Maxime Kmiec / Mbed 2 deprecated PROJECT

Dependencies:   mbed SDFileSystem

Committer:
adragar
Date:
Tue May 04 12:30:39 2021 +0000
Revision:
4:a73ad3555745
Code Maxime

Who changed what in which revision?

UserRevisionLine numberNew contents of line
adragar 4:a73ad3555745 1
adragar 4:a73ad3555745 2 #include "mbed.h"
adragar 4:a73ad3555745 3 #include "mbed_genie.h"
adragar 4:a73ad3555745 4
adragar 4:a73ad3555745 5 DigitalOut genieReset(PC_7); //genie reset pin on pin 8 of the mbed
adragar 4:a73ad3555745 6
adragar 4:a73ad3555745 7 Serial screen(PA_9,PA_10);
adragar 4:a73ad3555745 8 Serial pcusb(USBTX,USBRX);
adragar 4:a73ad3555745 9 Timer t;
adragar 4:a73ad3555745 10
adragar 4:a73ad3555745 11
adragar 4:a73ad3555745 12
adragar 4:a73ad3555745 13 void _genieFlushEventQueue (void);
adragar 4:a73ad3555745 14 void _handleError (void);
adragar 4:a73ad3555745 15 void _geniePutchar (uint8_t c);
adragar 4:a73ad3555745 16 uint8_t _genieGetchar (void);
adragar 4:a73ad3555745 17 void _genieSetLinkState (uint16_t newstate);
adragar 4:a73ad3555745 18 uint16_t _genieGetLinkState (void);
adragar 4:a73ad3555745 19 bool _genieEnqueueEvent (uint8_t * data);
adragar 4:a73ad3555745 20 //////////////////////////////////////////////////////////////
adragar 4:a73ad3555745 21 // A structure to hold up to MAX_GENIE_EVENTS events receive
adragar 4:a73ad3555745 22 // from the display
adragar 4:a73ad3555745 23 //
adragar 4:a73ad3555745 24 static genieEventQueueStruct _genieEventQueue;
adragar 4:a73ad3555745 25
adragar 4:a73ad3555745 26 //////////////////////////////////////////////////////////////
adragar 4:a73ad3555745 27 // Pointer to the user's event handler function
adragar 4:a73ad3555745 28 //
adragar 4:a73ad3555745 29 static genieUserEventHandlerPtr _genieUserHandler = NULL;
adragar 4:a73ad3555745 30
adragar 4:a73ad3555745 31
adragar 4:a73ad3555745 32 //////////////////////////////////////////////////////////////
adragar 4:a73ad3555745 33 // Simple 5-deep stack for the link state, this allows
adragar 4:a73ad3555745 34 // genieDoEvents() to save the current state, receive a frame,
adragar 4:a73ad3555745 35 // then restore the state
adragar 4:a73ad3555745 36 //
adragar 4:a73ad3555745 37 static uint8_t _genieLinkStates[5] = {GENIE_LINK_IDLE};
adragar 4:a73ad3555745 38 //
adragar 4:a73ad3555745 39 // Stack pointer
adragar 4:a73ad3555745 40 //
adragar 4:a73ad3555745 41 static uint8_t *_genieLinkState = &_genieLinkStates[0];
adragar 4:a73ad3555745 42
adragar 4:a73ad3555745 43
adragar 4:a73ad3555745 44 //////////////////////////////////////////////////////////////
adragar 4:a73ad3555745 45 // Number of mS the genieGetChar() function will wait before
adragar 4:a73ad3555745 46 // giving up on the display
adragar 4:a73ad3555745 47 static int _genieTimeout = TIMEOUT_PERIOD;
adragar 4:a73ad3555745 48
adragar 4:a73ad3555745 49
adragar 4:a73ad3555745 50 //////////////////////////////////////////////////////////////
adragar 4:a73ad3555745 51 // Number of times we have had a timeout
adragar 4:a73ad3555745 52 static int _genieTimeouts = 0;
adragar 4:a73ad3555745 53
adragar 4:a73ad3555745 54
adragar 4:a73ad3555745 55 //////////////////////////////////////////////////////////////
adragar 4:a73ad3555745 56 // Global error variable
adragar 4:a73ad3555745 57 static int _genieError = ERROR_NONE;
adragar 4:a73ad3555745 58
adragar 4:a73ad3555745 59
adragar 4:a73ad3555745 60
adragar 4:a73ad3555745 61
adragar 4:a73ad3555745 62 static uint8_t rxframe_count = 0;
adragar 4:a73ad3555745 63
adragar 4:a73ad3555745 64
adragar 4:a73ad3555745 65 //////////////////////////////////////////////////////////////
adragar 4:a73ad3555745 66 // Number of fatal errors encountered
adragar 4:a73ad3555745 67 static int _genieFatalErrors = 0;
adragar 4:a73ad3555745 68 ////////////////////// genieGetEventData ////////////////////////
adragar 4:a73ad3555745 69 //
adragar 4:a73ad3555745 70 // Returns the LSB and MSB of the event's data combined into
adragar 4:a73ad3555745 71 // a single uint16
adragar 4:a73ad3555745 72 //
adragar 4:a73ad3555745 73 // The data is transmitted from the display in big-endian format
adragar 4:a73ad3555745 74 // and stored the same so the user can't just access it as an int
adragar 4:a73ad3555745 75 // directly from the structure.
adragar 4:a73ad3555745 76 //
adragar 4:a73ad3555745 77 uint16_t genieGetEventData (genieFrame * e) {
adragar 4:a73ad3555745 78 return (e->reportObject.data_msb << 8) + e->reportObject.data_lsb;
adragar 4:a73ad3555745 79 }
adragar 4:a73ad3555745 80
adragar 4:a73ad3555745 81
adragar 4:a73ad3555745 82
adragar 4:a73ad3555745 83
adragar 4:a73ad3555745 84 //////////////////////// genieEventIs ///////////////////////////
adragar 4:a73ad3555745 85 //
adragar 4:a73ad3555745 86 // Compares the cmd, object and index fields of the event's
adragar 4:a73ad3555745 87 // structure.
adragar 4:a73ad3555745 88 //
adragar 4:a73ad3555745 89 // Returns: TRUE if all the fields match the caller's parms
adragar 4:a73ad3555745 90 // FALSE if any of them don't
adragar 4:a73ad3555745 91 //
adragar 4:a73ad3555745 92 bool genieEventIs(genieFrame * e, uint8_t cmd, uint8_t object, uint8_t index) {
adragar 4:a73ad3555745 93
adragar 4:a73ad3555745 94
adragar 4:a73ad3555745 95 return (e->reportObject.cmd == cmd &&
adragar 4:a73ad3555745 96 e->reportObject.object == object &&
adragar 4:a73ad3555745 97 e->reportObject.index == index);
adragar 4:a73ad3555745 98
adragar 4:a73ad3555745 99
adragar 4:a73ad3555745 100 }
adragar 4:a73ad3555745 101
adragar 4:a73ad3555745 102 ////////////////////// _geniePushLinkState //////////////////////
adragar 4:a73ad3555745 103 //
adragar 4:a73ad3555745 104 // Push a link state onto a FILO stack
adragar 4:a73ad3555745 105 //
adragar 4:a73ad3555745 106 void _geniePushLinkState (uint8_t newstate) {
adragar 4:a73ad3555745 107
adragar 4:a73ad3555745 108
adragar 4:a73ad3555745 109 _genieLinkState++;
adragar 4:a73ad3555745 110 _genieSetLinkState(newstate);
adragar 4:a73ad3555745 111
adragar 4:a73ad3555745 112
adragar 4:a73ad3555745 113 }
adragar 4:a73ad3555745 114
adragar 4:a73ad3555745 115
adragar 4:a73ad3555745 116 ////////////////////// _geniePopLinkState //////////////////////
adragar 4:a73ad3555745 117 //
adragar 4:a73ad3555745 118 // Pop a link state from a FILO stack
adragar 4:a73ad3555745 119 //
adragar 4:a73ad3555745 120 void _geniePopLinkState (void) {
adragar 4:a73ad3555745 121 if (_genieLinkState > &_genieLinkStates[0]) {
adragar 4:a73ad3555745 122 *_genieLinkState = 0xFF;
adragar 4:a73ad3555745 123 _genieLinkState--;
adragar 4:a73ad3555745 124 }
adragar 4:a73ad3555745 125 }
adragar 4:a73ad3555745 126
adragar 4:a73ad3555745 127 ///////////////// _genieFlushSerialInput ///////////////////
adragar 4:a73ad3555745 128 //
adragar 4:a73ad3555745 129 // Removes and discards all characters from the currently
adragar 4:a73ad3555745 130 // used serial port's Rx buffer.
adragar 4:a73ad3555745 131 //
adragar 4:a73ad3555745 132 void _genieFlushSerialInput(void) {
adragar 4:a73ad3555745 133 do {
adragar 4:a73ad3555745 134 _genieGetchar();
adragar 4:a73ad3555745 135 } while (_genieError != ERROR_NOCHAR);
adragar 4:a73ad3555745 136 }
adragar 4:a73ad3555745 137
adragar 4:a73ad3555745 138 ///////////////////////// _handleError /////////////////////////
adragar 4:a73ad3555745 139 //
adragar 4:a73ad3555745 140 // So far really just a debugging aid, but can be enhanced to
adragar 4:a73ad3555745 141 // help recover from errors.
adragar 4:a73ad3555745 142 //
adragar 4:a73ad3555745 143 void _handleError (void) {
adragar 4:a73ad3555745 144 // Serial2.write (_genieError + (1<<5));
adragar 4:a73ad3555745 145 // if (_genieError == GENIE_NAK) genieResync();
adragar 4:a73ad3555745 146 }
adragar 4:a73ad3555745 147
adragar 4:a73ad3555745 148
adragar 4:a73ad3555745 149
adragar 4:a73ad3555745 150
adragar 4:a73ad3555745 151 ////////////////////// _genieFlushEventQueue ////////////////////
adragar 4:a73ad3555745 152 //
adragar 4:a73ad3555745 153 // Reset all the event queue variables and start from scratch.
adragar 4:a73ad3555745 154 //
adragar 4:a73ad3555745 155 void _genieFlushEventQueue(void) {
adragar 4:a73ad3555745 156 _genieEventQueue.rd_index = 0;
adragar 4:a73ad3555745 157 _genieEventQueue.wr_index = 0;
adragar 4:a73ad3555745 158 _genieEventQueue.n_events = 0;
adragar 4:a73ad3555745 159 }
adragar 4:a73ad3555745 160 bool GenieReadable(void){
adragar 4:a73ad3555745 161 if (screen.readable())
adragar 4:a73ad3555745 162 {
adragar 4:a73ad3555745 163 return TRUE;
adragar 4:a73ad3555745 164 }
adragar 4:a73ad3555745 165 else
adragar 4:a73ad3555745 166 {
adragar 4:a73ad3555745 167 return FALSE;
adragar 4:a73ad3555745 168 }
adragar 4:a73ad3555745 169 }
adragar 4:a73ad3555745 170 ///////////////////////// genieDoEvents /////////////////////////
adragar 4:a73ad3555745 171 //
adragar 4:a73ad3555745 172 // This is the heart of the Genie comms state machine.
adragar 4:a73ad3555745 173 //
adragar 4:a73ad3555745 174 uint16_t genieDoEvents (void) {
adragar 4:a73ad3555745 175 uint8_t c;
adragar 4:a73ad3555745 176 static uint8_t rx_data[6];
adragar 4:a73ad3555745 177 static uint8_t checksum = 0;
adragar 4:a73ad3555745 178
adragar 4:a73ad3555745 179 if (GenieReadable())
adragar 4:a73ad3555745 180 {
adragar 4:a73ad3555745 181 c = _genieGetchar();
adragar 4:a73ad3555745 182 //pc.putc(c);
adragar 4:a73ad3555745 183
adragar 4:a73ad3555745 184 ////////////////////////////////////////////
adragar 4:a73ad3555745 185 //
adragar 4:a73ad3555745 186 // If there are no characters to process and we have
adragar 4:a73ad3555745 187 // queued events call the user's handler function.
adragar 4:a73ad3555745 188 //
adragar 4:a73ad3555745 189 if (_genieError == ERROR_NOCHAR) {
adragar 4:a73ad3555745 190 //pc.printf("EventCalled!\n\r");
adragar 4:a73ad3555745 191 if (_genieEventQueue.n_events > 0 && _genieUserHandler!= NULL) (_genieUserHandler)();
adragar 4:a73ad3555745 192 return GENIE_EVENT_NONE;
adragar 4:a73ad3555745 193 }
adragar 4:a73ad3555745 194
adragar 4:a73ad3555745 195 ///////////////////////////////////////////
adragar 4:a73ad3555745 196 //
adragar 4:a73ad3555745 197 // Main state machine
adragar 4:a73ad3555745 198 //
adragar 4:a73ad3555745 199 switch (_genieGetLinkState()) {
adragar 4:a73ad3555745 200 case GENIE_LINK_IDLE:
adragar 4:a73ad3555745 201 switch (c) {
adragar 4:a73ad3555745 202 case GENIE_REPORT_EVENT:
adragar 4:a73ad3555745 203 // event frame out of the blue, set the link state
adragar 4:a73ad3555745 204 // and fall through to the frame-accumulate code
adragar 4:a73ad3555745 205 // at the end of this function
adragar 4:a73ad3555745 206 _geniePushLinkState(GENIE_LINK_RXEVENT);
adragar 4:a73ad3555745 207 break;
adragar 4:a73ad3555745 208
adragar 4:a73ad3555745 209 default:
adragar 4:a73ad3555745 210 // error, bad character, no other character
adragar 4:a73ad3555745 211 // is acceptable in this state
adragar 4:a73ad3555745 212 return GENIE_EVENT_RXCHAR;
adragar 4:a73ad3555745 213
adragar 4:a73ad3555745 214 }
adragar 4:a73ad3555745 215 break;
adragar 4:a73ad3555745 216
adragar 4:a73ad3555745 217 case GENIE_LINK_WFAN:
adragar 4:a73ad3555745 218 switch (c) {
adragar 4:a73ad3555745 219
adragar 4:a73ad3555745 220
adragar 4:a73ad3555745 221 case GENIE_ACK:
adragar 4:a73ad3555745 222 _geniePopLinkState();
adragar 4:a73ad3555745 223 return GENIE_EVENT_RXCHAR;
adragar 4:a73ad3555745 224
adragar 4:a73ad3555745 225
adragar 4:a73ad3555745 226 case GENIE_NAK:
adragar 4:a73ad3555745 227 _geniePopLinkState();
adragar 4:a73ad3555745 228 _genieError = ERROR_NAK;
adragar 4:a73ad3555745 229 _handleError();
adragar 4:a73ad3555745 230 return GENIE_EVENT_RXCHAR;
adragar 4:a73ad3555745 231
adragar 4:a73ad3555745 232 case GENIE_REPORT_EVENT:
adragar 4:a73ad3555745 233 // event frame out of the blue while waiting for an ACK
adragar 4:a73ad3555745 234 // save/set the link state and fall through to the
adragar 4:a73ad3555745 235 // frame-accumulate code at the end of this function
adragar 4:a73ad3555745 236 _geniePushLinkState(GENIE_LINK_RXEVENT);
adragar 4:a73ad3555745 237 break;
adragar 4:a73ad3555745 238
adragar 4:a73ad3555745 239
adragar 4:a73ad3555745 240 case GENIE_REPORT_OBJ:
adragar 4:a73ad3555745 241 default:
adragar 4:a73ad3555745 242 // error, bad character
adragar 4:a73ad3555745 243 return GENIE_EVENT_RXCHAR;
adragar 4:a73ad3555745 244 }
adragar 4:a73ad3555745 245 break;
adragar 4:a73ad3555745 246
adragar 4:a73ad3555745 247
adragar 4:a73ad3555745 248 case GENIE_LINK_WF_RXREPORT: // waiting for the first byte of a report
adragar 4:a73ad3555745 249 switch (c) {
adragar 4:a73ad3555745 250
adragar 4:a73ad3555745 251 case GENIE_REPORT_EVENT:
adragar 4:a73ad3555745 252 // event frame out of the blue while waiting for the first
adragar 4:a73ad3555745 253 // byte of a report frame
adragar 4:a73ad3555745 254 // save/set the link state and fall through to the
adragar 4:a73ad3555745 255 // frame-accumulate code at the end of this function
adragar 4:a73ad3555745 256 _geniePushLinkState(GENIE_LINK_RXEVENT);
adragar 4:a73ad3555745 257 break;
adragar 4:a73ad3555745 258
adragar 4:a73ad3555745 259
adragar 4:a73ad3555745 260 case GENIE_REPORT_OBJ:
adragar 4:a73ad3555745 261 // first byte of a report frame
adragar 4:a73ad3555745 262 // replace the GENIE_LINK_WF_RXREPORT link state
adragar 4:a73ad3555745 263 // with GENIE_LINK_RXREPORT to indicate that we
adragar 4:a73ad3555745 264 // are now receiving a report frame
adragar 4:a73ad3555745 265 _geniePopLinkState();
adragar 4:a73ad3555745 266 _geniePushLinkState(GENIE_LINK_RXREPORT);
adragar 4:a73ad3555745 267 break;
adragar 4:a73ad3555745 268
adragar 4:a73ad3555745 269
adragar 4:a73ad3555745 270 case GENIE_ACK:
adragar 4:a73ad3555745 271 case GENIE_NAK:
adragar 4:a73ad3555745 272 default:
adragar 4:a73ad3555745 273 // error, bad character
adragar 4:a73ad3555745 274 return GENIE_EVENT_RXCHAR;
adragar 4:a73ad3555745 275 // break;
adragar 4:a73ad3555745 276 }
adragar 4:a73ad3555745 277
adragar 4:a73ad3555745 278
adragar 4:a73ad3555745 279 case GENIE_LINK_RXREPORT: // already receiving report
adragar 4:a73ad3555745 280 case GENIE_LINK_RXEVENT: // already receiving event
adragar 4:a73ad3555745 281 default:
adragar 4:a73ad3555745 282 break;
adragar 4:a73ad3555745 283
adragar 4:a73ad3555745 284 }
adragar 4:a73ad3555745 285
adragar 4:a73ad3555745 286
adragar 4:a73ad3555745 287 ///////////////////////////////////////////////////////
adragar 4:a73ad3555745 288 // We get here if we are in the process of receiving
adragar 4:a73ad3555745 289 // a report or event frame. Accumulate GENIE_FRAME_SIZE
adragar 4:a73ad3555745 290 // bytes into a local buffer then queue them as a frame
adragar 4:a73ad3555745 291 // into the event queue
adragar 4:a73ad3555745 292 //
adragar 4:a73ad3555745 293 if (_genieGetLinkState() == GENIE_LINK_RXREPORT || \
adragar 4:a73ad3555745 294 _genieGetLinkState() == GENIE_LINK_RXEVENT) {
adragar 4:a73ad3555745 295
adragar 4:a73ad3555745 296 checksum = (rxframe_count == 0) ? c : checksum ^ c;
adragar 4:a73ad3555745 297
adragar 4:a73ad3555745 298
adragar 4:a73ad3555745 299 rx_data[rxframe_count] = c;
adragar 4:a73ad3555745 300
adragar 4:a73ad3555745 301
adragar 4:a73ad3555745 302 if (rxframe_count == GENIE_FRAME_SIZE -1) {
adragar 4:a73ad3555745 303 //pc.printf("FrameReceived!\n\r");
adragar 4:a73ad3555745 304 // all bytes received, if the CS is good
adragar 4:a73ad3555745 305 // queue the frame and restore the link state
adragar 4:a73ad3555745 306 if (checksum == 0) {
adragar 4:a73ad3555745 307 _genieEnqueueEvent(rx_data);
adragar 4:a73ad3555745 308 if (_genieEventQueue.n_events > 0 && _genieUserHandler!= NULL) (_genieUserHandler)();
adragar 4:a73ad3555745 309 //return GENIE_EVENT_NONE;
adragar 4:a73ad3555745 310 rxframe_count = 0;
adragar 4:a73ad3555745 311 // revert the link state to whatever it was before
adragar 4:a73ad3555745 312 // we started accumulating this frame
adragar 4:a73ad3555745 313 _geniePopLinkState();
adragar 4:a73ad3555745 314 return GENIE_EVENT_RXCHAR;
adragar 4:a73ad3555745 315 } else {
adragar 4:a73ad3555745 316 _genieError = ERROR_BAD_CS;
adragar 4:a73ad3555745 317 _handleError();
adragar 4:a73ad3555745 318 }
adragar 4:a73ad3555745 319 }
adragar 4:a73ad3555745 320 rxframe_count++;
adragar 4:a73ad3555745 321 return GENIE_EVENT_RXCHAR;
adragar 4:a73ad3555745 322 }
adragar 4:a73ad3555745 323 }
adragar 4:a73ad3555745 324 }
adragar 4:a73ad3555745 325
adragar 4:a73ad3555745 326 ////////////////////// genieDequeueEvent ///////////////////
adragar 4:a73ad3555745 327 //
adragar 4:a73ad3555745 328 // Copy the bytes from a queued input event to a buffer supplied
adragar 4:a73ad3555745 329 // by the caller.
adragar 4:a73ad3555745 330 //
adragar 4:a73ad3555745 331 // Parms: genieFrame * buff, a pointer to the user's buffer
adragar 4:a73ad3555745 332 //
adragar 4:a73ad3555745 333 // Returns: TRUE if there was an event to copy
adragar 4:a73ad3555745 334 // FALSE if not
adragar 4:a73ad3555745 335 //
adragar 4:a73ad3555745 336 bool genieDequeueEvent(genieFrame * buff) {
adragar 4:a73ad3555745 337
adragar 4:a73ad3555745 338
adragar 4:a73ad3555745 339 if (_genieEventQueue.n_events > 0) {
adragar 4:a73ad3555745 340 memcpy (buff, &_genieEventQueue.frames[_genieEventQueue.rd_index],
adragar 4:a73ad3555745 341 GENIE_FRAME_SIZE);
adragar 4:a73ad3555745 342 _genieEventQueue.rd_index++;
adragar 4:a73ad3555745 343 _genieEventQueue.rd_index &= MAX_GENIE_EVENTS -1;
adragar 4:a73ad3555745 344 _genieEventQueue.n_events--;
adragar 4:a73ad3555745 345 return TRUE;
adragar 4:a73ad3555745 346 }
adragar 4:a73ad3555745 347 return FALSE;
adragar 4:a73ad3555745 348 }
adragar 4:a73ad3555745 349
adragar 4:a73ad3555745 350
adragar 4:a73ad3555745 351
adragar 4:a73ad3555745 352
adragar 4:a73ad3555745 353
adragar 4:a73ad3555745 354 ////////////////////// _genieWaitForIdle ////////////////////////
adragar 4:a73ad3555745 355 //
adragar 4:a73ad3555745 356 // Wait for the link to become idle or for the timeout period,
adragar 4:a73ad3555745 357 // whichever comes first.
adragar 4:a73ad3555745 358 //
adragar 4:a73ad3555745 359 void _genieWaitForIdle (void) {
adragar 4:a73ad3555745 360 uint16_t do_event_result;
adragar 4:a73ad3555745 361 long timeout = t.read_ms() + _genieTimeout;
adragar 4:a73ad3555745 362
adragar 4:a73ad3555745 363 for ( ; t.read_ms() < timeout;) {
adragar 4:a73ad3555745 364
adragar 4:a73ad3555745 365
adragar 4:a73ad3555745 366 do_event_result = genieDoEvents();
adragar 4:a73ad3555745 367 // if there was a character received from the
adragar 4:a73ad3555745 368 // display restart the timeout because doEvents
adragar 4:a73ad3555745 369 // is in the process of receiving something
adragar 4:a73ad3555745 370 if (do_event_result == GENIE_EVENT_RXCHAR) {
adragar 4:a73ad3555745 371 timeout = t.read_ms() + _genieTimeout;
adragar 4:a73ad3555745 372 return;
adragar 4:a73ad3555745 373 }
adragar 4:a73ad3555745 374
adragar 4:a73ad3555745 375 if (_genieGetLinkState() == GENIE_LINK_IDLE) {
adragar 4:a73ad3555745 376 return;
adragar 4:a73ad3555745 377 }
adragar 4:a73ad3555745 378 }
adragar 4:a73ad3555745 379 _genieError = ERROR_TIMEOUT;
adragar 4:a73ad3555745 380 _handleError();
adragar 4:a73ad3555745 381 return;
adragar 4:a73ad3555745 382 }
adragar 4:a73ad3555745 383
adragar 4:a73ad3555745 384 ///////////////////////// genieWriteObject //////////////////////
adragar 4:a73ad3555745 385 //
adragar 4:a73ad3555745 386 // Write data to an object on the display
adragar 4:a73ad3555745 387 //
adragar 4:a73ad3555745 388 uint16_t genieWriteObject (uint16_t object, uint16_t index, uint16_t data)
adragar 4:a73ad3555745 389 {
adragar 4:a73ad3555745 390 uint16_t msb, lsb ;
adragar 4:a73ad3555745 391 uint8_t checksum ;
adragar 4:a73ad3555745 392
adragar 4:a73ad3555745 393
adragar 4:a73ad3555745 394 _genieWaitForIdle();
adragar 4:a73ad3555745 395
adragar 4:a73ad3555745 396
adragar 4:a73ad3555745 397 lsb = data&0xFF;
adragar 4:a73ad3555745 398 msb = (data>>8) & 0xFF;
adragar 4:a73ad3555745 399
adragar 4:a73ad3555745 400
adragar 4:a73ad3555745 401 _genieError = ERROR_NONE;
adragar 4:a73ad3555745 402
adragar 4:a73ad3555745 403
adragar 4:a73ad3555745 404 _geniePutchar(GENIE_WRITE_OBJ) ; checksum = GENIE_WRITE_OBJ ;
adragar 4:a73ad3555745 405 _geniePutchar(object) ; checksum ^= object ;
adragar 4:a73ad3555745 406 _geniePutchar(index) ; checksum ^= index ;
adragar 4:a73ad3555745 407 _geniePutchar(msb) ; checksum ^= msb;
adragar 4:a73ad3555745 408 _geniePutchar(lsb) ; checksum ^= lsb;
adragar 4:a73ad3555745 409 _geniePutchar(checksum) ;
adragar 4:a73ad3555745 410
adragar 4:a73ad3555745 411
adragar 4:a73ad3555745 412 _geniePushLinkState(GENIE_LINK_WFAN);
adragar 4:a73ad3555745 413 }
adragar 4:a73ad3555745 414
adragar 4:a73ad3555745 415 /////////////////////// genieWriteContrast //////////////////////
adragar 4:a73ad3555745 416 //
adragar 4:a73ad3555745 417 // Alter the display contrast (backlight)
adragar 4:a73ad3555745 418 //
adragar 4:a73ad3555745 419 // Parms: uint8_t value: The required contrast setting, only
adragar 4:a73ad3555745 420 // values from 0 to 15 are valid. 0 or 1 for most displays
adragar 4:a73ad3555745 421 // and 0 to 15 for the uLCD-43
adragar 4:a73ad3555745 422 //
adragar 4:a73ad3555745 423 void genieWriteContrast (uint16_t value) {
adragar 4:a73ad3555745 424 unsigned int checksum ;
adragar 4:a73ad3555745 425
adragar 4:a73ad3555745 426
adragar 4:a73ad3555745 427 _genieWaitForIdle();
adragar 4:a73ad3555745 428
adragar 4:a73ad3555745 429
adragar 4:a73ad3555745 430 _geniePutchar(GENIE_WRITE_CONTRAST) ; checksum = GENIE_WRITE_CONTRAST ;
adragar 4:a73ad3555745 431 _geniePutchar(value) ; checksum ^= value ;
adragar 4:a73ad3555745 432 _geniePutchar(checksum) ;
adragar 4:a73ad3555745 433
adragar 4:a73ad3555745 434
adragar 4:a73ad3555745 435 _geniePushLinkState(GENIE_LINK_WFAN);
adragar 4:a73ad3555745 436
adragar 4:a73ad3555745 437
adragar 4:a73ad3555745 438 }
adragar 4:a73ad3555745 439
adragar 4:a73ad3555745 440
adragar 4:a73ad3555745 441 //////////////////////// _genieWriteStrX ///////////////////////
adragar 4:a73ad3555745 442 //
adragar 4:a73ad3555745 443 // Non-user function used by genieWriteStr() and genieWriteStrU()
adragar 4:a73ad3555745 444 //
adragar 4:a73ad3555745 445 static int _genieWriteStrX (uint16_t code, uint16_t index, char *string)
adragar 4:a73ad3555745 446 {
adragar 4:a73ad3555745 447 char *p ;
adragar 4:a73ad3555745 448 unsigned int checksum ;
adragar 4:a73ad3555745 449 int len = strlen (string) ;
adragar 4:a73ad3555745 450
adragar 4:a73ad3555745 451
adragar 4:a73ad3555745 452 if (len > 255)
adragar 4:a73ad3555745 453 return -1 ;
adragar 4:a73ad3555745 454
adragar 4:a73ad3555745 455
adragar 4:a73ad3555745 456 _genieWaitForIdle();
adragar 4:a73ad3555745 457
adragar 4:a73ad3555745 458
adragar 4:a73ad3555745 459 _geniePutchar(code) ; checksum = code ;
adragar 4:a73ad3555745 460 _geniePutchar(index) ; checksum ^= index ;
adragar 4:a73ad3555745 461 _geniePutchar((unsigned char)len) ; checksum ^= len ;
adragar 4:a73ad3555745 462 for (p = string ; *p ; ++p) {
adragar 4:a73ad3555745 463 _geniePutchar (*p) ;
adragar 4:a73ad3555745 464 checksum ^= *p ;
adragar 4:a73ad3555745 465 }
adragar 4:a73ad3555745 466 _geniePutchar(checksum) ;
adragar 4:a73ad3555745 467
adragar 4:a73ad3555745 468
adragar 4:a73ad3555745 469 _geniePushLinkState(GENIE_LINK_WFAN);
adragar 4:a73ad3555745 470
adragar 4:a73ad3555745 471
adragar 4:a73ad3555745 472 return 0 ;
adragar 4:a73ad3555745 473 }
adragar 4:a73ad3555745 474 /////////////////////// genieWriteStr ////////////////////////
adragar 4:a73ad3555745 475 //
adragar 4:a73ad3555745 476 // Write a string to the display (ASCII)
adragar 4:a73ad3555745 477 //
adragar 4:a73ad3555745 478 uint16_t genieWriteStr (uint16_t index, char *string) {
adragar 4:a73ad3555745 479
adragar 4:a73ad3555745 480 return _genieWriteStrX (GENIE_WRITE_STR, index, string);
adragar 4:a73ad3555745 481 }
adragar 4:a73ad3555745 482
adragar 4:a73ad3555745 483
adragar 4:a73ad3555745 484 /////////////////////// genieWriteStrU ////////////////////////
adragar 4:a73ad3555745 485 //
adragar 4:a73ad3555745 486 // Write a string to the display (Unicode)
adragar 4:a73ad3555745 487 //
adragar 4:a73ad3555745 488 uint16_t genieWriteStrU (uint16_t index, char *string) {
adragar 4:a73ad3555745 489
adragar 4:a73ad3555745 490
adragar 4:a73ad3555745 491 return _genieWriteStrX (GENIE_WRITE_STRU, index, string);
adragar 4:a73ad3555745 492
adragar 4:a73ad3555745 493
adragar 4:a73ad3555745 494 }
adragar 4:a73ad3555745 495 /////////////////// genieAttachEventHandler //////////////////////
adragar 4:a73ad3555745 496 //
adragar 4:a73ad3555745 497 // "Attaches" a pointer to the users event handler by writing
adragar 4:a73ad3555745 498 // the pointer into the variable used by doEVents()
adragar 4:a73ad3555745 499 //
adragar 4:a73ad3555745 500 void genieAttachEventHandler (genieUserEventHandlerPtr handler) {
adragar 4:a73ad3555745 501 _genieUserHandler = handler;
adragar 4:a73ad3555745 502 }
adragar 4:a73ad3555745 503
adragar 4:a73ad3555745 504
adragar 4:a73ad3555745 505 ////////////////////// _genieEnqueueEvent ///////////////////
adragar 4:a73ad3555745 506 //
adragar 4:a73ad3555745 507 // Copy the bytes from a buffer supplied by the caller
adragar 4:a73ad3555745 508 // to the input queue
adragar 4:a73ad3555745 509 //
adragar 4:a73ad3555745 510 // Parms: uint8_t * data, a pointer to the user's data
adragar 4:a73ad3555745 511 //
adragar 4:a73ad3555745 512 // Returns: TRUE if there was an empty location in the queue
adragar 4:a73ad3555745 513 // to copy the data into
adragar 4:a73ad3555745 514 // FALSE if not
adragar 4:a73ad3555745 515 // Sets: ERROR_REPLY_OVR if there was no room in the queue
adragar 4:a73ad3555745 516 //
adragar 4:a73ad3555745 517 bool _genieEnqueueEvent (uint8_t * data) {
adragar 4:a73ad3555745 518
adragar 4:a73ad3555745 519
adragar 4:a73ad3555745 520 if (_genieEventQueue.n_events < MAX_GENIE_EVENTS-2) {
adragar 4:a73ad3555745 521 memcpy (&_genieEventQueue.frames[_genieEventQueue.wr_index], data,
adragar 4:a73ad3555745 522 GENIE_FRAME_SIZE);
adragar 4:a73ad3555745 523 _genieEventQueue.wr_index++;
adragar 4:a73ad3555745 524 _genieEventQueue.wr_index &= MAX_GENIE_EVENTS -1;
adragar 4:a73ad3555745 525 _genieEventQueue.n_events++;
adragar 4:a73ad3555745 526 return TRUE;
adragar 4:a73ad3555745 527 } else {
adragar 4:a73ad3555745 528 _genieError = ERROR_REPLY_OVR;
adragar 4:a73ad3555745 529 _handleError();
adragar 4:a73ad3555745 530 return FALSE;
adragar 4:a73ad3555745 531 }
adragar 4:a73ad3555745 532 }
adragar 4:a73ad3555745 533 ///////////////////// _genieSetLinkState ////////////////////////
adragar 4:a73ad3555745 534 //
adragar 4:a73ad3555745 535 // Set the logical state of the link to the display.
adragar 4:a73ad3555745 536 //
adragar 4:a73ad3555745 537 // Parms: uint16_t newstate, a value to be written to the
adragar 4:a73ad3555745 538 // link's _genieLinkState variable. Valid values are
adragar 4:a73ad3555745 539 // GENIE_LINK_IDLE 0
adragar 4:a73ad3555745 540 // GENIE_LINK_WFAN 1 // waiting for Ack or Nak
adragar 4:a73ad3555745 541 // GENIE_LINK_WF_RXREPORT 2 // waiting for a report frame
adragar 4:a73ad3555745 542 // GENIE_LINK_RXREPORT 3 // receiving a report frame
adragar 4:a73ad3555745 543 // GENIE_LINK_RXEVENT 4 // receiving an event frame
adragar 4:a73ad3555745 544 // GENIE_LINK_SHDN 5
adragar 4:a73ad3555745 545 //
adragar 4:a73ad3555745 546 void _genieSetLinkState (uint16_t newstate) {
adragar 4:a73ad3555745 547
adragar 4:a73ad3555745 548 *_genieLinkState = newstate;
adragar 4:a73ad3555745 549
adragar 4:a73ad3555745 550
adragar 4:a73ad3555745 551 if (newstate == GENIE_LINK_RXREPORT || \
adragar 4:a73ad3555745 552 newstate == GENIE_LINK_RXEVENT)
adragar 4:a73ad3555745 553 rxframe_count = 0;
adragar 4:a73ad3555745 554 }
adragar 4:a73ad3555745 555
adragar 4:a73ad3555745 556
adragar 4:a73ad3555745 557 /////////////////////// _genieGetLinkState //////////////////////
adragar 4:a73ad3555745 558 //
adragar 4:a73ad3555745 559 // Get the current logical state of the link to the display.
adragar 4:a73ad3555745 560 //
adragar 4:a73ad3555745 561 uint16_t _genieGetLinkState (void) {
adragar 4:a73ad3555745 562 return *_genieLinkState;
adragar 4:a73ad3555745 563 }
adragar 4:a73ad3555745 564
adragar 4:a73ad3555745 565 /////////////////////// _geniePutchar ///////////////////////////
adragar 4:a73ad3555745 566 //
adragar 4:a73ad3555745 567 // Output the supplied character to the Genie display over
adragar 4:a73ad3555745 568 // the selected serial port
adragar 4:a73ad3555745 569 //
adragar 4:a73ad3555745 570 void _geniePutchar (uint8_t c) {
adragar 4:a73ad3555745 571 // if (screen != NULL)
adragar 4:a73ad3555745 572 screen.putc(c);
adragar 4:a73ad3555745 573 }
adragar 4:a73ad3555745 574
adragar 4:a73ad3555745 575
adragar 4:a73ad3555745 576 //////////////////////// _genieGetchar //////////////////////////
adragar 4:a73ad3555745 577 //
adragar 4:a73ad3555745 578 // Get a character from the selected Genie serial port
adragar 4:a73ad3555745 579 //
adragar 4:a73ad3555745 580 // Returns: ERROR_NOHANDLER if an Rx handler has not
adragar 4:a73ad3555745 581 // been defined
adragar 4:a73ad3555745 582 // ERROR_NOCHAR if no bytes have beeb received
adragar 4:a73ad3555745 583 // The char if there was one to get
adragar 4:a73ad3555745 584 // Sets: _genieError with any errors encountered
adragar 4:a73ad3555745 585 //
adragar 4:a73ad3555745 586 uint8_t _genieGetchar() {
adragar 4:a73ad3555745 587 uint16_t result;
adragar 4:a73ad3555745 588
adragar 4:a73ad3555745 589
adragar 4:a73ad3555745 590 _genieError = ERROR_NONE;
adragar 4:a73ad3555745 591
adragar 4:a73ad3555745 592 return (screen.getc());
adragar 4:a73ad3555745 593 }
adragar 4:a73ad3555745 594
adragar 4:a73ad3555745 595 void RxIrqHandler(void)
adragar 4:a73ad3555745 596 {
adragar 4:a73ad3555745 597 do
adragar 4:a73ad3555745 598 {
adragar 4:a73ad3555745 599 genieDoEvents();
adragar 4:a73ad3555745 600 }
adragar 4:a73ad3555745 601 while(screen.readable ());
adragar 4:a73ad3555745 602 }
adragar 4:a73ad3555745 603
adragar 4:a73ad3555745 604
adragar 4:a73ad3555745 605 void TickerIrq(void)
adragar 4:a73ad3555745 606 {
adragar 4:a73ad3555745 607 }
adragar 4:a73ad3555745 608
adragar 4:a73ad3555745 609
adragar 4:a73ad3555745 610 void SetupGenie(void)
adragar 4:a73ad3555745 611 {
adragar 4:a73ad3555745 612 screen.baud(9600);
adragar 4:a73ad3555745 613 pcusb.baud(9600);
adragar 4:a73ad3555745 614 screen.attach(&RxIrqHandler,Serial::RxIrq);
adragar 4:a73ad3555745 615 t.start();
adragar 4:a73ad3555745 616 // EventChk.attach(&TickerIrq,0.05);
adragar 4:a73ad3555745 617 }