Files
2016-10-07 23:44:50 +02:00

171 lines
3.7 KiB
C

#include "Terminal.h"
#include "../System.h"
#include "../LEDHook.h"
#include "../LUFADescriptors.h"
#define INIT_DELAY (2000 / SYSTEM_TICK_MS)
USB_ClassInfo_CDC_Device_t TerminalHandle = {
.Config = {
.ControlInterfaceNumber = 0,
.DataINEndpoint = {
.Address = CDC_TX_EPADDR,
.Size = CDC_TXRX_EPSIZE,
.Banks = 1,
}, .DataOUTEndpoint = {
.Address = CDC_RX_EPADDR,
.Size = CDC_TXRX_EPSIZE,
.Banks = 1,
}, .NotificationEndpoint = {
.Address = CDC_NOTIFICATION_EPADDR,
.Size = CDC_NOTIFICATION_EPSIZE,
.Banks = 1,
},
}
};
uint8_t TerminalBuffer[TERMINAL_BUFFER_SIZE];
TerminalStateEnum TerminalState = TERMINAL_UNINITIALIZED;
static uint8_t TerminalInitDelay = INIT_DELAY;
void TerminalSendString(const char* s) {
CDC_Device_SendString(&TerminalHandle, s);
}
void TerminalSendStringP(const char* s) {
char c;
while( (c = pgm_read_byte(s++)) != '\0' ) {
TerminalSendChar(c);
}
}
/*
void TerminalSendHex(void* Buffer, uint16_t ByteCount)
{
char* pTerminalBuffer = (char*) TerminalBuffer;
BufferToHexString(pTerminalBuffer, sizeof(TerminalBuffer), Buffer, ByteCount);
TerminalSendString(pTerminalBuffer);
}
*/
void TerminalSendBlock(const void* Buffer, uint16_t ByteCount)
{
CDC_Device_SendData(&TerminalHandle, Buffer, ByteCount);
}
static void ProcessByte(void) {
int16_t Byte = CDC_Device_ReceiveByte(&TerminalHandle);
if (Byte >= 0) {
/* Byte received */
LEDHook(LED_TERMINAL_RXTX, LED_PULSE);
if (XModemProcessByte(Byte)) {
/* XModem handled the byte */
} else if (CommandLineProcessByte(Byte)) {
/* CommandLine handled the byte */
}
}
}
static void SenseVBus(void)
{
switch(TerminalState) {
case TERMINAL_UNINITIALIZED:
if (TERMINAL_VBUS_PORT.IN & TERMINAL_VBUS_MASK) {
/* Not initialized and VBUS sense high */
TerminalInitDelay = INIT_DELAY;
TerminalState = TERMINAL_INITIALIZING;
}
break;
case TERMINAL_INITIALIZING:
if (--TerminalInitDelay == 0) {
SystemStartUSBClock();
USB_Init();
TerminalState = TERMINAL_INITIALIZED;
}
break;
case TERMINAL_INITIALIZED:
if (!(TERMINAL_VBUS_PORT.IN & TERMINAL_VBUS_MASK)) {
/* Initialized and VBUS sense low */
TerminalInitDelay = INIT_DELAY;
TerminalState = TERMINAL_UNITIALIZING;
}
break;
case TERMINAL_UNITIALIZING:
if (--TerminalInitDelay == 0) {
USB_Disable();
SystemStopUSBClock();
TerminalState = TERMINAL_UNINITIALIZED;
}
break;
default:
break;
}
}
void TerminalInit(void)
{
TERMINAL_VBUS_PORT.DIRCLR = TERMINAL_VBUS_MASK;
}
void TerminalTask(void)
{
if (TerminalState == TERMINAL_INITIALIZED) {
CDC_Device_USBTask(&TerminalHandle);
USB_USBTask();
ProcessByte();
}
}
void TerminalTick(void)
{
SenseVBus();
if (TerminalState == TERMINAL_INITIALIZED) {
XModemTick();
CommandLineTick();
}
}
/** Event handler for the library USB Connection event. */
void EVENT_USB_Device_Connect(void)
{
LEDHook(LED_TERMINAL_CONN, LED_ON);
}
/** Event handler for the library USB Disconnection event. */
void EVENT_USB_Device_Disconnect(void)
{
LEDHook(LED_TERMINAL_CONN, LED_OFF);
}
/** Event handler for the library USB Configuration Changed event. */
void EVENT_USB_Device_ConfigurationChanged(void)
{
CDC_Device_ConfigureEndpoints(&TerminalHandle);
}
/** Event handler for the library USB Control Request reception event. */
void EVENT_USB_Device_ControlRequest(void)
{
CDC_Device_ProcessControlRequest(&TerminalHandle);
}