A port of the arduino voltmeter example for the mbed using the 4.3' PCT 4d systems touch screen display. Uses the mbed_genie library ported from the arduino visie-genie library by Christian B

Dependencies:   mbed

A test of the arduino voltmeter example using the 4.3' PCT 4d systems touch screen display.

This example program uses the mbed_genie library ported from the arduino Visi-Genie library by Christian B

The display serial TX and RX pins are connected to pin 9 and pin 10 of the mbed microcontroller

The reset pin is not connected as reset function is not implemented

Pin 15 of the mbed has a potentiometer wiper connected to it. The other connections of the potentiometer are connected to +3.3V and 0V - this is to provide some data for the demonstration and to ensure that we don't apply too much voltage to the analogue input pin

For setting up the display in Visie-Genie -

The display has an angular meter object, a LED digits object, two button objects and three static text objects.

The 4dButton0 (On) and the 4dButton1 (Off) button has been set to report on change within Visi-Genie object inspector

The serial baud rate of the display must be set to 115200 baud for this example to work. Ensure you have the settings correct in Visi-Genie when exporting the display program

The mbed program sends digital voltage readings to the LED digits and angular meter of the display module.

The volt readings will only be displayed if the appropriate button on the display is set!

I have written up a more in depth explanation on my blog here:

http://langster1980.blogspot.co.uk/2014/01/ulcd-43-display-mbed-tutorial.html

Committer:
langster1980
Date:
Sun Jan 05 00:58:09 2014 +0000
Revision:
0:1ab681bd453e
A 1st port of the arduino voltmeter demo for the 4d systems touch screen; display using the mbed as the host micro

Who changed what in which revision?

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