Experiment of serial command protocol

Dependencies:   RingBuffer SerialInterfaceProtocol duinotech_16x2_LCD mbed

You can edit this area

Committer:
rba90
Date:
Sun Jun 19 01:39:39 2016 +0000
Revision:
4:658044ad7327
Parent:
3:0c4aa3cec685
Create new library

Who changed what in which revision?

UserRevisionLine numberNew contents of line
rba90 0:2ba6a9f316b6 1 #include "mbed.h"
rba90 0:2ba6a9f316b6 2 #include "freetronicsLCDShield.h"
rba90 0:2ba6a9f316b6 3 #include "buffer.h"
rba90 0:2ba6a9f316b6 4 #include "CommandPacket.h"
rba90 2:54932809c7b2 5 #include "SerialInterfaceProtocol.h"
rba90 0:2ba6a9f316b6 6
rba90 0:2ba6a9f316b6 7 // #define DEBUG_MESSAGE
rba90 0:2ba6a9f316b6 8
rba90 0:2ba6a9f316b6 9 freetronicsLCDShield lcd(D8, D9, D4, D5, D6, D7, D10, A0); // rs, e, d0, d1, d2, d3, bl, a0
rba90 0:2ba6a9f316b6 10 Serial pc(USBTX, USBRX);
rba90 2:54932809c7b2 11 CircularBuffer<uint8_t> SerialInputBuffer;
rba90 2:54932809c7b2 12 CircularBuffer<uint8_t> SerialOutputBuffer;
rba90 2:54932809c7b2 13 SerialInterfaceProtocol SIP(&SerialInputBuffer, &SerialOutputBuffer);
rba90 0:2ba6a9f316b6 14
rba90 0:2ba6a9f316b6 15 void serialInterruptHandler() {
rba90 0:2ba6a9f316b6 16 // Note: you need to actually read from the serial to clear the RX interrupt
rba90 0:2ba6a9f316b6 17 int c = pc.getc();
rba90 0:2ba6a9f316b6 18
rba90 0:2ba6a9f316b6 19 // add to buffer
rba90 2:54932809c7b2 20 if (SerialInputBuffer.isLocked())
rba90 0:2ba6a9f316b6 21 {
rba90 0:2ba6a9f316b6 22 printf("Mutex Locked\r\n");
rba90 0:2ba6a9f316b6 23 }
rba90 0:2ba6a9f316b6 24 else
rba90 0:2ba6a9f316b6 25 {
rba90 2:54932809c7b2 26 SerialInputBuffer.enqueue((uint8_t) c);
rba90 0:2ba6a9f316b6 27 }
rba90 0:2ba6a9f316b6 28 }
rba90 0:2ba6a9f316b6 29
rba90 2:54932809c7b2 30 int toggleLcdBackLight(uint8_t *payload, uint8_t payload_length, uint8_t *response, uint8_t *response_length)
rba90 2:54932809c7b2 31 {
rba90 2:54932809c7b2 32 // wrong payload length
rba90 2:54932809c7b2 33 if (payload_length != 1)
rba90 2:54932809c7b2 34 {
rba90 2:54932809c7b2 35 sprintf((char *) response, "Wrong Payload Length\r\n");
rba90 2:54932809c7b2 36 *response_length = 22;
rba90 2:54932809c7b2 37 return 1;
rba90 2:54932809c7b2 38 }
rba90 2:54932809c7b2 39
rba90 2:54932809c7b2 40 // get payload
rba90 2:54932809c7b2 41 bool lcdBackLight = (bool) payload[0];
rba90 2:54932809c7b2 42
rba90 2:54932809c7b2 43 // set back light
rba90 2:54932809c7b2 44 lcd.setBackLight(lcdBackLight);
rba90 2:54932809c7b2 45
rba90 2:54932809c7b2 46 return 0;
rba90 2:54932809c7b2 47 }
rba90 2:54932809c7b2 48
rba90 2:54932809c7b2 49 int setLcdBackLightIntensity(uint8_t *payload, uint8_t payload_length, uint8_t *response, uint8_t *response_length)
rba90 2:54932809c7b2 50 {
rba90 2:54932809c7b2 51 // set intensity
rba90 2:54932809c7b2 52 lcd.setBackLight((float) atof((char*) payload));
rba90 2:54932809c7b2 53
rba90 2:54932809c7b2 54 return 0;
rba90 2:54932809c7b2 55 }
rba90 2:54932809c7b2 56
rba90 2:54932809c7b2 57 int resetLcd(uint8_t *payload, uint8_t payload_length, uint8_t *response, uint8_t *response_length)
rba90 2:54932809c7b2 58 {
rba90 2:54932809c7b2 59 // no payload
rba90 2:54932809c7b2 60 if (payload_length != 0)
rba90 2:54932809c7b2 61 {
rba90 2:54932809c7b2 62 sprintf((char *) response, "Wrong Payload Length\r\n");
rba90 2:54932809c7b2 63 *response_length = 22;
rba90 2:54932809c7b2 64 return 1;
rba90 2:54932809c7b2 65 }
rba90 2:54932809c7b2 66
rba90 2:54932809c7b2 67 // reset display and settings
rba90 2:54932809c7b2 68 lcd.cls();
rba90 2:54932809c7b2 69
rba90 2:54932809c7b2 70 return 0;
rba90 2:54932809c7b2 71 }
rba90 2:54932809c7b2 72
rba90 2:54932809c7b2 73 int setLcdCursorPosition(uint8_t *payload, uint8_t payload_length, uint8_t *response, uint8_t *response_length)
rba90 0:2ba6a9f316b6 74 {
rba90 2:54932809c7b2 75 // two payloads
rba90 2:54932809c7b2 76 if (payload_length != 2)
rba90 0:2ba6a9f316b6 77 {
rba90 2:54932809c7b2 78 sprintf((char *) response, "Wrong Payload Length\r\n");
rba90 2:54932809c7b2 79 *response_length = 22;
rba90 2:54932809c7b2 80 return 1;
rba90 2:54932809c7b2 81 }
rba90 2:54932809c7b2 82
rba90 2:54932809c7b2 83 // set current cursor location
rba90 2:54932809c7b2 84 lcd.setCursorPosition(
rba90 2:54932809c7b2 85 (bool) payload[0],
rba90 2:54932809c7b2 86 (bool) payload[1]
rba90 2:54932809c7b2 87 );
rba90 2:54932809c7b2 88
rba90 2:54932809c7b2 89 return 0;
rba90 2:54932809c7b2 90 }
rba90 2:54932809c7b2 91
rba90 2:54932809c7b2 92 int setLcdCursorProperty(uint8_t *payload, uint8_t payload_length, uint8_t *response, uint8_t *response_length)
rba90 2:54932809c7b2 93 {
rba90 2:54932809c7b2 94 // two payloads
rba90 2:54932809c7b2 95 if (payload_length != 2)
rba90 2:54932809c7b2 96 {
rba90 2:54932809c7b2 97 sprintf((char *) response, "Wrong Payload Length\r\n");
rba90 2:54932809c7b2 98 *response_length = 22;
rba90 2:54932809c7b2 99 return 1;
rba90 2:54932809c7b2 100 }
rba90 2:54932809c7b2 101
rba90 2:54932809c7b2 102 lcd.setCursor(
rba90 2:54932809c7b2 103 (bool) payload[0],
rba90 2:54932809c7b2 104 (bool) payload[1]
rba90 2:54932809c7b2 105 );
rba90 2:54932809c7b2 106
rba90 2:54932809c7b2 107 return 0;
rba90 2:54932809c7b2 108 }
rba90 2:54932809c7b2 109
rba90 2:54932809c7b2 110 int lcdPrintToLine(uint8_t *payload, uint8_t payload_length, uint8_t *response, uint8_t *response_length)
rba90 2:54932809c7b2 111 {
rba90 2:54932809c7b2 112 // set cursor position
rba90 2:54932809c7b2 113 lcd.setCursorPosition(payload[0], 0);
rba90 2:54932809c7b2 114
rba90 2:54932809c7b2 115 // print to screen
rba90 2:54932809c7b2 116 lcd.printf((char *) (payload + 1));
rba90 2:54932809c7b2 117
rba90 2:54932809c7b2 118 return 0;
rba90 2:54932809c7b2 119 }
rba90 2:54932809c7b2 120
rba90 2:54932809c7b2 121 int lcdAppendPrint(uint8_t *payload, uint8_t payload_length, uint8_t *response, uint8_t *response_length)
rba90 2:54932809c7b2 122 {
rba90 2:54932809c7b2 123 // print to screen
rba90 2:54932809c7b2 124 lcd.printf((char *) payload);
rba90 2:54932809c7b2 125
rba90 2:54932809c7b2 126 return 0;
rba90 2:54932809c7b2 127 }
rba90 2:54932809c7b2 128
rba90 2:54932809c7b2 129 int toggleChecksum(uint8_t *payload, uint8_t payload_length, uint8_t *response, uint8_t *response_length)
rba90 2:54932809c7b2 130 {
rba90 2:54932809c7b2 131 // one payload
rba90 2:54932809c7b2 132 if (payload_length != 1)
rba90 2:54932809c7b2 133 {
rba90 2:54932809c7b2 134 sprintf((char *) response, "Wrong Payload Length\r\n");
rba90 2:54932809c7b2 135 *response_length = 22;
rba90 2:54932809c7b2 136 return 1;
rba90 2:54932809c7b2 137 }
rba90 2:54932809c7b2 138
rba90 2:54932809c7b2 139 if ((bool) payload[0])
rba90 2:54932809c7b2 140 {
rba90 2:54932809c7b2 141 SIP.enableChecksum();
rba90 0:2ba6a9f316b6 142 }
rba90 2:54932809c7b2 143 else
rba90 2:54932809c7b2 144 {
rba90 2:54932809c7b2 145 SIP.disableChecksum();
rba90 2:54932809c7b2 146 }
rba90 2:54932809c7b2 147
rba90 2:54932809c7b2 148 return 0;
rba90 0:2ba6a9f316b6 149 }
rba90 3:0c4aa3cec685 150
rba90 3:0c4aa3cec685 151 int setBaudRate(uint8_t *payload, uint8_t payload_length, uint8_t *response, uint8_t *response_length)
rba90 3:0c4aa3cec685 152 {
rba90 3:0c4aa3cec685 153 int baudRate = atoi((char *)payload);
rba90 3:0c4aa3cec685 154
rba90 3:0c4aa3cec685 155 // set baud rate
rba90 3:0c4aa3cec685 156 pc.baud(baudRate);
rba90 3:0c4aa3cec685 157
rba90 3:0c4aa3cec685 158 return 0;
rba90 3:0c4aa3cec685 159 }
rba90 3:0c4aa3cec685 160
rba90 3:0c4aa3cec685 161 int echoPayload(uint8_t *payload, uint8_t payload_length, uint8_t *response, uint8_t *response_length)
rba90 3:0c4aa3cec685 162 {
rba90 3:0c4aa3cec685 163 memcpy(response, payload, payload_length);
rba90 3:0c4aa3cec685 164 *response_length = payload_length;
rba90 3:0c4aa3cec685 165
rba90 3:0c4aa3cec685 166 return 0;
rba90 3:0c4aa3cec685 167 }
rba90 0:2ba6a9f316b6 168
rba90 0:2ba6a9f316b6 169 int main() {
rba90 0:2ba6a9f316b6 170 // turn on the back light (it's off by default)
rba90 0:2ba6a9f316b6 171 lcd.setBackLight(true);
rba90 0:2ba6a9f316b6 172 lcd.setCursor(true, true);
rba90 0:2ba6a9f316b6 173 lcd.cls();
rba90 0:2ba6a9f316b6 174
rba90 0:2ba6a9f316b6 175 pc.attach(&serialInterruptHandler);
rba90 0:2ba6a9f316b6 176
rba90 2:54932809c7b2 177 // control
rba90 2:54932809c7b2 178 SIP.registerCommand(0x00, toggleChecksum);
rba90 3:0c4aa3cec685 179 SIP.registerCommand(0x01, setBaudRate);
rba90 3:0c4aa3cec685 180
rba90 3:0c4aa3cec685 181 // misc
rba90 3:0c4aa3cec685 182 SIP.registerCommand(0xe0, echoPayload);
rba90 2:54932809c7b2 183
rba90 2:54932809c7b2 184 // lcd
rba90 2:54932809c7b2 185 SIP.registerCommand(0xf0, toggleLcdBackLight);
rba90 2:54932809c7b2 186 SIP.registerCommand(0xf1, setLcdBackLightIntensity);
rba90 2:54932809c7b2 187 SIP.registerCommand(0xf2, resetLcd);
rba90 2:54932809c7b2 188 SIP.registerCommand(0xf3, setLcdCursorPosition);
rba90 2:54932809c7b2 189 SIP.registerCommand(0xf4, setLcdCursorProperty);
rba90 2:54932809c7b2 190 SIP.registerCommand(0xf5, lcdPrintToLine);
rba90 2:54932809c7b2 191 SIP.registerCommand(0xf6, lcdAppendPrint);
rba90 2:54932809c7b2 192
rba90 2:54932809c7b2 193
rba90 2:54932809c7b2 194
rba90 0:2ba6a9f316b6 195 while (1)
rba90 0:2ba6a9f316b6 196 {
rba90 2:54932809c7b2 197 SIP.poll();
rba90 0:2ba6a9f316b6 198 // button event
rba90 0:2ba6a9f316b6 199 switch (lcd.readButton())
rba90 0:2ba6a9f316b6 200 {
rba90 0:2ba6a9f316b6 201 case freetronicsLCDShield::BTN_SELECT:
rba90 0:2ba6a9f316b6 202 lcd.cls();
rba90 0:2ba6a9f316b6 203 break;
rba90 0:2ba6a9f316b6 204 case freetronicsLCDShield::BTN_UP:
rba90 0:2ba6a9f316b6 205 break;
rba90 0:2ba6a9f316b6 206 case freetronicsLCDShield::BTN_DOWN:
rba90 0:2ba6a9f316b6 207 break;
rba90 0:2ba6a9f316b6 208 case freetronicsLCDShield::BTN_LEFT:
rba90 0:2ba6a9f316b6 209 break;
rba90 0:2ba6a9f316b6 210 case freetronicsLCDShield::BTN_RIGHT:
rba90 0:2ba6a9f316b6 211 break;
rba90 0:2ba6a9f316b6 212 default:
rba90 0:2ba6a9f316b6 213 break;
rba90 0:2ba6a9f316b6 214 }
rba90 0:2ba6a9f316b6 215
rba90 0:2ba6a9f316b6 216
rba90 2:54932809c7b2 217 // extract buffer
rba90 2:54932809c7b2 218 while (SerialOutputBuffer.getCounter() > 0)
rba90 2:54932809c7b2 219 {
rba90 2:54932809c7b2 220 uint8_t ch;
rba90 2:54932809c7b2 221 ch = SerialOutputBuffer.dequeue();
rba90 2:54932809c7b2 222 pc.putc(ch);
rba90 2:54932809c7b2 223 }
rba90 0:2ba6a9f316b6 224 }
rba90 0:2ba6a9f316b6 225 }