Exemple #1
0
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);
    }
}
Exemple #2
0
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;
}
Exemple #3
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);
  }
}