Release 1.01

Dependents:   mbed_escm2000

Committer:
foxbrianr
Date:
Tue Sep 17 14:24:20 2019 +0000
Revision:
6:af3769d17a35
Parent:
5:9f4d4f8ffc00
Child:
8:9d4e684d8eb8
RC01

Who changed what in which revision?

UserRevisionLine numberNew contents of line
foxbrianr 5:9f4d4f8ffc00 1 /**************************************************************************
foxbrianr 5:9f4d4f8ffc00 2 * @file DisplayCodeMenu.cpp
foxbrianr 5:9f4d4f8ffc00 3 * @brief Base class for implementing the Display Code Menu display
foxbrianr 5:9f4d4f8ffc00 4 * @version: V1.0
foxbrianr 5:9f4d4f8ffc00 5 * @date: 9/17/2019
foxbrianr 5:9f4d4f8ffc00 6
foxbrianr 5:9f4d4f8ffc00 7 *
foxbrianr 5:9f4d4f8ffc00 8 * @note
foxbrianr 5:9f4d4f8ffc00 9 * Copyright (C) 2019 E3 Design. All rights reserved.
foxbrianr 5:9f4d4f8ffc00 10 *
foxbrianr 5:9f4d4f8ffc00 11 * @par
foxbrianr 5:9f4d4f8ffc00 12 * E3 Designers LLC is supplying this software for use with Cortex-M3 LPC1768
foxbrianr 5:9f4d4f8ffc00 13 * processor based microcontroller for the ESCM 2000 Monitor and Display.
foxbrianr 5:9f4d4f8ffc00 14 * *
foxbrianr 5:9f4d4f8ffc00 15 * @par
foxbrianr 5:9f4d4f8ffc00 16 * THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED
foxbrianr 5:9f4d4f8ffc00 17 * OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF
foxbrianr 5:9f4d4f8ffc00 18 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE.
foxbrianr 5:9f4d4f8ffc00 19 * ARM SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR
foxbrianr 5:9f4d4f8ffc00 20 * CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER.
foxbrianr 5:9f4d4f8ffc00 21 *
foxbrianr 5:9f4d4f8ffc00 22 ******************************************************************************/
foxbrianr 3:8395f7ab6d3e 23 #include "mbed.h"
foxbrianr 3:8395f7ab6d3e 24 #include "DisplayCodesMenu.h"
foxbrianr 3:8395f7ab6d3e 25 #include "TimeUtilities.h"
foxbrianr 4:7226c43320b5 26 #include "ESCMControlApp.h"
foxbrianr 3:8395f7ab6d3e 27
foxbrianr 3:8395f7ab6d3e 28
foxbrianr 5:9f4d4f8ffc00 29 /******************************************************************************/
foxbrianr 4:7226c43320b5 30 DisplayCodesMenu::DisplayCodesMenu(char* id): Menu(id)
foxbrianr 3:8395f7ab6d3e 31 {
foxbrianr 4:7226c43320b5 32
foxbrianr 4:7226c43320b5 33 active_selection = 0;
foxbrianr 4:7226c43320b5 34 row=0;
foxbrianr 4:7226c43320b5 35 column=0;
foxbrianr 4:7226c43320b5 36 update_needed=1;
foxbrianr 4:7226c43320b5 37 current_index=0;
foxbrianr 4:7226c43320b5 38 current_line = 1;
foxbrianr 4:7226c43320b5 39 top = 0;
foxbrianr 4:7226c43320b5 40
foxbrianr 4:7226c43320b5 41 }
foxbrianr 4:7226c43320b5 42
foxbrianr 4:7226c43320b5 43
foxbrianr 4:7226c43320b5 44
foxbrianr 5:9f4d4f8ffc00 45 /******************************************************************************/
foxbrianr 4:7226c43320b5 46 void DisplayCodesMenu::init()
foxbrianr 4:7226c43320b5 47 {
foxbrianr 3:8395f7ab6d3e 48 active_selection = 0;
foxbrianr 3:8395f7ab6d3e 49 row=0;
foxbrianr 3:8395f7ab6d3e 50 column=0;
foxbrianr 3:8395f7ab6d3e 51 update_needed=1;
foxbrianr 4:7226c43320b5 52 current_index= 0;
foxbrianr 4:7226c43320b5 53 current_line = 1;
foxbrianr 4:7226c43320b5 54 top = 0;
foxbrianr 3:8395f7ab6d3e 55 }
foxbrianr 4:7226c43320b5 56
foxbrianr 4:7226c43320b5 57
foxbrianr 5:9f4d4f8ffc00 58 /******************************************************************************/
foxbrianr 3:8395f7ab6d3e 59 void DisplayCodesMenu::display(LCD * lcd)
foxbrianr 3:8395f7ab6d3e 60 {
foxbrianr 4:7226c43320b5 61 static int lastPos = 0;
foxbrianr 4:7226c43320b5 62 static int lastSize = 0;
foxbrianr 4:7226c43320b5 63
foxbrianr 4:7226c43320b5 64 int update_page = 0;
foxbrianr 3:8395f7ab6d3e 65 char buf[40];
foxbrianr 4:7226c43320b5 66
foxbrianr 4:7226c43320b5 67 //displayCurrentTime(lcd);
foxbrianr 3:8395f7ab6d3e 68
foxbrianr 4:7226c43320b5 69 if(escmEventLog.head_ != lastPos ) {
foxbrianr 4:7226c43320b5 70
foxbrianr 4:7226c43320b5 71 current_index = 0;
foxbrianr 4:7226c43320b5 72 top = current_index;
foxbrianr 4:7226c43320b5 73 bottom = top + 2;
foxbrianr 4:7226c43320b5 74
foxbrianr 4:7226c43320b5 75 lastPos = escmEventLog.head_;
foxbrianr 4:7226c43320b5 76 lastSize = escmEventLog.size();
foxbrianr 4:7226c43320b5 77 update_needed=1;
foxbrianr 4:7226c43320b5 78 }
foxbrianr 4:7226c43320b5 79
foxbrianr 4:7226c43320b5 80
foxbrianr 4:7226c43320b5 81 // paging
foxbrianr 4:7226c43320b5 82 if (current_index < top )
foxbrianr 4:7226c43320b5 83 {
foxbrianr 4:7226c43320b5 84 top = current_index ;
foxbrianr 4:7226c43320b5 85 bottom = current_index + 2;
foxbrianr 4:7226c43320b5 86 update_page = 1;
foxbrianr 4:7226c43320b5 87 update_needed=1;
foxbrianr 4:7226c43320b5 88 }
foxbrianr 4:7226c43320b5 89 else if (current_index > bottom)
foxbrianr 4:7226c43320b5 90 {
foxbrianr 4:7226c43320b5 91 top = current_index - 2;
foxbrianr 4:7226c43320b5 92 bottom = current_index;
foxbrianr 4:7226c43320b5 93 update_page = 1;
foxbrianr 4:7226c43320b5 94 update_needed=1;
foxbrianr 4:7226c43320b5 95 }
foxbrianr 4:7226c43320b5 96 else
foxbrianr 3:8395f7ab6d3e 97 {
foxbrianr 3:8395f7ab6d3e 98
foxbrianr 3:8395f7ab6d3e 99 }
foxbrianr 3:8395f7ab6d3e 100
foxbrianr 4:7226c43320b5 101
foxbrianr 4:7226c43320b5 102 if (update_needed) {
foxbrianr 4:7226c43320b5 103
foxbrianr 4:7226c43320b5 104 lock();
foxbrianr 4:7226c43320b5 105
foxbrianr 4:7226c43320b5 106 switch (active_selection ) {
foxbrianr 5:9f4d4f8ffc00 107 case 2:
foxbrianr 4:7226c43320b5 108 lcd->cls();
foxbrianr 4:7226c43320b5 109 lcd->locate(1,0);
foxbrianr 4:7226c43320b5 110 lcd->printf("Are you sure you want to erase");
foxbrianr 4:7226c43320b5 111 lcd->locate(2,0);
foxbrianr 5:9f4d4f8ffc00 112 lcd->printf("all events (Press Set)?");
foxbrianr 4:7226c43320b5 113 update_needed = 0;
foxbrianr 4:7226c43320b5 114 break;
foxbrianr 5:9f4d4f8ffc00 115 case 3:
foxbrianr 4:7226c43320b5 116 lcd->cls();
foxbrianr 4:7226c43320b5 117 lcd->locate(1,0);
foxbrianr 4:7226c43320b5 118 lcd->printf("Deleting Events...");
foxbrianr 4:7226c43320b5 119 erase_log = 0;
foxbrianr 4:7226c43320b5 120 escmEventLog.reset();
foxbrianr 4:7226c43320b5 121 escmEventLog.save();
foxbrianr 4:7226c43320b5 122 update_needed = 1;
foxbrianr 4:7226c43320b5 123 active_selection = 0;
foxbrianr 4:7226c43320b5 124 current_index = 0;
foxbrianr 4:7226c43320b5 125 break;
foxbrianr 4:7226c43320b5 126
foxbrianr 5:9f4d4f8ffc00 127 case 1:
foxbrianr 5:9f4d4f8ffc00 128 // DISPLAY EXPANDED INFO
foxbrianr 4:7226c43320b5 129 lcd->cls();
foxbrianr 4:7226c43320b5 130 lcd->locate(0,0);
foxbrianr 4:7226c43320b5 131 lcd->printf(" ID | Port | Unit | Time");
foxbrianr 5:9f4d4f8ffc00 132 lcd->locate(0,33);
foxbrianr 5:9f4d4f8ffc00 133 lcd->printf("Addr=%02d",escmController.cur_address);
foxbrianr 4:7226c43320b5 134
foxbrianr 4:7226c43320b5 135 // update display
foxbrianr 4:7226c43320b5 136 for(int i=0; i<3; i++) {
foxbrianr 4:7226c43320b5 137
foxbrianr 4:7226c43320b5 138 int index = top + i;
foxbrianr 4:7226c43320b5 139 int line = (1+i);
foxbrianr 4:7226c43320b5 140
foxbrianr 4:7226c43320b5 141 int selected = current_index == index;
foxbrianr 4:7226c43320b5 142
foxbrianr 4:7226c43320b5 143
foxbrianr 4:7226c43320b5 144 ESCM_Event *event = escmEventLog.index (index) ;
foxbrianr 4:7226c43320b5 145
foxbrianr 4:7226c43320b5 146 if (event != NULL && index < escmEventLog.size() ) {
foxbrianr 5:9f4d4f8ffc00 147
foxbrianr 4:7226c43320b5 148 sprintf(buf,"%02d | %02d | %02d | %02d:%02d:%02d %02d/%02d/%04d",
foxbrianr 4:7226c43320b5 149 index + 1,
foxbrianr 4:7226c43320b5 150 event->port,
foxbrianr 4:7226c43320b5 151 event->address,
foxbrianr 4:7226c43320b5 152 event->hours,
foxbrianr 4:7226c43320b5 153 event->mins,
foxbrianr 4:7226c43320b5 154 event->secs,
foxbrianr 4:7226c43320b5 155 event->month,
foxbrianr 4:7226c43320b5 156 event->day,
foxbrianr 4:7226c43320b5 157 event->year
foxbrianr 4:7226c43320b5 158 );
foxbrianr 4:7226c43320b5 159
foxbrianr 5:9f4d4f8ffc00 160
foxbrianr 4:7226c43320b5 161 } else {
foxbrianr 4:7226c43320b5 162 sprintf(buf,"%-s | %-s | %-s | %-s",
foxbrianr 4:7226c43320b5 163 "--",
foxbrianr 4:7226c43320b5 164 "--",
foxbrianr 4:7226c43320b5 165 "--",
foxbrianr 4:7226c43320b5 166 "- N/A -");
foxbrianr 4:7226c43320b5 167 }
foxbrianr 4:7226c43320b5 168
foxbrianr 4:7226c43320b5 169 if(selected) {
foxbrianr 4:7226c43320b5 170 lcd->locate(line,0);
foxbrianr 4:7226c43320b5 171 lcd->printf(">%-39s",buf);
foxbrianr 4:7226c43320b5 172 } else {
foxbrianr 4:7226c43320b5 173 lcd->locate(line,0);
foxbrianr 4:7226c43320b5 174 lcd->printf(" %-39s",buf);
foxbrianr 4:7226c43320b5 175 }
foxbrianr 4:7226c43320b5 176
foxbrianr 4:7226c43320b5 177 //lcd->locate(line,2);
foxbrianr 4:7226c43320b5 178 //lcd->printf(buf);
foxbrianr 4:7226c43320b5 179
foxbrianr 4:7226c43320b5 180 }
foxbrianr 4:7226c43320b5 181 update_page = 0;
foxbrianr 4:7226c43320b5 182 update_needed=0;
foxbrianr 4:7226c43320b5 183 break;
foxbrianr 5:9f4d4f8ffc00 184 break;
foxbrianr 5:9f4d4f8ffc00 185 default:
foxbrianr 5:9f4d4f8ffc00 186
foxbrianr 5:9f4d4f8ffc00 187 lcd->cls();
foxbrianr 5:9f4d4f8ffc00 188 lcd->locate(0,0);
foxbrianr 5:9f4d4f8ffc00 189 #if 0
foxbrianr 5:9f4d4f8ffc00 190 lcd->printf(" ID | Port | Unit | Time");
foxbrianr 5:9f4d4f8ffc00 191 #else
foxbrianr 5:9f4d4f8ffc00 192 lcd->printf(" ID | Description | Time");
foxbrianr 5:9f4d4f8ffc00 193 #endif
foxbrianr 5:9f4d4f8ffc00 194
foxbrianr 5:9f4d4f8ffc00 195 lcd->locate(0,33);
foxbrianr 5:9f4d4f8ffc00 196 lcd->printf("Addr=%02d",escmController.cur_address);
foxbrianr 6:af3769d17a35 197
foxbrianr 5:9f4d4f8ffc00 198 // update display
foxbrianr 5:9f4d4f8ffc00 199 for(int i=0; i<3; i++) {
foxbrianr 5:9f4d4f8ffc00 200
foxbrianr 5:9f4d4f8ffc00 201 int index = top + i;
foxbrianr 5:9f4d4f8ffc00 202 int line = (1+i);
foxbrianr 5:9f4d4f8ffc00 203
foxbrianr 5:9f4d4f8ffc00 204 int selected = current_index == index;
foxbrianr 5:9f4d4f8ffc00 205
foxbrianr 5:9f4d4f8ffc00 206
foxbrianr 5:9f4d4f8ffc00 207 ESCM_Event *event = escmEventLog.index (index) ;
foxbrianr 5:9f4d4f8ffc00 208
foxbrianr 5:9f4d4f8ffc00 209 if (event != NULL && index < escmEventLog.size() ) {
foxbrianr 5:9f4d4f8ffc00 210 #if 0
foxbrianr 5:9f4d4f8ffc00 211 sprintf(buf,"%02d | %02d | %02d | %02d:%02d:%02d %02d/%02d/%04d",
foxbrianr 5:9f4d4f8ffc00 212 index + 1,
foxbrianr 5:9f4d4f8ffc00 213 event->port,
foxbrianr 5:9f4d4f8ffc00 214 event->address,
foxbrianr 5:9f4d4f8ffc00 215 event->hours,
foxbrianr 5:9f4d4f8ffc00 216 event->mins,
foxbrianr 5:9f4d4f8ffc00 217 event->secs,
foxbrianr 5:9f4d4f8ffc00 218 event->month,
foxbrianr 5:9f4d4f8ffc00 219 event->day,
foxbrianr 5:9f4d4f8ffc00 220 event->year
foxbrianr 5:9f4d4f8ffc00 221 );
foxbrianr 5:9f4d4f8ffc00 222 #else
foxbrianr 5:9f4d4f8ffc00 223 char * ev_desc = addressMap.getDescription(event->address);
foxbrianr 5:9f4d4f8ffc00 224 sprintf(buf,"%02d | %-12s | %02d:%02d:%02d %02d/%02d/%04d",
foxbrianr 5:9f4d4f8ffc00 225
foxbrianr 5:9f4d4f8ffc00 226 event->address,
foxbrianr 5:9f4d4f8ffc00 227 ev_desc,
foxbrianr 5:9f4d4f8ffc00 228 event->hours,
foxbrianr 5:9f4d4f8ffc00 229 event->mins,
foxbrianr 5:9f4d4f8ffc00 230 event->secs,
foxbrianr 5:9f4d4f8ffc00 231 event->month,
foxbrianr 5:9f4d4f8ffc00 232 event->day,
foxbrianr 5:9f4d4f8ffc00 233 event->year
foxbrianr 5:9f4d4f8ffc00 234 );
foxbrianr 5:9f4d4f8ffc00 235 #endif
foxbrianr 5:9f4d4f8ffc00 236
foxbrianr 5:9f4d4f8ffc00 237 } else {
foxbrianr 5:9f4d4f8ffc00 238 #if 0
foxbrianr 5:9f4d4f8ffc00 239 sprintf(buf,"%-s | %-s | %-s | %-s",
foxbrianr 5:9f4d4f8ffc00 240 "--",
foxbrianr 5:9f4d4f8ffc00 241 "--",
foxbrianr 5:9f4d4f8ffc00 242 "--",
foxbrianr 5:9f4d4f8ffc00 243 "- N/A -");
foxbrianr 5:9f4d4f8ffc00 244 #else
foxbrianr 6:af3769d17a35 245 sprintf(buf,"%-s | %-s | %-s",
foxbrianr 5:9f4d4f8ffc00 246 "--",
foxbrianr 5:9f4d4f8ffc00 247 "Empty",
foxbrianr 5:9f4d4f8ffc00 248 "- N/A -");
foxbrianr 5:9f4d4f8ffc00 249 #endif
foxbrianr 5:9f4d4f8ffc00 250 }
foxbrianr 5:9f4d4f8ffc00 251
foxbrianr 5:9f4d4f8ffc00 252 if(selected) {
foxbrianr 5:9f4d4f8ffc00 253 lcd->locate(line,0);
foxbrianr 5:9f4d4f8ffc00 254 lcd->printf(">%-39s",buf);
foxbrianr 5:9f4d4f8ffc00 255 } else {
foxbrianr 5:9f4d4f8ffc00 256 lcd->locate(line,0);
foxbrianr 5:9f4d4f8ffc00 257 lcd->printf(" %-39s",buf);
foxbrianr 5:9f4d4f8ffc00 258 }
foxbrianr 5:9f4d4f8ffc00 259
foxbrianr 5:9f4d4f8ffc00 260 //lcd->locate(line,2);
foxbrianr 5:9f4d4f8ffc00 261 //lcd->printf(buf);
foxbrianr 5:9f4d4f8ffc00 262
foxbrianr 5:9f4d4f8ffc00 263 }
foxbrianr 5:9f4d4f8ffc00 264 update_page = 0;
foxbrianr 5:9f4d4f8ffc00 265 update_needed=0;
foxbrianr 5:9f4d4f8ffc00 266 break;
foxbrianr 4:7226c43320b5 267 }
foxbrianr 4:7226c43320b5 268
foxbrianr 4:7226c43320b5 269 unlock();
foxbrianr 4:7226c43320b5 270 }
foxbrianr 4:7226c43320b5 271 }
foxbrianr 4:7226c43320b5 272
foxbrianr 4:7226c43320b5 273
foxbrianr 5:9f4d4f8ffc00 274 /******************************************************************************/
foxbrianr 4:7226c43320b5 275 void DisplayCodesMenu::pressSet()
foxbrianr 4:7226c43320b5 276 {
foxbrianr 4:7226c43320b5 277 switch(active_selection) {
foxbrianr 4:7226c43320b5 278
foxbrianr 5:9f4d4f8ffc00 279 case 0:
foxbrianr 5:9f4d4f8ffc00 280 case 1:
foxbrianr 5:9f4d4f8ffc00 281 { // normal
foxbrianr 5:9f4d4f8ffc00 282
foxbrianr 4:7226c43320b5 283 ESCM_Event *event = escmEventLog.index(current_index);
foxbrianr 4:7226c43320b5 284 if (event!=NULL)
foxbrianr 4:7226c43320b5 285 {
foxbrianr 5:9f4d4f8ffc00 286 escmController.say(event->address );
foxbrianr 5:9f4d4f8ffc00 287 escmController.relayMessage(event->address );
foxbrianr 4:7226c43320b5 288 }
foxbrianr 4:7226c43320b5 289 update_needed = 0;
foxbrianr 4:7226c43320b5 290 break;
foxbrianr 4:7226c43320b5 291 }
foxbrianr 5:9f4d4f8ffc00 292 case 2: // press yes
foxbrianr 5:9f4d4f8ffc00 293 active_selection = 3;
foxbrianr 4:7226c43320b5 294 update_needed = 1;
foxbrianr 4:7226c43320b5 295 break;
foxbrianr 5:9f4d4f8ffc00 296 case 3: // press yes
foxbrianr 4:7226c43320b5 297 default:
foxbrianr 4:7226c43320b5 298 active_selection = 0;
foxbrianr 4:7226c43320b5 299 break;
foxbrianr 4:7226c43320b5 300 }
foxbrianr 3:8395f7ab6d3e 301 }
foxbrianr 3:8395f7ab6d3e 302
foxbrianr 5:9f4d4f8ffc00 303 /******************************************************************************/
foxbrianr 3:8395f7ab6d3e 304 void DisplayCodesMenu::pressMode()
foxbrianr 4:7226c43320b5 305 {
foxbrianr 3:8395f7ab6d3e 306
foxbrianr 4:7226c43320b5 307 switch(active_selection) {
foxbrianr 4:7226c43320b5 308 case 0: // normal
foxbrianr 4:7226c43320b5 309 active_selection = 1;
foxbrianr 4:7226c43320b5 310 update_needed = 1;
foxbrianr 4:7226c43320b5 311 break;
foxbrianr 5:9f4d4f8ffc00 312 case 1: // normal
foxbrianr 5:9f4d4f8ffc00 313 active_selection = 2;
foxbrianr 5:9f4d4f8ffc00 314 update_needed = 1;
foxbrianr 5:9f4d4f8ffc00 315 break;
foxbrianr 5:9f4d4f8ffc00 316 case 2: // normal
foxbrianr 5:9f4d4f8ffc00 317 case 3: // normal
foxbrianr 4:7226c43320b5 318 default:
foxbrianr 4:7226c43320b5 319 active_selection = 0;
foxbrianr 4:7226c43320b5 320 update_needed = 1;
foxbrianr 4:7226c43320b5 321 break;
foxbrianr 4:7226c43320b5 322 }
foxbrianr 3:8395f7ab6d3e 323 }
foxbrianr 3:8395f7ab6d3e 324
foxbrianr 5:9f4d4f8ffc00 325 /******************************************************************************/
foxbrianr 3:8395f7ab6d3e 326 void DisplayCodesMenu::pressDown()
foxbrianr 4:7226c43320b5 327 {
foxbrianr 4:7226c43320b5 328
foxbrianr 4:7226c43320b5 329 current_line++;
foxbrianr 4:7226c43320b5 330 current_index++;
foxbrianr 4:7226c43320b5 331
foxbrianr 4:7226c43320b5 332 if (current_index >= escmEventLog.size() )
foxbrianr 4:7226c43320b5 333 current_index = 0;
foxbrianr 3:8395f7ab6d3e 334
foxbrianr 4:7226c43320b5 335
foxbrianr 4:7226c43320b5 336 if (current_line > 3 )
foxbrianr 4:7226c43320b5 337 current_line = 3;
foxbrianr 4:7226c43320b5 338
foxbrianr 3:8395f7ab6d3e 339 update_needed=1;
foxbrianr 3:8395f7ab6d3e 340 }
foxbrianr 4:7226c43320b5 341
foxbrianr 5:9f4d4f8ffc00 342 /******************************************************************************/
foxbrianr 3:8395f7ab6d3e 343 void DisplayCodesMenu::pressUp()
foxbrianr 3:8395f7ab6d3e 344 {
foxbrianr 4:7226c43320b5 345 current_line--;
foxbrianr 4:7226c43320b5 346 current_index--;
foxbrianr 4:7226c43320b5 347 if (current_index < 0)
foxbrianr 4:7226c43320b5 348 current_index = escmEventLog.size()-1;
foxbrianr 4:7226c43320b5 349
foxbrianr 4:7226c43320b5 350 if (current_line < 1 )
foxbrianr 4:7226c43320b5 351 current_line = 1;
foxbrianr 4:7226c43320b5 352
foxbrianr 4:7226c43320b5 353 update_needed =1;
foxbrianr 3:8395f7ab6d3e 354 }
foxbrianr 5:9f4d4f8ffc00 355 /******************************************************************************/