Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
System.c
00001 #include "System.h" 00002 00003 DigitalOut EXT_LED0(LED2); 00004 DigitalOut ETH_LED_GREEN(p29); 00005 DigitalOut ETH_LED_YELLOW(p30); 00006 DigitalIn ActionButton(p28); 00007 DigitalIn SDCardDetect(p9); 00008 Ticker SystemTick; 00009 00010 WORD UpdateHostTerminalTick; 00011 WORD DisplayUpdateTick; 00012 WORD ButtonCheckTick; 00013 WORD DisplayShutOffTick; 00014 00015 BYTE SystemState; 00016 CHAR DTBuf[32]; 00017 CHAR DataLineBuf[256]; 00018 00019 //***************************************************************** 00020 //smart Display related stuff 00021 //***************************************************************** 00022 00023 #define DISPLAY_MEASUREMENTS 0x00 00024 #define DISPLAY_BATTERY 0x01 00025 #define DISPLAY_DATE_TIME 0x02 00026 #define DISPLAY_CARD_STATUS 0x03 00027 #define DISPLAY_BUFFER_STATS 0x04 00028 #define DISPLAY_FIRMWARE_VERSION 0x05 00029 #define DISPLAY_ID 0x06 00030 #define DISPLAY_OFF 0xFF 00031 00032 #define NUM_DISPLAYS 7 00033 #define DISPLAY_SHUTOFF_TIME 10000 00034 00035 BYTE DisplayMode; 00036 BYTE LastBackLightColor = 0; 00037 00038 //***************************************************************** 00039 //Action Button Related stuff 00040 //***************************************************************** 00041 #define WAITING_FOR_PRESS 0x00 00042 #define WAITING_FOR_RELEASE 0x01 00043 00044 BYTE PreviousButtonState; 00045 BYTE CurrentButtonState; 00046 WORD ButtonHoldTime; 00047 BYTE ButtonCheckState; 00048 void ActionButtonHandler(WORD ButtonPressTime); 00049 00050 //***************************************************************** 00051 //Terminal Related stuff 00052 //***************************************************************** 00053 00054 //#define MAX_TERMINAL_LINE_CHARS 128 00055 //CHAR TerminalLineBuf[MAX_TERMINAL_LINE_CHARS]; 00056 //BYTE TerminalPos; 00057 time_t CurrentTime_InSec; 00058 tm *CurrentTime; 00059 BOOL ProcessTerminalLine(CHAR * LineIn); 00060 BOOL CheckForTime(CHAR *LineIn); 00061 BOOL CheckForDate(CHAR *LineIn); 00062 BOOL CheckForTimeInit(CHAR * LineIn); 00063 BOOL CheckforConfig(CHAR *LineIn); 00064 00065 //***************************************************************** 00066 //Logging Related Stuff 00067 //***************************************************************** 00068 CHAR CurrentLogFileName[256]; 00069 BOOL InitDataLog(); 00070 BOOL DataLogError; 00071 CHAR *ErrorMsg; 00072 00073 void CreateLogFileName(); 00074 00075 FATFS MyFileSystem; 00076 FIL CurrentLogFileHandle; 00077 00078 //DataBlock MyDataBlock[2]; 00079 DataBlock MyDataBlock; 00080 00081 BYTE ActiveDataBlock; 00082 DWORD DataBlocksWritten; 00083 DWORD DataPointIndex; 00084 SIGNED_DWORD ReadWriteDifferential; 00085 00086 DWORD WritesSinceLastFlush; 00087 00088 #define BINARY_WRITE_CACHE_THRESHOLD 512 00089 BYTE BinaryDataCache[BINARY_WRITE_CACHE_THRESHOLD + 64]; 00090 DWORD BinaryDataCachePtr; 00091 00092 #define NUM_WRITES_BEFORE_FLUSH (10) 00093 00094 //***************************************************************** 00095 //Misc System Related Stuff 00096 //***************************************************************** 00097 void SystemTickIrq(); 00098 void AdjustIOffset(); 00099 00100 void InitRobotPowerMeasurementSystem() 00101 { 00102 InitDataBlocks(&MyDataBlock); 00103 00104 ActiveDataBlock = 0; 00105 DataBlocksWritten = 0; 00106 DataPointIndex = 0; 00107 00108 SystemTick.attach_us(&SystemTickIrq,10000); 00109 CurrentTime_InSec = time(NULL); 00110 00111 DataLogError = FALSE; 00112 } 00113 00114 00115 void InitDataBlocks(DataBlock * DB) 00116 { 00117 int i; 00118 00119 for(i=0;i<DATA_BLOCK_SIZE;i++) 00120 { 00121 DB->Voltage[i] = 0; 00122 DB->Current[i] = 0; 00123 } 00124 00125 DB->WriteOutPtr = 0; 00126 DB->ReadInPtr = 0; 00127 } 00128 00129 00130 void EnterSystemState(BYTE NextState) 00131 { 00132 switch(NextState) 00133 { 00134 default: 00135 case SYSTEM_STATE_INIT: 00136 DisplayMode = DISPLAY_MEASUREMENTS; 00137 SystemState = NextState; 00138 break; 00139 00140 case SYSTEM_STATE_LOGGING: 00141 DisplayMode = DISPLAY_CARD_STATUS; 00142 00143 if(InitDataLog() == FALSE) 00144 { 00145 SystemState = NextState; 00146 00147 } 00148 else 00149 { 00150 SystemState = SYSTEM_STATE_IDLE; 00151 } 00152 00153 break; 00154 00155 case SYSTEM_STATE_IDLE: 00156 DisplayMode = DISPLAY_CARD_STATUS; 00157 if(SystemState == SYSTEM_STATE_LOGGING) 00158 { 00159 f_close(&CurrentLogFileHandle); 00160 f_mount(0,NULL); 00161 PrintfEnqueue(&PCBackDoorTx,"Logging terminated on file %s\r\n>",CurrentLogFileName); 00162 } 00163 00164 SystemState = NextState; 00165 break; 00166 } 00167 } 00168 00169 BOOL InitDataLog() 00170 { 00171 UINT BytesWritten; 00172 00173 PrintfEnqueue(&PCBackDoorTx,"\r\n\r\bInitializing Data log....\r\n"); 00174 CreateLogFileName(); 00175 PrintfEnqueue(&PCBackDoorTx,"Filename: %s\r\n",CurrentLogFileName); 00176 PrintfEnqueue(&PCBackDoorTx,"Attempting File Open....\r\n"); 00177 00178 BinaryDataCachePtr = 0; 00179 WritesSinceLastFlush = 0; 00180 00181 f_mount(0,&MyFileSystem); 00182 if(f_open(&CurrentLogFileHandle,&CurrentLogFileName[0],FA_WRITE | FA_OPEN_ALWAYS) != FR_OK) 00183 { 00184 DataLogError = TRUE; 00185 PrintfEnqueue(&PCBackDoorTx,"Could not open file!\r\n>"); 00186 ErrorMsg = "Write Error!"; 00187 return TRUE; 00188 } 00189 00190 DataBlocksWritten = 0; 00191 DataPointIndex = 0; 00192 00193 DataLogError = FALSE; 00194 PrintfEnqueue(&PCBackDoorTx,"Writing Headers....\r\n"); 00195 time(&CurrentTime_InSec); 00196 strftime(DTBuf,128, "%Y.%m.%d", localtime(&CurrentTime_InSec)); 00197 f_printf(&CurrentLogFileHandle, "Date %s\r\n",DTBuf); 00198 strftime(DTBuf,128, "%H:%M:%S", localtime(&CurrentTime_InSec)); 00199 f_printf(&CurrentLogFileHandle, "Time %s\r\n\n",DTBuf); 00200 sprintf(DTBuf, "Sample Rate %.1f Hz\r\n\r\n",SAMPLE_RATE); 00201 f_write(&CurrentLogFileHandle,DTBuf,strlen(DTBuf),&BytesWritten); 00202 PrintfEnqueue(&PCBackDoorTx,"Headers Written.... Starting log\r\n"); 00203 00204 00205 PrintfEnqueue(&PCBackDoorTx,"\r\n>"); 00206 00207 return FALSE; 00208 } 00209 00210 00211 void CreateLogFileName() 00212 { 00213 time(&CurrentTime_InSec); 00214 strftime(CurrentLogFileName,256, "F%Y.%m.%d.%H.%M.%S.csv", localtime(&CurrentTime_InSec)); 00215 } 00216 00217 00218 00219 void SystemTickIrq() 00220 { 00221 if(UpdateHostTerminalTick<0xFFFF) 00222 UpdateHostTerminalTick++; 00223 00224 if(DisplayUpdateTick<0xFFFF) 00225 DisplayUpdateTick++; 00226 00227 if(ButtonCheckTick<0xFFFF) 00228 ButtonCheckTick++; 00229 00230 if(DisplayShutOffTick<0xFFFF) 00231 DisplayShutOffTick++; 00232 } 00233 00234 void InitButton() 00235 { 00236 ButtonCheckState = WAITING_FOR_PRESS; 00237 ButtonCheckTick = 0; 00238 PreviousButtonState = FALSE; 00239 CurrentButtonState = FALSE; 00240 00241 } 00242 void CheckButton() 00243 { 00244 if(ButtonCheckTick>0) 00245 { 00246 ButtonCheckTick = 0; 00247 00248 PreviousButtonState = CurrentButtonState; 00249 CurrentButtonState = ActionButton.read(); 00250 00251 switch(ButtonCheckState) 00252 { 00253 default: 00254 case WAITING_FOR_PRESS: 00255 00256 if(CurrentButtonState == TRUE && PreviousButtonState == FALSE) 00257 { 00258 ButtonCheckState = WAITING_FOR_RELEASE; 00259 } 00260 00261 ButtonHoldTime = 0; 00262 00263 break; 00264 00265 case WAITING_FOR_RELEASE: 00266 00267 if(CurrentButtonState == TRUE && PreviousButtonState == TRUE) 00268 { 00269 ButtonHoldTime++; 00270 } 00271 else if(CurrentButtonState == FALSE && PreviousButtonState == TRUE) 00272 { 00273 ActionButtonHandler(ButtonHoldTime); 00274 ButtonCheckState = WAITING_FOR_PRESS; 00275 } 00276 else 00277 { 00278 ButtonCheckState = WAITING_FOR_PRESS; 00279 } 00280 break; 00281 } 00282 } 00283 } 00284 00285 00286 void ActionButtonHandler(WORD ButtonPressTime) 00287 { 00288 DisplayShutOffTick = 0; 00289 00290 if(ButtonPressTime<50) 00291 { 00292 if(DisplayMode == DISPLAY_OFF) 00293 { 00294 PowerUpSmartSwitch(); 00295 SmartSwitch_Reset(); 00296 SmartSwitchClear(); 00297 DisplayMode = DISPLAY_MEASUREMENTS; 00298 } 00299 else 00300 { 00301 00302 if(DataLogError == TRUE) 00303 { 00304 DataLogError = FALSE; 00305 } 00306 else 00307 { 00308 DisplayMode++; 00309 00310 if(DisplayMode >= NUM_DISPLAYS) 00311 { 00312 DisplayMode = 0; 00313 } 00314 } 00315 } 00316 } 00317 00318 else if(ButtonPressTime>100 && ButtonPressTime<500) 00319 { 00320 switch(SystemState) 00321 { 00322 default: 00323 case SYSTEM_STATE_IDLE: 00324 switch(DisplayMode) 00325 { 00326 default: 00327 00328 break; 00329 00330 case DISPLAY_MEASUREMENTS: 00331 AdjustIOffset(); 00332 break; 00333 00334 00335 case DISPLAY_FIRMWARE_VERSION: 00336 LoadConfiguration(); 00337 break; 00338 00339 00340 case DISPLAY_CARD_STATUS: 00341 if(SDCardDetect == 1) 00342 { 00343 EnterSystemState(SYSTEM_STATE_LOGGING); 00344 } 00345 break; 00346 } 00347 break; 00348 00349 00350 case SYSTEM_STATE_LOGGING: 00351 EnterSystemState(SYSTEM_STATE_IDLE); 00352 // unmount the file system 00353 f_mount(0,NULL); 00354 break; 00355 } 00356 } 00357 } 00358 00359 void AdjustIOffset() 00360 { 00361 DWORD SamplesToTake; 00362 DWORD i; 00363 float RunningSum = 0; 00364 00365 PrintfEnqueue(&PCBackDoorTx,"Zeroing ACS576.....\r\n"); 00366 00367 ADCDataRdy=0; 00368 00369 SamplesToTake = (DWORD)(SAMPLE_RATE)*2; 00370 00371 for(i=0;i<SamplesToTake;i++) 00372 { 00373 SmartSwitch_SetBackLightColor2((BYTE)((float)i/(float)SamplesToTake * 64)); 00374 00375 while(ADCDataRdy == FALSE) 00376 { 00377 00378 } 00379 ADCDataRdy = FALSE; 00380 RunningSum += RobotBusCurrentHR; 00381 } 00382 00383 ACS576_IOFFSET_TRIM += RunningSum / SamplesToTake; 00384 00385 SmartSwitch_SetBackLightColor(3,3,3); 00386 00387 PrintfEnqueue(&PCBackDoorTx,"Exporting new configuration file.....\r\n>"); 00388 00389 ExportConfigurationSettings(); 00390 } 00391 00392 00393 /*void UpdateHostTerminal() 00394 { 00395 BYTE NextCharIn; 00396 00397 if(BytesInQueue(&PCBackDoorRx)>0) 00398 { 00399 ByteDequeue(&PCBackDoorRx,&NextCharIn); 00400 00401 switch(NextCharIn) 00402 { 00403 case '\r': 00404 00405 TerminalLineBuf[TerminalPos++] = 0x0; 00406 ByteEnqueue(&PCBackDoorTx,NextCharIn); 00407 ProcessTerminalLine(TerminalLineBuf); 00408 ByteEnqueue(&PCBackDoorTx,'\n'); 00409 ByteEnqueue(&PCBackDoorTx,'>'); 00410 TerminalPos = 0; 00411 00412 break; 00413 00414 case '\b': 00415 if(TerminalPos > 0) 00416 { 00417 TerminalPos--; 00418 ByteEnqueue(&PCBackDoorTx,NextCharIn); 00419 } 00420 break; 00421 00422 default: 00423 00424 if(NextCharIn > 32) 00425 { 00426 if(TerminalPos < MAX_TERMINAL_LINE_CHARS-1) 00427 { 00428 TerminalLineBuf[TerminalPos++] = NextCharIn; 00429 ByteEnqueue(&PCBackDoorTx,NextCharIn); 00430 } 00431 } 00432 00433 break; 00434 00435 } 00436 } 00437 00438 } 00439 */ 00440 00441 BOOL ProcessTerminalLine(CHAR * LineIn) 00442 { 00443 CheckForTime(LineIn); 00444 CheckForDate(LineIn); 00445 CheckForTimeInit(LineIn); 00446 CheckforConfig(LineIn); 00447 return TRUE; 00448 } 00449 00450 BOOL CheckforConfig(CHAR *LineIn) 00451 { 00452 if(!strcmp(LineIn,"config")) 00453 { 00454 LoadConfiguration(); 00455 } 00456 return TRUE; 00457 } 00458 00459 00460 BOOL CheckForTimeInit(CHAR * LineIn) 00461 { 00462 if(!strcmp(LineIn,"tinit")) 00463 { 00464 set_time(1256729737); 00465 PrintfEnqueue(&PCBackDoorTx,"\r\nTime Reset\r\n"); 00466 } 00467 00468 return TRUE; 00469 00470 } 00471 00472 BOOL CheckForTime(CHAR *LineIn) 00473 { 00474 int Hour,Minute,Second=0; 00475 int Items; 00476 BOOL Error = FALSE; 00477 time_t TimeStampTemp; 00478 00479 00480 Items = sscanf(LineIn, "time=%d : %d : %d", &Hour, &Minute, &Second); 00481 if(Items == 3) 00482 { 00483 PrintfEnqueue(&PCBackDoorTx,"\r\n"); 00484 if(Hour>23) 00485 { 00486 PrintfEnqueue(&PCBackDoorTx,"Hour entry must be between 0 and 24\r\n"); 00487 Error = TRUE; 00488 } 00489 if(Minute>60) 00490 { 00491 PrintfEnqueue(&PCBackDoorTx,"Minute entry must be between 0 and 60\r\n"); 00492 Error = TRUE; 00493 } 00494 if(Second>60) 00495 { 00496 PrintfEnqueue(&PCBackDoorTx,"Second entry must be between 0 and 60\r\n"); 00497 Error = TRUE; 00498 } 00499 00500 if(Error == TRUE) 00501 { 00502 PrintfEnqueue(&PCBackDoorTx,"Error in time format. Time not changed.\r\n"); 00503 } 00504 else 00505 { 00506 TimeStampTemp = time(NULL); 00507 //convert to tm struct 00508 CurrentTime = localtime(&TimeStampTemp); 00509 //dump in our new valus 00510 CurrentTime->tm_sec = Second; 00511 CurrentTime->tm_min = Minute; 00512 CurrentTime->tm_hour = Hour; 00513 //set the new time 00514 set_time(mktime(CurrentTime)); 00515 PrintfEnqueue(&PCBackDoorTx,"Time set to %d:%d:%d\r\n",Hour,Minute,Second); 00516 } 00517 00518 } 00519 return FALSE; 00520 } 00521 00522 BOOL CheckForDate(CHAR *LineIn) 00523 { 00524 int Day,Month,Year=0; 00525 int Items; 00526 BOOL Error = FALSE; 00527 time_t TimeStampTemp; 00528 00529 Items = sscanf(LineIn, "date=%d / %d / %d", &Month, &Day, &Year); 00530 if(Items == 3) 00531 { 00532 PrintfEnqueue(&PCBackDoorTx,"\r\n"); 00533 if(Month>12 || Month < 1) 00534 { 00535 PrintfEnqueue(&PCBackDoorTx,"Month entry must be between 1 and 12\r\n"); 00536 Error = TRUE; 00537 } 00538 if(Day>31 || Day<1) 00539 { 00540 PrintfEnqueue(&PCBackDoorTx,"Day entry must be between 1 and 31\r\n"); 00541 Error = TRUE; 00542 } 00543 if(Year<1900) 00544 { 00545 PrintfEnqueue(&PCBackDoorTx,"Year entry must be greater than 1900\r\n"); 00546 Error = TRUE; 00547 } 00548 00549 if(Error == TRUE) 00550 { 00551 PrintfEnqueue(&PCBackDoorTx,"Error in time format. Date not changed.\r\n"); 00552 } 00553 else 00554 { 00555 //Get the current time in seconds since unix epoch 00556 TimeStampTemp = time(NULL); 00557 //convert to tm struct fom 00558 CurrentTime = localtime(&TimeStampTemp); 00559 //dump in our new valus 00560 CurrentTime->tm_mon = Month-1; 00561 CurrentTime->tm_mday = Day; 00562 CurrentTime->tm_year = Year - 1900; 00563 //set the new time 00564 set_time(mktime(CurrentTime)); 00565 PrintfEnqueue(&PCBackDoorTx,"Date set to %d/%d/%d\r\n",Month,Day,Year); 00566 } 00567 00568 } 00569 return FALSE; 00570 } 00571 00572 00573 00574 void UpdateDisplay() 00575 { 00576 00577 if(DisplayShutOffTick > DISPLAY_SHUTOFF_TIME) 00578 { 00579 DisplayMode = DISPLAY_OFF; 00580 SmartSwitchClear(); 00581 PowerDownSmartSwitch(); 00582 } 00583 else 00584 { 00585 if(DisplayUpdateTick > 25) 00586 { 00587 GFX_FullDisplayBufferClear(&BackBuffer); 00588 DisplayUpdateTick = 0; 00589 switch(DisplayMode) 00590 { 00591 default: 00592 case DISPLAY_MEASUREMENTS: 00593 SmartSwitch_SetBackLightColor(3,3,3); 00594 GFX_DrawString(&BackBuffer,"Robot Bus",0,0,&Font5x7); 00595 GFX_DrawHline(&BackBuffer,0,PHYSICAL_DISPLAY_XRES-1,10); 00596 GFX_DrawHline(&BackBuffer,0,PHYSICAL_DISPLAY_XRES-1,11); 00597 GFX_DrawHline(&BackBuffer,0,PHYSICAL_DISPLAY_XRES-1,12); 00598 00599 GFX_printf(&BackBuffer,0,16,&Font5x7,"V: %.2fv",RobotBusVoltageHR); 00600 GFX_printf(&BackBuffer,0,24,&Font5x7,"I: %.2fa",RobotBusCurrentHR); 00601 break; 00602 00603 00604 case DISPLAY_BATTERY: 00605 SmartSwitch_SetBackLightColor(3,3,0); 00606 GFX_DrawString(&BackBuffer,"Battery",0,0,&Font5x7); 00607 GFX_DrawHline(&BackBuffer,0,PHYSICAL_DISPLAY_XRES-1,10); 00608 GFX_DrawHline(&BackBuffer,0,PHYSICAL_DISPLAY_XRES-1,11); 00609 GFX_DrawHline(&BackBuffer,0,PHYSICAL_DISPLAY_XRES-1,12); 00610 00611 GFX_printf(&BackBuffer,0,16,&Font5x7,"V: %.1fv",BatteryVoltage); 00612 00613 break; 00614 00615 case DISPLAY_DATE_TIME: 00616 SmartSwitch_SetBackLightColor(1,3,0); 00617 GFX_DrawString(&BackBuffer,"Date/Time",0,0,&Font5x7); 00618 GFX_DrawHline(&BackBuffer,0,PHYSICAL_DISPLAY_XRES-1,10); 00619 GFX_DrawHline(&BackBuffer,0,PHYSICAL_DISPLAY_XRES-1,11); 00620 GFX_DrawHline(&BackBuffer,0,PHYSICAL_DISPLAY_XRES-1,12); 00621 00622 time(&CurrentTime_InSec); 00623 strftime(DTBuf, 32, "%m.%d.%Y", localtime(&CurrentTime_InSec)); 00624 GFX_printf(&BackBuffer,0,16,&Font5x7,"%s",DTBuf); 00625 00626 strftime(DTBuf, 32, "%H:%M:%S", localtime(&CurrentTime_InSec)); 00627 GFX_printf(&BackBuffer,0,24,&Font5x7,"%s",DTBuf); 00628 break; 00629 00630 case DISPLAY_BUFFER_STATS: 00631 SmartSwitch_SetBackLightColor(3,3,3); 00632 GFX_DrawString(&BackBuffer,"Buf Status",0,0,&Font5x7); 00633 GFX_DrawHline(&BackBuffer,0,PHYSICAL_DISPLAY_XRES-1,10); 00634 GFX_DrawHline(&BackBuffer,0,PHYSICAL_DISPLAY_XRES-1,11); 00635 GFX_DrawHline(&BackBuffer,0,PHYSICAL_DISPLAY_XRES-1,12); 00636 GFX_printf(&BackBuffer,0,16,&Font3x5,"R/W Diff:"); 00637 GFX_printf(&BackBuffer,0,24,&Font3x5,"%04d/%d",ReadWriteDifferential,DATA_BLOCK_SIZE); 00638 break; 00639 00640 case DISPLAY_FIRMWARE_VERSION: 00641 SmartSwitch_SetBackLightColor(3,3,3); 00642 GFX_DrawString(&BackBuffer,"Firmware Version",0,0,&Font3x5); 00643 GFX_DrawHline(&BackBuffer,0,PHYSICAL_DISPLAY_XRES-1,10); 00644 GFX_DrawHline(&BackBuffer,0,PHYSICAL_DISPLAY_XRES-1,11); 00645 GFX_DrawHline(&BackBuffer,0,PHYSICAL_DISPLAY_XRES-1,12); 00646 GFX_printf(&BackBuffer,19,20,&Font5x7,"%d.%d",FIRMWARE_VERSION_MAJOR,FIRMWARE_VERSION_MINOR); 00647 break; 00648 00649 case DISPLAY_ID: 00650 SmartSwitch_SetBackLightColor(3,3,3); 00651 GFX_DrawString(&BackBuffer,"ID",0,0,&Font3x5); 00652 GFX_DrawHline(&BackBuffer,0,PHYSICAL_DISPLAY_XRES-1,10); 00653 GFX_DrawHline(&BackBuffer,0,PHYSICAL_DISPLAY_XRES-1,11); 00654 GFX_DrawHline(&BackBuffer,0,PHYSICAL_DISPLAY_XRES-1,12); 00655 GFX_printf(&BackBuffer,0,20,&Font5x7,"%s",ID); 00656 break; 00657 00658 case DISPLAY_CARD_STATUS: 00659 00660 if(SDCardDetect == 1) 00661 { 00662 00663 switch(SystemState) 00664 { 00665 default: 00666 case SYSTEM_STATE_IDLE: 00667 switch(LastBackLightColor) 00668 { 00669 default: 00670 case SMART_SWITCH_BACKLIGHT_GREEN: 00671 LastBackLightColor = SMART_SWITCH_BACKLIGHT_YELLOW; 00672 SmartSwitch_SetBackLightColor2(LastBackLightColor); 00673 break; 00674 00675 case SMART_SWITCH_BACKLIGHT_YELLOW: 00676 LastBackLightColor = SMART_SWITCH_BACKLIGHT_GREEN; 00677 SmartSwitch_SetBackLightColor2(LastBackLightColor); 00678 break; 00679 } 00680 00681 00682 if(DataLogError == TRUE) 00683 { 00684 GFX_DrawString(&BackBuffer,"Error!",0,0,&Font5x7); 00685 GFX_DrawString(&BackBuffer,ErrorMsg,0,16,&Font3x5); 00686 } 00687 else 00688 { 00689 GFX_DrawString(&BackBuffer,"SD Detected",0,16,&Font5x7); 00690 GFX_DrawString(&BackBuffer,"Idle....",0,0,&Font5x7); 00691 GFX_DrawString(&BackBuffer,"Not Logging",0,24,&Font5x7); 00692 } 00693 break; 00694 00695 00696 case SYSTEM_STATE_LOGGING: 00697 SmartSwitch_SetBackLightColor2(SMART_SWITCH_BACKLIGHT_GREEN); 00698 00699 GFX_DrawString(&BackBuffer,"Logging Data....",0,0,&Font5x7); 00700 GFX_DrawString(&BackBuffer,&CurrentLogFileName[4],0,16,&Font5x7); 00701 GFX_printf(&BackBuffer,0,26,&Font3x5,"Block: %d",DataBlocksWritten); 00702 00703 break; 00704 } 00705 } 00706 else 00707 { 00708 GFX_DrawString(&BackBuffer,"No SD Card!",0,0,&Font5x7); 00709 00710 switch(LastBackLightColor) 00711 { 00712 default: 00713 case SMART_SWITCH_BACKLIGHT_RED: 00714 LastBackLightColor = SMART_SWITCH_BACKLIGHT_YELLOW; 00715 SmartSwitch_SetBackLightColor2(LastBackLightColor); 00716 break; 00717 00718 case SMART_SWITCH_BACKLIGHT_YELLOW: 00719 LastBackLightColor = SMART_SWITCH_BACKLIGHT_RED; 00720 SmartSwitch_SetBackLightColor2(LastBackLightColor); 00721 break; 00722 } 00723 } 00724 00725 GFX_DrawHline(&BackBuffer,0,PHYSICAL_DISPLAY_XRES-1,10); 00726 GFX_DrawHline(&BackBuffer,0,PHYSICAL_DISPLAY_XRES-1,11); 00727 GFX_DrawHline(&BackBuffer,0,PHYSICAL_DISPLAY_XRES-1,12); 00728 00729 break; 00730 } 00731 GFX_DumpRenderContextToPhysicalScreen(&BackBuffer); 00732 } 00733 } 00734 } 00735 00736 00737 void CheckSDCardStatus() 00738 { 00739 //Make sure that the SD card stays in while logging 00740 switch(SystemState) 00741 { 00742 case SYSTEM_STATE_LOGGING: 00743 if(SDCardDetect == 0) 00744 { 00745 //Gracefully shut the logging system down..... 00746 EnterSystemState(SYSTEM_STATE_IDLE); 00747 } 00748 break; 00749 00750 default: 00751 break; 00752 } 00753 } 00754 00755 00756 void LogData() 00757 { 00758 WORD i; 00759 int ElementsToWrite; 00760 UINT BytesWritten; 00761 00762 if(RobotBusVoltageHR < 9) 00763 { 00764 EnterSystemState(SYSTEM_STATE_IDLE); 00765 return; 00766 } 00767 00768 if(DataLogError == TRUE) 00769 { 00770 EnterSystemState(SYSTEM_STATE_IDLE); 00771 } 00772 else 00773 { 00774 if(MyDataBlock.ReadInPtr < MyDataBlock.WriteOutPtr) 00775 { 00776 ElementsToWrite = MyDataBlock.ReadInPtr + (DATA_BLOCK_SIZE - MyDataBlock.WriteOutPtr); 00777 } 00778 else 00779 { 00780 ElementsToWrite = MyDataBlock.ReadInPtr - MyDataBlock.WriteOutPtr; 00781 } 00782 00783 if(ElementsToWrite > WRITE_BLOCK_THRESH) 00784 { 00785 for(i=0;i<ElementsToWrite;i++) 00786 { 00787 BinaryDataCachePtr += sprintf((char *)&BinaryDataCache[BinaryDataCachePtr],"%d,%.2f,%.2f\r\n",DataPointIndex,MyDataBlock.Voltage[MyDataBlock.WriteOutPtr],MyDataBlock.Current[MyDataBlock.WriteOutPtr]); 00788 if(BinaryDataCachePtr>=BINARY_WRITE_CACHE_THRESHOLD) 00789 { 00790 EXT_LED0 = 1; 00791 f_write(&CurrentLogFileHandle,BinaryDataCache,BinaryDataCachePtr,&BytesWritten); 00792 00793 BinaryDataCachePtr = 0; 00794 00795 EXT_LED0=0; 00796 } 00797 DataPointIndex++; 00798 MyDataBlock.WriteOutPtr++; 00799 if(MyDataBlock.WriteOutPtr == DATA_BLOCK_SIZE) 00800 { 00801 MyDataBlock.WriteOutPtr = 0; 00802 } 00803 } 00804 if(WritesSinceLastFlush > NUM_WRITES_BEFORE_FLUSH) 00805 { 00806 f_close(&CurrentLogFileHandle); 00807 WritesSinceLastFlush = 0; 00808 f_open(&CurrentLogFileHandle,&CurrentLogFileName[0],FA_WRITE | FA_OPEN_ALWAYS); 00809 f_lseek(&CurrentLogFileHandle, CurrentLogFileHandle.fsize); 00810 } 00811 DataBlocksWritten++; 00812 } 00813 } 00814 } 00815 00816 00817 00818 void DisplayBootMsg() 00819 { 00820 PrintfEnqueue(&PCBackDoorTx,"\r\n\r\n"); 00821 PrintfEnqueue(&PCBackDoorTx,".______ _______. __ __ ___ .______ __ \r\n"); 00822 PrintfEnqueue(&PCBackDoorTx,"| _ \\ / || | | | / \\ | _ \\ | | \r\n"); 00823 PrintfEnqueue(&PCBackDoorTx,"| |_) | | (----`| | | | ______ / ^ \\ | |_) | | | \r\n"); 00824 PrintfEnqueue(&PCBackDoorTx,"| ___/ \\ \\ | | | | |______/ /_\\ \\ | / | | \r\n"); 00825 PrintfEnqueue(&PCBackDoorTx,"| | .----) | | `--' | / _____ \\ | |\\ \\----.| `----.\r\n"); 00826 PrintfEnqueue(&PCBackDoorTx,"| _| |_______/ \\______/ /__/ \\__\\ | _| `._____||_______|\r\n"); 00827 PrintfEnqueue(&PCBackDoorTx,"---------------------------------------------------------------------------\r\n"); 00828 PrintfEnqueue(&PCBackDoorTx,"HyPER MPMC Control Terminal\r\n\r\n>"); 00829 }
Generated on Thu Jul 14 2022 09:05:34 by
1.7.2