![](/media/cache/group/download_IjbieK2.png.50x50_q85.png)
demo new haven display
Dependencies: LCD Menu ButtonCtrl TimeManagement EventLog AddressMap emic2
ESCM 2000 Control and Display application provides interface for the LPC1768 processor boards with the ECSM 2000 system.
This application implements SW interface : - RX 485 Receive from physical system - RX 485 Interface to send toECOM / ESCM board - CAN Interface to send to ECOM / ESCM board - 4x40 LCD with menu controls - RTC configuration -EMIC2 Sound Card - GPIO Extender to push buttons etc
ESCMControlApp.cpp@3:ecaf9963341b, 2019-07-25 (annotated)
- Committer:
- foxbrianr
- Date:
- Thu Jul 25 00:45:01 2019 +0000
- Revision:
- 3:ecaf9963341b
- Child:
- 5:65f21c0b6b79
Baseline for testing
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
foxbrianr | 3:ecaf9963341b | 1 | |
foxbrianr | 3:ecaf9963341b | 2 | #include "mbed.h" |
foxbrianr | 3:ecaf9963341b | 3 | #include "ESCMControlApp.h" |
foxbrianr | 3:ecaf9963341b | 4 | |
foxbrianr | 3:ecaf9963341b | 5 | |
foxbrianr | 3:ecaf9963341b | 6 | Serial rs485port1(p9, p10, 9600); //tx,rx,baud |
foxbrianr | 3:ecaf9963341b | 7 | DigitalOut rs485port1mode (p11); //Transmit = 1, Receive = 0 |
foxbrianr | 3:ecaf9963341b | 8 | |
foxbrianr | 3:ecaf9963341b | 9 | Serial rs485port2(p13, p14, 9600); //tx,rx,baud |
foxbrianr | 3:ecaf9963341b | 10 | DigitalOut rs485port2mode (p12); //Transmit = 1, Receive = 0 |
foxbrianr | 3:ecaf9963341b | 11 | |
foxbrianr | 3:ecaf9963341b | 12 | CAN canport (p30, p29); // rx,tx |
foxbrianr | 3:ecaf9963341b | 13 | DigitalOut canportmode (p25); //Silent Mode = 1, Normal = 0 |
foxbrianr | 3:ecaf9963341b | 14 | |
foxbrianr | 3:ecaf9963341b | 15 | |
foxbrianr | 3:ecaf9963341b | 16 | emic2 speaker(p28, p27); //serial RX,TX pins to emic |
foxbrianr | 3:ecaf9963341b | 17 | |
foxbrianr | 3:ecaf9963341b | 18 | Mutex sound_mutex; |
foxbrianr | 3:ecaf9963341b | 19 | |
foxbrianr | 3:ecaf9963341b | 20 | |
foxbrianr | 3:ecaf9963341b | 21 | ESCM_EventLog escmEventLog; |
foxbrianr | 3:ecaf9963341b | 22 | |
foxbrianr | 3:ecaf9963341b | 23 | static int dataRxCnt = 0; |
foxbrianr | 3:ecaf9963341b | 24 | static int cur_address = 0; |
foxbrianr | 3:ecaf9963341b | 25 | |
foxbrianr | 3:ecaf9963341b | 26 | |
foxbrianr | 3:ecaf9963341b | 27 | void setCurrentTime (char* timeBuf) |
foxbrianr | 3:ecaf9963341b | 28 | { |
foxbrianr | 3:ecaf9963341b | 29 | |
foxbrianr | 3:ecaf9963341b | 30 | time_t rawtime; |
foxbrianr | 3:ecaf9963341b | 31 | struct tm * timeinfo; |
foxbrianr | 3:ecaf9963341b | 32 | |
foxbrianr | 3:ecaf9963341b | 33 | time ( &rawtime ); |
foxbrianr | 3:ecaf9963341b | 34 | timeinfo = localtime ( &rawtime ); |
foxbrianr | 3:ecaf9963341b | 35 | |
foxbrianr | 3:ecaf9963341b | 36 | int hours = timeinfo->tm_hour; |
foxbrianr | 3:ecaf9963341b | 37 | int mins = timeinfo->tm_min; |
foxbrianr | 3:ecaf9963341b | 38 | int secs = timeinfo->tm_sec; |
foxbrianr | 3:ecaf9963341b | 39 | |
foxbrianr | 3:ecaf9963341b | 40 | int years = timeinfo->tm_year + 1900; |
foxbrianr | 3:ecaf9963341b | 41 | int months = timeinfo->tm_mon + 1 ; |
foxbrianr | 3:ecaf9963341b | 42 | int days = timeinfo->tm_mday; |
foxbrianr | 3:ecaf9963341b | 43 | |
foxbrianr | 3:ecaf9963341b | 44 | sprintf(timeBuf,"%0d/%0d/%04d %02d:%02d:%02d\0", |
foxbrianr | 3:ecaf9963341b | 45 | months,days,years,hours,mins,secs ); |
foxbrianr | 3:ecaf9963341b | 46 | |
foxbrianr | 3:ecaf9963341b | 47 | } |
foxbrianr | 3:ecaf9963341b | 48 | |
foxbrianr | 3:ecaf9963341b | 49 | void rx485Message() { |
foxbrianr | 3:ecaf9963341b | 50 | // Note: you need to actually read from the serial to clear the RX interrupt |
foxbrianr | 3:ecaf9963341b | 51 | int dataRxBuffer[4]; |
foxbrianr | 3:ecaf9963341b | 52 | char timeBuffer[40]; |
foxbrianr | 3:ecaf9963341b | 53 | |
foxbrianr | 3:ecaf9963341b | 54 | int value = rs485port1.getc(); |
foxbrianr | 3:ecaf9963341b | 55 | |
foxbrianr | 3:ecaf9963341b | 56 | if (value){ |
foxbrianr | 3:ecaf9963341b | 57 | dataRxBuffer[dataRxCnt++]=value; |
foxbrianr | 3:ecaf9963341b | 58 | |
foxbrianr | 3:ecaf9963341b | 59 | if(dataRxCnt==4) { |
foxbrianr | 3:ecaf9963341b | 60 | cur_address = 10*(dataRxBuffer[0] -0x30) + (dataRxBuffer[1] -0x30); |
foxbrianr | 3:ecaf9963341b | 61 | memset(dataRxBuffer,0,sizeof(dataRxBuffer)); |
foxbrianr | 3:ecaf9963341b | 62 | dataRxCnt=0; |
foxbrianr | 3:ecaf9963341b | 63 | printf("ADDR=%d\n",cur_address); |
foxbrianr | 3:ecaf9963341b | 64 | |
foxbrianr | 3:ecaf9963341b | 65 | setCurrentTime(timeBuffer); |
foxbrianr | 3:ecaf9963341b | 66 | escmEventLog.add(cur_address, timeBuffer); |
foxbrianr | 3:ecaf9963341b | 67 | ESCMControlApp::say("Unit %d is open",cur_address); |
foxbrianr | 3:ecaf9963341b | 68 | } |
foxbrianr | 3:ecaf9963341b | 69 | } |
foxbrianr | 3:ecaf9963341b | 70 | } |
foxbrianr | 3:ecaf9963341b | 71 | |
foxbrianr | 3:ecaf9963341b | 72 | |
foxbrianr | 3:ecaf9963341b | 73 | |
foxbrianr | 3:ecaf9963341b | 74 | void ESCMControlApp::init() |
foxbrianr | 3:ecaf9963341b | 75 | { |
foxbrianr | 3:ecaf9963341b | 76 | rs485port1mode = 0; // Receive |
foxbrianr | 3:ecaf9963341b | 77 | rs485port2mode = 1; // Transmit |
foxbrianr | 3:ecaf9963341b | 78 | canportmode = 0; // Normal mode |
foxbrianr | 3:ecaf9963341b | 79 | |
foxbrianr | 3:ecaf9963341b | 80 | |
foxbrianr | 3:ecaf9963341b | 81 | rs485port1.attach(&rx485Message); |
foxbrianr | 3:ecaf9963341b | 82 | } |
foxbrianr | 3:ecaf9963341b | 83 | |
foxbrianr | 3:ecaf9963341b | 84 | |
foxbrianr | 3:ecaf9963341b | 85 | void ESCMControlApp::update(void) |
foxbrianr | 3:ecaf9963341b | 86 | { |
foxbrianr | 3:ecaf9963341b | 87 | #if 0 |
foxbrianr | 3:ecaf9963341b | 88 | if(rs485port1.readable() ) |
foxbrianr | 3:ecaf9963341b | 89 | { |
foxbrianr | 3:ecaf9963341b | 90 | rx485Message(); |
foxbrianr | 3:ecaf9963341b | 91 | } |
foxbrianr | 3:ecaf9963341b | 92 | #endif |
foxbrianr | 3:ecaf9963341b | 93 | |
foxbrianr | 3:ecaf9963341b | 94 | if (cur_address) |
foxbrianr | 3:ecaf9963341b | 95 | { |
foxbrianr | 3:ecaf9963341b | 96 | tx485Message(cur_address); |
foxbrianr | 3:ecaf9963341b | 97 | say("%d is open", cur_address); |
foxbrianr | 3:ecaf9963341b | 98 | } |
foxbrianr | 3:ecaf9963341b | 99 | } |
foxbrianr | 3:ecaf9963341b | 100 | |
foxbrianr | 3:ecaf9963341b | 101 | |
foxbrianr | 3:ecaf9963341b | 102 | void ESCMControlApp::say (char *format, ...) |
foxbrianr | 3:ecaf9963341b | 103 | { |
foxbrianr | 3:ecaf9963341b | 104 | char buffer[128]; |
foxbrianr | 3:ecaf9963341b | 105 | va_list args; |
foxbrianr | 3:ecaf9963341b | 106 | va_start(args, format); |
foxbrianr | 3:ecaf9963341b | 107 | vsprintf(buffer,format,args); |
foxbrianr | 3:ecaf9963341b | 108 | |
foxbrianr | 3:ecaf9963341b | 109 | speaker.speakf("S");//Speak command starts with "S" |
foxbrianr | 3:ecaf9963341b | 110 | speaker.speakf(buffer); |
foxbrianr | 3:ecaf9963341b | 111 | speaker.speakf("\r"); |
foxbrianr | 3:ecaf9963341b | 112 | speaker.ready(); |
foxbrianr | 3:ecaf9963341b | 113 | |
foxbrianr | 3:ecaf9963341b | 114 | |
foxbrianr | 3:ecaf9963341b | 115 | va_end(args); |
foxbrianr | 3:ecaf9963341b | 116 | } |
foxbrianr | 3:ecaf9963341b | 117 | |
foxbrianr | 3:ecaf9963341b | 118 | void ESCMControlApp::tx485Message(int address) { |
foxbrianr | 3:ecaf9963341b | 119 | |
foxbrianr | 3:ecaf9963341b | 120 | int sum =0; |
foxbrianr | 3:ecaf9963341b | 121 | |
foxbrianr | 3:ecaf9963341b | 122 | char dataTxBuffer[12]; |
foxbrianr | 3:ecaf9963341b | 123 | sum += dataTxBuffer[0] = 0x40; |
foxbrianr | 3:ecaf9963341b | 124 | sum += dataTxBuffer[1] = 0x01; |
foxbrianr | 3:ecaf9963341b | 125 | sum += dataTxBuffer[2] = address; // floor number |
foxbrianr | 3:ecaf9963341b | 126 | sum += dataTxBuffer[3] = 0x0; |
foxbrianr | 3:ecaf9963341b | 127 | sum += dataTxBuffer[4] = 0x0; |
foxbrianr | 3:ecaf9963341b | 128 | sum += dataTxBuffer[5] = 0x0; |
foxbrianr | 3:ecaf9963341b | 129 | sum += dataTxBuffer[6] = (0x30 + address / 10); |
foxbrianr | 3:ecaf9963341b | 130 | sum += dataTxBuffer[7] = (0x30 + address % 10); |
foxbrianr | 3:ecaf9963341b | 131 | ; // |
foxbrianr | 3:ecaf9963341b | 132 | sum += dataTxBuffer[8] = 0x0; |
foxbrianr | 3:ecaf9963341b | 133 | sum += dataTxBuffer[9] = 0x0; |
foxbrianr | 3:ecaf9963341b | 134 | sum += dataTxBuffer[10] = 0x0; |
foxbrianr | 3:ecaf9963341b | 135 | sum += dataTxBuffer[11] = (char)(~sum +1); |
foxbrianr | 3:ecaf9963341b | 136 | |
foxbrianr | 3:ecaf9963341b | 137 | for(int i= 0;i<12;i++){ |
foxbrianr | 3:ecaf9963341b | 138 | rs485port2.putc(dataTxBuffer[i]); |
foxbrianr | 3:ecaf9963341b | 139 | } |
foxbrianr | 3:ecaf9963341b | 140 | |
foxbrianr | 3:ecaf9963341b | 141 | } |
foxbrianr | 3:ecaf9963341b | 142 | |
foxbrianr | 3:ecaf9963341b | 143 | void ESCMControlApp::txCanMessage502 (int address) |
foxbrianr | 3:ecaf9963341b | 144 | { |
foxbrianr | 3:ecaf9963341b | 145 | CANMessage canMessage(502); |
foxbrianr | 3:ecaf9963341b | 146 | |
foxbrianr | 3:ecaf9963341b | 147 | canMessage.len = 8; |
foxbrianr | 3:ecaf9963341b | 148 | |
foxbrianr | 3:ecaf9963341b | 149 | canMessage.data[0] = 0x0; |
foxbrianr | 3:ecaf9963341b | 150 | canMessage.data[1] = (0x30 + address / 10); |
foxbrianr | 3:ecaf9963341b | 151 | canMessage.data[2] = (0x30 + address % 10); |
foxbrianr | 3:ecaf9963341b | 152 | canMessage.data[3] = 0x0; |
foxbrianr | 3:ecaf9963341b | 153 | canMessage.data[4] = 0x0; |
foxbrianr | 3:ecaf9963341b | 154 | canMessage.data[5] = 0x0; |
foxbrianr | 3:ecaf9963341b | 155 | canMessage.data[6] = 0x0; |
foxbrianr | 3:ecaf9963341b | 156 | canMessage.data[7] = 0x0; |
foxbrianr | 3:ecaf9963341b | 157 | |
foxbrianr | 3:ecaf9963341b | 158 | wait_ms(5); //Wait a bit for the mode the first time |
foxbrianr | 3:ecaf9963341b | 159 | if(canport.write(canMessage)) { |
foxbrianr | 3:ecaf9963341b | 160 | printf("Message sent via CAN: %d\n\r", address); |
foxbrianr | 3:ecaf9963341b | 161 | } |
foxbrianr | 3:ecaf9963341b | 162 | |
foxbrianr | 3:ecaf9963341b | 163 | } |
foxbrianr | 3:ecaf9963341b | 164 | |
foxbrianr | 3:ecaf9963341b | 165 | |
foxbrianr | 3:ecaf9963341b | 166 | |
foxbrianr | 3:ecaf9963341b | 167 | Menu ESCMControlApp::getAddressMenu() |
foxbrianr | 3:ecaf9963341b | 168 | { |
foxbrianr | 3:ecaf9963341b | 169 | return NULL; |
foxbrianr | 3:ecaf9963341b | 170 | } |