Anders Rundgren
/
SerialDriverTest
main.cpp
- Committer:
- andersrundgren
- Date:
- 2009-12-29
- Revision:
- 0:1de208404352
File content as of revision 0:1de208404352:
#include "mbed.h" Serial pc(USBTX, USBRX); // tx, rx DigitalOut myled_4(LED4); DigitalOut myled_3(LED3); DigitalOut myled_2(LED2); DigitalOut myled_1(LED1); Timer serial_timeout; const int MAX_DELAY_BETWEEN_CHARCTERS_IN_MS = 2000; const int BAUD_RATE = 115200; const int CAPACITY_COMMAND = 1; const int MISSING_DATA_COMMAND = 2; const int DEVICE_TIMEOUT_COMMEND = 3; static int counter; static int length; static int curr_pos; static bool buffer_full; static int readCharTimed () { serial_timeout.reset (); while (!pc.readable ()) { if (serial_timeout.read_ms () > MAX_DELAY_BETWEEN_CHARCTERS_IN_MS) { myled_1 = 1; return -1; } } return pc.getc (); } int getCommand (int first_char) { buffer_full = false; serial_timeout.start (); int next_char = readCharTimed (); if (next_char < 0) { myled_2 = 1; return -1; } length = ((first_char << 8) + next_char) & 0xFFFF; curr_pos = 1; return readCharTimed (); // This is the command (pos 0 in expected buffer) } #define OUTPUT_TIMED void putByte (int c) { #ifdef OUTPUT_TIMED if (!buffer_full) { serial_timeout.start (); while (true) { if (pc.writeable ()) { #endif pc.putc (c); #ifdef OUTPUT_TIMED break; } if (serial_timeout.read_ms () > MAX_DELAY_BETWEEN_CHARCTERS_IN_MS) { myled_1 = 1; myled_4 = 1; buffer_full = true; break; } } } #endif } void putSuccessStatus () { if (curr_pos != length) { myled_1 = 1; myled_2 = 1; myled_3 = 1; } putByte (0); } void putShort (int v) { putByte (v >> 8); putByte (v & 0xFF); } void putString (char *string) { int len = strlen (string); putShort (len); for (int i = 0; i < len; i++) { pc.putc (string[i]); } } int getChar () { if (curr_pos++ >= length) { myled_3 = 1; } return readCharTimed() & 0xFF; } int getShort () { int v = getChar () << 8; return v + getChar (); } int main() { pc.baud (BAUD_RATE); while (1) { counter++; switch (getCommand (pc.getc ())) { case CAPACITY_COMMAND: int out_buffer_size; out_buffer_size = getShort () & 0xFFFF; int in_buffer_size; in_buffer_size = getShort () & 0xFFFF; while (in_buffer_size-- > 0) { getChar (); } putSuccessStatus (); putShort (out_buffer_size); while (out_buffer_size-- > 0) { putByte (0); } break; case MISSING_DATA_COMMAND: getShort (); putSuccessStatus (); break; case DEVICE_TIMEOUT_COMMEND: wait (30); putSuccessStatus (); break; default: myled_2 = 1; pc.putc (7); putString ("No such command..."); } } }