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 Mar 17 17:24:16 2020 +0000
Revision:
10:f221dd1ef77b
Parent:
8:f15a5358883c
fix up code for barry

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