4D display working with Gecko board STK3600
Fork of 4dGENIE by
mbed_genie.h@7:6edb20845684, 2014-07-05 (annotated)
- Committer:
- chris215
- Date:
- Sat Jul 05 15:11:57 2014 +0000
- Revision:
- 7:6edb20845684
- Parent:
- 6:f4d3977b0eae
- Child:
- 8:b5ba0df2d0db
Restored rx by interrupt feature. Added following features : read_obj, write_str, userHandler callback when frame is received. Ran stable for 12 hours.
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
chris215 | 7:6edb20845684 | 1 | |
chris215 | 7:6edb20845684 | 2 | |
chris215 | 0:d2ed5a44c802 | 3 | // Genie commands & replys: |
chris215 | 0:d2ed5a44c802 | 4 | |
chris215 | 0:d2ed5a44c802 | 5 | #define GENIE_ACK 0x06 |
chris215 | 0:d2ed5a44c802 | 6 | #define GENIE_NAK 0x15 |
chris215 | 0:d2ed5a44c802 | 7 | |
chris215 | 0:d2ed5a44c802 | 8 | #define TIMEOUT_PERIOD 500 |
chris215 | 0:d2ed5a44c802 | 9 | #define RESYNC_PERIOD 100 |
chris215 | 0:d2ed5a44c802 | 10 | |
chris215 | 0:d2ed5a44c802 | 11 | #define GENIE_READ_OBJ 0 |
chris215 | 0:d2ed5a44c802 | 12 | #define GENIE_WRITE_OBJ 1 |
chris215 | 0:d2ed5a44c802 | 13 | #define GENIE_WRITE_STR 2 |
chris215 | 0:d2ed5a44c802 | 14 | #define GENIE_WRITE_STRU 3 |
chris215 | 0:d2ed5a44c802 | 15 | #define GENIE_WRITE_CONTRAST 4 |
chris215 | 0:d2ed5a44c802 | 16 | #define GENIE_REPORT_OBJ 5 |
chris215 | 0:d2ed5a44c802 | 17 | #define GENIE_REPORT_EVENT 7 |
chris215 | 0:d2ed5a44c802 | 18 | |
chris215 | 0:d2ed5a44c802 | 19 | // Objects |
chris215 | 0:d2ed5a44c802 | 20 | // the manual says: |
chris215 | 0:d2ed5a44c802 | 21 | // Note: Object IDs may change with future releases; it is not |
chris215 | 0:d2ed5a44c802 | 22 | // advisable to code their values as constants. |
chris215 | 0:d2ed5a44c802 | 23 | |
chris215 | 0:d2ed5a44c802 | 24 | #define GENIE_OBJ_DIPSW 0 |
chris215 | 0:d2ed5a44c802 | 25 | #define GENIE_OBJ_KNOB 1 |
chris215 | 0:d2ed5a44c802 | 26 | #define GENIE_OBJ_ROCKERSW 2 |
chris215 | 0:d2ed5a44c802 | 27 | #define GENIE_OBJ_ROTARYSW 3 |
chris215 | 0:d2ed5a44c802 | 28 | #define GENIE_OBJ_SLIDER 4 |
chris215 | 0:d2ed5a44c802 | 29 | #define GENIE_OBJ_TRACKBAR 5 |
chris215 | 0:d2ed5a44c802 | 30 | #define GENIE_OBJ_WINBUTTON 6 |
chris215 | 0:d2ed5a44c802 | 31 | #define GENIE_OBJ_ANGULAR_METER 7 |
chris215 | 0:d2ed5a44c802 | 32 | #define GENIE_OBJ_COOL_GAUGE 8 |
chris215 | 0:d2ed5a44c802 | 33 | #define GENIE_OBJ_CUSTOM_DIGITS 9 |
chris215 | 0:d2ed5a44c802 | 34 | #define GENIE_OBJ_FORM 10 |
chris215 | 0:d2ed5a44c802 | 35 | #define GENIE_OBJ_GAUGE 11 |
chris215 | 0:d2ed5a44c802 | 36 | #define GENIE_OBJ_IMAGE 12 |
chris215 | 0:d2ed5a44c802 | 37 | #define GENIE_OBJ_KEYBOARD 13 |
chris215 | 0:d2ed5a44c802 | 38 | #define GENIE_OBJ_LED 14 |
chris215 | 0:d2ed5a44c802 | 39 | #define GENIE_OBJ_LED_DIGITS 15 |
chris215 | 0:d2ed5a44c802 | 40 | #define GENIE_OBJ_METER 16 |
chris215 | 0:d2ed5a44c802 | 41 | #define GENIE_OBJ_STRINGS 17 |
chris215 | 0:d2ed5a44c802 | 42 | #define GENIE_OBJ_THERMOMETER 18 |
chris215 | 0:d2ed5a44c802 | 43 | #define GENIE_OBJ_USER_LED 19 |
chris215 | 0:d2ed5a44c802 | 44 | #define GENIE_OBJ_VIDEO 20 |
chris215 | 0:d2ed5a44c802 | 45 | #define GENIE_OBJ_STATIC_TEXT 21 |
chris215 | 0:d2ed5a44c802 | 46 | #define GENIE_OBJ_SOUND 22 |
chris215 | 0:d2ed5a44c802 | 47 | #define GENIE_OBJ_TIMER 23 |
chris215 | 0:d2ed5a44c802 | 48 | #define GENIE_OBJ_SPECTRUM 24 |
chris215 | 0:d2ed5a44c802 | 49 | #define GENIE_OBJ_SCOPE 25 |
chris215 | 0:d2ed5a44c802 | 50 | #define GENIE_OBJ_TANK 26 |
chris215 | 0:d2ed5a44c802 | 51 | #define GENIE_OBJ_USERIMAGES 27 |
chris215 | 0:d2ed5a44c802 | 52 | #define GENIE_OBJ_PINOUTPUT 28 |
chris215 | 0:d2ed5a44c802 | 53 | #define GENIE_OBJ_PININPUT 29 |
chris215 | 0:d2ed5a44c802 | 54 | #define GENIE_OBJ_4DBUTTON 30 |
chris215 | 0:d2ed5a44c802 | 55 | #define GENIE_OBJ_ANIBUTTON 31 |
chris215 | 0:d2ed5a44c802 | 56 | #define GENIE_OBJ_COLORPICKER 32 |
chris215 | 0:d2ed5a44c802 | 57 | #define GENIE_OBJ_USERBUTTON 33 |
chris215 | 0:d2ed5a44c802 | 58 | |
chris215 | 0:d2ed5a44c802 | 59 | // Structure to store replys returned from a display |
chris215 | 0:d2ed5a44c802 | 60 | |
chris215 | 0:d2ed5a44c802 | 61 | #define GENIE_FRAME_SIZE 6 |
chris215 | 0:d2ed5a44c802 | 62 | |
chris215 | 0:d2ed5a44c802 | 63 | #define ERROR_NONE 0 |
chris215 | 0:d2ed5a44c802 | 64 | #define ERROR_TIMEOUT -1 // 255 0xFF |
chris215 | 0:d2ed5a44c802 | 65 | #define ERROR_NOHANDLER -2 // 254 0xFE |
chris215 | 0:d2ed5a44c802 | 66 | #define ERROR_NOCHAR -3 // 253 0xFD |
chris215 | 0:d2ed5a44c802 | 67 | #define ERROR_NAK -4 // 252 0xFC |
chris215 | 0:d2ed5a44c802 | 68 | #define ERROR_REPLY_OVR -5 // 251 0xFB |
chris215 | 0:d2ed5a44c802 | 69 | #define ERROR_RESYNC -6 // 250 0xFA |
chris215 | 0:d2ed5a44c802 | 70 | #define ERROR_NODISPLAY -7 // 249 0xF9 |
chris215 | 0:d2ed5a44c802 | 71 | #define ERROR_BAD_CS -8 // 248 0xF8 |
chris215 | 0:d2ed5a44c802 | 72 | |
chris215 | 0:d2ed5a44c802 | 73 | #define GENIE_LINK_IDLE 0 |
chris215 | 0:d2ed5a44c802 | 74 | #define GENIE_LINK_WFAN 1 // waiting for Ack or Nak |
chris215 | 0:d2ed5a44c802 | 75 | #define GENIE_LINK_WF_RXREPORT 2 // waiting for a report frame |
chris215 | 0:d2ed5a44c802 | 76 | #define GENIE_LINK_RXREPORT 3 // receiving a report frame |
chris215 | 0:d2ed5a44c802 | 77 | #define GENIE_LINK_RXEVENT 4 // receiving an event frame |
chris215 | 0:d2ed5a44c802 | 78 | #define GENIE_LINK_SHDN 5 |
chris215 | 0:d2ed5a44c802 | 79 | |
chris215 | 0:d2ed5a44c802 | 80 | #define GENIE_EVENT_NONE 0 |
chris215 | 0:d2ed5a44c802 | 81 | #define GENIE_EVENT_RXCHAR 1 |
chris215 | 0:d2ed5a44c802 | 82 | |
chris215 | 0:d2ed5a44c802 | 83 | #ifndef TRUE |
chris215 | 0:d2ed5a44c802 | 84 | #define TRUE (1==1) |
chris215 | 0:d2ed5a44c802 | 85 | #define FALSE (!TRUE) |
chris215 | 0:d2ed5a44c802 | 86 | #endif |
chris215 | 0:d2ed5a44c802 | 87 | |
chris215 | 7:6edb20845684 | 88 | #define NO_RESPONSE 0 |
chris215 | 7:6edb20845684 | 89 | |
chris215 | 7:6edb20845684 | 90 | #define GENIE_FRAME_SIZE 6 |
chris215 | 7:6edb20845684 | 91 | // Structure to store replys returned from a display |
chris215 | 7:6edb20845684 | 92 | struct genieFrameReportObj { |
chris215 | 7:6edb20845684 | 93 | uint8_t cmd; |
chris215 | 7:6edb20845684 | 94 | uint8_t object; |
chris215 | 7:6edb20845684 | 95 | uint8_t index; |
chris215 | 7:6edb20845684 | 96 | uint8_t data_msb; |
chris215 | 7:6edb20845684 | 97 | uint8_t data_lsb; |
chris215 | 7:6edb20845684 | 98 | }; |
chris215 | 7:6edb20845684 | 99 | ///////////////////////////////////////////////////////////////////// |
chris215 | 7:6edb20845684 | 100 | // The Genie frame definition |
chris215 | 7:6edb20845684 | 101 | // |
chris215 | 7:6edb20845684 | 102 | // The union allows the data to be referenced as an array of uint8_t |
chris215 | 7:6edb20845684 | 103 | // or a structure of type genieFrameReportObj, eg |
chris215 | 7:6edb20845684 | 104 | // |
chris215 | 7:6edb20845684 | 105 | // genieFrame f; |
chris215 | 7:6edb20845684 | 106 | // f.bytes[4]; |
chris215 | 7:6edb20845684 | 107 | // f.reportObject.data_lsb |
chris215 | 7:6edb20845684 | 108 | // |
chris215 | 7:6edb20845684 | 109 | // both methods get the same byte |
chris215 | 7:6edb20845684 | 110 | // |
chris215 | 7:6edb20845684 | 111 | union genieFrame { |
chris215 | 7:6edb20845684 | 112 | uint8_t bytes[GENIE_FRAME_SIZE]; |
chris215 | 7:6edb20845684 | 113 | genieFrameReportObj reportObject; |
chris215 | 7:6edb20845684 | 114 | }; |
chris215 | 7:6edb20845684 | 115 | #define MAX_GENIE_EVENTS 16 // MUST be a power of 2 |
chris215 | 7:6edb20845684 | 116 | struct genieEventQueueStruct { |
chris215 | 7:6edb20845684 | 117 | genieFrame frames[MAX_GENIE_EVENTS]; |
chris215 | 7:6edb20845684 | 118 | uint8_t rd_index; |
chris215 | 7:6edb20845684 | 119 | uint8_t wr_index; |
chris215 | 7:6edb20845684 | 120 | uint8_t n_events; |
chris215 | 7:6edb20845684 | 121 | }; |
chris215 | 7:6edb20845684 | 122 | |
chris215 | 7:6edb20845684 | 123 | typedef void (*genieUserEventHandlerPtr) (void); |
chris215 | 7:6edb20845684 | 124 | |
chris215 | 2:f283764fe9b7 | 125 | class Mbed4dGenie{ |
chris215 | 2:f283764fe9b7 | 126 | public: |
chris215 | 7:6edb20845684 | 127 | |
chris215 | 7:6edb20845684 | 128 | typedef enum{ |
chris215 | 7:6edb20845684 | 129 | CommIdle = 0, |
chris215 | 7:6edb20845684 | 130 | CommInProgress = 1 |
chris215 | 7:6edb20845684 | 131 | }CommState; |
chris215 | 7:6edb20845684 | 132 | |
chris215 | 6:f4d3977b0eae | 133 | /* |
chris215 | 6:f4d3977b0eae | 134 | Constructor to initialise the pins used to control the lcd screen |
chris215 | 6:f4d3977b0eae | 135 | Note: When the class is first initialised, the lcd screen will be put |
chris215 | 6:f4d3977b0eae | 136 | in reset and kept reset until Start() is called |
chris215 | 6:f4d3977b0eae | 137 | */ |
chris215 | 3:11c49c49cd1a | 138 | Mbed4dGenie(PinName TxPin,PinName RxPin, PinName resetpin); |
chris215 | 6:f4d3977b0eae | 139 | /* |
chris215 | 6:f4d3977b0eae | 140 | Deassert the reset pin and give some time to the lcd to |
chris215 | 6:f4d3977b0eae | 141 | initialise itself before sending any commands. |
chris215 | 6:f4d3977b0eae | 142 | */ |
chris215 | 7:6edb20845684 | 143 | void Start(); |
chris215 | 7:6edb20845684 | 144 | void Reset(void); |
chris215 | 6:f4d3977b0eae | 145 | /* |
chris215 | 6:f4d3977b0eae | 146 | Generic command to write data to a Genie object |
chris215 | 6:f4d3977b0eae | 147 | returns the status code of operation |
chris215 | 6:f4d3977b0eae | 148 | */ |
chris215 | 7:6edb20845684 | 149 | int8_t genieWriteObject (uint16_t object, uint16_t index, uint16_t data); |
chris215 | 7:6edb20845684 | 150 | int8_t genieWriteStr (uint16_t index, char *string); |
chris215 | 7:6edb20845684 | 151 | int8_t genieReadObj (uint16_t object, uint16_t index); |
chris215 | 7:6edb20845684 | 152 | |
chris215 | 7:6edb20845684 | 153 | bool genieDequeueEvent(genieFrame * buff); |
chris215 | 7:6edb20845684 | 154 | void genieAttachEventHandler (genieUserEventHandlerPtr handler); |
chris215 | 7:6edb20845684 | 155 | bool PendingFrames(void); |
chris215 | 2:f283764fe9b7 | 156 | |
chris215 | 7:6edb20845684 | 157 | private: |
chris215 | 7:6edb20845684 | 158 | void writec(char data); |
chris215 | 7:6edb20845684 | 159 | void RxIrqHandler(void); |
chris215 | 7:6edb20845684 | 160 | void ManageReceiveData(char data); |
chris215 | 7:6edb20845684 | 161 | bool _genieEnqueueEvent (uint8_t * data); |
chris215 | 7:6edb20845684 | 162 | void _genieFlushEventQueue(void); |
chris215 | 6:f4d3977b0eae | 163 | /* |
chris215 | 6:f4d3977b0eae | 164 | Wait for the screen to aknowledge the command |
chris215 | 6:f4d3977b0eae | 165 | returns the status code of operation |
chris215 | 6:f4d3977b0eae | 166 | */ |
chris215 | 7:6edb20845684 | 167 | int8_t WaitForAnswer(); |
chris215 | 7:6edb20845684 | 168 | bool WaitForIdle(); |
chris215 | 6:f4d3977b0eae | 169 | |
chris215 | 7:6edb20845684 | 170 | ////////////////////////////////////////////////////////////// |
chris215 | 7:6edb20845684 | 171 | // A structure to hold up to MAX_GENIE_EVENTS events receive |
chris215 | 7:6edb20845684 | 172 | // from the display |
chris215 | 7:6edb20845684 | 173 | // |
chris215 | 7:6edb20845684 | 174 | genieEventQueueStruct _genieEventQueue; |
chris215 | 7:6edb20845684 | 175 | uint8_t rxframe_count; |
chris215 | 7:6edb20845684 | 176 | uint8_t rx_data[GENIE_FRAME_SIZE]; |
chris215 | 7:6edb20845684 | 177 | uint8_t checksum; |
chris215 | 7:6edb20845684 | 178 | ////////////////////////////////////////////////////////////// |
chris215 | 7:6edb20845684 | 179 | // Pointer to the user's event handler function |
chris215 | 7:6edb20845684 | 180 | // |
chris215 | 7:6edb20845684 | 181 | genieUserEventHandlerPtr _genieUserHandler; |
chris215 | 6:f4d3977b0eae | 182 | |
chris215 | 2:f283764fe9b7 | 183 | Serial _screen; |
chris215 | 6:f4d3977b0eae | 184 | DigitalOut _reset; |
chris215 | 2:f283764fe9b7 | 185 | Timer _t; |
chris215 | 7:6edb20845684 | 186 | int state; |
chris215 | 7:6edb20845684 | 187 | int LastResponse; |
chris215 | 6:f4d3977b0eae | 188 | }; |