Mbed 4dGenie class

Dependents:   Genie_Test 039847382-S3_DS1621_and_LCD_V1

This is a work in progress.

4dGenie class to use with 4dLCD screens that are using the genie environment.

There are still some rare occasions where the 4dLCD might crash, for now i have no solution to this except doing a reset of the 4dLCD.

Please make sure to have the most up to date PmmC loaded on the screen.

usage example :

Mbed4dGenie test program

#include "mbed.h"
#include "mbed_genie.h"

DigitalOut myled(LED1);
/*
    The Mbed4dGenie class requires 3 parameters
    1 - Tx pin
    2 - Rx pin
    3 - Reset pin
*/
Mbed4dGenie lcd4d(PTE0,PTE1,PTB9);



int main() {
    int temp = 0;
printf("Mbed Genie demo \n\r");
lcd4d.Start();


 /*
 for example, in this loop we increment the thermometer0 object from 0 to 100
 */
 
    while(1) {
        if(temp >= 100)
        {
            temp = -1;
        }
        else
        {
            temp++;
        }

        lcd4d.genieWriteObject(GENIE_OBJ_LED_DIGITS,1,temp);

        myled = 1;
        wait(0.05);
        myled = 0;
        wait(0.05);
    }
}
Committer:
chris215
Date:
Sun Jul 06 17:22:32 2014 +0000
Revision:
8:b5ba0df2d0db
Parent:
7:6edb20845684
Child:
10:4d9f1be4a901
Improve stability when using obj read commands and listening to Genie events.

Who changed what in which revision?

UserRevisionLine numberNew 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 8:b5ba0df2d0db 168 bool WaitForIdle();
chris215 8:b5ba0df2d0db 169 int8_t WaitForReadAnswer();
chris215 6:f4d3977b0eae 170
chris215 7:6edb20845684 171 //////////////////////////////////////////////////////////////
chris215 7:6edb20845684 172 // A structure to hold up to MAX_GENIE_EVENTS events receive
chris215 7:6edb20845684 173 // from the display
chris215 7:6edb20845684 174 //
chris215 7:6edb20845684 175 genieEventQueueStruct _genieEventQueue;
chris215 7:6edb20845684 176 uint8_t rxframe_count;
chris215 7:6edb20845684 177 uint8_t rx_data[GENIE_FRAME_SIZE];
chris215 7:6edb20845684 178 uint8_t checksum;
chris215 7:6edb20845684 179 //////////////////////////////////////////////////////////////
chris215 7:6edb20845684 180 // Pointer to the user's event handler function
chris215 7:6edb20845684 181 //
chris215 7:6edb20845684 182 genieUserEventHandlerPtr _genieUserHandler;
chris215 6:f4d3977b0eae 183
chris215 8:b5ba0df2d0db 184 Serial _screen;
chris215 8:b5ba0df2d0db 185 DigitalOut _reset;
chris215 8:b5ba0df2d0db 186 Timer _t;
chris215 7:6edb20845684 187 int state;
chris215 8:b5ba0df2d0db 188 int LastResponse;
chris215 8:b5ba0df2d0db 189 long RxMaxTimeout;
chris215 8:b5ba0df2d0db 190 long RxStateTimeoutErrors;
chris215 6:f4d3977b0eae 191 };