void AppProtocolTasks(CHANNEL_HANDLE h) { if (state == STATE_CLOSED) return; if (state == STATE_CLOSING && ByteQueueSize(&tx_queue) == 0) { log_printf("Finished flushing, closing the channel."); ConnectionCloseChannel(h); state = STATE_CLOSED; return; } UARTTasks(); SPITasks(); I2CTasks(); ICSPTasks(); if (ConnectionCanSend(h)) { BYTE prev = SyncInterruptLevel(1); const BYTE* data; if (bytes_out) { ByteQueuePull(&tx_queue, bytes_out); bytes_out = 0; } ByteQueuePeek(&tx_queue, &data, &bytes_out); if (bytes_out > 0) { if (bytes_out > max_packet) bytes_out = max_packet; ConnectionSend(h, data, bytes_out); } SyncInterruptLevel(prev); } }
int main() { log_init(); log_printf("***** Hello from app-layer! *******"); ConnectionInit(); SoftReset(); while (1) { BOOL connected = ConnectionTasks(); if (!connected && state > STATE_OPEN_CHANNEL) { // just got disconnected log_printf("Disconnected"); SoftReset(); state = STATE_INIT; } switch (state) { case STATE_INIT: handle = INVALID_CHANNEL_HANDLE; state = STATE_OPEN_CHANNEL; break; case STATE_OPEN_CHANNEL: if ((handle = OpenAvailableChannel()) != INVALID_CHANNEL_HANDLE) { log_printf("Connected"); state = STATE_WAIT_CHANNEL_OPEN; } break; case STATE_WAIT_CHANNEL_OPEN: if (ConnectionCanSend(handle)) { log_printf("Channel open"); AppProtocolInit(handle); state = STATE_CONNECTED; } break; case STATE_CONNECTED: AppProtocolTasks(handle); break; case STATE_ERROR: ConnectionCloseChannel(handle); SoftReset(); state = STATE_INIT; break; } } return 0; }
void AppProtocolTasks(CHANNEL_HANDLE h) { UARTTasks(); SPITasks(); I2CTasks(); ICSPTasks(); /***********************SNES/NES****************************/ SNESTasks(); /***********************************************************/ if (ConnectionCanSend(h)) { BYTE prev = SyncInterruptLevel(1); const BYTE* data; if (bytes_out) { ByteQueuePull(&tx_queue, bytes_out); bytes_out = 0; } ByteQueuePeek(&tx_queue, &data, &bytes_out); if (bytes_out > 0) { if (bytes_out > max_packet) bytes_out = max_packet; ConnectionSend(h, data, bytes_out); } SyncInterruptLevel(prev); } }