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); } }
Revision 11:9196f72fc325, committed 2015-03-04
- Comitter:
- chris215
- Date:
- Wed Mar 04 03:00:40 2015 +0000
- Parent:
- 10:4d9f1be4a901
- Commit message:
- Added new constructor overload with the option to specify the baud rate to use (Mbed side only)
Changed in this revision
mbed_genie.cpp | Show annotated file Show diff for this revision Revisions of this file |
mbed_genie.h | Show annotated file Show diff for this revision Revisions of this file |
diff -r 4d9f1be4a901 -r 9196f72fc325 mbed_genie.cpp --- a/mbed_genie.cpp Tue Jul 08 18:34:47 2014 +0000 +++ b/mbed_genie.cpp Wed Mar 04 03:00:40 2015 +0000 @@ -9,17 +9,27 @@ _genieUserHandler = NULL; RxStateTimeoutErrors = 0; } +Mbed4dGenie::Mbed4dGenie(PinName TxPin,PinName RxPin, PinName resetpin,uint32_t baud) : _screen(TxPin,RxPin) , _reset(resetpin) +{ + //reset the 4d screen + _reset = 0; + _screen.baud(baud); + _genieUserHandler = NULL; + RxStateTimeoutErrors = 0; +} void Mbed4dGenie::Start() { _reset = 1; wait(3.0); //4D datasheet says that the screen can take up to 3000 ms before //becomming responsive to serial commands. - _t.start(); + _waitTimer.start(); + _receptionTimer.start(); Reset(); _genieFlushEventQueue(); _screen.attach(this,&Mbed4dGenie::RxIrqHandler,Serial::RxIrq); } + ////////////////////// genieGetEventData //////////////////////// // // Returns the LSB and MSB of the event's data combined into @@ -40,8 +50,15 @@ do { c = _screen.getc(); - if(_t.read_ms() >= RxMaxTimeout && state == CommInProgress) + /* + check if we are in reception mode and if we timeout + */ + if(_receptionTimer.read_ms() >= RxMaxTimeout && state == CommInProgress) { + /* + if we get here, it means something bad has happened and + we need to reet communication status + */ Reset(); } ManageReceiveData(c); @@ -61,7 +78,9 @@ } else if(data == GENIE_REPORT_OBJ || data == GENIE_REPORT_EVENT) { - RxMaxTimeout = _t.read_ms() + RESYNC_PERIOD; + //re-initialise the reception timer + _receptionTimer.reset(); + RxMaxTimeout = _receptionTimer.read_ms() + RESYNC_PERIOD; checksum = data; rx_data[rxframe_count++] = data; state = CommInProgress; @@ -175,18 +194,22 @@ } bool Mbed4dGenie::WaitForIdle() { + /* + If the communication is still in progress + lets wait for it to finish or check/wait for timeout + */ if(state != CommIdle) { - long timeout = _t.read_ms() + TIMEOUT_PERIOD; + long timeout = _receptionTimer.read_ms() + TIMEOUT_PERIOD; long timerReading = 0; - if(_t.read_ms() >= RxMaxTimeout) + if(_receptionTimer.read_ms() >= RxMaxTimeout) { Reset(); RxStateTimeoutErrors++; } while(timerReading < timeout && state != CommIdle) { - timerReading = _t.read_ms(); + timerReading = _receptionTimer.read_ms(); } LastResponse = 0; return (timerReading >= timeout); @@ -195,20 +218,26 @@ return false; } +/* + Not used for now, since the screen will answer with either a report event or NAK + Since those two answers are so different, there is no efficient means to receive + both in interrupt. No wait to NAK will be done. DONT USE THIS FUNCTION ... YET +*/ int8_t Mbed4dGenie::WaitForReadAnswer() { - long timeout = _t.read_ms() + TIMEOUT_PERIOD; + _waitTimer.reset(); + long timeout = _waitTimer.read_ms() + TIMEOUT_PERIOD; long timerReading = 0; while(state == CommIdle && LastResponse != ERROR_NAK && timerReading < timeout) { - timerReading = _t.read_ms(); + timerReading = _waitTimer.read_ms(); } if(LastResponse == ERROR_NAK)//check if the screen returned a NACK { LastResponse = NO_RESPONSE; return ERROR_NAK; } - else if(_t.read_ms() >= timeout) //check if we timed out while waiting for response + else if(_waitTimer.read_ms() >= timeout) //check if we timed out while waiting for response { LastResponse = NO_RESPONSE; @@ -221,12 +250,12 @@ int8_t Mbed4dGenie::WaitForAnswer() { - - long timeout = _t.read_ms() + TIMEOUT_PERIOD; + _waitTimer.reset(); + long timeout = _waitTimer.read_ms() + TIMEOUT_PERIOD; long timerReading = 0; while(LastResponse != GENIE_ACK && LastResponse != ERROR_NAK && timerReading < timeout) { - timerReading = _t.read_ms(); + timerReading = _waitTimer.read_ms(); } if(LastResponse == ERROR_NAK) @@ -234,9 +263,9 @@ LastResponse = NO_RESPONSE; return ERROR_NAK; } - else if(_t.read_ms() >= timeout) + else if(_waitTimer.read_ms() >= timeout) { - printf("Current timer:%d ; timeout:%d\n\r",_t.read_ms(),timeout); + printf("Current timer:%d ; timeout:%d\n\r",_waitTimer.read_ms(),timeout); LastResponse = NO_RESPONSE; return ERROR_TIMEOUT; } @@ -248,6 +277,8 @@ { LastResponse = NO_RESPONSE; state = CommIdle; + _receptionTimer.reset(); + _waitTimer.reset(); while(_screen.readable()) _screen.getc(); }
diff -r 4d9f1be4a901 -r 9196f72fc325 mbed_genie.h --- a/mbed_genie.h Tue Jul 08 18:34:47 2014 +0000 +++ b/mbed_genie.h Wed Mar 04 03:00:40 2015 +0000 @@ -136,6 +136,7 @@ in reset and kept reset until Start() is called */ Mbed4dGenie(PinName TxPin,PinName RxPin, PinName resetpin); + Mbed4dGenie(PinName TxPin,PinName RxPin, PinName resetpin,uint32_t baud); /* Deassert the reset pin and give some time to the lcd to initialise itself before sending any commands. @@ -183,9 +184,9 @@ // genieUserEventHandlerPtr _genieUserHandler; - Serial _screen; + RawSerial _screen; DigitalOut _reset; - Timer _t; + Timer _waitTimer,_receptionTimer; int state; int LastResponse; long RxMaxTimeout;