A simple WIP that logs data from a Grove sensor, and can send and receive information over USB and SMS.
Dependencies: DHT DS_1337 SDFileSystem USBDevice mbed
Handlers/UsbComms.cpp@0:2df78a4443cd, 2016-04-10 (annotated)
- Committer:
- Joseph Radford
- Date:
- Sun Apr 10 15:47:33 2016 +1000
- Revision:
- 0:2df78a4443cd
Initial commit
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
Joseph Radford |
0:2df78a4443cd | 1 | #include "UsbComms.h" |
Joseph Radford |
0:2df78a4443cd | 2 | #include "mbed.h" |
Joseph Radford |
0:2df78a4443cd | 3 | |
Joseph Radford |
0:2df78a4443cd | 4 | #include "USBDevice.h" |
Joseph Radford |
0:2df78a4443cd | 5 | #include "USBSerial.h" |
Joseph Radford |
0:2df78a4443cd | 6 | |
Joseph Radford |
0:2df78a4443cd | 7 | #include "circbuff.h" |
Joseph Radford |
0:2df78a4443cd | 8 | |
Joseph Radford |
0:2df78a4443cd | 9 | #define USB_CIRC_BUFF 256 |
Joseph Radford |
0:2df78a4443cd | 10 | |
Joseph Radford |
0:2df78a4443cd | 11 | extern DigitalOut myled1; // this led is used to notify state of USB comms |
Joseph Radford |
0:2df78a4443cd | 12 | |
Joseph Radford |
0:2df78a4443cd | 13 | UsbComms::UsbComms(MyTimers *_timer) : AbstractHandler(_timer) |
Joseph Radford |
0:2df78a4443cd | 14 | { |
Joseph Radford |
0:2df78a4443cd | 15 | mode = usb_Start; |
Joseph Radford |
0:2df78a4443cd | 16 | |
Joseph Radford |
0:2df78a4443cd | 17 | m_circBuff = new CircBuff(USB_CIRC_BUFF); |
Joseph Radford |
0:2df78a4443cd | 18 | |
Joseph Radford |
0:2df78a4443cd | 19 | // Declare serial port for communication with PC over USB |
Joseph Radford |
0:2df78a4443cd | 20 | _serial = new USBSerial; |
Joseph Radford |
0:2df78a4443cd | 21 | } |
Joseph Radford |
0:2df78a4443cd | 22 | |
Joseph Radford |
0:2df78a4443cd | 23 | UsbComms::~UsbComms() |
Joseph Radford |
0:2df78a4443cd | 24 | { |
Joseph Radford |
0:2df78a4443cd | 25 | delete _serial; |
Joseph Radford |
0:2df78a4443cd | 26 | delete m_circBuff; |
Joseph Radford |
0:2df78a4443cd | 27 | } |
Joseph Radford |
0:2df78a4443cd | 28 | |
Joseph Radford |
0:2df78a4443cd | 29 | void UsbComms::run() |
Joseph Radford |
0:2df78a4443cd | 30 | { |
Joseph Radford |
0:2df78a4443cd | 31 | unsigned char temp; |
Joseph Radford |
0:2df78a4443cd | 32 | switch(mode) { |
Joseph Radford |
0:2df78a4443cd | 33 | case usb_Start: |
Joseph Radford |
0:2df78a4443cd | 34 | mode = usb_CheckInput; |
Joseph Radford |
0:2df78a4443cd | 35 | break; |
Joseph Radford |
0:2df78a4443cd | 36 | case usb_CheckInput: |
Joseph Radford |
0:2df78a4443cd | 37 | if (_serial->readable()) { |
Joseph Radford |
0:2df78a4443cd | 38 | _serial->getc(); |
Joseph Radford |
0:2df78a4443cd | 39 | // todo: do something with it! this is where config events are started |
Joseph Radford |
0:2df78a4443cd | 40 | // uncomment to print a message confirming input |
Joseph Radford |
0:2df78a4443cd | 41 | // _serial->writeBlock((unsigned char*)"getc\r\n", 6); |
Joseph Radford |
0:2df78a4443cd | 42 | //mode = usb_WaitForInput; |
Joseph Radford |
0:2df78a4443cd | 43 | mode = usb_CheckOutput; |
Joseph Radford |
0:2df78a4443cd | 44 | } else { |
Joseph Radford |
0:2df78a4443cd | 45 | mode = usb_CheckOutput; |
Joseph Radford |
0:2df78a4443cd | 46 | } |
Joseph Radford |
0:2df78a4443cd | 47 | break; |
Joseph Radford |
0:2df78a4443cd | 48 | case usb_CheckOutput: |
Joseph Radford |
0:2df78a4443cd | 49 | if (m_circBuff->dataAvailable() && _serial->writeable()) { |
Joseph Radford |
0:2df78a4443cd | 50 | // ensure only 64 bytes or less are written at a time |
Joseph Radford |
0:2df78a4443cd | 51 | unsigned char s[TX_USB_MSG_MAX]; |
Joseph Radford |
0:2df78a4443cd | 52 | int len = m_circBuff->read(s, TX_USB_MSG_MAX); |
Joseph Radford |
0:2df78a4443cd | 53 | _serial->writeBlock((unsigned char*)s, len); |
Joseph Radford |
0:2df78a4443cd | 54 | myled1 = 1; |
Joseph Radford |
0:2df78a4443cd | 55 | |
Joseph Radford |
0:2df78a4443cd | 56 | } else { |
Joseph Radford |
0:2df78a4443cd | 57 | myled1 = 0; |
Joseph Radford |
0:2df78a4443cd | 58 | } |
Joseph Radford |
0:2df78a4443cd | 59 | mode = usb_CheckInput; |
Joseph Radford |
0:2df78a4443cd | 60 | break; |
Joseph Radford |
0:2df78a4443cd | 61 | } |
Joseph Radford |
0:2df78a4443cd | 62 | } |
Joseph Radford |
0:2df78a4443cd | 63 | |
Joseph Radford |
0:2df78a4443cd | 64 | void UsbComms::setRequest(int request, void *data) |
Joseph Radford |
0:2df78a4443cd | 65 | { |
Joseph Radford |
0:2df78a4443cd | 66 | request_t req = (request_t)request; |
Joseph Radford |
0:2df78a4443cd | 67 | |
Joseph Radford |
0:2df78a4443cd | 68 | switch (req) { |
Joseph Radford |
0:2df78a4443cd | 69 | case usbreq_PrintToTerminal: |
Joseph Radford |
0:2df78a4443cd | 70 | printToTerminal((char*)data); |
Joseph Radford |
0:2df78a4443cd | 71 | break; |
Joseph Radford |
0:2df78a4443cd | 72 | case usbreq_PrintToTerminalTimestamp: |
Joseph Radford |
0:2df78a4443cd | 73 | printToTerminalEx((char*)data); |
Joseph Radford |
0:2df78a4443cd | 74 | break; |
Joseph Radford |
0:2df78a4443cd | 75 | } |
Joseph Radford |
0:2df78a4443cd | 76 | } |
Joseph Radford |
0:2df78a4443cd | 77 | |
Joseph Radford |
0:2df78a4443cd | 78 | void UsbComms::printToTerminal(char *s) |
Joseph Radford |
0:2df78a4443cd | 79 | { |
Joseph Radford |
0:2df78a4443cd | 80 | // simply add this string to the circular buffer |
Joseph Radford |
0:2df78a4443cd | 81 | m_circBuff->add((unsigned char*)s); |
Joseph Radford |
0:2df78a4443cd | 82 | } |
Joseph Radford |
0:2df78a4443cd | 83 | |
Joseph Radford |
0:2df78a4443cd | 84 | // print the message, but prepend it with a standard timestamp |
Joseph Radford |
0:2df78a4443cd | 85 | // YYYYMMDD HHMMSS: |
Joseph Radford |
0:2df78a4443cd | 86 | // 01234567890123456 |
Joseph Radford |
0:2df78a4443cd | 87 | void UsbComms::printToTerminalEx(char *s) |
Joseph Radford |
0:2df78a4443cd | 88 | { |
Joseph Radford |
0:2df78a4443cd | 89 | unsigned char tempBuff[TX_USB_BUFF_SIZE]; |
Joseph Radford |
0:2df78a4443cd | 90 | // this won't work! needs to be a circular buffer... |
Joseph Radford |
0:2df78a4443cd | 91 | uint16_t sSize = 0, i = 0, j = 0; |
Joseph Radford |
0:2df78a4443cd | 92 | |
Joseph Radford |
0:2df78a4443cd | 93 | // get the length of the passed array (it should be null terminated, but include max buffer size for caution) |
Joseph Radford |
0:2df78a4443cd | 94 | for (sSize = 0; (sSize < TX_USB_BUFF_SIZE) && (s[sSize] != 0); sSize++); |
Joseph Radford |
0:2df78a4443cd | 95 | |
Joseph Radford |
0:2df78a4443cd | 96 | |
Joseph Radford |
0:2df78a4443cd | 97 | time_t _time = time(NULL); // get the seconds since dawn of time |
Joseph Radford |
0:2df78a4443cd | 98 | |
Joseph Radford |
0:2df78a4443cd | 99 | // extract time_t to time info struct |
Joseph Radford |
0:2df78a4443cd | 100 | struct tm * timeinfo = localtime(&_time); |
Joseph Radford |
0:2df78a4443cd | 101 | |
Joseph Radford |
0:2df78a4443cd | 102 | // print the formatted timestamp at the start of terminalBuffer |
Joseph Radford |
0:2df78a4443cd | 103 | sprintf((char*)&tempBuff[0], "%04d%02d%02d %02d%02d%02d:", (timeinfo->tm_year + 1900), |
Joseph Radford |
0:2df78a4443cd | 104 | (timeinfo->tm_mon + 1), |
Joseph Radford |
0:2df78a4443cd | 105 | timeinfo->tm_mday, |
Joseph Radford |
0:2df78a4443cd | 106 | timeinfo->tm_hour, |
Joseph Radford |
0:2df78a4443cd | 107 | timeinfo->tm_min, |
Joseph Radford |
0:2df78a4443cd | 108 | timeinfo->tm_sec); |
Joseph Radford |
0:2df78a4443cd | 109 | |
Joseph Radford |
0:2df78a4443cd | 110 | |
Joseph Radford |
0:2df78a4443cd | 111 | // copy the string into the remainder of the terminal buffer |
Joseph Radford |
0:2df78a4443cd | 112 | for (i = 16; i < (16 + sSize); i++) { |
Joseph Radford |
0:2df78a4443cd | 113 | tempBuff[i] = s[j++]; |
Joseph Radford |
0:2df78a4443cd | 114 | } |
Joseph Radford |
0:2df78a4443cd | 115 | |
Joseph Radford |
0:2df78a4443cd | 116 | // add a carriage return and new line to the output buffer |
Joseph Radford |
0:2df78a4443cd | 117 | tempBuff[i++] = '\r'; |
Joseph Radford |
0:2df78a4443cd | 118 | tempBuff[i++] = '\n'; |
Joseph Radford |
0:2df78a4443cd | 119 | tempBuff[i++] = 0; |
Joseph Radford |
0:2df78a4443cd | 120 | |
Joseph Radford |
0:2df78a4443cd | 121 | // add it to the circular buffer |
Joseph Radford |
0:2df78a4443cd | 122 | m_circBuff->add(tempBuff); |
Joseph Radford |
0:2df78a4443cd | 123 | } |
Joseph Radford |
0:2df78a4443cd | 124 | |
Joseph Radford |
0:2df78a4443cd | 125 |