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

Committer:
Joseph Radford
Date:
Sun Apr 10 15:47:33 2016 +1000
Revision:
0:2df78a4443cd
Initial commit

Who changed what in which revision?

UserRevisionLine numberNew 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