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.
Fork of PSU-POWERLOGGER by
CODE/System.cpp@0:d0c18e423b13, 2012-09-18 (annotated)
- Committer:
- emh203
- Date:
- Tue Sep 18 18:35:23 2012 +0000
- Revision:
- 0:d0c18e423b13
- Child:
- 1:871a329fd172
Re-added project from offline version. COmpiles but need to test!
Who changed what in which revision?
| User | Revision | Line number | New contents of line |
|---|---|---|---|
| emh203 | 0:d0c18e423b13 | 1 | #include "System.h" |
| emh203 | 0:d0c18e423b13 | 2 | |
| emh203 | 0:d0c18e423b13 | 3 | DigitalOut EXT_LED0(LED2); |
| emh203 | 0:d0c18e423b13 | 4 | DigitalOut ETH_LED_GREEN(p29); |
| emh203 | 0:d0c18e423b13 | 5 | DigitalOut ETH_LED_YELLOW(p30); |
| emh203 | 0:d0c18e423b13 | 6 | DigitalIn ActionButton(p28); |
| emh203 | 0:d0c18e423b13 | 7 | DigitalIn SDCardDetect(p11); |
| emh203 | 0:d0c18e423b13 | 8 | Ticker SystemTick; |
| emh203 | 0:d0c18e423b13 | 9 | |
| emh203 | 0:d0c18e423b13 | 10 | WORD UpdateHostTerminalTick; |
| emh203 | 0:d0c18e423b13 | 11 | WORD DisplayUpdateTick; |
| emh203 | 0:d0c18e423b13 | 12 | WORD ButtonCheckTick; |
| emh203 | 0:d0c18e423b13 | 13 | WORD DisplayShutOffTick; |
| emh203 | 0:d0c18e423b13 | 14 | |
| emh203 | 0:d0c18e423b13 | 15 | BYTE SystemState; |
| emh203 | 0:d0c18e423b13 | 16 | CHAR DTBuf[32]; |
| emh203 | 0:d0c18e423b13 | 17 | CHAR DataLineBuf[256]; |
| emh203 | 0:d0c18e423b13 | 18 | |
| emh203 | 0:d0c18e423b13 | 19 | //***************************************************************** |
| emh203 | 0:d0c18e423b13 | 20 | //smart Display related stuff |
| emh203 | 0:d0c18e423b13 | 21 | //***************************************************************** |
| emh203 | 0:d0c18e423b13 | 22 | |
| emh203 | 0:d0c18e423b13 | 23 | #define DISPLAY_MEASUREMENTS 0x00 |
| emh203 | 0:d0c18e423b13 | 24 | #define DISPLAY_BATTERY 0x01 |
| emh203 | 0:d0c18e423b13 | 25 | #define DISPLAY_DATE_TIME 0x02 |
| emh203 | 0:d0c18e423b13 | 26 | #define DISPLAY_CARD_STATUS 0x03 |
| emh203 | 0:d0c18e423b13 | 27 | #define DISPLAY_BUFFER_STATS 0x04 |
| emh203 | 0:d0c18e423b13 | 28 | #define DISPLAY_FIRMWARE_VERSION 0x05 |
| emh203 | 0:d0c18e423b13 | 29 | #define DISPLAY_ID 0x06 |
| emh203 | 0:d0c18e423b13 | 30 | #define DISPLAY_OFF 0xFF |
| emh203 | 0:d0c18e423b13 | 31 | |
| emh203 | 0:d0c18e423b13 | 32 | #define NUM_DISPLAYS 7 |
| emh203 | 0:d0c18e423b13 | 33 | #define DISPLAY_SHUTOFF_TIME 10000 |
| emh203 | 0:d0c18e423b13 | 34 | |
| emh203 | 0:d0c18e423b13 | 35 | BYTE DisplayMode; |
| emh203 | 0:d0c18e423b13 | 36 | BYTE LastBackLightColor = 0; |
| emh203 | 0:d0c18e423b13 | 37 | |
| emh203 | 0:d0c18e423b13 | 38 | //***************************************************************** |
| emh203 | 0:d0c18e423b13 | 39 | //Action Button Related stuff |
| emh203 | 0:d0c18e423b13 | 40 | //***************************************************************** |
| emh203 | 0:d0c18e423b13 | 41 | #define WAITING_FOR_PRESS 0x00 |
| emh203 | 0:d0c18e423b13 | 42 | #define WAITING_FOR_RELEASE 0x01 |
| emh203 | 0:d0c18e423b13 | 43 | |
| emh203 | 0:d0c18e423b13 | 44 | BYTE PreviousButtonState; |
| emh203 | 0:d0c18e423b13 | 45 | BYTE CurrentButtonState; |
| emh203 | 0:d0c18e423b13 | 46 | WORD ButtonHoldTime; |
| emh203 | 0:d0c18e423b13 | 47 | BYTE ButtonCheckState; |
| emh203 | 0:d0c18e423b13 | 48 | void ActionButtonHandler(WORD ButtonPressTime); |
| emh203 | 0:d0c18e423b13 | 49 | |
| emh203 | 0:d0c18e423b13 | 50 | //time Variables |
| emh203 | 0:d0c18e423b13 | 51 | time_t CurrentTime_InSec; |
| emh203 | 0:d0c18e423b13 | 52 | tm *CurrentTime; |
| emh203 | 0:d0c18e423b13 | 53 | |
| emh203 | 0:d0c18e423b13 | 54 | //***************************************************************** |
| emh203 | 0:d0c18e423b13 | 55 | //Logging Related Stuff |
| emh203 | 0:d0c18e423b13 | 56 | //***************************************************************** |
| emh203 | 0:d0c18e423b13 | 57 | CHAR CurrentLogFileName[256]; |
| emh203 | 0:d0c18e423b13 | 58 | BOOL InitDataLog(); |
| emh203 | 0:d0c18e423b13 | 59 | BOOL DataLogError; |
| emh203 | 0:d0c18e423b13 | 60 | CHAR *ErrorMsg; |
| emh203 | 0:d0c18e423b13 | 61 | |
| emh203 | 0:d0c18e423b13 | 62 | void CreateLogFileName(); |
| emh203 | 0:d0c18e423b13 | 63 | |
| emh203 | 0:d0c18e423b13 | 64 | FATFS MyFileSystem; |
| emh203 | 0:d0c18e423b13 | 65 | FIL CurrentLogFileHandle; |
| emh203 | 0:d0c18e423b13 | 66 | |
| emh203 | 0:d0c18e423b13 | 67 | //DataBlock MyDataBlock[2]; |
| emh203 | 0:d0c18e423b13 | 68 | DataBlock MyDataBlock; |
| emh203 | 0:d0c18e423b13 | 69 | |
| emh203 | 0:d0c18e423b13 | 70 | BYTE ActiveDataBlock; |
| emh203 | 0:d0c18e423b13 | 71 | DWORD DataBlocksWritten; |
| emh203 | 0:d0c18e423b13 | 72 | DWORD DataPointIndex; |
| emh203 | 0:d0c18e423b13 | 73 | SIGNED_DWORD ReadWriteDifferential; |
| emh203 | 0:d0c18e423b13 | 74 | |
| emh203 | 0:d0c18e423b13 | 75 | DWORD WritesSinceLastFlush; |
| emh203 | 0:d0c18e423b13 | 76 | |
| emh203 | 0:d0c18e423b13 | 77 | #define BINARY_WRITE_CACHE_THRESHOLD 512 |
| emh203 | 0:d0c18e423b13 | 78 | BYTE BinaryDataCache[BINARY_WRITE_CACHE_THRESHOLD + 64]; |
| emh203 | 0:d0c18e423b13 | 79 | DWORD BinaryDataCachePtr; |
| emh203 | 0:d0c18e423b13 | 80 | |
| emh203 | 0:d0c18e423b13 | 81 | #define NUM_WRITES_BEFORE_FLUSH (10) |
| emh203 | 0:d0c18e423b13 | 82 | |
| emh203 | 0:d0c18e423b13 | 83 | //***************************************************************** |
| emh203 | 0:d0c18e423b13 | 84 | //Misc System Related Stuff |
| emh203 | 0:d0c18e423b13 | 85 | //***************************************************************** |
| emh203 | 0:d0c18e423b13 | 86 | void SystemTickIrq(); |
| emh203 | 0:d0c18e423b13 | 87 | void AdjustIOffset(); |
| emh203 | 0:d0c18e423b13 | 88 | |
| emh203 | 0:d0c18e423b13 | 89 | void InitRobotPowerMeasurementSystem() |
| emh203 | 0:d0c18e423b13 | 90 | { |
| emh203 | 0:d0c18e423b13 | 91 | InitDataBlocks(&MyDataBlock); |
| emh203 | 0:d0c18e423b13 | 92 | |
| emh203 | 0:d0c18e423b13 | 93 | ActiveDataBlock = 0; |
| emh203 | 0:d0c18e423b13 | 94 | DataBlocksWritten = 0; |
| emh203 | 0:d0c18e423b13 | 95 | DataPointIndex = 0; |
| emh203 | 0:d0c18e423b13 | 96 | |
| emh203 | 0:d0c18e423b13 | 97 | SystemTick.attach_us(&SystemTickIrq,10000); |
| emh203 | 0:d0c18e423b13 | 98 | CurrentTime_InSec = time(NULL); |
| emh203 | 0:d0c18e423b13 | 99 | |
| emh203 | 0:d0c18e423b13 | 100 | DataLogError = FALSE; |
| emh203 | 0:d0c18e423b13 | 101 | } |
| emh203 | 0:d0c18e423b13 | 102 | |
| emh203 | 0:d0c18e423b13 | 103 | |
| emh203 | 0:d0c18e423b13 | 104 | void InitDataBlocks(DataBlock * DB) |
| emh203 | 0:d0c18e423b13 | 105 | { |
| emh203 | 0:d0c18e423b13 | 106 | int i; |
| emh203 | 0:d0c18e423b13 | 107 | |
| emh203 | 0:d0c18e423b13 | 108 | for(i=0;i<DATA_BLOCK_SIZE;i++) |
| emh203 | 0:d0c18e423b13 | 109 | { |
| emh203 | 0:d0c18e423b13 | 110 | DB->Voltage[i] = 0; |
| emh203 | 0:d0c18e423b13 | 111 | DB->Current[i] = 0; |
| emh203 | 0:d0c18e423b13 | 112 | } |
| emh203 | 0:d0c18e423b13 | 113 | |
| emh203 | 0:d0c18e423b13 | 114 | DB->WriteOutPtr = 0; |
| emh203 | 0:d0c18e423b13 | 115 | DB->ReadInPtr = 0; |
| emh203 | 0:d0c18e423b13 | 116 | } |
| emh203 | 0:d0c18e423b13 | 117 | |
| emh203 | 0:d0c18e423b13 | 118 | |
| emh203 | 0:d0c18e423b13 | 119 | void EnterSystemState(BYTE NextState) |
| emh203 | 0:d0c18e423b13 | 120 | { |
| emh203 | 0:d0c18e423b13 | 121 | switch(NextState) |
| emh203 | 0:d0c18e423b13 | 122 | { |
| emh203 | 0:d0c18e423b13 | 123 | default: |
| emh203 | 0:d0c18e423b13 | 124 | case SYSTEM_STATE_INIT: |
| emh203 | 0:d0c18e423b13 | 125 | DisplayMode = DISPLAY_MEASUREMENTS; |
| emh203 | 0:d0c18e423b13 | 126 | SystemState = NextState; |
| emh203 | 0:d0c18e423b13 | 127 | break; |
| emh203 | 0:d0c18e423b13 | 128 | |
| emh203 | 0:d0c18e423b13 | 129 | case SYSTEM_STATE_LOGGING: |
| emh203 | 0:d0c18e423b13 | 130 | DisplayMode = DISPLAY_CARD_STATUS; |
| emh203 | 0:d0c18e423b13 | 131 | |
| emh203 | 0:d0c18e423b13 | 132 | if(InitDataLog() == FALSE) |
| emh203 | 0:d0c18e423b13 | 133 | { |
| emh203 | 0:d0c18e423b13 | 134 | SystemState = NextState; |
| emh203 | 0:d0c18e423b13 | 135 | |
| emh203 | 0:d0c18e423b13 | 136 | } |
| emh203 | 0:d0c18e423b13 | 137 | else |
| emh203 | 0:d0c18e423b13 | 138 | { |
| emh203 | 0:d0c18e423b13 | 139 | SystemState = SYSTEM_STATE_IDLE; |
| emh203 | 0:d0c18e423b13 | 140 | } |
| emh203 | 0:d0c18e423b13 | 141 | |
| emh203 | 0:d0c18e423b13 | 142 | break; |
| emh203 | 0:d0c18e423b13 | 143 | |
| emh203 | 0:d0c18e423b13 | 144 | case SYSTEM_STATE_IDLE: |
| emh203 | 0:d0c18e423b13 | 145 | DisplayMode = DISPLAY_CARD_STATUS; |
| emh203 | 0:d0c18e423b13 | 146 | if(SystemState == SYSTEM_STATE_LOGGING) |
| emh203 | 0:d0c18e423b13 | 147 | { |
| emh203 | 0:d0c18e423b13 | 148 | f_close(&CurrentLogFileHandle); |
| emh203 | 0:d0c18e423b13 | 149 | f_mount(0,NULL); |
| emh203 | 0:d0c18e423b13 | 150 | PrintfEnqueue(&PCBackDoorTx,"Logging terminated on file %s\r\n>",CurrentLogFileName); |
| emh203 | 0:d0c18e423b13 | 151 | } |
| emh203 | 0:d0c18e423b13 | 152 | |
| emh203 | 0:d0c18e423b13 | 153 | SystemState = NextState; |
| emh203 | 0:d0c18e423b13 | 154 | break; |
| emh203 | 0:d0c18e423b13 | 155 | } |
| emh203 | 0:d0c18e423b13 | 156 | } |
| emh203 | 0:d0c18e423b13 | 157 | |
| emh203 | 0:d0c18e423b13 | 158 | BOOL InitDataLog() |
| emh203 | 0:d0c18e423b13 | 159 | { |
| emh203 | 0:d0c18e423b13 | 160 | UINT BytesWritten; |
| emh203 | 0:d0c18e423b13 | 161 | |
| emh203 | 0:d0c18e423b13 | 162 | PrintfEnqueue(&PCBackDoorTx,"\r\n\r\bInitializing Data log....\r\n"); |
| emh203 | 0:d0c18e423b13 | 163 | CreateLogFileName(); |
| emh203 | 0:d0c18e423b13 | 164 | PrintfEnqueue(&PCBackDoorTx,"Filename: %s\r\n",CurrentLogFileName); |
| emh203 | 0:d0c18e423b13 | 165 | PrintfEnqueue(&PCBackDoorTx,"Attempting File Open....\r\n"); |
| emh203 | 0:d0c18e423b13 | 166 | |
| emh203 | 0:d0c18e423b13 | 167 | |
| emh203 | 0:d0c18e423b13 | 168 | f_mount(0,&MyFileSystem); |
| emh203 | 0:d0c18e423b13 | 169 | if(f_open(&CurrentLogFileHandle,&CurrentLogFileName[0],FA_WRITE | FA_OPEN_ALWAYS) != FR_OK) |
| emh203 | 0:d0c18e423b13 | 170 | { |
| emh203 | 0:d0c18e423b13 | 171 | DataLogError = TRUE; |
| emh203 | 0:d0c18e423b13 | 172 | PrintfEnqueue(&PCBackDoorTx,"Could not open file!\r\n>"); |
| emh203 | 0:d0c18e423b13 | 173 | ErrorMsg = "Write Error!"; |
| emh203 | 0:d0c18e423b13 | 174 | return TRUE; |
| emh203 | 0:d0c18e423b13 | 175 | } |
| emh203 | 0:d0c18e423b13 | 176 | |
| emh203 | 0:d0c18e423b13 | 177 | |
| emh203 | 0:d0c18e423b13 | 178 | DataLogError = FALSE; |
| emh203 | 0:d0c18e423b13 | 179 | PrintfEnqueue(&PCBackDoorTx,"Writing Headers....\r\n"); |
| emh203 | 0:d0c18e423b13 | 180 | time(&CurrentTime_InSec); |
| emh203 | 0:d0c18e423b13 | 181 | strftime(DTBuf,128, "%Y.%m.%d", localtime(&CurrentTime_InSec)); |
| emh203 | 0:d0c18e423b13 | 182 | f_printf(&CurrentLogFileHandle, "Date %s\r\n",DTBuf); |
| emh203 | 0:d0c18e423b13 | 183 | strftime(DTBuf,128, "%H:%M:%S", localtime(&CurrentTime_InSec)); |
| emh203 | 0:d0c18e423b13 | 184 | f_printf(&CurrentLogFileHandle, "Time %s\r\n\n",DTBuf); |
| emh203 | 0:d0c18e423b13 | 185 | sprintf(DTBuf, "Sample Rate %.1f Hz\r\n\r\n",SAMPLE_RATE); |
| emh203 | 0:d0c18e423b13 | 186 | f_write(&CurrentLogFileHandle,DTBuf,strlen(DTBuf),&BytesWritten); |
| emh203 | 0:d0c18e423b13 | 187 | PrintfEnqueue(&PCBackDoorTx,"Headers Written.... Starting log\r\n"); |
| emh203 | 0:d0c18e423b13 | 188 | |
| emh203 | 0:d0c18e423b13 | 189 | |
| emh203 | 0:d0c18e423b13 | 190 | PrintfEnqueue(&PCBackDoorTx,"\r\n>"); |
| emh203 | 0:d0c18e423b13 | 191 | |
| emh203 | 0:d0c18e423b13 | 192 | |
| emh203 | 0:d0c18e423b13 | 193 | |
| emh203 | 0:d0c18e423b13 | 194 | BinaryDataCachePtr = 0; |
| emh203 | 0:d0c18e423b13 | 195 | WritesSinceLastFlush = 0; |
| emh203 | 0:d0c18e423b13 | 196 | |
| emh203 | 0:d0c18e423b13 | 197 | DataBlocksWritten = 0; |
| emh203 | 0:d0c18e423b13 | 198 | DataPointIndex = 0; |
| emh203 | 0:d0c18e423b13 | 199 | |
| emh203 | 0:d0c18e423b13 | 200 | return FALSE; |
| emh203 | 0:d0c18e423b13 | 201 | } |
| emh203 | 0:d0c18e423b13 | 202 | |
| emh203 | 0:d0c18e423b13 | 203 | |
| emh203 | 0:d0c18e423b13 | 204 | void CreateLogFileName() |
| emh203 | 0:d0c18e423b13 | 205 | { |
| emh203 | 0:d0c18e423b13 | 206 | time(&CurrentTime_InSec); |
| emh203 | 0:d0c18e423b13 | 207 | strftime(CurrentLogFileName,256, "F%Y.%m.%d.%H.%M.%S.csv", localtime(&CurrentTime_InSec)); |
| emh203 | 0:d0c18e423b13 | 208 | } |
| emh203 | 0:d0c18e423b13 | 209 | |
| emh203 | 0:d0c18e423b13 | 210 | |
| emh203 | 0:d0c18e423b13 | 211 | |
| emh203 | 0:d0c18e423b13 | 212 | void SystemTickIrq() |
| emh203 | 0:d0c18e423b13 | 213 | { |
| emh203 | 0:d0c18e423b13 | 214 | if(UpdateHostTerminalTick<0xFFFF) |
| emh203 | 0:d0c18e423b13 | 215 | UpdateHostTerminalTick++; |
| emh203 | 0:d0c18e423b13 | 216 | |
| emh203 | 0:d0c18e423b13 | 217 | if(DisplayUpdateTick<0xFFFF) |
| emh203 | 0:d0c18e423b13 | 218 | DisplayUpdateTick++; |
| emh203 | 0:d0c18e423b13 | 219 | |
| emh203 | 0:d0c18e423b13 | 220 | if(ButtonCheckTick<0xFFFF) |
| emh203 | 0:d0c18e423b13 | 221 | ButtonCheckTick++; |
| emh203 | 0:d0c18e423b13 | 222 | |
| emh203 | 0:d0c18e423b13 | 223 | if(DisplayShutOffTick<0xFFFF) |
| emh203 | 0:d0c18e423b13 | 224 | DisplayShutOffTick++; |
| emh203 | 0:d0c18e423b13 | 225 | } |
| emh203 | 0:d0c18e423b13 | 226 | |
| emh203 | 0:d0c18e423b13 | 227 | void InitButton() |
| emh203 | 0:d0c18e423b13 | 228 | { |
| emh203 | 0:d0c18e423b13 | 229 | ButtonCheckState = WAITING_FOR_PRESS; |
| emh203 | 0:d0c18e423b13 | 230 | ButtonCheckTick = 0; |
| emh203 | 0:d0c18e423b13 | 231 | PreviousButtonState = FALSE; |
| emh203 | 0:d0c18e423b13 | 232 | CurrentButtonState = FALSE; |
| emh203 | 0:d0c18e423b13 | 233 | |
| emh203 | 0:d0c18e423b13 | 234 | } |
| emh203 | 0:d0c18e423b13 | 235 | void CheckButton() |
| emh203 | 0:d0c18e423b13 | 236 | { |
| emh203 | 0:d0c18e423b13 | 237 | if(ButtonCheckTick>0) |
| emh203 | 0:d0c18e423b13 | 238 | { |
| emh203 | 0:d0c18e423b13 | 239 | ButtonCheckTick = 0; |
| emh203 | 0:d0c18e423b13 | 240 | |
| emh203 | 0:d0c18e423b13 | 241 | PreviousButtonState = CurrentButtonState; |
| emh203 | 0:d0c18e423b13 | 242 | CurrentButtonState = ActionButton.read(); |
| emh203 | 0:d0c18e423b13 | 243 | |
| emh203 | 0:d0c18e423b13 | 244 | switch(ButtonCheckState) |
| emh203 | 0:d0c18e423b13 | 245 | { |
| emh203 | 0:d0c18e423b13 | 246 | default: |
| emh203 | 0:d0c18e423b13 | 247 | case WAITING_FOR_PRESS: |
| emh203 | 0:d0c18e423b13 | 248 | |
| emh203 | 0:d0c18e423b13 | 249 | if(CurrentButtonState == TRUE && PreviousButtonState == FALSE) |
| emh203 | 0:d0c18e423b13 | 250 | { |
| emh203 | 0:d0c18e423b13 | 251 | ButtonCheckState = WAITING_FOR_RELEASE; |
| emh203 | 0:d0c18e423b13 | 252 | } |
| emh203 | 0:d0c18e423b13 | 253 | |
| emh203 | 0:d0c18e423b13 | 254 | ButtonHoldTime = 0; |
| emh203 | 0:d0c18e423b13 | 255 | |
| emh203 | 0:d0c18e423b13 | 256 | break; |
| emh203 | 0:d0c18e423b13 | 257 | |
| emh203 | 0:d0c18e423b13 | 258 | case WAITING_FOR_RELEASE: |
| emh203 | 0:d0c18e423b13 | 259 | |
| emh203 | 0:d0c18e423b13 | 260 | if(CurrentButtonState == TRUE && PreviousButtonState == TRUE) |
| emh203 | 0:d0c18e423b13 | 261 | { |
| emh203 | 0:d0c18e423b13 | 262 | ButtonHoldTime++; |
| emh203 | 0:d0c18e423b13 | 263 | } |
| emh203 | 0:d0c18e423b13 | 264 | else if(CurrentButtonState == FALSE && PreviousButtonState == TRUE) |
| emh203 | 0:d0c18e423b13 | 265 | { |
| emh203 | 0:d0c18e423b13 | 266 | ActionButtonHandler(ButtonHoldTime); |
| emh203 | 0:d0c18e423b13 | 267 | ButtonCheckState = WAITING_FOR_PRESS; |
| emh203 | 0:d0c18e423b13 | 268 | } |
| emh203 | 0:d0c18e423b13 | 269 | else |
| emh203 | 0:d0c18e423b13 | 270 | { |
| emh203 | 0:d0c18e423b13 | 271 | ButtonCheckState = WAITING_FOR_PRESS; |
| emh203 | 0:d0c18e423b13 | 272 | } |
| emh203 | 0:d0c18e423b13 | 273 | break; |
| emh203 | 0:d0c18e423b13 | 274 | } |
| emh203 | 0:d0c18e423b13 | 275 | } |
| emh203 | 0:d0c18e423b13 | 276 | } |
| emh203 | 0:d0c18e423b13 | 277 | |
| emh203 | 0:d0c18e423b13 | 278 | |
| emh203 | 0:d0c18e423b13 | 279 | void ActionButtonHandler(WORD ButtonPressTime) |
| emh203 | 0:d0c18e423b13 | 280 | { |
| emh203 | 0:d0c18e423b13 | 281 | DisplayShutOffTick = 0; |
| emh203 | 0:d0c18e423b13 | 282 | |
| emh203 | 0:d0c18e423b13 | 283 | if(ButtonPressTime<50) |
| emh203 | 0:d0c18e423b13 | 284 | { |
| emh203 | 0:d0c18e423b13 | 285 | if(DisplayMode == DISPLAY_OFF) |
| emh203 | 0:d0c18e423b13 | 286 | { |
| emh203 | 0:d0c18e423b13 | 287 | PowerUpSmartSwitch(); |
| emh203 | 0:d0c18e423b13 | 288 | SmartSwitch_Reset(); |
| emh203 | 0:d0c18e423b13 | 289 | SmartSwitchClear(); |
| emh203 | 0:d0c18e423b13 | 290 | DisplayMode = DISPLAY_MEASUREMENTS; |
| emh203 | 0:d0c18e423b13 | 291 | } |
| emh203 | 0:d0c18e423b13 | 292 | else |
| emh203 | 0:d0c18e423b13 | 293 | { |
| emh203 | 0:d0c18e423b13 | 294 | |
| emh203 | 0:d0c18e423b13 | 295 | if(DataLogError == TRUE) |
| emh203 | 0:d0c18e423b13 | 296 | { |
| emh203 | 0:d0c18e423b13 | 297 | DataLogError = FALSE; |
| emh203 | 0:d0c18e423b13 | 298 | } |
| emh203 | 0:d0c18e423b13 | 299 | else |
| emh203 | 0:d0c18e423b13 | 300 | { |
| emh203 | 0:d0c18e423b13 | 301 | DisplayMode++; |
| emh203 | 0:d0c18e423b13 | 302 | |
| emh203 | 0:d0c18e423b13 | 303 | if(DisplayMode >= NUM_DISPLAYS) |
| emh203 | 0:d0c18e423b13 | 304 | { |
| emh203 | 0:d0c18e423b13 | 305 | DisplayMode = 0; |
| emh203 | 0:d0c18e423b13 | 306 | } |
| emh203 | 0:d0c18e423b13 | 307 | } |
| emh203 | 0:d0c18e423b13 | 308 | } |
| emh203 | 0:d0c18e423b13 | 309 | } |
| emh203 | 0:d0c18e423b13 | 310 | |
| emh203 | 0:d0c18e423b13 | 311 | else if(ButtonPressTime>100 && ButtonPressTime<500) |
| emh203 | 0:d0c18e423b13 | 312 | { |
| emh203 | 0:d0c18e423b13 | 313 | switch(SystemState) |
| emh203 | 0:d0c18e423b13 | 314 | { |
| emh203 | 0:d0c18e423b13 | 315 | default: |
| emh203 | 0:d0c18e423b13 | 316 | case SYSTEM_STATE_IDLE: |
| emh203 | 0:d0c18e423b13 | 317 | switch(DisplayMode) |
| emh203 | 0:d0c18e423b13 | 318 | { |
| emh203 | 0:d0c18e423b13 | 319 | default: |
| emh203 | 0:d0c18e423b13 | 320 | |
| emh203 | 0:d0c18e423b13 | 321 | break; |
| emh203 | 0:d0c18e423b13 | 322 | |
| emh203 | 0:d0c18e423b13 | 323 | case DISPLAY_MEASUREMENTS: |
| emh203 | 0:d0c18e423b13 | 324 | AdjustIOffset(); |
| emh203 | 0:d0c18e423b13 | 325 | break; |
| emh203 | 0:d0c18e423b13 | 326 | |
| emh203 | 0:d0c18e423b13 | 327 | |
| emh203 | 0:d0c18e423b13 | 328 | case DISPLAY_FIRMWARE_VERSION: |
| emh203 | 0:d0c18e423b13 | 329 | LoadConfiguration(); |
| emh203 | 0:d0c18e423b13 | 330 | break; |
| emh203 | 0:d0c18e423b13 | 331 | |
| emh203 | 0:d0c18e423b13 | 332 | |
| emh203 | 0:d0c18e423b13 | 333 | case DISPLAY_CARD_STATUS: |
| emh203 | 0:d0c18e423b13 | 334 | // if(SDCardDetect == 1) |
| emh203 | 0:d0c18e423b13 | 335 | { |
| emh203 | 0:d0c18e423b13 | 336 | EnterSystemState(SYSTEM_STATE_LOGGING); |
| emh203 | 0:d0c18e423b13 | 337 | } |
| emh203 | 0:d0c18e423b13 | 338 | break; |
| emh203 | 0:d0c18e423b13 | 339 | } |
| emh203 | 0:d0c18e423b13 | 340 | break; |
| emh203 | 0:d0c18e423b13 | 341 | |
| emh203 | 0:d0c18e423b13 | 342 | |
| emh203 | 0:d0c18e423b13 | 343 | case SYSTEM_STATE_LOGGING: |
| emh203 | 0:d0c18e423b13 | 344 | EnterSystemState(SYSTEM_STATE_IDLE); |
| emh203 | 0:d0c18e423b13 | 345 | // unmount the file system |
| emh203 | 0:d0c18e423b13 | 346 | f_mount(0,NULL); |
| emh203 | 0:d0c18e423b13 | 347 | break; |
| emh203 | 0:d0c18e423b13 | 348 | } |
| emh203 | 0:d0c18e423b13 | 349 | } |
| emh203 | 0:d0c18e423b13 | 350 | } |
| emh203 | 0:d0c18e423b13 | 351 | |
| emh203 | 0:d0c18e423b13 | 352 | void AdjustIOffset() |
| emh203 | 0:d0c18e423b13 | 353 | { |
| emh203 | 0:d0c18e423b13 | 354 | DWORD SamplesToTake; |
| emh203 | 0:d0c18e423b13 | 355 | DWORD i; |
| emh203 | 0:d0c18e423b13 | 356 | float RunningSum = 0; |
| emh203 | 0:d0c18e423b13 | 357 | |
| emh203 | 0:d0c18e423b13 | 358 | PrintfEnqueue(&PCBackDoorTx,"Zeroing ACS576.....\r\n"); |
| emh203 | 0:d0c18e423b13 | 359 | |
| emh203 | 0:d0c18e423b13 | 360 | ADCDataRdy=0; |
| emh203 | 0:d0c18e423b13 | 361 | |
| emh203 | 0:d0c18e423b13 | 362 | SamplesToTake = (DWORD)(SAMPLE_RATE)*2; |
| emh203 | 0:d0c18e423b13 | 363 | |
| emh203 | 0:d0c18e423b13 | 364 | for(i=0;i<SamplesToTake;i++) |
| emh203 | 0:d0c18e423b13 | 365 | { |
| emh203 | 0:d0c18e423b13 | 366 | SmartSwitch_SetBackLightColor2((BYTE)((float)i/(float)SamplesToTake * 64)); |
| emh203 | 0:d0c18e423b13 | 367 | |
| emh203 | 0:d0c18e423b13 | 368 | while(ADCDataRdy == FALSE) |
| emh203 | 0:d0c18e423b13 | 369 | { |
| emh203 | 0:d0c18e423b13 | 370 | |
| emh203 | 0:d0c18e423b13 | 371 | } |
| emh203 | 0:d0c18e423b13 | 372 | ADCDataRdy = FALSE; |
| emh203 | 0:d0c18e423b13 | 373 | RunningSum += RobotBusCurrentHR; |
| emh203 | 0:d0c18e423b13 | 374 | } |
| emh203 | 0:d0c18e423b13 | 375 | |
| emh203 | 0:d0c18e423b13 | 376 | ACS576_IOFFSET_TRIM += RunningSum / SamplesToTake; |
| emh203 | 0:d0c18e423b13 | 377 | |
| emh203 | 0:d0c18e423b13 | 378 | SmartSwitch_SetBackLightColor(3,3,3); |
| emh203 | 0:d0c18e423b13 | 379 | |
| emh203 | 0:d0c18e423b13 | 380 | PrintfEnqueue(&PCBackDoorTx,"Exporting new configuration file.....\r\n>"); |
| emh203 | 0:d0c18e423b13 | 381 | |
| emh203 | 0:d0c18e423b13 | 382 | ExportConfigurationSettings(); |
| emh203 | 0:d0c18e423b13 | 383 | } |
| emh203 | 0:d0c18e423b13 | 384 | |
| emh203 | 0:d0c18e423b13 | 385 | |
| emh203 | 0:d0c18e423b13 | 386 | |
| emh203 | 0:d0c18e423b13 | 387 | |
| emh203 | 0:d0c18e423b13 | 388 | BOOL CheckforConfig(CHAR *LineIn) |
| emh203 | 0:d0c18e423b13 | 389 | { |
| emh203 | 0:d0c18e423b13 | 390 | if(!strcmp(LineIn,"config")) |
| emh203 | 0:d0c18e423b13 | 391 | { |
| emh203 | 0:d0c18e423b13 | 392 | LoadConfiguration(); |
| emh203 | 0:d0c18e423b13 | 393 | } |
| emh203 | 0:d0c18e423b13 | 394 | return TRUE; |
| emh203 | 0:d0c18e423b13 | 395 | } |
| emh203 | 0:d0c18e423b13 | 396 | |
| emh203 | 0:d0c18e423b13 | 397 | |
| emh203 | 0:d0c18e423b13 | 398 | BOOL CheckForTimeInit(CHAR * LineIn) |
| emh203 | 0:d0c18e423b13 | 399 | { |
| emh203 | 0:d0c18e423b13 | 400 | if(!strcmp(LineIn,"tinit")) |
| emh203 | 0:d0c18e423b13 | 401 | { |
| emh203 | 0:d0c18e423b13 | 402 | set_time(1256729737); |
| emh203 | 0:d0c18e423b13 | 403 | PrintfEnqueue(&PCBackDoorTx,"\r\nTime Reset\r\n"); |
| emh203 | 0:d0c18e423b13 | 404 | } |
| emh203 | 0:d0c18e423b13 | 405 | |
| emh203 | 0:d0c18e423b13 | 406 | return TRUE; |
| emh203 | 0:d0c18e423b13 | 407 | |
| emh203 | 0:d0c18e423b13 | 408 | } |
| emh203 | 0:d0c18e423b13 | 409 | |
| emh203 | 0:d0c18e423b13 | 410 | BOOL CheckForTime(CHAR *LineIn) |
| emh203 | 0:d0c18e423b13 | 411 | { |
| emh203 | 0:d0c18e423b13 | 412 | int Hour,Minute,Second=0; |
| emh203 | 0:d0c18e423b13 | 413 | int Items; |
| emh203 | 0:d0c18e423b13 | 414 | BOOL Error = FALSE; |
| emh203 | 0:d0c18e423b13 | 415 | time_t TimeStampTemp; |
| emh203 | 0:d0c18e423b13 | 416 | |
| emh203 | 0:d0c18e423b13 | 417 | |
| emh203 | 0:d0c18e423b13 | 418 | Items = sscanf(LineIn, "time=%d : %d : %d", &Hour, &Minute, &Second); |
| emh203 | 0:d0c18e423b13 | 419 | if(Items == 3) |
| emh203 | 0:d0c18e423b13 | 420 | { |
| emh203 | 0:d0c18e423b13 | 421 | PrintfEnqueue(&PCBackDoorTx,"\r\n"); |
| emh203 | 0:d0c18e423b13 | 422 | if(Hour>23) |
| emh203 | 0:d0c18e423b13 | 423 | { |
| emh203 | 0:d0c18e423b13 | 424 | PrintfEnqueue(&PCBackDoorTx,"Hour entry must be between 0 and 24\r\n"); |
| emh203 | 0:d0c18e423b13 | 425 | Error = TRUE; |
| emh203 | 0:d0c18e423b13 | 426 | } |
| emh203 | 0:d0c18e423b13 | 427 | if(Minute>60) |
| emh203 | 0:d0c18e423b13 | 428 | { |
| emh203 | 0:d0c18e423b13 | 429 | PrintfEnqueue(&PCBackDoorTx,"Minute entry must be between 0 and 60\r\n"); |
| emh203 | 0:d0c18e423b13 | 430 | Error = TRUE; |
| emh203 | 0:d0c18e423b13 | 431 | } |
| emh203 | 0:d0c18e423b13 | 432 | if(Second>60) |
| emh203 | 0:d0c18e423b13 | 433 | { |
| emh203 | 0:d0c18e423b13 | 434 | PrintfEnqueue(&PCBackDoorTx,"Second entry must be between 0 and 60\r\n"); |
| emh203 | 0:d0c18e423b13 | 435 | Error = TRUE; |
| emh203 | 0:d0c18e423b13 | 436 | } |
| emh203 | 0:d0c18e423b13 | 437 | |
| emh203 | 0:d0c18e423b13 | 438 | if(Error == TRUE) |
| emh203 | 0:d0c18e423b13 | 439 | { |
| emh203 | 0:d0c18e423b13 | 440 | PrintfEnqueue(&PCBackDoorTx,"Error in time format. Time not changed.\r\n"); |
| emh203 | 0:d0c18e423b13 | 441 | } |
| emh203 | 0:d0c18e423b13 | 442 | else |
| emh203 | 0:d0c18e423b13 | 443 | { |
| emh203 | 0:d0c18e423b13 | 444 | TimeStampTemp = time(NULL); |
| emh203 | 0:d0c18e423b13 | 445 | //convert to tm struct |
| emh203 | 0:d0c18e423b13 | 446 | CurrentTime = localtime(&TimeStampTemp); |
| emh203 | 0:d0c18e423b13 | 447 | //dump in our new valus |
| emh203 | 0:d0c18e423b13 | 448 | CurrentTime->tm_sec = Second; |
| emh203 | 0:d0c18e423b13 | 449 | CurrentTime->tm_min = Minute; |
| emh203 | 0:d0c18e423b13 | 450 | CurrentTime->tm_hour = Hour; |
| emh203 | 0:d0c18e423b13 | 451 | //set the new time |
| emh203 | 0:d0c18e423b13 | 452 | set_time(mktime(CurrentTime)); |
| emh203 | 0:d0c18e423b13 | 453 | PrintfEnqueue(&PCBackDoorTx,"Time set to %d:%d:%d\r\n",Hour,Minute,Second); |
| emh203 | 0:d0c18e423b13 | 454 | } |
| emh203 | 0:d0c18e423b13 | 455 | |
| emh203 | 0:d0c18e423b13 | 456 | } |
| emh203 | 0:d0c18e423b13 | 457 | return FALSE; |
| emh203 | 0:d0c18e423b13 | 458 | } |
| emh203 | 0:d0c18e423b13 | 459 | |
| emh203 | 0:d0c18e423b13 | 460 | BOOL CheckForDate(CHAR *LineIn) |
| emh203 | 0:d0c18e423b13 | 461 | { |
| emh203 | 0:d0c18e423b13 | 462 | int Day,Month,Year=0; |
| emh203 | 0:d0c18e423b13 | 463 | int Items; |
| emh203 | 0:d0c18e423b13 | 464 | BOOL Error = FALSE; |
| emh203 | 0:d0c18e423b13 | 465 | time_t TimeStampTemp; |
| emh203 | 0:d0c18e423b13 | 466 | |
| emh203 | 0:d0c18e423b13 | 467 | Items = sscanf(LineIn, "date=%d / %d / %d", &Month, &Day, &Year); |
| emh203 | 0:d0c18e423b13 | 468 | if(Items == 3) |
| emh203 | 0:d0c18e423b13 | 469 | { |
| emh203 | 0:d0c18e423b13 | 470 | PrintfEnqueue(&PCBackDoorTx,"\r\n"); |
| emh203 | 0:d0c18e423b13 | 471 | if(Month>12 || Month < 1) |
| emh203 | 0:d0c18e423b13 | 472 | { |
| emh203 | 0:d0c18e423b13 | 473 | PrintfEnqueue(&PCBackDoorTx,"Month entry must be between 1 and 12\r\n"); |
| emh203 | 0:d0c18e423b13 | 474 | Error = TRUE; |
| emh203 | 0:d0c18e423b13 | 475 | } |
| emh203 | 0:d0c18e423b13 | 476 | if(Day>31 || Day<1) |
| emh203 | 0:d0c18e423b13 | 477 | { |
| emh203 | 0:d0c18e423b13 | 478 | PrintfEnqueue(&PCBackDoorTx,"Day entry must be between 1 and 31\r\n"); |
| emh203 | 0:d0c18e423b13 | 479 | Error = TRUE; |
| emh203 | 0:d0c18e423b13 | 480 | } |
| emh203 | 0:d0c18e423b13 | 481 | if(Year<1900) |
| emh203 | 0:d0c18e423b13 | 482 | { |
| emh203 | 0:d0c18e423b13 | 483 | PrintfEnqueue(&PCBackDoorTx,"Year entry must be greater than 1900\r\n"); |
| emh203 | 0:d0c18e423b13 | 484 | Error = TRUE; |
| emh203 | 0:d0c18e423b13 | 485 | } |
| emh203 | 0:d0c18e423b13 | 486 | |
| emh203 | 0:d0c18e423b13 | 487 | if(Error == TRUE) |
| emh203 | 0:d0c18e423b13 | 488 | { |
| emh203 | 0:d0c18e423b13 | 489 | PrintfEnqueue(&PCBackDoorTx,"Error in time format. Date not changed.\r\n"); |
| emh203 | 0:d0c18e423b13 | 490 | } |
| emh203 | 0:d0c18e423b13 | 491 | else |
| emh203 | 0:d0c18e423b13 | 492 | { |
| emh203 | 0:d0c18e423b13 | 493 | //Get the current time in seconds since unix epoch |
| emh203 | 0:d0c18e423b13 | 494 | TimeStampTemp = time(NULL); |
| emh203 | 0:d0c18e423b13 | 495 | //convert to tm struct fom |
| emh203 | 0:d0c18e423b13 | 496 | CurrentTime = localtime(&TimeStampTemp); |
| emh203 | 0:d0c18e423b13 | 497 | //dump in our new valus |
| emh203 | 0:d0c18e423b13 | 498 | CurrentTime->tm_mon = Month-1; |
| emh203 | 0:d0c18e423b13 | 499 | CurrentTime->tm_mday = Day; |
| emh203 | 0:d0c18e423b13 | 500 | CurrentTime->tm_year = Year - 1900; |
| emh203 | 0:d0c18e423b13 | 501 | //set the new time |
| emh203 | 0:d0c18e423b13 | 502 | set_time(mktime(CurrentTime)); |
| emh203 | 0:d0c18e423b13 | 503 | PrintfEnqueue(&PCBackDoorTx,"Date set to %d/%d/%d\r\n",Month,Day,Year); |
| emh203 | 0:d0c18e423b13 | 504 | } |
| emh203 | 0:d0c18e423b13 | 505 | |
| emh203 | 0:d0c18e423b13 | 506 | } |
| emh203 | 0:d0c18e423b13 | 507 | return FALSE; |
| emh203 | 0:d0c18e423b13 | 508 | } |
| emh203 | 0:d0c18e423b13 | 509 | |
| emh203 | 0:d0c18e423b13 | 510 | |
| emh203 | 0:d0c18e423b13 | 511 | |
| emh203 | 0:d0c18e423b13 | 512 | void UpdateDisplay() |
| emh203 | 0:d0c18e423b13 | 513 | { |
| emh203 | 0:d0c18e423b13 | 514 | |
| emh203 | 0:d0c18e423b13 | 515 | if(DisplayShutOffTick > DISPLAY_SHUTOFF_TIME) |
| emh203 | 0:d0c18e423b13 | 516 | { |
| emh203 | 0:d0c18e423b13 | 517 | DisplayMode = DISPLAY_OFF; |
| emh203 | 0:d0c18e423b13 | 518 | SmartSwitchClear(); |
| emh203 | 0:d0c18e423b13 | 519 | PowerDownSmartSwitch(); |
| emh203 | 0:d0c18e423b13 | 520 | } |
| emh203 | 0:d0c18e423b13 | 521 | else |
| emh203 | 0:d0c18e423b13 | 522 | { |
| emh203 | 0:d0c18e423b13 | 523 | if(DisplayUpdateTick > 25) |
| emh203 | 0:d0c18e423b13 | 524 | { |
| emh203 | 0:d0c18e423b13 | 525 | GFX_FullDisplayBufferClear(&BackBuffer); |
| emh203 | 0:d0c18e423b13 | 526 | DisplayUpdateTick = 0; |
| emh203 | 0:d0c18e423b13 | 527 | switch(DisplayMode) |
| emh203 | 0:d0c18e423b13 | 528 | { |
| emh203 | 0:d0c18e423b13 | 529 | default: |
| emh203 | 0:d0c18e423b13 | 530 | case DISPLAY_MEASUREMENTS: |
| emh203 | 0:d0c18e423b13 | 531 | SmartSwitch_SetBackLightColor(3,3,3); |
| emh203 | 0:d0c18e423b13 | 532 | GFX_DrawString(&BackBuffer,"Robot Bus",0,0,&Font5x7); |
| emh203 | 0:d0c18e423b13 | 533 | GFX_DrawHline(&BackBuffer,0,PHYSICAL_DISPLAY_XRES-1,10); |
| emh203 | 0:d0c18e423b13 | 534 | GFX_DrawHline(&BackBuffer,0,PHYSICAL_DISPLAY_XRES-1,11); |
| emh203 | 0:d0c18e423b13 | 535 | GFX_DrawHline(&BackBuffer,0,PHYSICAL_DISPLAY_XRES-1,12); |
| emh203 | 0:d0c18e423b13 | 536 | |
| emh203 | 0:d0c18e423b13 | 537 | GFX_printf(&BackBuffer,0,16,&Font5x7,"V: %.2fv",RobotBusVoltageHR); |
| emh203 | 0:d0c18e423b13 | 538 | GFX_printf(&BackBuffer,0,24,&Font5x7,"I: %.2fa",RobotBusCurrentHR); |
| emh203 | 0:d0c18e423b13 | 539 | break; |
| emh203 | 0:d0c18e423b13 | 540 | |
| emh203 | 0:d0c18e423b13 | 541 | |
| emh203 | 0:d0c18e423b13 | 542 | case DISPLAY_BATTERY: |
| emh203 | 0:d0c18e423b13 | 543 | SmartSwitch_SetBackLightColor(3,3,0); |
| emh203 | 0:d0c18e423b13 | 544 | GFX_DrawString(&BackBuffer,"Battery",0,0,&Font5x7); |
| emh203 | 0:d0c18e423b13 | 545 | GFX_DrawHline(&BackBuffer,0,PHYSICAL_DISPLAY_XRES-1,10); |
| emh203 | 0:d0c18e423b13 | 546 | GFX_DrawHline(&BackBuffer,0,PHYSICAL_DISPLAY_XRES-1,11); |
| emh203 | 0:d0c18e423b13 | 547 | GFX_DrawHline(&BackBuffer,0,PHYSICAL_DISPLAY_XRES-1,12); |
| emh203 | 0:d0c18e423b13 | 548 | |
| emh203 | 0:d0c18e423b13 | 549 | GFX_printf(&BackBuffer,0,16,&Font5x7,"V: %.1fv",BatteryVoltage); |
| emh203 | 0:d0c18e423b13 | 550 | |
| emh203 | 0:d0c18e423b13 | 551 | break; |
| emh203 | 0:d0c18e423b13 | 552 | |
| emh203 | 0:d0c18e423b13 | 553 | case DISPLAY_DATE_TIME: |
| emh203 | 0:d0c18e423b13 | 554 | SmartSwitch_SetBackLightColor(1,3,0); |
| emh203 | 0:d0c18e423b13 | 555 | GFX_DrawString(&BackBuffer,"Date/Time",0,0,&Font5x7); |
| emh203 | 0:d0c18e423b13 | 556 | GFX_DrawHline(&BackBuffer,0,PHYSICAL_DISPLAY_XRES-1,10); |
| emh203 | 0:d0c18e423b13 | 557 | GFX_DrawHline(&BackBuffer,0,PHYSICAL_DISPLAY_XRES-1,11); |
| emh203 | 0:d0c18e423b13 | 558 | GFX_DrawHline(&BackBuffer,0,PHYSICAL_DISPLAY_XRES-1,12); |
| emh203 | 0:d0c18e423b13 | 559 | |
| emh203 | 0:d0c18e423b13 | 560 | time(&CurrentTime_InSec); |
| emh203 | 0:d0c18e423b13 | 561 | strftime(DTBuf, 32, "%m.%d.%Y", localtime(&CurrentTime_InSec)); |
| emh203 | 0:d0c18e423b13 | 562 | GFX_printf(&BackBuffer,0,16,&Font5x7,"%s",DTBuf); |
| emh203 | 0:d0c18e423b13 | 563 | |
| emh203 | 0:d0c18e423b13 | 564 | strftime(DTBuf, 32, "%H:%M:%S", localtime(&CurrentTime_InSec)); |
| emh203 | 0:d0c18e423b13 | 565 | GFX_printf(&BackBuffer,0,24,&Font5x7,"%s",DTBuf); |
| emh203 | 0:d0c18e423b13 | 566 | break; |
| emh203 | 0:d0c18e423b13 | 567 | |
| emh203 | 0:d0c18e423b13 | 568 | case DISPLAY_BUFFER_STATS: |
| emh203 | 0:d0c18e423b13 | 569 | SmartSwitch_SetBackLightColor(3,3,3); |
| emh203 | 0:d0c18e423b13 | 570 | GFX_DrawString(&BackBuffer,"Buf Status",0,0,&Font5x7); |
| emh203 | 0:d0c18e423b13 | 571 | GFX_DrawHline(&BackBuffer,0,PHYSICAL_DISPLAY_XRES-1,10); |
| emh203 | 0:d0c18e423b13 | 572 | GFX_DrawHline(&BackBuffer,0,PHYSICAL_DISPLAY_XRES-1,11); |
| emh203 | 0:d0c18e423b13 | 573 | GFX_DrawHline(&BackBuffer,0,PHYSICAL_DISPLAY_XRES-1,12); |
| emh203 | 0:d0c18e423b13 | 574 | GFX_printf(&BackBuffer,0,16,&Font3x5,"R/W Diff:"); |
| emh203 | 0:d0c18e423b13 | 575 | GFX_printf(&BackBuffer,0,24,&Font3x5,"%04d/%d",ReadWriteDifferential,DATA_BLOCK_SIZE); |
| emh203 | 0:d0c18e423b13 | 576 | break; |
| emh203 | 0:d0c18e423b13 | 577 | |
| emh203 | 0:d0c18e423b13 | 578 | case DISPLAY_FIRMWARE_VERSION: |
| emh203 | 0:d0c18e423b13 | 579 | SmartSwitch_SetBackLightColor(3,3,3); |
| emh203 | 0:d0c18e423b13 | 580 | GFX_DrawString(&BackBuffer,"Firmware Version",0,0,&Font3x5); |
| emh203 | 0:d0c18e423b13 | 581 | GFX_DrawHline(&BackBuffer,0,PHYSICAL_DISPLAY_XRES-1,10); |
| emh203 | 0:d0c18e423b13 | 582 | GFX_DrawHline(&BackBuffer,0,PHYSICAL_DISPLAY_XRES-1,11); |
| emh203 | 0:d0c18e423b13 | 583 | GFX_DrawHline(&BackBuffer,0,PHYSICAL_DISPLAY_XRES-1,12); |
| emh203 | 0:d0c18e423b13 | 584 | GFX_printf(&BackBuffer,19,20,&Font5x7,"%d.%d",FIRMWARE_VERSION_MAJOR,FIRMWARE_VERSION_MINOR); |
| emh203 | 0:d0c18e423b13 | 585 | break; |
| emh203 | 0:d0c18e423b13 | 586 | |
| emh203 | 0:d0c18e423b13 | 587 | case DISPLAY_ID: |
| emh203 | 0:d0c18e423b13 | 588 | SmartSwitch_SetBackLightColor(3,3,3); |
| emh203 | 0:d0c18e423b13 | 589 | GFX_DrawString(&BackBuffer,"ID",0,0,&Font3x5); |
| emh203 | 0:d0c18e423b13 | 590 | GFX_DrawHline(&BackBuffer,0,PHYSICAL_DISPLAY_XRES-1,10); |
| emh203 | 0:d0c18e423b13 | 591 | GFX_DrawHline(&BackBuffer,0,PHYSICAL_DISPLAY_XRES-1,11); |
| emh203 | 0:d0c18e423b13 | 592 | GFX_DrawHline(&BackBuffer,0,PHYSICAL_DISPLAY_XRES-1,12); |
| emh203 | 0:d0c18e423b13 | 593 | GFX_printf(&BackBuffer,0,20,&Font5x7,"%s",ID); |
| emh203 | 0:d0c18e423b13 | 594 | break; |
| emh203 | 0:d0c18e423b13 | 595 | |
| emh203 | 0:d0c18e423b13 | 596 | case DISPLAY_CARD_STATUS: |
| emh203 | 0:d0c18e423b13 | 597 | |
| emh203 | 0:d0c18e423b13 | 598 | if(1) |
| emh203 | 0:d0c18e423b13 | 599 | { |
| emh203 | 0:d0c18e423b13 | 600 | |
| emh203 | 0:d0c18e423b13 | 601 | switch(SystemState) |
| emh203 | 0:d0c18e423b13 | 602 | { |
| emh203 | 0:d0c18e423b13 | 603 | default: |
| emh203 | 0:d0c18e423b13 | 604 | case SYSTEM_STATE_IDLE: |
| emh203 | 0:d0c18e423b13 | 605 | switch(LastBackLightColor) |
| emh203 | 0:d0c18e423b13 | 606 | { |
| emh203 | 0:d0c18e423b13 | 607 | default: |
| emh203 | 0:d0c18e423b13 | 608 | case SMART_SWITCH_BACKLIGHT_GREEN: |
| emh203 | 0:d0c18e423b13 | 609 | LastBackLightColor = SMART_SWITCH_BACKLIGHT_YELLOW; |
| emh203 | 0:d0c18e423b13 | 610 | SmartSwitch_SetBackLightColor2(LastBackLightColor); |
| emh203 | 0:d0c18e423b13 | 611 | break; |
| emh203 | 0:d0c18e423b13 | 612 | |
| emh203 | 0:d0c18e423b13 | 613 | case SMART_SWITCH_BACKLIGHT_YELLOW: |
| emh203 | 0:d0c18e423b13 | 614 | LastBackLightColor = SMART_SWITCH_BACKLIGHT_GREEN; |
| emh203 | 0:d0c18e423b13 | 615 | SmartSwitch_SetBackLightColor2(LastBackLightColor); |
| emh203 | 0:d0c18e423b13 | 616 | break; |
| emh203 | 0:d0c18e423b13 | 617 | } |
| emh203 | 0:d0c18e423b13 | 618 | |
| emh203 | 0:d0c18e423b13 | 619 | |
| emh203 | 0:d0c18e423b13 | 620 | if(DataLogError == TRUE) |
| emh203 | 0:d0c18e423b13 | 621 | { |
| emh203 | 0:d0c18e423b13 | 622 | GFX_DrawString(&BackBuffer,"Error!",0,0,&Font5x7); |
| emh203 | 0:d0c18e423b13 | 623 | GFX_DrawString(&BackBuffer,ErrorMsg,0,16,&Font3x5); |
| emh203 | 0:d0c18e423b13 | 624 | } |
| emh203 | 0:d0c18e423b13 | 625 | else |
| emh203 | 0:d0c18e423b13 | 626 | { |
| emh203 | 0:d0c18e423b13 | 627 | GFX_DrawString(&BackBuffer,"SD Detected",0,16,&Font5x7); |
| emh203 | 0:d0c18e423b13 | 628 | GFX_DrawString(&BackBuffer,"Idle....",0,0,&Font5x7); |
| emh203 | 0:d0c18e423b13 | 629 | GFX_DrawString(&BackBuffer,"Not Logging",0,24,&Font5x7); |
| emh203 | 0:d0c18e423b13 | 630 | } |
| emh203 | 0:d0c18e423b13 | 631 | break; |
| emh203 | 0:d0c18e423b13 | 632 | |
| emh203 | 0:d0c18e423b13 | 633 | |
| emh203 | 0:d0c18e423b13 | 634 | case SYSTEM_STATE_LOGGING: |
| emh203 | 0:d0c18e423b13 | 635 | SmartSwitch_SetBackLightColor2(SMART_SWITCH_BACKLIGHT_GREEN); |
| emh203 | 0:d0c18e423b13 | 636 | |
| emh203 | 0:d0c18e423b13 | 637 | GFX_DrawString(&BackBuffer,"Logging Data....",0,0,&Font5x7); |
| emh203 | 0:d0c18e423b13 | 638 | GFX_DrawString(&BackBuffer,&CurrentLogFileName[4],0,16,&Font5x7); |
| emh203 | 0:d0c18e423b13 | 639 | GFX_printf(&BackBuffer,0,26,&Font3x5,"Block: %d",DataBlocksWritten); |
| emh203 | 0:d0c18e423b13 | 640 | |
| emh203 | 0:d0c18e423b13 | 641 | break; |
| emh203 | 0:d0c18e423b13 | 642 | } |
| emh203 | 0:d0c18e423b13 | 643 | } |
| emh203 | 0:d0c18e423b13 | 644 | else |
| emh203 | 0:d0c18e423b13 | 645 | { |
| emh203 | 0:d0c18e423b13 | 646 | GFX_DrawString(&BackBuffer,"No SD Card!",0,0,&Font5x7); |
| emh203 | 0:d0c18e423b13 | 647 | |
| emh203 | 0:d0c18e423b13 | 648 | switch(LastBackLightColor) |
| emh203 | 0:d0c18e423b13 | 649 | { |
| emh203 | 0:d0c18e423b13 | 650 | default: |
| emh203 | 0:d0c18e423b13 | 651 | case SMART_SWITCH_BACKLIGHT_RED: |
| emh203 | 0:d0c18e423b13 | 652 | LastBackLightColor = SMART_SWITCH_BACKLIGHT_YELLOW; |
| emh203 | 0:d0c18e423b13 | 653 | SmartSwitch_SetBackLightColor2(LastBackLightColor); |
| emh203 | 0:d0c18e423b13 | 654 | break; |
| emh203 | 0:d0c18e423b13 | 655 | |
| emh203 | 0:d0c18e423b13 | 656 | case SMART_SWITCH_BACKLIGHT_YELLOW: |
| emh203 | 0:d0c18e423b13 | 657 | LastBackLightColor = SMART_SWITCH_BACKLIGHT_RED; |
| emh203 | 0:d0c18e423b13 | 658 | SmartSwitch_SetBackLightColor2(LastBackLightColor); |
| emh203 | 0:d0c18e423b13 | 659 | break; |
| emh203 | 0:d0c18e423b13 | 660 | } |
| emh203 | 0:d0c18e423b13 | 661 | } |
| emh203 | 0:d0c18e423b13 | 662 | |
| emh203 | 0:d0c18e423b13 | 663 | GFX_DrawHline(&BackBuffer,0,PHYSICAL_DISPLAY_XRES-1,10); |
| emh203 | 0:d0c18e423b13 | 664 | GFX_DrawHline(&BackBuffer,0,PHYSICAL_DISPLAY_XRES-1,11); |
| emh203 | 0:d0c18e423b13 | 665 | GFX_DrawHline(&BackBuffer,0,PHYSICAL_DISPLAY_XRES-1,12); |
| emh203 | 0:d0c18e423b13 | 666 | |
| emh203 | 0:d0c18e423b13 | 667 | break; |
| emh203 | 0:d0c18e423b13 | 668 | } |
| emh203 | 0:d0c18e423b13 | 669 | GFX_DumpRenderContextToPhysicalScreen(&BackBuffer); |
| emh203 | 0:d0c18e423b13 | 670 | } |
| emh203 | 0:d0c18e423b13 | 671 | } |
| emh203 | 0:d0c18e423b13 | 672 | } |
| emh203 | 0:d0c18e423b13 | 673 | |
| emh203 | 0:d0c18e423b13 | 674 | |
| emh203 | 0:d0c18e423b13 | 675 | void CheckSDCardStatus() |
| emh203 | 0:d0c18e423b13 | 676 | { |
| emh203 | 0:d0c18e423b13 | 677 | //Make sure that the SD card stays in while logging |
| emh203 | 0:d0c18e423b13 | 678 | switch(SystemState) |
| emh203 | 0:d0c18e423b13 | 679 | { |
| emh203 | 0:d0c18e423b13 | 680 | case SYSTEM_STATE_LOGGING: |
| emh203 | 0:d0c18e423b13 | 681 | //if(SDCardDetect == 0) |
| emh203 | 0:d0c18e423b13 | 682 | { |
| emh203 | 0:d0c18e423b13 | 683 | //Gracefully shut the logging system down..... |
| emh203 | 0:d0c18e423b13 | 684 | // EnterSystemState(SYSTEM_STATE_IDLE); |
| emh203 | 0:d0c18e423b13 | 685 | } |
| emh203 | 0:d0c18e423b13 | 686 | break; |
| emh203 | 0:d0c18e423b13 | 687 | |
| emh203 | 0:d0c18e423b13 | 688 | default: |
| emh203 | 0:d0c18e423b13 | 689 | break; |
| emh203 | 0:d0c18e423b13 | 690 | } |
| emh203 | 0:d0c18e423b13 | 691 | } |
| emh203 | 0:d0c18e423b13 | 692 | |
| emh203 | 0:d0c18e423b13 | 693 | |
| emh203 | 0:d0c18e423b13 | 694 | void LogData() |
| emh203 | 0:d0c18e423b13 | 695 | { |
| emh203 | 0:d0c18e423b13 | 696 | WORD i; |
| emh203 | 0:d0c18e423b13 | 697 | int ElementsToWrite; |
| emh203 | 0:d0c18e423b13 | 698 | UINT BytesWritten; |
| emh203 | 0:d0c18e423b13 | 699 | |
| emh203 | 0:d0c18e423b13 | 700 | if(RobotBusVoltageHR < 9) |
| emh203 | 0:d0c18e423b13 | 701 | { |
| emh203 | 0:d0c18e423b13 | 702 | // EnterSystemState(SYSTEM_STATE_IDLE); |
| emh203 | 0:d0c18e423b13 | 703 | return; |
| emh203 | 0:d0c18e423b13 | 704 | } |
| emh203 | 0:d0c18e423b13 | 705 | |
| emh203 | 0:d0c18e423b13 | 706 | if(DataLogError == TRUE) |
| emh203 | 0:d0c18e423b13 | 707 | { |
| emh203 | 0:d0c18e423b13 | 708 | //EnterSystemState(SYSTEM_STATE_IDLE); |
| emh203 | 0:d0c18e423b13 | 709 | } |
| emh203 | 0:d0c18e423b13 | 710 | else |
| emh203 | 0:d0c18e423b13 | 711 | { |
| emh203 | 0:d0c18e423b13 | 712 | if(MyDataBlock.ReadInPtr < MyDataBlock.WriteOutPtr) |
| emh203 | 0:d0c18e423b13 | 713 | { |
| emh203 | 0:d0c18e423b13 | 714 | ElementsToWrite = MyDataBlock.ReadInPtr + (DATA_BLOCK_SIZE - MyDataBlock.WriteOutPtr); |
| emh203 | 0:d0c18e423b13 | 715 | } |
| emh203 | 0:d0c18e423b13 | 716 | else |
| emh203 | 0:d0c18e423b13 | 717 | { |
| emh203 | 0:d0c18e423b13 | 718 | ElementsToWrite = MyDataBlock.ReadInPtr - MyDataBlock.WriteOutPtr; |
| emh203 | 0:d0c18e423b13 | 719 | } |
| emh203 | 0:d0c18e423b13 | 720 | |
| emh203 | 0:d0c18e423b13 | 721 | if(ElementsToWrite > WRITE_BLOCK_THRESH) |
| emh203 | 0:d0c18e423b13 | 722 | { |
| emh203 | 0:d0c18e423b13 | 723 | for(i=0;i<ElementsToWrite;i++) |
| emh203 | 0:d0c18e423b13 | 724 | { |
| emh203 | 0:d0c18e423b13 | 725 | BinaryDataCachePtr += sprintf((char *)&BinaryDataCache[BinaryDataCachePtr],"%d,%.2f,%.2f\r\n",DataPointIndex,MyDataBlock.Voltage[MyDataBlock.WriteOutPtr],MyDataBlock.Current[MyDataBlock.WriteOutPtr]); |
| emh203 | 0:d0c18e423b13 | 726 | if(BinaryDataCachePtr>=BINARY_WRITE_CACHE_THRESHOLD) |
| emh203 | 0:d0c18e423b13 | 727 | { |
| emh203 | 0:d0c18e423b13 | 728 | EXT_LED0 = 1; |
| emh203 | 0:d0c18e423b13 | 729 | f_write(&CurrentLogFileHandle,BinaryDataCache,BinaryDataCachePtr,&BytesWritten); |
| emh203 | 0:d0c18e423b13 | 730 | |
| emh203 | 0:d0c18e423b13 | 731 | BinaryDataCachePtr = 0; |
| emh203 | 0:d0c18e423b13 | 732 | |
| emh203 | 0:d0c18e423b13 | 733 | EXT_LED0=0; |
| emh203 | 0:d0c18e423b13 | 734 | } |
| emh203 | 0:d0c18e423b13 | 735 | DataPointIndex++; |
| emh203 | 0:d0c18e423b13 | 736 | MyDataBlock.WriteOutPtr++; |
| emh203 | 0:d0c18e423b13 | 737 | if(MyDataBlock.WriteOutPtr == DATA_BLOCK_SIZE) |
| emh203 | 0:d0c18e423b13 | 738 | { |
| emh203 | 0:d0c18e423b13 | 739 | MyDataBlock.WriteOutPtr = 0; |
| emh203 | 0:d0c18e423b13 | 740 | } |
| emh203 | 0:d0c18e423b13 | 741 | } |
| emh203 | 0:d0c18e423b13 | 742 | if(WritesSinceLastFlush > NUM_WRITES_BEFORE_FLUSH) |
| emh203 | 0:d0c18e423b13 | 743 | { |
| emh203 | 0:d0c18e423b13 | 744 | f_close(&CurrentLogFileHandle); |
| emh203 | 0:d0c18e423b13 | 745 | WritesSinceLastFlush = 0; |
| emh203 | 0:d0c18e423b13 | 746 | f_open(&CurrentLogFileHandle,&CurrentLogFileName[0],FA_WRITE | FA_OPEN_ALWAYS); |
| emh203 | 0:d0c18e423b13 | 747 | f_lseek(&CurrentLogFileHandle, CurrentLogFileHandle.fsize); |
| emh203 | 0:d0c18e423b13 | 748 | } |
| emh203 | 0:d0c18e423b13 | 749 | DataBlocksWritten++; |
| emh203 | 0:d0c18e423b13 | 750 | } |
| emh203 | 0:d0c18e423b13 | 751 | } |
| emh203 | 0:d0c18e423b13 | 752 | } |
| emh203 | 0:d0c18e423b13 | 753 | |
| emh203 | 0:d0c18e423b13 | 754 | |
| emh203 | 0:d0c18e423b13 | 755 | |
| emh203 | 0:d0c18e423b13 | 756 | void DisplayBootMsg() |
| emh203 | 0:d0c18e423b13 | 757 | { |
| emh203 | 0:d0c18e423b13 | 758 | PrintfEnqueue(&PCBackDoorTx,"\r\n\r\n"); |
| emh203 | 0:d0c18e423b13 | 759 | PrintfEnqueue(&PCBackDoorTx,".______ _______. __ __ ___ .______ __ \r\n"); |
| emh203 | 0:d0c18e423b13 | 760 | PrintfEnqueue(&PCBackDoorTx,"| _ \\ / || | | | / \\ | _ \\ | | \r\n"); |
| emh203 | 0:d0c18e423b13 | 761 | PrintfEnqueue(&PCBackDoorTx,"| |_) | | (----`| | | | ______ / ^ \\ | |_) | | | \r\n"); |
| emh203 | 0:d0c18e423b13 | 762 | PrintfEnqueue(&PCBackDoorTx,"| ___/ \\ \\ | | | | |______/ /_\\ \\ | / | | \r\n"); |
| emh203 | 0:d0c18e423b13 | 763 | PrintfEnqueue(&PCBackDoorTx,"| | .----) | | `--' | / _____ \\ | |\\ \\----.| `----.\r\n"); |
| emh203 | 0:d0c18e423b13 | 764 | PrintfEnqueue(&PCBackDoorTx,"| _| |_______/ \\______/ /__/ \\__\\ | _| `._____||_______|\r\n"); |
| emh203 | 0:d0c18e423b13 | 765 | PrintfEnqueue(&PCBackDoorTx,"---------------------------------------------------------------------------\r\n"); |
| emh203 | 0:d0c18e423b13 | 766 | PrintfEnqueue(&PCBackDoorTx,"Robot Power Logger Control Terminal\r\n\r\n>"); |
| emh203 | 0:d0c18e423b13 | 767 | } |
| emh203 | 0:d0c18e423b13 | 768 |
