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

Committer:
foxbrianr
Date:
Tue Sep 17 13:48:57 2019 +0000
Revision:
6:010ceb99f7b0
Parent:
5:65f21c0b6b79
Child:
7:0244f1a26545
Beta 2

Who changed what in which revision?

UserRevisionLine numberNew contents of line
foxbrianr 6:010ceb99f7b0 1 /**************************************************************************
foxbrianr 6:010ceb99f7b0 2 * @file ESCMControlApp.cpp
foxbrianr 6:010ceb99f7b0 3 * @brief Main class for wrapping the interface with ESCM Control
foxbrianr 6:010ceb99f7b0 4 * Application
foxbrianr 6:010ceb99f7b0 5 * @version: V1.0
foxbrianr 6:010ceb99f7b0 6 * @date: 9/17/2019
foxbrianr 3:ecaf9963341b 7
foxbrianr 6:010ceb99f7b0 8 *
foxbrianr 6:010ceb99f7b0 9 * @note
foxbrianr 6:010ceb99f7b0 10 * Copyright (C) 2019 E3 Design. All rights reserved.
foxbrianr 6:010ceb99f7b0 11 *
foxbrianr 6:010ceb99f7b0 12 * @par
foxbrianr 6:010ceb99f7b0 13 * E3 Designers LLC is supplying this software for use with Cortex-M3 LPC1768
foxbrianr 6:010ceb99f7b0 14 * processor based microcontroller for the ESCM 2000 Monitor and Display.
foxbrianr 6:010ceb99f7b0 15 * *
foxbrianr 6:010ceb99f7b0 16 * @par
foxbrianr 6:010ceb99f7b0 17 * THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED
foxbrianr 6:010ceb99f7b0 18 * OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF
foxbrianr 6:010ceb99f7b0 19 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE.
foxbrianr 6:010ceb99f7b0 20 * ARM SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR
foxbrianr 6:010ceb99f7b0 21 * CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER.
foxbrianr 6:010ceb99f7b0 22 *
foxbrianr 6:010ceb99f7b0 23 ******************************************************************************/
foxbrianr 3:ecaf9963341b 24 #include "mbed.h"
foxbrianr 3:ecaf9963341b 25 #include "ESCMControlApp.h"
foxbrianr 5:65f21c0b6b79 26 #include "SPI_MX25R.h"
foxbrianr 5:65f21c0b6b79 27
foxbrianr 5:65f21c0b6b79 28 // ---------------------------------------------------------------------
foxbrianr 6:010ceb99f7b0 29 // External IO for the ESCM Io Board
foxbrianr 5:65f21c0b6b79 30 // ---------------------------------------------------------------------
foxbrianr 5:65f21c0b6b79 31 Serial escmRs485_Input(p9, p10, 9600); //tx,rx,baud
foxbrianr 5:65f21c0b6b79 32 DigitalOut escmRs485_Mode (p11); //Transmit = 1, Receive = 0
foxbrianr 5:65f21c0b6b79 33
foxbrianr 6:010ceb99f7b0 34 // ---------------------------------------------------------------------
foxbrianr 6:010ceb99f7b0 35 // External IO for the MicroComm ESCM Control Board
foxbrianr 6:010ceb99f7b0 36 // ---------------------------------------------------------------------
foxbrianr 5:65f21c0b6b79 37 Serial microCommRs485_Tx(p13, p14, 9600); //tx,rx,baud
foxbrianr 5:65f21c0b6b79 38 DigitalOut microCommRs485_Mode (p12); //Transmit = 1, Receive = 0
foxbrianr 5:65f21c0b6b79 39
foxbrianr 5:65f21c0b6b79 40 CAN microCommCanItf (p30, p29, 50000); // rx,tx
foxbrianr 5:65f21c0b6b79 41 DigitalOut microCommCan_Mode (p25); //Silent Mode = 1, Normal = 0
foxbrianr 3:ecaf9963341b 42
foxbrianr 5:65f21c0b6b79 43 // ---------------------------------------------------------------------
foxbrianr 5:65f21c0b6b79 44 // External IO for the Speaker / EMIC2 board
foxbrianr 5:65f21c0b6b79 45 // ---------------------------------------------------------------------
foxbrianr 5:65f21c0b6b79 46 emic2 speaker(p28, p27); //serial RX,TX pins to emic
foxbrianr 6:010ceb99f7b0 47 Mutex sound_mutex;
foxbrianr 5:65f21c0b6b79 48 // ---------------------------------------------------------------------
foxbrianr 6:010ceb99f7b0 49 // External MEMORY for the FAULT AND ADDRESS MAPS (not used)
foxbrianr 5:65f21c0b6b79 50 // ---------------------------------------------------------------------
foxbrianr 5:65f21c0b6b79 51 SPI_MX25R spi_memory (p5, p6, p7, p8);
foxbrianr 3:ecaf9963341b 52
foxbrianr 6:010ceb99f7b0 53 // ---------------------------------------------------------------------
foxbrianr 6:010ceb99f7b0 54 ESCM_EventLog escmEventLog;
foxbrianr 3:ecaf9963341b 55
foxbrianr 5:65f21c0b6b79 56 // ---------------------------------------------------------------------
foxbrianr 5:65f21c0b6b79 57 AddressMap addressMap;
foxbrianr 5:65f21c0b6b79 58
foxbrianr 6:010ceb99f7b0 59 // ---------------------------------------------------------------------
foxbrianr 5:65f21c0b6b79 60 RealTimeClock rtc;
foxbrianr 5:65f21c0b6b79 61
foxbrianr 5:65f21c0b6b79 62 /* for incoming messages */
foxbrianr 5:65f21c0b6b79 63 CircularBuffer<event_t, 64> message_queue;
foxbrianr 5:65f21c0b6b79 64
foxbrianr 5:65f21c0b6b79 65 /* for button presses */
foxbrianr 5:65f21c0b6b79 66 CircularBuffer<event_t, 64> event_queue;
foxbrianr 5:65f21c0b6b79 67
foxbrianr 5:65f21c0b6b79 68 /* for playing sound */
foxbrianr 5:65f21c0b6b79 69 CircularBuffer<playbackMessage_t, 10> playback_queue;
foxbrianr 3:ecaf9963341b 70
foxbrianr 3:ecaf9963341b 71
foxbrianr 6:010ceb99f7b0 72 // ---------------------------------------------------------------------
foxbrianr 3:ecaf9963341b 73 void setCurrentTime (char* timeBuf)
foxbrianr 3:ecaf9963341b 74 {
foxbrianr 3:ecaf9963341b 75
foxbrianr 3:ecaf9963341b 76 time_t rawtime;
foxbrianr 3:ecaf9963341b 77 struct tm * timeinfo;
foxbrianr 3:ecaf9963341b 78
foxbrianr 3:ecaf9963341b 79 time ( &rawtime );
foxbrianr 3:ecaf9963341b 80 timeinfo = localtime ( &rawtime );
foxbrianr 3:ecaf9963341b 81
foxbrianr 3:ecaf9963341b 82 int hours = timeinfo->tm_hour;
foxbrianr 3:ecaf9963341b 83 int mins = timeinfo->tm_min;
foxbrianr 3:ecaf9963341b 84 int secs = timeinfo->tm_sec;
foxbrianr 3:ecaf9963341b 85
foxbrianr 3:ecaf9963341b 86 int years = timeinfo->tm_year + 1900;
foxbrianr 3:ecaf9963341b 87 int months = timeinfo->tm_mon + 1 ;
foxbrianr 3:ecaf9963341b 88 int days = timeinfo->tm_mday;
foxbrianr 3:ecaf9963341b 89
foxbrianr 5:65f21c0b6b79 90 sprintf(timeBuf,"%0d/%0d/%04d %02d:%02d:%02d",
foxbrianr 3:ecaf9963341b 91 months,days,years,hours,mins,secs );
foxbrianr 5:65f21c0b6b79 92
foxbrianr 5:65f21c0b6b79 93 printf("NEW %s\n", timeBuf);
foxbrianr 3:ecaf9963341b 94
foxbrianr 3:ecaf9963341b 95 }
foxbrianr 3:ecaf9963341b 96
foxbrianr 6:010ceb99f7b0 97 // ---------------------------------------------------------------------
foxbrianr 3:ecaf9963341b 98 void ESCMControlApp::init()
foxbrianr 3:ecaf9963341b 99 {
foxbrianr 5:65f21c0b6b79 100 // set on power, should not change
foxbrianr 5:65f21c0b6b79 101 escmRs485_Mode = 0; // Receive
foxbrianr 5:65f21c0b6b79 102 microCommRs485_Mode = 1; // Transmit
foxbrianr 5:65f21c0b6b79 103 microCommCan_Mode = 0; // Normal mode (turn on CNA transeiver)
foxbrianr 3:ecaf9963341b 104
foxbrianr 3:ecaf9963341b 105
foxbrianr 5:65f21c0b6b79 106 escmEventLog.init();
foxbrianr 5:65f21c0b6b79 107
foxbrianr 5:65f21c0b6b79 108 addressMap.init();
foxbrianr 5:65f21c0b6b79 109
foxbrianr 6:010ceb99f7b0 110 cur_address = 0;
foxbrianr 6:010ceb99f7b0 111
foxbrianr 5:65f21c0b6b79 112 if (escmEventLog.size()>0)
foxbrianr 5:65f21c0b6b79 113 {
foxbrianr 5:65f21c0b6b79 114 cur_address = escmEventLog.index(0)->address;
foxbrianr 5:65f21c0b6b79 115 }
foxbrianr 3:ecaf9963341b 116 }
foxbrianr 3:ecaf9963341b 117
foxbrianr 3:ecaf9963341b 118
foxbrianr 6:010ceb99f7b0 119 // ---------------------------------------------------------------------
foxbrianr 3:ecaf9963341b 120 void ESCMControlApp::update(void)
foxbrianr 3:ecaf9963341b 121 {
foxbrianr 5:65f21c0b6b79 122 static int counter = 0;
foxbrianr 6:010ceb99f7b0 123
foxbrianr 5:65f21c0b6b79 124 char value;
foxbrianr 6:010ceb99f7b0 125 int msgCount = 0;
foxbrianr 6:010ceb99f7b0 126 int nChar = 0;
foxbrianr 6:010ceb99f7b0 127 int new_address = 0;
foxbrianr 5:65f21c0b6b79 128 bool update_needed = 0;
foxbrianr 6:010ceb99f7b0 129
foxbrianr 6:010ceb99f7b0 130 char dataRxBuffer[4];
foxbrianr 6:010ceb99f7b0 131
foxbrianr 6:010ceb99f7b0 132 if(escmRs485_Input.readable() ) {
foxbrianr 5:65f21c0b6b79 133 //rx485Message();
foxbrianr 6:010ceb99f7b0 134 while (msgCount < 10 && (value = escmRs485_Input.getc())) {
foxbrianr 6:010ceb99f7b0 135 //printf("%02x ",value);
foxbrianr 6:010ceb99f7b0 136 dataRxBuffer[nChar++]=value;
foxbrianr 6:010ceb99f7b0 137 if(nChar==4) { // read 4 characters
foxbrianr 5:65f21c0b6b79 138 if (dataRxBuffer[2] == 0xd && dataRxBuffer[3] == 0xa) {
foxbrianr 5:65f21c0b6b79 139 new_address = 10*(dataRxBuffer[0] -0x30) + (dataRxBuffer[1] -0x30);
foxbrianr 6:010ceb99f7b0 140 printf("ADDR = %d ",new_address);
foxbrianr 6:010ceb99f7b0 141 update_needed = 1; // receive at least 1
foxbrianr 6:010ceb99f7b0 142 nChar = 0;
foxbrianr 5:65f21c0b6b79 143 dataRxCnt++;
foxbrianr 6:010ceb99f7b0 144 msgCount++;
foxbrianr 6:010ceb99f7b0 145 break;
foxbrianr 5:65f21c0b6b79 146 }
foxbrianr 6:010ceb99f7b0 147 }
foxbrianr 6:010ceb99f7b0 148
foxbrianr 5:65f21c0b6b79 149 }
foxbrianr 3:ecaf9963341b 150 }
foxbrianr 5:65f21c0b6b79 151
foxbrianr 5:65f21c0b6b79 152
foxbrianr 5:65f21c0b6b79 153 if (update_needed)
foxbrianr 5:65f21c0b6b79 154 {
foxbrianr 5:65f21c0b6b79 155 if (new_address >= 0 && new_address < 100 )
foxbrianr 5:65f21c0b6b79 156 {
foxbrianr 5:65f21c0b6b79 157 cur_address = new_address;
foxbrianr 6:010ceb99f7b0 158 printf("New Addr=%d\n",cur_address);
foxbrianr 5:65f21c0b6b79 159 postEvent(cur_address,0);
foxbrianr 5:65f21c0b6b79 160 counter = 0;
foxbrianr 5:65f21c0b6b79 161 new_address = -1;
foxbrianr 5:65f21c0b6b79 162 } else {
foxbrianr 5:65f21c0b6b79 163
foxbrianr 6:010ceb99f7b0 164 for (int i=0;i<4;i++)
foxbrianr 6:010ceb99f7b0 165 printf( "%0x ", dataRxBuffer[i]);
foxbrianr 6:010ceb99f7b0 166
foxbrianr 6:010ceb99f7b0 167 error("ERROR: INVALID_ADDR=[%d] [%d]\n",
foxbrianr 6:010ceb99f7b0 168 cur_address,
foxbrianr 6:010ceb99f7b0 169 new_address);
foxbrianr 6:010ceb99f7b0 170
foxbrianr 5:65f21c0b6b79 171 }
foxbrianr 5:65f21c0b6b79 172 }
foxbrianr 5:65f21c0b6b79 173
foxbrianr 6:010ceb99f7b0 174 if (counter == 0 ) {
foxbrianr 6:010ceb99f7b0 175 relayMessage (cur_address);
foxbrianr 6:010ceb99f7b0 176 counter = 5; //send .5 sec
foxbrianr 6:010ceb99f7b0 177 dataTxCnt++;
foxbrianr 5:65f21c0b6b79 178 }
foxbrianr 5:65f21c0b6b79 179 counter--;
foxbrianr 5:65f21c0b6b79 180 }
foxbrianr 5:65f21c0b6b79 181
foxbrianr 5:65f21c0b6b79 182 /*************************************************************************/
foxbrianr 5:65f21c0b6b79 183 void ESCMControlApp::processMessageQueue ()
foxbrianr 5:65f21c0b6b79 184 {
foxbrianr 5:65f21c0b6b79 185 event_t e;
foxbrianr 5:65f21c0b6b79 186
foxbrianr 5:65f21c0b6b79 187 if (message_queue.empty())
foxbrianr 5:65f21c0b6b79 188 return;
foxbrianr 5:65f21c0b6b79 189
foxbrianr 5:65f21c0b6b79 190 while (!message_queue.empty()) {
foxbrianr 6:010ceb99f7b0 191 message_queue.pop(e);
foxbrianr 5:65f21c0b6b79 192 tx485Message(e.event);
foxbrianr 6:010ceb99f7b0 193 ThisThread::sleep_for(100);
foxbrianr 5:65f21c0b6b79 194 }
foxbrianr 5:65f21c0b6b79 195 }
foxbrianr 5:65f21c0b6b79 196
foxbrianr 5:65f21c0b6b79 197 /*************************************************************************/
foxbrianr 5:65f21c0b6b79 198 void ESCMControlApp::processSoundQueue ()
foxbrianr 5:65f21c0b6b79 199 {
foxbrianr 5:65f21c0b6b79 200 playbackMessage_t e;
foxbrianr 5:65f21c0b6b79 201
foxbrianr 5:65f21c0b6b79 202 if (playback_queue.empty())
foxbrianr 5:65f21c0b6b79 203 return;
foxbrianr 6:010ceb99f7b0 204
foxbrianr 6:010ceb99f7b0 205 // drain the queue
foxbrianr 5:65f21c0b6b79 206 while (!playback_queue.empty()) {
foxbrianr 5:65f21c0b6b79 207 playback_queue.pop(e);
foxbrianr 6:010ceb99f7b0 208 ThisThread::sleep_for(500);
foxbrianr 6:010ceb99f7b0 209 }
foxbrianr 6:010ceb99f7b0 210
foxbrianr 6:010ceb99f7b0 211 // emic is very slow so play last message
foxbrianr 6:010ceb99f7b0 212 speaker.speakf("S"); //Speak command starts with "S"
foxbrianr 6:010ceb99f7b0 213 speaker.speakf(e.message); // Send the desired string to convert to speech
foxbrianr 6:010ceb99f7b0 214 speaker.speakf("\r"); //marks end of speak command
foxbrianr 6:010ceb99f7b0 215 speaker.ready(); //ready waits for speech to finish from last command with a ":" response
foxbrianr 6:010ceb99f7b0 216
foxbrianr 6:010ceb99f7b0 217 }
foxbrianr 6:010ceb99f7b0 218 /*************************************************************************/
foxbrianr 6:010ceb99f7b0 219 void ESCMControlApp::info (char *format, ...)
foxbrianr 6:010ceb99f7b0 220 {
foxbrianr 6:010ceb99f7b0 221 char buffer[128];
foxbrianr 6:010ceb99f7b0 222 va_list args;
foxbrianr 6:010ceb99f7b0 223 va_start(args, format);
foxbrianr 6:010ceb99f7b0 224 vsprintf(buffer,format,args);
foxbrianr 6:010ceb99f7b0 225 printf("\nINFO:%s");
foxbrianr 6:010ceb99f7b0 226 va_end(args);
foxbrianr 6:010ceb99f7b0 227 }
foxbrianr 6:010ceb99f7b0 228 /*************************************************************************/
foxbrianr 6:010ceb99f7b0 229 void ESCMControlApp::warning (char *format, ...)
foxbrianr 6:010ceb99f7b0 230 {
foxbrianr 6:010ceb99f7b0 231
foxbrianr 6:010ceb99f7b0 232 char buffer[128];
foxbrianr 6:010ceb99f7b0 233 va_list args;
foxbrianr 6:010ceb99f7b0 234 va_start(args, format);
foxbrianr 6:010ceb99f7b0 235 vsprintf(buffer,format,args);
foxbrianr 6:010ceb99f7b0 236 printf("\nWARNING:%s");
foxbrianr 6:010ceb99f7b0 237 va_end(args);
foxbrianr 6:010ceb99f7b0 238 }
foxbrianr 6:010ceb99f7b0 239 /*************************************************************************/
foxbrianr 6:010ceb99f7b0 240 void ESCMControlApp::error (char *format, ...)
foxbrianr 6:010ceb99f7b0 241 {
foxbrianr 6:010ceb99f7b0 242 char buffer[128];
foxbrianr 6:010ceb99f7b0 243 va_list args;
foxbrianr 6:010ceb99f7b0 244 va_start(args, format);
foxbrianr 6:010ceb99f7b0 245 vsprintf(buffer,format,args);
foxbrianr 6:010ceb99f7b0 246
foxbrianr 6:010ceb99f7b0 247 printf("\n---------------------------------------------------");
foxbrianr 6:010ceb99f7b0 248 printf("\nERROR:%s");
foxbrianr 6:010ceb99f7b0 249 va_end(args);
foxbrianr 6:010ceb99f7b0 250 }
foxbrianr 6:010ceb99f7b0 251
foxbrianr 6:010ceb99f7b0 252 /*************************************************************************/
foxbrianr 6:010ceb99f7b0 253 void ESCMControlApp::say (int address)
foxbrianr 6:010ceb99f7b0 254 {
foxbrianr 6:010ceb99f7b0 255 char * desc = addressMap.getDescription(address);
foxbrianr 6:010ceb99f7b0 256 if (strlen(desc) > 0) {
foxbrianr 6:010ceb99f7b0 257 escmController.say("%s is open", desc );
foxbrianr 6:010ceb99f7b0 258 } else {
foxbrianr 6:010ceb99f7b0 259 escmController.say("Unit %d is open", address );
foxbrianr 3:ecaf9963341b 260 }
foxbrianr 3:ecaf9963341b 261 }
foxbrianr 5:65f21c0b6b79 262 /*************************************************************************/
foxbrianr 3:ecaf9963341b 263 void ESCMControlApp::say (char *format, ...)
foxbrianr 3:ecaf9963341b 264 {
foxbrianr 5:65f21c0b6b79 265
foxbrianr 5:65f21c0b6b79 266 playbackMessage_t e;
foxbrianr 5:65f21c0b6b79 267
foxbrianr 3:ecaf9963341b 268 char buffer[128];
foxbrianr 3:ecaf9963341b 269 va_list args;
foxbrianr 3:ecaf9963341b 270 va_start(args, format);
foxbrianr 5:65f21c0b6b79 271 vsprintf(e.message,format,args);
foxbrianr 6:010ceb99f7b0 272 // note: immediately going to the emic blocks calling thread
foxbrianr 5:65f21c0b6b79 273 #if 0
foxbrianr 3:ecaf9963341b 274 speaker.speakf("S");//Speak command starts with "S"
foxbrianr 5:65f21c0b6b79 275 speaker.speakf(e.message);
foxbrianr 3:ecaf9963341b 276 speaker.speakf("\r");
foxbrianr 3:ecaf9963341b 277 speaker.ready();
foxbrianr 5:65f21c0b6b79 278 #else
foxbrianr 5:65f21c0b6b79 279
foxbrianr 5:65f21c0b6b79 280 if (!playback_queue.full()) {
foxbrianr 5:65f21c0b6b79 281 playback_queue.push(e);
foxbrianr 5:65f21c0b6b79 282 } else {
foxbrianr 5:65f21c0b6b79 283 printf("Sound Queue Full\n");
foxbrianr 5:65f21c0b6b79 284 }
foxbrianr 5:65f21c0b6b79 285 #endif
foxbrianr 3:ecaf9963341b 286
foxbrianr 3:ecaf9963341b 287
foxbrianr 3:ecaf9963341b 288 va_end(args);
foxbrianr 3:ecaf9963341b 289 }
foxbrianr 5:65f21c0b6b79 290 /*************************************************************************/
foxbrianr 5:65f21c0b6b79 291 void ESCMControlApp::postEvent (uint16_t address)
foxbrianr 5:65f21c0b6b79 292 {
foxbrianr 5:65f21c0b6b79 293 event_t e;
foxbrianr 5:65f21c0b6b79 294
foxbrianr 5:65f21c0b6b79 295 e.event = address;
foxbrianr 5:65f21c0b6b79 296
foxbrianr 5:65f21c0b6b79 297 if (!message_queue.full()) {
foxbrianr 5:65f21c0b6b79 298 message_queue.push(e);
foxbrianr 5:65f21c0b6b79 299 } else {
foxbrianr 5:65f21c0b6b79 300 printf("Message Queue Full\n");
foxbrianr 5:65f21c0b6b79 301 }
foxbrianr 5:65f21c0b6b79 302 }
foxbrianr 3:ecaf9963341b 303
foxbrianr 5:65f21c0b6b79 304
foxbrianr 5:65f21c0b6b79 305 /*************************************************************************
foxbrianr 5:65f21c0b6b79 306 * The following function is called with a new event is received to
foxbrianr 5:65f21c0b6b79 307 * update the related parts
foxbrianr 5:65f21c0b6b79 308 *************************************************************************/
foxbrianr 5:65f21c0b6b79 309 void ESCMControlApp::postEvent (uint16_t address, uint16_t source)
foxbrianr 5:65f21c0b6b79 310 {
foxbrianr 5:65f21c0b6b79 311 if ( address >= 0 && address < 100 )
foxbrianr 5:65f21c0b6b79 312 {
foxbrianr 5:65f21c0b6b79 313 escmEventLog.add(address, source);
foxbrianr 5:65f21c0b6b79 314 ESCMControlApp::refresh_display();
foxbrianr 5:65f21c0b6b79 315
foxbrianr 5:65f21c0b6b79 316 #if 0
foxbrianr 5:65f21c0b6b79 317 ESCMControlApp::say("Unit %d is open", address);
foxbrianr 5:65f21c0b6b79 318 #else
foxbrianr 5:65f21c0b6b79 319 ESCMControlApp::say("%s is open",
foxbrianr 5:65f21c0b6b79 320 addressMap.getDescription(address));
foxbrianr 5:65f21c0b6b79 321 #endif
foxbrianr 5:65f21c0b6b79 322
foxbrianr 5:65f21c0b6b79 323 }
foxbrianr 5:65f21c0b6b79 324 else
foxbrianr 5:65f21c0b6b79 325 {
foxbrianr 5:65f21c0b6b79 326 //ignore it
foxbrianr 5:65f21c0b6b79 327 }
foxbrianr 5:65f21c0b6b79 328 }
foxbrianr 5:65f21c0b6b79 329
foxbrianr 6:010ceb99f7b0 330 /*************************************************************************/
foxbrianr 6:010ceb99f7b0 331
foxbrianr 5:65f21c0b6b79 332 void ESCMControlApp::refresh_display(void)
foxbrianr 5:65f21c0b6b79 333 {
foxbrianr 6:010ceb99f7b0 334 // Note: we only refresh the event log display to avoid LCD flashing
foxbrianr 6:010ceb99f7b0 335 // --
foxbrianr 6:010ceb99f7b0 336 #if 1
foxbrianr 6:010ceb99f7b0 337 showEvents.update_needed=1;
foxbrianr 6:010ceb99f7b0 338 #else
foxbrianr 6:010ceb99f7b0 339 Menu::getCurrentMenu()->update_needed=1
foxbrianr 6:010ceb99f7b0 340 #endif
foxbrianr 5:65f21c0b6b79 341 }
foxbrianr 5:65f21c0b6b79 342
foxbrianr 5:65f21c0b6b79 343 /*************************************************************************
foxbrianr 5:65f21c0b6b79 344 * The following function get time
foxbrianr 5:65f21c0b6b79 345 *************************************************************************/
foxbrianr 5:65f21c0b6b79 346 void ESCMControlApp::getTime(char *timeBuf)
foxbrianr 5:65f21c0b6b79 347 {
foxbrianr 5:65f21c0b6b79 348 time_t rawtime;
foxbrianr 5:65f21c0b6b79 349 struct tm * timeinfo;
foxbrianr 5:65f21c0b6b79 350
foxbrianr 5:65f21c0b6b79 351 time ( &rawtime );
foxbrianr 5:65f21c0b6b79 352 timeinfo = localtime ( &rawtime );
foxbrianr 5:65f21c0b6b79 353
foxbrianr 5:65f21c0b6b79 354 int hours = timeinfo->tm_hour;
foxbrianr 5:65f21c0b6b79 355 int mins = timeinfo->tm_min;
foxbrianr 5:65f21c0b6b79 356 int secs = timeinfo->tm_sec;
foxbrianr 5:65f21c0b6b79 357
foxbrianr 5:65f21c0b6b79 358 int years = timeinfo->tm_year + 1900;
foxbrianr 5:65f21c0b6b79 359 int months = timeinfo->tm_mon + 1 ;
foxbrianr 5:65f21c0b6b79 360 int days = timeinfo->tm_mday;
foxbrianr 3:ecaf9963341b 361
foxbrianr 6:010ceb99f7b0 362 sprintf(timeBuf,"%0d/%0d/%04d %02d:%02d:%02d",
foxbrianr 5:65f21c0b6b79 363 months,days,years,hours,mins,secs );
foxbrianr 5:65f21c0b6b79 364
foxbrianr 5:65f21c0b6b79 365 printf("TIME: %s\n", timeBuf);
foxbrianr 5:65f21c0b6b79 366 }
foxbrianr 5:65f21c0b6b79 367
foxbrianr 5:65f21c0b6b79 368 /*************************************************************************
foxbrianr 5:65f21c0b6b79 369 * The following functdion sets time which set the RTC
foxbrianr 5:65f21c0b6b79 370 *************************************************************************/
foxbrianr 5:65f21c0b6b79 371 void ESCMControlApp::setTime(int hours, int mins, int sec, int months, int days, int years )
foxbrianr 5:65f21c0b6b79 372 {
foxbrianr 5:65f21c0b6b79 373
foxbrianr 5:65f21c0b6b79 374 struct tm t;
foxbrianr 5:65f21c0b6b79 375
foxbrianr 5:65f21c0b6b79 376 t.tm_hour = hours;
foxbrianr 5:65f21c0b6b79 377 t.tm_min = mins;
foxbrianr 5:65f21c0b6b79 378 t.tm_sec = 0;
foxbrianr 5:65f21c0b6b79 379
foxbrianr 5:65f21c0b6b79 380 t.tm_year = years - 1900;
foxbrianr 5:65f21c0b6b79 381 t.tm_mon = months - 1;
foxbrianr 5:65f21c0b6b79 382 t.tm_mday = days;
foxbrianr 5:65f21c0b6b79 383
foxbrianr 5:65f21c0b6b79 384 // set the time
foxbrianr 5:65f21c0b6b79 385 set_time(mktime(&t));
foxbrianr 5:65f21c0b6b79 386 }
foxbrianr 5:65f21c0b6b79 387
foxbrianr 6:010ceb99f7b0 388 /*************************************************************************/
foxbrianr 6:010ceb99f7b0 389 void ESCMControlApp::relayMessage (int address)
foxbrianr 6:010ceb99f7b0 390 {
foxbrianr 6:010ceb99f7b0 391
foxbrianr 6:010ceb99f7b0 392 //printf("Current_Address is %d \n\r", cur_address );
foxbrianr 6:010ceb99f7b0 393 if (address >= 0 && address < 100 )
foxbrianr 6:010ceb99f7b0 394 {
foxbrianr 6:010ceb99f7b0 395 tx485Message(address); //send on rs485
foxbrianr 6:010ceb99f7b0 396 #if 1 // currently 501 & 502 control output
foxbrianr 6:010ceb99f7b0 397 txCanMessage501(address);//send on can
foxbrianr 6:010ceb99f7b0 398 txCanMessage502(address);
foxbrianr 6:010ceb99f7b0 399 #else
foxbrianr 6:010ceb99f7b0 400 txCanMessage580(address);
foxbrianr 6:010ceb99f7b0 401 #endif
foxbrianr 6:010ceb99f7b0 402 }
foxbrianr 6:010ceb99f7b0 403 else
foxbrianr 6:010ceb99f7b0 404 {
foxbrianr 6:010ceb99f7b0 405 error("relay: INVALID_ADDR=%d\n", address);
foxbrianr 6:010ceb99f7b0 406 }
foxbrianr 6:010ceb99f7b0 407 }
foxbrianr 5:65f21c0b6b79 408 /*************************************************************************
foxbrianr 5:65f21c0b6b79 409 * The following information is from the MicroComm_gen_input.doc
foxbrianr 5:65f21c0b6b79 410 *
foxbrianr 5:65f21c0b6b79 411 * Message is always 12 bytes with Check Sum
foxbrianr 5:65f21c0b6b79 412 * Byte 1 : 40
foxbrianr 5:65f21c0b6b79 413 * Byte 2 : Indictator
foxbrianr 5:65f21c0b6b79 414 * arrival_dn_arrow :1, bit 1
foxbrianr 5:65f21c0b6b79 415 * arrival_up_arrow :1, bit 0
foxbrianr 5:65f21c0b6b79 416 *
foxbrianr 5:65f21c0b6b79 417 * Byte 3 : Scan_slot.
foxbrianr 5:65f21c0b6b79 418 * Byte 4 : Message_number.
foxbrianr 5:65f21c0b6b79 419 * Byte 5 : Indictor
foxbrianr 5:65f21c0b6b79 420 * traveling dn arrow :1, bit 1
foxbrianr 5:65f21c0b6b79 421 * traveling up arrow :1, bit 0
foxbrianr 5:65f21c0b6b79 422 *
foxbrianr 5:65f21c0b6b79 423 * Byte 6 : ASCII floor char, msb
foxbrianr 5:65f21c0b6b79 424 * Byte 7 : ASCII floor char,
foxbrianr 5:65f21c0b6b79 425 * Byte 8 : ASCII floor char, lsb
foxbrianr 5:65f21c0b6b79 426 * Note: floor ASCII range is 0x30 through 0x5a (‘0’ – ‘Z’).
foxbrianr 5:65f21c0b6b79 427 * 0x3a through 0x40 are special characters with
foxbrianr 5:65f21c0b6b79 428 * 0x3b being the space or blank character(semicolon)
foxbrianr 5:65f21c0b6b79 429 * 0x3d is normally displayed as a minus character.
foxbrianr 5:65f21c0b6b79 430 *
foxbrianr 5:65f21c0b6b79 431 *
foxbrianr 5:65f21c0b6b79 432 * Byte 9 : ASCII msg char, msb
foxbrianr 5:65f21c0b6b79 433 * Byte 10 : ASCII msg char,
foxbrianr 5:65f21c0b6b79 434 * Byte 11 : ASCII msg char, lsb
foxbrianr 5:65f21c0b6b79 435 * Note: message ASCII range is 0x30 through 0x5b (‘0’ – ‘[’).
foxbrianr 5:65f21c0b6b79 436 * 0x3a through 0x40 are special characters with
foxbrianr 5:65f21c0b6b79 437 * 0x3b being the space or blank character(semicolon)
foxbrianr 5:65f21c0b6b79 438 * 0x5d is sent when there is no message (instead of spaces).
foxbrianr 5:65f21c0b6b79 439 *
foxbrianr 5:65f21c0b6b79 440 *
foxbrianr 5:65f21c0b6b79 441 * Byte 12 : checksum
foxbrianr 5:65f21c0b6b79 442 *
foxbrianr 5:65f21c0b6b79 443 * note messages are sent .5 - 1 sec using 485 Bus
foxbrianr 5:65f21c0b6b79 444 *************************************************************************/
foxbrianr 5:65f21c0b6b79 445 void ESCMControlApp::tx485Message(int address)
foxbrianr 5:65f21c0b6b79 446 {
foxbrianr 5:65f21c0b6b79 447
foxbrianr 3:ecaf9963341b 448 int sum =0;
foxbrianr 3:ecaf9963341b 449 char dataTxBuffer[12];
foxbrianr 5:65f21c0b6b79 450
foxbrianr 5:65f21c0b6b79 451 if (address >= 0 && address < 100 ) {
foxbrianr 5:65f21c0b6b79 452
foxbrianr 5:65f21c0b6b79 453 sum += dataTxBuffer[0] = 0x40; // fixed value
foxbrianr 5:65f21c0b6b79 454 sum += dataTxBuffer[1] = 0x01;
foxbrianr 5:65f21c0b6b79 455 sum += dataTxBuffer[2] = address; // floor number
foxbrianr 5:65f21c0b6b79 456 sum += dataTxBuffer[3] = 0x0;
foxbrianr 5:65f21c0b6b79 457 sum += dataTxBuffer[4] = 0x0;
foxbrianr 5:65f21c0b6b79 458 //---
foxbrianr 5:65f21c0b6b79 459 sum += dataTxBuffer[5] = 0x0;
foxbrianr 5:65f21c0b6b79 460 sum += dataTxBuffer[6] = (0x30 + address / 10);
foxbrianr 5:65f21c0b6b79 461 sum += dataTxBuffer[7] = (0x30 + address % 10);
foxbrianr 5:65f21c0b6b79 462 //---
foxbrianr 5:65f21c0b6b79 463 sum += dataTxBuffer[8] = 0x0;
foxbrianr 5:65f21c0b6b79 464 sum += dataTxBuffer[9] = 'F';
foxbrianr 5:65f21c0b6b79 465 sum += dataTxBuffer[10] = 'X';
foxbrianr 5:65f21c0b6b79 466
foxbrianr 5:65f21c0b6b79 467 sum += dataTxBuffer[11] = (char)(~sum +1);
foxbrianr 5:65f21c0b6b79 468
foxbrianr 5:65f21c0b6b79 469 for(int i= 0; i<12; i++) {
foxbrianr 5:65f21c0b6b79 470 microCommRs485_Tx.putc(dataTxBuffer[i]);
foxbrianr 5:65f21c0b6b79 471 }
foxbrianr 5:65f21c0b6b79 472
foxbrianr 5:65f21c0b6b79 473 } else {
foxbrianr 6:010ceb99f7b0 474 warning("tx485: invalid address %d",address );
foxbrianr 3:ecaf9963341b 475 }
foxbrianr 3:ecaf9963341b 476
foxbrianr 3:ecaf9963341b 477 }
foxbrianr 3:ecaf9963341b 478
foxbrianr 5:65f21c0b6b79 479
foxbrianr 5:65f21c0b6b79 480 /*************************************************************************
foxbrianr 5:65f21c0b6b79 481 * The following information is from the ElevCANtoMC
foxbrianr 5:65f21c0b6b79 482 * for CAN Message 0x501
foxbrianr 5:65f21c0b6b79 483 *
foxbrianr 5:65f21c0b6b79 484 * Byte 1
foxbrianr 5:65f21c0b6b79 485 * Front arrows
foxbrianr 5:65f21c0b6b79 486 * Bit 0 – Front arrival arrow up
foxbrianr 5:65f21c0b6b79 487 * Bit 1 – Front arrival arrow down
foxbrianr 5:65f21c0b6b79 488 * Bit 2 – Play Strobe
foxbrianr 5:65f21c0b6b79 489 * Bit 3-5 – Reserved
foxbrianr 5:65f21c0b6b79 490 * Bit 6 – Fire Warning Lamp
foxbrianr 5:65f21c0b6b79 491 * Byte 2
foxbrianr 5:65f21c0b6b79 492 * Floor Number. A floor number of 0 is not a valid.
foxbrianr 5:65f21c0b6b79 493 * Byte 3
foxbrianr 5:65f21c0b6b79 494 * Priority message number
foxbrianr 5:65f21c0b6b79 495 * Byte 4
foxbrianr 5:65f21c0b6b79 496 * Travel and rear arrows
foxbrianr 5:65f21c0b6b79 497 * Bit 0 – Travel arrow up
foxbrianr 5:65f21c0b6b79 498 * Bit 1 – Travel arrow down
foxbrianr 5:65f21c0b6b79 499 * Bit 2 – unused
foxbrianr 5:65f21c0b6b79 500 * Bit 3 – Passing Chime
foxbrianr 5:65f21c0b6b79 501 * Bit 4 – Message Level Low Bit
foxbrianr 5:65f21c0b6b79 502 * Bit 5 – Message Level High Bit
foxbrianr 5:65f21c0b6b79 503 * Bit 6 – Rear arrival arrow up
foxbrianr 5:65f21c0b6b79 504 * Bit 7 – Rear arrival arrow down
foxbrianr 5:65f21c0b6b79 505 * Byte 5-8
foxbrianr 5:65f21c0b6b79 506 * Reserved
foxbrianr 5:65f21c0b6b79 507 *
foxbrianr 5:65f21c0b6b79 508 *
foxbrianr 5:65f21c0b6b79 509 * note messages are to come .5 - 1 sec using 50K CAN Bus
foxbrianr 5:65f21c0b6b79 510 ********************************************************************/
foxbrianr 5:65f21c0b6b79 511 void ESCMControlApp::txCanMessage501 (int address)
foxbrianr 5:65f21c0b6b79 512 {
foxbrianr 5:65f21c0b6b79 513 static int counterTx = 0;
foxbrianr 5:65f21c0b6b79 514 char data[8];
foxbrianr 5:65f21c0b6b79 515
foxbrianr 5:65f21c0b6b79 516
foxbrianr 5:65f21c0b6b79 517 if (address >= 0 && address < 100 ) {
foxbrianr 5:65f21c0b6b79 518
foxbrianr 5:65f21c0b6b79 519 data[0] = (counterTx%2)?0x1:0x2; // toggle arrow
foxbrianr 5:65f21c0b6b79 520 data[1] = (uint8_t)address; // numerical floor #
foxbrianr 5:65f21c0b6b79 521 data[2] = 0x0;
foxbrianr 5:65f21c0b6b79 522 data[3] = (counterTx%2)?0x1:0x2; // toggle travel arrow
foxbrianr 5:65f21c0b6b79 523 data[4] = 0x0;
foxbrianr 5:65f21c0b6b79 524 data[5] = 0x0;
foxbrianr 5:65f21c0b6b79 525 data[6] = 0x0;
foxbrianr 5:65f21c0b6b79 526 data[7] = 0x0;
foxbrianr 5:65f21c0b6b79 527
foxbrianr 5:65f21c0b6b79 528 if(microCommCanItf.write(CANMessage(0x501, data, 8))) {
foxbrianr 5:65f21c0b6b79 529 //printf("Message 501:(%d) sent via CAN: %d\n\r",counterTx, address);
foxbrianr 5:65f21c0b6b79 530 counterTx++;
foxbrianr 5:65f21c0b6b79 531 } else {
foxbrianr 5:65f21c0b6b79 532 //printf("Message 501: Reset\n\r");
foxbrianr 5:65f21c0b6b79 533 microCommCanItf.reset();
foxbrianr 5:65f21c0b6b79 534 }
foxbrianr 5:65f21c0b6b79 535
foxbrianr 5:65f21c0b6b79 536 } else {
foxbrianr 6:010ceb99f7b0 537 warning("tx501: invalid address %d",address );
foxbrianr 5:65f21c0b6b79 538 }
foxbrianr 5:65f21c0b6b79 539
foxbrianr 5:65f21c0b6b79 540 }
foxbrianr 5:65f21c0b6b79 541 /*************************************************************************
foxbrianr 5:65f21c0b6b79 542 * The following information is from the ElevCANtoMC
foxbrianr 5:65f21c0b6b79 543 * for CAN Message 0x502
foxbrianr 5:65f21c0b6b79 544 * Byte 1
foxbrianr 5:65f21c0b6b79 545 * Floor marking character (leftmost)
foxbrianr 5:65f21c0b6b79 546 * Byte 2
foxbrianr 5:65f21c0b6b79 547 * Floor marking character
foxbrianr 5:65f21c0b6b79 548 * Byte 3
foxbrianr 5:65f21c0b6b79 549 * Floor marking character (rightmost)
foxbrianr 5:65f21c0b6b79 550 * Byte 4
foxbrianr 5:65f21c0b6b79 551 * Message marking character (leftmost)
foxbrianr 5:65f21c0b6b79 552 * Byte 5
foxbrianr 5:65f21c0b6b79 553 * Message marking character
foxbrianr 5:65f21c0b6b79 554 * Byte 6
foxbrianr 5:65f21c0b6b79 555 * Message marking character (rightmost)
foxbrianr 5:65f21c0b6b79 556 * Byte 7
foxbrianr 5:65f21c0b6b79 557 * Lantern Position (ThyssenKrupp)
foxbrianr 5:65f21c0b6b79 558 * Byte 8
foxbrianr 5:65f21c0b6b79 559 * Unused
foxbrianr 5:65f21c0b6b79 560 *
foxbrianr 5:65f21c0b6b79 561 * note messages are to come .5 - 1 sec using 50K CAN Bus
foxbrianr 5:65f21c0b6b79 562 ********************************************************************/
foxbrianr 3:ecaf9963341b 563 void ESCMControlApp::txCanMessage502 (int address)
foxbrianr 3:ecaf9963341b 564 {
foxbrianr 5:65f21c0b6b79 565 static int counterTx = 0;
foxbrianr 5:65f21c0b6b79 566 char data[8];
foxbrianr 3:ecaf9963341b 567
foxbrianr 5:65f21c0b6b79 568 if (address >= 0 && address < 100 ) {
foxbrianr 5:65f21c0b6b79 569
foxbrianr 5:65f21c0b6b79 570 data[0] = 0x0;
foxbrianr 5:65f21c0b6b79 571 data[1] = (0x30 + address / 10); // assumes address is 0-9 range
foxbrianr 5:65f21c0b6b79 572 data[2] = (0x30 + address % 10); // assumes address is 0-9 range
foxbrianr 5:65f21c0b6b79 573 data[3] = 0x0;
foxbrianr 5:65f21c0b6b79 574 data[4] = (0x30 + address / 10); // assumes address is 0-9 range
foxbrianr 5:65f21c0b6b79 575 data[5] = (0x30 + address % 10); // assumes address is 0-9 range
foxbrianr 5:65f21c0b6b79 576 data[6] = 'F';
foxbrianr 5:65f21c0b6b79 577 data[7] = 0x0;
foxbrianr 5:65f21c0b6b79 578
foxbrianr 5:65f21c0b6b79 579
foxbrianr 5:65f21c0b6b79 580 if(microCommCanItf.write(CANMessage(0x502, data, 8))) {
foxbrianr 6:010ceb99f7b0 581 //printf("Message 502: (%d) sent via CAN: %d\n\r",counterTx, address);
foxbrianr 5:65f21c0b6b79 582 counterTx++;
foxbrianr 5:65f21c0b6b79 583 } else {
foxbrianr 5:65f21c0b6b79 584 microCommCanItf.reset();
foxbrianr 5:65f21c0b6b79 585 }
foxbrianr 5:65f21c0b6b79 586
foxbrianr 5:65f21c0b6b79 587 } else {
foxbrianr 6:010ceb99f7b0 588 warning("tx503: invalid address %d",address );
foxbrianr 5:65f21c0b6b79 589 }
foxbrianr 5:65f21c0b6b79 590 }
foxbrianr 5:65f21c0b6b79 591
foxbrianr 5:65f21c0b6b79 592 /*************************************************************************
foxbrianr 5:65f21c0b6b79 593 * The following information is from the ElevCANtoMC
foxbrianr 5:65f21c0b6b79 594 * for CAN Message 0x580
foxbrianr 5:65f21c0b6b79 595 * Byte 1
foxbrianr 5:65f21c0b6b79 596 * Floor Number. A floor number of 0 is not a valid floor position and should only be used when translating from a source that does not provide numeric position data.
foxbrianr 5:65f21c0b6b79 597 * Byte 2
foxbrianr 5:65f21c0b6b79 598 * Floor marking character (leftmost) [the MICRO COMM® converter does not support this character]
foxbrianr 5:65f21c0b6b79 599 * Byte 3
foxbrianr 5:65f21c0b6b79 600 * Floor marking character
foxbrianr 5:65f21c0b6b79 601 * Byte 4
foxbrianr 5:65f21c0b6b79 602 * Floor marking character
foxbrianr 5:65f21c0b6b79 603 * Byte 5
foxbrianr 5:65f21c0b6b79 604 * Floor marking character (rightmost)
foxbrianr 5:65f21c0b6b79 605 * Byte 6
foxbrianr 5:65f21c0b6b79 606 * Bit 0 – Front in-car arrow up
foxbrianr 5:65f21c0b6b79 607 * Bit 1 – Front in-car arrow down
foxbrianr 5:65f21c0b6b79 608 * Bit 2 – Rear in-car arrow up
foxbrianr 5:65f21c0b6b79 609 * Bit 3 – Rear in-car arrow down
foxbrianr 5:65f21c0b6b79 610 * Bit 4 – Travel arrow up
foxbrianr 5:65f21c0b6b79 611 * Bit 5 – Travel arrow down
foxbrianr 5:65f21c0b6b79 612 * Bit 6 – Passing chime
foxbrianr 5:65f21c0b6b79 613 * Bit 7 – Unused
foxbrianr 5:65f21c0b6b79 614 * Byte 7
foxbrianr 5:65f21c0b6b79 615 * Hall Arrows
foxbrianr 5:65f21c0b6b79 616 * Bit 0 – Front arrival arrow up
foxbrianr 5:65f21c0b6b79 617 * Bit 1 – Front arrival arrow down
foxbrianr 5:65f21c0b6b79 618 * Bit 2 – Front gong up
foxbrianr 5:65f21c0b6b79 619 * Bit 3 – Front gong down
foxbrianr 5:65f21c0b6b79 620 * Bit 4 – Rear arrival arrow up
foxbrianr 5:65f21c0b6b79 621 * Bit 5 – Rear arrival arrow down
foxbrianr 5:65f21c0b6b79 622 * Bit 6 – Rear gong up
foxbrianr 5:65f21c0b6b79 623 * Bit 7 – Rear gong down
foxbrianr 5:65f21c0b6b79 624 * Byte 8
foxbrianr 5:65f21c0b6b79 625 * Target display number (This is not used by most controllers.
foxbrianr 5:65f21c0b6b79 626 * Just leave this set to 0xFF for basic controller operation).
foxbrianr 5:65f21c0b6b79 627 * If this is used, it only applies to data located in Byte 7.
foxbrianr 5:65f21c0b6b79 628 *
foxbrianr 5:65f21c0b6b79 629 * note messages are to come .5 - 1 sec using 50K CAN Bus
foxbrianr 5:65f21c0b6b79 630 ********************************************************************/
foxbrianr 5:65f21c0b6b79 631 void ESCMControlApp::txCanMessage580 (int address)
foxbrianr 5:65f21c0b6b79 632 {
foxbrianr 5:65f21c0b6b79 633 static int counterTx = 0;
foxbrianr 5:65f21c0b6b79 634 char data[8];
foxbrianr 5:65f21c0b6b79 635
foxbrianr 5:65f21c0b6b79 636 if (address >= 0 && address < 100 ) {
foxbrianr 5:65f21c0b6b79 637
foxbrianr 5:65f21c0b6b79 638 data[0] = address;
foxbrianr 5:65f21c0b6b79 639 data[1] = 0x0;
foxbrianr 5:65f21c0b6b79 640 data[2] = 0x0;
foxbrianr 5:65f21c0b6b79 641 data[3] = (0x30 + address / 10);
foxbrianr 5:65f21c0b6b79 642 data[4] = (0x30 + address % 10);
foxbrianr 5:65f21c0b6b79 643 data[5] = (counterTx%2)?0x1:0x2;
foxbrianr 5:65f21c0b6b79 644 data[6] = 0x0A;//front down and gong down
foxbrianr 5:65f21c0b6b79 645 data[7] = 0xFF;
foxbrianr 5:65f21c0b6b79 646
foxbrianr 5:65f21c0b6b79 647 if(microCommCanItf.write(CANMessage(0x580, data, 8))) {
foxbrianr 5:65f21c0b6b79 648 //printf("Message 580: (%d) sent via CAN: %d\n\r",counterTx, address);
foxbrianr 5:65f21c0b6b79 649 counterTx++;
foxbrianr 5:65f21c0b6b79 650 } else {
foxbrianr 5:65f21c0b6b79 651 microCommCanItf.reset();
foxbrianr 5:65f21c0b6b79 652 }
foxbrianr 5:65f21c0b6b79 653
foxbrianr 5:65f21c0b6b79 654
foxbrianr 5:65f21c0b6b79 655 } else {
foxbrianr 6:010ceb99f7b0 656 warning ("tx580: invalid address %d",address );
foxbrianr 5:65f21c0b6b79 657 }
foxbrianr 3:ecaf9963341b 658
foxbrianr 3:ecaf9963341b 659 }
foxbrianr 3:ecaf9963341b 660
foxbrianr 3:ecaf9963341b 661
foxbrianr 3:ecaf9963341b 662
foxbrianr 5:65f21c0b6b79 663