Clean up the code + introduce USB CDC module
... and tune some more namespacespull/115/head
parent
c2d705e612
commit
b6d630d1c9
|
|
@ -12,3 +12,5 @@ uint16_t ReadADC(uint8_t channel);
|
||||||
|
|
||||||
} // namespace adc
|
} // namespace adc
|
||||||
} // namespace hal
|
} // namespace hal
|
||||||
|
|
||||||
|
namespace ha = hal::adc;
|
||||||
|
|
|
||||||
|
|
@ -57,3 +57,5 @@ void Reset();
|
||||||
|
|
||||||
} // namespace watchdog
|
} // namespace watchdog
|
||||||
} // namespace hal
|
} // namespace hal
|
||||||
|
|
||||||
|
namespace hwd = hal::watchdog;
|
||||||
|
|
|
||||||
137
src/main.cpp
137
src/main.cpp
|
|
@ -6,12 +6,6 @@
|
||||||
#include "hal/usart.h"
|
#include "hal/usart.h"
|
||||||
#include "hal/watchdog.h"
|
#include "hal/watchdog.h"
|
||||||
|
|
||||||
extern "C" {
|
|
||||||
#include "lufa_config.h"
|
|
||||||
#include "Descriptors.h"
|
|
||||||
#include "lufa/LUFA/Drivers/USB/USB.h"
|
|
||||||
}
|
|
||||||
|
|
||||||
#include "pins.h"
|
#include "pins.h"
|
||||||
#include <avr/interrupt.h>
|
#include <avr/interrupt.h>
|
||||||
#include <util/delay.h>
|
#include <util/delay.h>
|
||||||
|
|
@ -27,6 +21,7 @@ extern "C" {
|
||||||
#include "modules/user_input.h"
|
#include "modules/user_input.h"
|
||||||
#include "modules/timebase.h"
|
#include "modules/timebase.h"
|
||||||
#include "modules/motion.h"
|
#include "modules/motion.h"
|
||||||
|
#include "modules/usb_cdc.h"
|
||||||
|
|
||||||
#include "logic/command_base.h"
|
#include "logic/command_base.h"
|
||||||
#include "logic/cut_filament.h"
|
#include "logic/cut_filament.h"
|
||||||
|
|
@ -38,112 +33,8 @@ extern "C" {
|
||||||
#include "logic/unload_filament.h"
|
#include "logic/unload_filament.h"
|
||||||
|
|
||||||
#include "version.h"
|
#include "version.h"
|
||||||
|
|
||||||
#include "panic.h"
|
#include "panic.h"
|
||||||
|
|
||||||
extern "C" {
|
|
||||||
|
|
||||||
/** LUFA CDC Class driver interface configuration and state information. This structure is
|
|
||||||
* passed to all CDC Class driver functions, so that multiple instances of the same class
|
|
||||||
* within a device can be differentiated from one another.
|
|
||||||
*/
|
|
||||||
USB_ClassInfo_CDC_Device_t VirtualSerial_CDC_Interface = {
|
|
||||||
.Config = {
|
|
||||||
.ControlInterfaceNumber = INTERFACE_ID_CDC_CCI,
|
|
||||||
.DataINEndpoint = {
|
|
||||||
.Address = CDC_TX_EPADDR,
|
|
||||||
.Size = CDC_TXRX_EPSIZE,
|
|
||||||
.Type = EP_TYPE_BULK,
|
|
||||||
.Banks = 1,
|
|
||||||
},
|
|
||||||
.DataOUTEndpoint = {
|
|
||||||
.Address = CDC_RX_EPADDR,
|
|
||||||
.Size = CDC_TXRX_EPSIZE,
|
|
||||||
.Type = EP_TYPE_BULK,
|
|
||||||
.Banks = 1,
|
|
||||||
},
|
|
||||||
.NotificationEndpoint = {
|
|
||||||
.Address = CDC_NOTIFICATION_EPADDR,
|
|
||||||
.Size = CDC_NOTIFICATION_EPSIZE,
|
|
||||||
.Type = EP_TYPE_INTERRUPT,
|
|
||||||
.Banks = 1,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
};
|
|
||||||
|
|
||||||
// void testFunc1(uint8_t i) {
|
|
||||||
// char str[30];
|
|
||||||
// sprintf_P(str, PSTR("testFunc1(%hu)\n"), i);
|
|
||||||
// hal::usart::usart1.puts(str);
|
|
||||||
// }
|
|
||||||
|
|
||||||
// void testFunc2(uint8_t i) {
|
|
||||||
// char str[30];
|
|
||||||
// sprintf_P(str, PSTR("testFunc2(%hu)\n"), i);
|
|
||||||
// hal::usart::usart1.puts(str);
|
|
||||||
// }
|
|
||||||
|
|
||||||
/** Event handler for the library USB Connection event. */
|
|
||||||
void EVENT_USB_Device_Connect(void) {
|
|
||||||
hal::usart::usart1.puts("EVENT_USB_Device_Connect\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
/** Event handler for the library USB Disconnection event. */
|
|
||||||
void EVENT_USB_Device_Disconnect(void) {
|
|
||||||
hal::usart::usart1.puts("EVENT_USB_Device_Disconnect\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
/** Event handler for the library USB Configuration Changed event. */
|
|
||||||
void EVENT_USB_Device_ConfigurationChanged(void) {
|
|
||||||
bool ConfigSuccess = true;
|
|
||||||
|
|
||||||
ConfigSuccess &= CDC_Device_ConfigureEndpoints(&VirtualSerial_CDC_Interface);
|
|
||||||
|
|
||||||
// LEDs_SetAllLEDs(ConfigSuccess ? LEDMASK_USB_READY : LEDMASK_USB_ERROR);
|
|
||||||
// char str1[] = "ready\n";
|
|
||||||
// char str0[] = "error\n";
|
|
||||||
// hal::usart::usart1.puts("EVENT_USB_Device_ConfigurationChanged:");
|
|
||||||
// hal::usart::usart1.puts(ConfigSuccess ? str1 : str0);
|
|
||||||
}
|
|
||||||
|
|
||||||
/** Event handler for the library USB Control Request reception event. */
|
|
||||||
void EVENT_USB_Device_ControlRequest(void) {
|
|
||||||
// hal::usart::usart1.puts("EVENT_USB_Device_ControlRequest\n");
|
|
||||||
CDC_Device_ProcessControlRequest(&VirtualSerial_CDC_Interface);
|
|
||||||
}
|
|
||||||
|
|
||||||
/** CDC class driver callback function the processing of changes to the virtual
|
|
||||||
* control lines sent from the host..
|
|
||||||
*
|
|
||||||
* \param[in] CDCInterfaceInfo Pointer to the CDC class interface configuration structure being referenced
|
|
||||||
*/
|
|
||||||
void EVENT_CDC_Device_ControLineStateChanged(USB_ClassInfo_CDC_Device_t *const CDCInterfaceInfo) {
|
|
||||||
// Printing to serial from here will make Windows commit suicide when opening the port
|
|
||||||
|
|
||||||
// hal::usart::usart1.puts("EVENT_CDC_Device_ControLineStateChanged ");
|
|
||||||
// bool HostReady = (CDCInterfaceInfo->State.ControlLineStates.HostToDevice & CDC_CONTROL_LINE_OUT_DTR) != 0;
|
|
||||||
// char str[50];
|
|
||||||
// sprintf_P(str, PSTR("DTR:%hu\n"), HostReady);
|
|
||||||
// hal::usart::usart1.puts(str);
|
|
||||||
}
|
|
||||||
|
|
||||||
void EVENT_CDC_Device_LineEncodingChanged(USB_ClassInfo_CDC_Device_t *const CDCInterfaceInfo) {
|
|
||||||
// Printing to serial from here will make Windows commit suicide when opening the port
|
|
||||||
|
|
||||||
// hal::usart::usart1.puts("EVENT_CDC_Device_LineEncodingChanged ");
|
|
||||||
// char str[50];
|
|
||||||
// sprintf_P(str, PSTR("baud:%lu\n"), CDCInterfaceInfo->State.LineEncoding.BaudRateBPS);
|
|
||||||
// hal::usart::usart1.puts(str);
|
|
||||||
|
|
||||||
if (CDCInterfaceInfo->State.LineEncoding.BaudRateBPS == 1200) {
|
|
||||||
// *(uint16_t *)0x0800U = 0x7777; //old bootloader?
|
|
||||||
*(uint16_t *)(RAMEND-1) = 0x7777;
|
|
||||||
hal::cpu::resetPending = true;
|
|
||||||
hal::watchdog::Enable(hal::watchdog::configuration::compute(250));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Global instance of the protocol codec
|
/// Global instance of the protocol codec
|
||||||
static mp::Protocol protocol;
|
static mp::Protocol protocol;
|
||||||
|
|
||||||
|
|
@ -200,24 +91,19 @@ void TmpPlayground() {
|
||||||
/// Called before entering the loop() function
|
/// Called before entering the loop() function
|
||||||
/// Green LEDs signalize the progress of initialization. If anything goes wrong we shall turn on a red LED
|
/// Green LEDs signalize the progress of initialization. If anything goes wrong we shall turn on a red LED
|
||||||
void setup() {
|
void setup() {
|
||||||
using namespace hal;
|
hal::cpu::Init();
|
||||||
|
|
||||||
cpu::Init();
|
|
||||||
|
|
||||||
mt::timebase.Init();
|
mt::timebase.Init();
|
||||||
|
|
||||||
watchdog::Enable(watchdog::configuration::compute(8000)); //set 8s timeout
|
hwd::Enable(hwd::configuration::compute(8000)); //set 8s timeout
|
||||||
|
|
||||||
mg::globals.Init();
|
mg::globals.Init();
|
||||||
|
|
||||||
// watchdog init
|
hal::shr16::shr16.Init();
|
||||||
|
|
||||||
shr16::shr16.Init();
|
|
||||||
ml::leds.SetMode(4, ml::Color::green, ml::Mode::on);
|
ml::leds.SetMode(4, ml::Color::green, ml::Mode::on);
|
||||||
ml::leds.Step();
|
ml::leds.Step();
|
||||||
|
|
||||||
// @@TODO if the shift register doesn't work we really can't signalize anything, only internal variables will be accessible if the UART works
|
// if the shift register doesn't work we really can't signalize anything, only internal variables will be accessible if the UART works
|
||||||
|
|
||||||
hu::USART::USART_InitTypeDef usart_conf = {
|
hu::USART::USART_InitTypeDef usart_conf = {
|
||||||
.rx_pin = USART_RX,
|
.rx_pin = USART_RX,
|
||||||
.tx_pin = USART_TX,
|
.tx_pin = USART_TX,
|
||||||
|
|
@ -229,7 +115,7 @@ void setup() {
|
||||||
|
|
||||||
// @@TODO if both shift register and the UART are dead, we are sitting ducks :(
|
// @@TODO if both shift register and the UART are dead, we are sitting ducks :(
|
||||||
|
|
||||||
spi::SPI_InitTypeDef spi_conf = {
|
hal::spi::SPI_InitTypeDef spi_conf = {
|
||||||
.miso_pin = TMC2130_SPI_MISO_PIN,
|
.miso_pin = TMC2130_SPI_MISO_PIN,
|
||||||
.mosi_pin = TMC2130_SPI_MOSI_PIN,
|
.mosi_pin = TMC2130_SPI_MOSI_PIN,
|
||||||
.sck_pin = TMC2130_SPI_SCK_PIN,
|
.sck_pin = TMC2130_SPI_SCK_PIN,
|
||||||
|
|
@ -238,7 +124,7 @@ void setup() {
|
||||||
.cpha = 1,
|
.cpha = 1,
|
||||||
.cpol = 1,
|
.cpol = 1,
|
||||||
};
|
};
|
||||||
spi::Init(SPI0, &spi_conf);
|
hal::spi::Init(SPI0, &spi_conf);
|
||||||
ml::leds.SetMode(2, ml::Color::green, ml::Mode::on);
|
ml::leds.SetMode(2, ml::Color::green, ml::Mode::on);
|
||||||
ml::leds.Step();
|
ml::leds.Step();
|
||||||
|
|
||||||
|
|
@ -246,11 +132,11 @@ void setup() {
|
||||||
ml::leds.SetMode(1, ml::Color::green, ml::Mode::on);
|
ml::leds.SetMode(1, ml::Color::green, ml::Mode::on);
|
||||||
ml::leds.Step();
|
ml::leds.Step();
|
||||||
|
|
||||||
adc::Init();
|
ha::Init();
|
||||||
ml::leds.SetMode(0, ml::Color::green, ml::Mode::on);
|
ml::leds.SetMode(0, ml::Color::green, ml::Mode::on);
|
||||||
ml::leds.Step();
|
ml::leds.Step();
|
||||||
|
|
||||||
USB_Init();
|
mu::cdc.Init();
|
||||||
|
|
||||||
_delay_ms(100);
|
_delay_ms(100);
|
||||||
|
|
||||||
|
|
@ -481,10 +367,7 @@ void loop() {
|
||||||
mui::userInput.Step();
|
mui::userInput.Step();
|
||||||
currentCommand->Step();
|
currentCommand->Step();
|
||||||
hal::cpu::Step();
|
hal::cpu::Step();
|
||||||
|
mu::cdc.Step();
|
||||||
CDC_Device_ReceiveByte(&VirtualSerial_CDC_Interface);
|
|
||||||
CDC_Device_USBTask(&VirtualSerial_CDC_Interface);
|
|
||||||
USB_USBTask();
|
|
||||||
|
|
||||||
hal::watchdog::Reset();
|
hal::watchdog::Reset();
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -11,9 +11,10 @@ target_sources(
|
||||||
motion.cpp
|
motion.cpp
|
||||||
movable_base.cpp
|
movable_base.cpp
|
||||||
permanent_storage.cpp
|
permanent_storage.cpp
|
||||||
|
pulse_gen.cpp
|
||||||
selector.cpp
|
selector.cpp
|
||||||
speed_table.cpp
|
speed_table.cpp
|
||||||
timebase.cpp
|
timebase.cpp
|
||||||
|
usb_cdc.cpp
|
||||||
user_input.cpp
|
user_input.cpp
|
||||||
pulse_gen.cpp
|
|
||||||
)
|
)
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,129 @@
|
||||||
|
#include "usb_cdc.h"
|
||||||
|
#include "../hal/cpu.h"
|
||||||
|
#include "../hal/usart.h"
|
||||||
|
#include "../hal/watchdog.h"
|
||||||
|
|
||||||
|
extern "C" {
|
||||||
|
#include "lufa_config.h"
|
||||||
|
#include "Descriptors.h"
|
||||||
|
#include "lufa/LUFA/Drivers/USB/USB.h"
|
||||||
|
|
||||||
|
/** LUFA CDC Class driver interface configuration and state information. This structure is
|
||||||
|
* passed to all CDC Class driver functions, so that multiple instances of the same class
|
||||||
|
* within a device can be differentiated from one another.
|
||||||
|
*/
|
||||||
|
USB_ClassInfo_CDC_Device_t VirtualSerial_CDC_Interface = {
|
||||||
|
.Config = {
|
||||||
|
.ControlInterfaceNumber = INTERFACE_ID_CDC_CCI,
|
||||||
|
.DataINEndpoint = {
|
||||||
|
.Address = CDC_TX_EPADDR,
|
||||||
|
.Size = CDC_TXRX_EPSIZE,
|
||||||
|
.Type = EP_TYPE_BULK,
|
||||||
|
.Banks = 1,
|
||||||
|
},
|
||||||
|
.DataOUTEndpoint = {
|
||||||
|
.Address = CDC_RX_EPADDR,
|
||||||
|
.Size = CDC_TXRX_EPSIZE,
|
||||||
|
.Type = EP_TYPE_BULK,
|
||||||
|
.Banks = 1,
|
||||||
|
},
|
||||||
|
.NotificationEndpoint = {
|
||||||
|
.Address = CDC_NOTIFICATION_EPADDR,
|
||||||
|
.Size = CDC_NOTIFICATION_EPSIZE,
|
||||||
|
.Type = EP_TYPE_INTERRUPT,
|
||||||
|
.Banks = 1,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
// void testFunc1(uint8_t i) {
|
||||||
|
// char str[30];
|
||||||
|
// sprintf_P(str, PSTR("testFunc1(%hu)\n"), i);
|
||||||
|
// hal::usart::usart1.puts(str);
|
||||||
|
// }
|
||||||
|
|
||||||
|
// void testFunc2(uint8_t i) {
|
||||||
|
// char str[30];
|
||||||
|
// sprintf_P(str, PSTR("testFunc2(%hu)\n"), i);
|
||||||
|
// hal::usart::usart1.puts(str);
|
||||||
|
// }
|
||||||
|
|
||||||
|
/** Event handler for the library USB Connection event. */
|
||||||
|
void EVENT_USB_Device_Connect(void) {
|
||||||
|
hal::usart::usart1.puts("EVENT_USB_Device_Connect\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Event handler for the library USB Disconnection event. */
|
||||||
|
void EVENT_USB_Device_Disconnect(void) {
|
||||||
|
hal::usart::usart1.puts("EVENT_USB_Device_Disconnect\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Event handler for the library USB Configuration Changed event. */
|
||||||
|
void EVENT_USB_Device_ConfigurationChanged(void) {
|
||||||
|
bool ConfigSuccess = true;
|
||||||
|
|
||||||
|
ConfigSuccess &= CDC_Device_ConfigureEndpoints(&VirtualSerial_CDC_Interface);
|
||||||
|
|
||||||
|
// LEDs_SetAllLEDs(ConfigSuccess ? LEDMASK_USB_READY : LEDMASK_USB_ERROR);
|
||||||
|
// char str1[] = "ready\n";
|
||||||
|
// char str0[] = "error\n";
|
||||||
|
// hal::usart::usart1.puts("EVENT_USB_Device_ConfigurationChanged:");
|
||||||
|
// hal::usart::usart1.puts(ConfigSuccess ? str1 : str0);
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Event handler for the library USB Control Request reception event. */
|
||||||
|
void EVENT_USB_Device_ControlRequest(void) {
|
||||||
|
// hal::usart::usart1.puts("EVENT_USB_Device_ControlRequest\n");
|
||||||
|
CDC_Device_ProcessControlRequest(&VirtualSerial_CDC_Interface);
|
||||||
|
}
|
||||||
|
|
||||||
|
/** CDC class driver callback function the processing of changes to the virtual
|
||||||
|
* control lines sent from the host..
|
||||||
|
*
|
||||||
|
* \param[in] CDCInterfaceInfo Pointer to the CDC class interface configuration structure being referenced
|
||||||
|
*/
|
||||||
|
void EVENT_CDC_Device_ControLineStateChanged(USB_ClassInfo_CDC_Device_t *const CDCInterfaceInfo) {
|
||||||
|
// Printing to serial from here will make Windows commit suicide when opening the port
|
||||||
|
|
||||||
|
// hal::usart::usart1.puts("EVENT_CDC_Device_ControLineStateChanged ");
|
||||||
|
// bool HostReady = (CDCInterfaceInfo->State.ControlLineStates.HostToDevice & CDC_CONTROL_LINE_OUT_DTR) != 0;
|
||||||
|
// char str[50];
|
||||||
|
// sprintf_P(str, PSTR("DTR:%hu\n"), HostReady);
|
||||||
|
// hal::usart::usart1.puts(str);
|
||||||
|
}
|
||||||
|
|
||||||
|
void EVENT_CDC_Device_LineEncodingChanged(USB_ClassInfo_CDC_Device_t *const CDCInterfaceInfo) {
|
||||||
|
// Printing to serial from here will make Windows commit suicide when opening the port
|
||||||
|
|
||||||
|
// hal::usart::usart1.puts("EVENT_CDC_Device_LineEncodingChanged ");
|
||||||
|
// char str[50];
|
||||||
|
// sprintf_P(str, PSTR("baud:%lu\n"), CDCInterfaceInfo->State.LineEncoding.BaudRateBPS);
|
||||||
|
// hal::usart::usart1.puts(str);
|
||||||
|
|
||||||
|
if (CDCInterfaceInfo->State.LineEncoding.BaudRateBPS == 1200) {
|
||||||
|
// *(uint16_t *)0x0800U = 0x7777; //old bootloader?
|
||||||
|
*(uint16_t *)(RAMEND - 1) = 0x7777;
|
||||||
|
hal::cpu::resetPending = true;
|
||||||
|
hal::watchdog::Enable(hal::watchdog::configuration::compute(250));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
namespace modules {
|
||||||
|
namespace usb {
|
||||||
|
|
||||||
|
CDC cdc;
|
||||||
|
|
||||||
|
void CDC::Init() {
|
||||||
|
USB_Init();
|
||||||
|
}
|
||||||
|
|
||||||
|
void CDC::Step() {
|
||||||
|
CDC_Device_ReceiveByte(&VirtualSerial_CDC_Interface);
|
||||||
|
CDC_Device_USBTask(&VirtualSerial_CDC_Interface);
|
||||||
|
USB_USBTask();
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace usb
|
||||||
|
|
||||||
|
} // namespace modules
|
||||||
|
|
@ -0,0 +1,26 @@
|
||||||
|
#pragma once
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
namespace modules {
|
||||||
|
|
||||||
|
/// The usb namespace provides all necessary facilities related to the USB interface.
|
||||||
|
namespace usb {
|
||||||
|
|
||||||
|
class CDC {
|
||||||
|
public:
|
||||||
|
constexpr inline CDC() {}
|
||||||
|
|
||||||
|
void Init();
|
||||||
|
|
||||||
|
void Step();
|
||||||
|
|
||||||
|
private:
|
||||||
|
};
|
||||||
|
|
||||||
|
/// The one and only instance of Selector in the FW
|
||||||
|
extern CDC cdc;
|
||||||
|
|
||||||
|
} // namespace usb
|
||||||
|
} // namespace modules
|
||||||
|
|
||||||
|
namespace mu = modules::usb;
|
||||||
Loading…
Reference in New Issue