The field version of the solarnano grid on the ionQubes

Fork of SolarNanoGridv3 by SONG Project

Committer:
epgmdm
Date:
Wed Jun 08 22:48:09 2016 +0000
Revision:
12:d9b13f31206d
Parent:
11:87ab310924f0
Child:
13:de43f28c0365
Added getLogDir and getMaxCurrent as public methods to Battery

Who changed what in which revision?

UserRevisionLine numberNew contents of line
defrost 5:57b06b4b47c6 1 /**
defrost 5:57b06b4b47c6 2 *@section DESCRIPTION
defrost 5:57b06b4b47c6 3 * mbed SolarNanogrid Library
defrost 5:57b06b4b47c6 4 * Battery extends SolarNanoGrid.
defrost 5:57b06b4b47c6 5 * Battery interacts with the lockers.
defrost 5:57b06b4b47c6 6 * The ID must NOT end in 00.
defrost 5:57b06b4b47c6 7 *@section LICENSE
defrost 5:57b06b4b47c6 8 * Copyright (c) 2016, Malcolm McCulloch
defrost 5:57b06b4b47c6 9 *
defrost 5:57b06b4b47c6 10 * Permission is hereby granted, free of charge, to any person obtaining a copy
defrost 5:57b06b4b47c6 11 * of this software and associated documentation files (the "Software"), to deal
defrost 5:57b06b4b47c6 12 * in the Software without restriction, including without limitation the rights
defrost 5:57b06b4b47c6 13 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
defrost 5:57b06b4b47c6 14 * copies of the Software, and to permit persons to whom the Software is
defrost 5:57b06b4b47c6 15 * furnished to do so, subject to the following conditions:
defrost 5:57b06b4b47c6 16 *
defrost 5:57b06b4b47c6 17 * The above copyright notice and this permission notice shall be included in
defrost 5:57b06b4b47c6 18 * all copies or substantial portions of the Software.
defrost 5:57b06b4b47c6 19 *
defrost 5:57b06b4b47c6 20 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
defrost 5:57b06b4b47c6 21 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
defrost 5:57b06b4b47c6 22 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
defrost 5:57b06b4b47c6 23 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
defrost 5:57b06b4b47c6 24 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
defrost 5:57b06b4b47c6 25 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
defrost 5:57b06b4b47c6 26 * THE SOFTWARE.
defrost 5:57b06b4b47c6 27 * @file "Battery.c"
defrost 5:57b06b4b47c6 28 */
defrost 5:57b06b4b47c6 29 #include "Battery.h"
defrost 10:30c9e8df0032 30 #define FUNCNAME "BATTERY"
defrost 10:30c9e8df0032 31 #include "defs.h"
defrost 5:57b06b4b47c6 32
defrost 5:57b06b4b47c6 33 // ------------------------------------------------------------------------
defrost 5:57b06b4b47c6 34 // Constructors
defrost 5:57b06b4b47c6 35 // ------------------------------------------------------------------------
defrost 5:57b06b4b47c6 36
epgmdm 11:87ab310924f0 37 Battery::Battery(FILE* fp, Serial *pc) : SolarNanoGrid(fp,pc){
defrost 5:57b06b4b47c6 38 DBG("Initialize class");
adrienBiz 8:0acda4f2e0a8 39 // ***** Variable initialisation *****
adrienBiz 8:0acda4f2e0a8 40 // Public variable initialisation
epgmdm 11:87ab310924f0 41
epgmdm 12:d9b13f31206d 42 maxChargeRate=1.0; // Charge rate in amps
epgmdm 11:87ab310924f0 43
adrienBiz 8:0acda4f2e0a8 44 // Protected variables initialisation
adrienBiz 8:0acda4f2e0a8 45 count=0;
adrienBiz 8:0acda4f2e0a8 46 sizeRead=0;
adrienBiz 8:0acda4f2e0a8 47 fileLength=0;
adrienBiz 8:0acda4f2e0a8 48 filePointer=0;
adrienBiz 8:0acda4f2e0a8 49 fileLeft=0;
epgmdm 11:87ab310924f0 50
adrienBiz 8:0acda4f2e0a8 51 sdBuffPnt=0;
adrienBiz 8:0acda4f2e0a8 52 /**
adrienBiz 8:0acda4f2e0a8 53 * Open channel address of the locker
adrienBiz 8:0acda4f2e0a8 54 */
adrienBiz 8:0acda4f2e0a8 55 openAddr=0;
adrienBiz 8:0acda4f2e0a8 56
adrienBiz 8:0acda4f2e0a8 57 /**
adrienBiz 8:0acda4f2e0a8 58 * Private channel address of the locker
adrienBiz 8:0acda4f2e0a8 59 */
adrienBiz 8:0acda4f2e0a8 60 privateAddr=0;
adrienBiz 8:0acda4f2e0a8 61
adrienBiz 8:0acda4f2e0a8 62 countSD=0;
adrienBiz 8:0acda4f2e0a8 63
adrienBiz 8:0acda4f2e0a8 64 // Protected flags: *
adrienBiz 8:0acda4f2e0a8 65 checkedIn=0;
adrienBiz 8:0acda4f2e0a8 66 flagGetTime=0;
adrienBiz 8:0acda4f2e0a8 67 flagNextFile=0;
adrienBiz 8:0acda4f2e0a8 68 flagSendFileName=0;
adrienBiz 8:0acda4f2e0a8 69 flagSendFileSize=0;
adrienBiz 8:0acda4f2e0a8 70 flagSendFile=0;
adrienBiz 8:0acda4f2e0a8 71 flagSendFileDone=0;
epgmdm 12:d9b13f31206d 72 flagGetMaxCharge=0;
epgmdm 12:d9b13f31206d 73 sendingFile=0;
epgmdm 11:87ab310924f0 74
adrienBiz 8:0acda4f2e0a8 75 // Protected interrupts
adrienBiz 8:0acda4f2e0a8 76 button=NULL;
adrienBiz 8:0acda4f2e0a8 77 txWatch=NULL;
adrienBiz 8:0acda4f2e0a8 78 delay=NULL;
epgmdm 11:87ab310924f0 79
adrienBiz 8:0acda4f2e0a8 80 //Private variables initialisation
adrienBiz 8:0acda4f2e0a8 81 maxRT=false;
epgmdm 11:87ab310924f0 82
adrienBiz 8:0acda4f2e0a8 83 // ***** End of variables initialisation *****
epgmdm 11:87ab310924f0 84
epgmdm 11:87ab310924f0 85 // No other information needed from the config file
epgmdm 11:87ab310924f0 86 fclose(fp);
epgmdm 11:87ab310924f0 87 //
epgmdm 11:87ab310924f0 88 // Setup variables
epgmdm 11:87ab310924f0 89 //
epgmdm 11:87ab310924f0 90 txFileName = (char*) calloc(80, 1);
epgmdm 11:87ab310924f0 91 fullTxFilePath = (char*) calloc(80, 1);
epgmdm 11:87ab310924f0 92 logDir = (char*) calloc(20, 1);
epgmdm 11:87ab310924f0 93 sdBuffer = (char*) calloc(SDBUFFERSIZE, 1);
epgmdm 11:87ab310924f0 94
epgmdm 11:87ab310924f0 95
epgmdm 11:87ab310924f0 96
epgmdm 11:87ab310924f0 97
defrost 5:57b06b4b47c6 98 //
defrost 5:57b06b4b47c6 99 // Setup NRF
defrost 5:57b06b4b47c6 100 //
defrost 5:57b06b4b47c6 101 privateAddr = ((long long)communityID <<16)+ (id &0XFFFF);
defrost 5:57b06b4b47c6 102 openAddr = privateAddr & 0xFFFFFFFF00;
defrost 5:57b06b4b47c6 103
defrost 5:57b06b4b47c6 104 DBG("Channel %x Address %llx Address Locker %llx", chan, privateAddr, openAddr);
defrost 5:57b06b4b47c6 105
epgmdm 11:87ab310924f0 106 spiNRF();
defrost 5:57b06b4b47c6 107 nrf->quickTxSetup(chan, openAddr);
defrost 5:57b06b4b47c6 108 nrf->setRadio(0x01, 0x03); // 2MB/S 0dB
defrost 5:57b06b4b47c6 109 nrf->setTxRetry(0x0F, 0x0F);
defrost 5:57b06b4b47c6 110 nrfFlush();
defrost 5:57b06b4b47c6 111 DBG("Nrf Details:");
defrost 5:57b06b4b47c6 112 #ifdef DEBUG
defrost 5:57b06b4b47c6 113 nrf->printDetails();
defrost 5:57b06b4b47c6 114 #endif
defrost 5:57b06b4b47c6 115 //
defrost 5:57b06b4b47c6 116 // Setup logging directories
defrost 5:57b06b4b47c6 117 //
defrost 5:57b06b4b47c6 118 sprintf(logDir, "/sd/data/%02X%04X", (communityID&0XFF),(id&0XFFFF));
defrost 5:57b06b4b47c6 119 DBG(" Log directory %s", logDir);
defrost 5:57b06b4b47c6 120 spiSD();
defrost 5:57b06b4b47c6 121 mkdir("/sd/data", 777);
defrost 5:57b06b4b47c6 122 mkdir(logDir, 777);
defrost 5:57b06b4b47c6 123 DBG(" made");
defrost 5:57b06b4b47c6 124 //
defrost 5:57b06b4b47c6 125 // Setup interrupts
defrost 5:57b06b4b47c6 126 //
defrost 5:57b06b4b47c6 127 button = new InterruptIn(SW2);
defrost 5:57b06b4b47c6 128 button->fall(this, &Battery::intButton);
defrost 5:57b06b4b47c6 129
defrost 5:57b06b4b47c6 130 nrfInt = new InterruptIn(PTC18);
defrost 5:57b06b4b47c6 131 nrfInt->fall(this, &Battery::intNrf); // attach nrf interrupt.
defrost 5:57b06b4b47c6 132
defrost 5:57b06b4b47c6 133 txWatch = new Ticker ();
defrost 5:57b06b4b47c6 134 txWatch->attach(this,&Battery::retransmit,10.01);
defrost 5:57b06b4b47c6 135
defrost 5:57b06b4b47c6 136 delay = new Timeout();
defrost 5:57b06b4b47c6 137
defrost 5:57b06b4b47c6 138 loop();
defrost 5:57b06b4b47c6 139 }
defrost 5:57b06b4b47c6 140
defrost 5:57b06b4b47c6 141 // ------------------------------------------------------------------------
defrost 5:57b06b4b47c6 142 // Interrupt routines
defrost 5:57b06b4b47c6 143 // ------------------------------------------------------------------------
defrost 5:57b06b4b47c6 144
defrost 5:57b06b4b47c6 145 /**
defrost 5:57b06b4b47c6 146 * When the button is pressed transmit something
defrost 5:57b06b4b47c6 147 */
defrost 5:57b06b4b47c6 148 void Battery::intButton(){
defrost 5:57b06b4b47c6 149 if (!maxRT){
defrost 5:57b06b4b47c6 150 *ce = 1;
defrost 5:57b06b4b47c6 151 if(checkedIn==0){
defrost 5:57b06b4b47c6 152 checkIn();
defrost 5:57b06b4b47c6 153 } else{
defrost 5:57b06b4b47c6 154 flagNextFile = 1;
defrost 5:57b06b4b47c6 155 }
defrost 5:57b06b4b47c6 156
defrost 5:57b06b4b47c6 157 }
defrost 5:57b06b4b47c6 158 }
defrost 5:57b06b4b47c6 159
defrost 5:57b06b4b47c6 160 /**
defrost 5:57b06b4b47c6 161 * Called when the nrf creates an interrupt.
defrost 5:57b06b4b47c6 162 *
defrost 5:57b06b4b47c6 163 */
defrost 5:57b06b4b47c6 164 void Battery::intNrf(){
defrost 5:57b06b4b47c6 165 // DBG("NRF Interrupt Started.");
defrost 5:57b06b4b47c6 166 int pipe=0;
defrost 5:57b06b4b47c6 167 int status=0;
defrost 5:57b06b4b47c6 168 int width=0;
defrost 5:57b06b4b47c6 169
defrost 5:57b06b4b47c6 170 //
defrost 5:57b06b4b47c6 171 //Get status and pipe
defrost 5:57b06b4b47c6 172 //
epgmdm 11:87ab310924f0 173 spiNRF();
defrost 5:57b06b4b47c6 174 status = nrf->checkStatus();
defrost 5:57b06b4b47c6 175 pipe = (status >> 1);
defrost 5:57b06b4b47c6 176 pipe = (pipe & 0x0007);
defrost 5:57b06b4b47c6 177
defrost 5:57b06b4b47c6 178 //
defrost 5:57b06b4b47c6 179 // Check if max RT is reached
defrost 5:57b06b4b47c6 180 //
defrost 5:57b06b4b47c6 181 if (((status >>MAX_RT)& 01) ==1) {
defrost 5:57b06b4b47c6 182 maxRT=true;
defrost 5:57b06b4b47c6 183 DBG("MAX RT flag is set.PTB20= %d status=%x",*ce,status);
defrost 5:57b06b4b47c6 184 *ce = 0;
defrost 5:57b06b4b47c6 185 DBG("PTB20= %d status=%x",*ce,status);
defrost 5:57b06b4b47c6 186 nrf->clearStatus();
defrost 5:57b06b4b47c6 187 *ledRed=0;
defrost 5:57b06b4b47c6 188 }
defrost 5:57b06b4b47c6 189
defrost 5:57b06b4b47c6 190 //
defrost 5:57b06b4b47c6 191 // Check if data received
defrost 5:57b06b4b47c6 192 //
defrost 5:57b06b4b47c6 193 if (((status >>RX_DR)& 01) ==1) { // Received a packet
defrost 5:57b06b4b47c6 194 width= nrf->getRxData(dataRx);
defrost 5:57b06b4b47c6 195 dataRx[width]='\0';
defrost 5:57b06b4b47c6 196 if (dataRx[0]!='S'){
defrost 5:57b06b4b47c6 197 DBG("intNrf>D[p=%1d]=<%2s> ",pipe,dataRx);
defrost 5:57b06b4b47c6 198 }
defrost 5:57b06b4b47c6 199 maxRT=false;
defrost 5:57b06b4b47c6 200 *ce = 1;
defrost 5:57b06b4b47c6 201 nrf->clearStatus();
defrost 5:57b06b4b47c6 202 switch (dataRx[0]) {
defrost 5:57b06b4b47c6 203 case ('C'):{
defrost 5:57b06b4b47c6 204 doCheckIn();
defrost 5:57b06b4b47c6 205 flagNextFile = 1;
defrost 5:57b06b4b47c6 206 break;}
defrost 5:57b06b4b47c6 207 case ('D'):{
defrost 5:57b06b4b47c6 208 flag = &flagSendFileName;
defrost 5:57b06b4b47c6 209 delay->detach();
defrost 5:57b06b4b47c6 210 delay->attach(this, &Battery::setFlag, 1.5);
defrost 5:57b06b4b47c6 211 break;}
defrost 5:57b06b4b47c6 212 case ('F'):{
defrost 5:57b06b4b47c6 213 flag = &flagSendFileSize;
defrost 5:57b06b4b47c6 214 countSD = 0;
defrost 5:57b06b4b47c6 215 delay->detach();
defrost 5:57b06b4b47c6 216 delay->attach(this, &Battery::setFlag, 1.50);
defrost 5:57b06b4b47c6 217 break;}
defrost 5:57b06b4b47c6 218 case ('S'):{
defrost 5:57b06b4b47c6 219 flag = &flagSendFile;
defrost 5:57b06b4b47c6 220 delay->detach();
defrost 5:57b06b4b47c6 221 // printf("%d\n\r",countSD%16);
defrost 5:57b06b4b47c6 222 //delay->attach(this, &Battery::setFlag, 0.05);
defrost 5:57b06b4b47c6 223
defrost 5:57b06b4b47c6 224 if (countSD % (SDBUFFERSIZE/32) == 0) {
defrost 5:57b06b4b47c6 225 delay->attach(this, &Battery::setFlag, 1.5); // wait to write to SD card
defrost 5:57b06b4b47c6 226 } else {
defrost 5:57b06b4b47c6 227 delay->attach_us(this, &Battery::setFlag, 800);
defrost 5:57b06b4b47c6 228 }
defrost 5:57b06b4b47c6 229 countSD++;
defrost 5:57b06b4b47c6 230 break;}
defrost 5:57b06b4b47c6 231 case ('T'):{
defrost 5:57b06b4b47c6 232 time_t now;
defrost 5:57b06b4b47c6 233 sscanf (&dataRx[2],"%x",&now );
defrost 5:57b06b4b47c6 234 set_time(now);
defrost 5:57b06b4b47c6 235 now= time(NULL);
defrost 5:57b06b4b47c6 236 struct tm * timeInf = localtime(&now);
defrost 5:57b06b4b47c6 237 DBG ("Time is now: %04d-%02d-%02d %02d:%02d:%02d \n\r",timeInf->tm_year+1900,timeInf->tm_mon+1,timeInf->tm_mday,timeInf->tm_hour, timeInf->tm_min,timeInf->tm_sec);
defrost 5:57b06b4b47c6 238
defrost 5:57b06b4b47c6 239 break;}
defrost 5:57b06b4b47c6 240
epgmdm 12:d9b13f31206d 241
epgmdm 12:d9b13f31206d 242 case ('M'):{
epgmdm 12:d9b13f31206d 243 time_t now;
epgmdm 12:d9b13f31206d 244 sscanf (&dataRx[2],"%f",&maxChargeRate );
epgmdm 12:d9b13f31206d 245 if(maxChargeRate>2.0){
epgmdm 12:d9b13f31206d 246 maxChargeRate=2.0;
epgmdm 12:d9b13f31206d 247 }
epgmdm 12:d9b13f31206d 248 if (maxChargeRate<0.0){
epgmdm 12:d9b13f31206d 249 maxChargeRate=0.0;
epgmdm 12:d9b13f31206d 250 }
epgmdm 12:d9b13f31206d 251 DBG ("Max charge %f \n\r",maxChargeRate);
epgmdm 12:d9b13f31206d 252
epgmdm 12:d9b13f31206d 253 break;}
defrost 5:57b06b4b47c6 254 }
epgmdm 12:d9b13f31206d 255
defrost 5:57b06b4b47c6 256 }
epgmdm 12:d9b13f31206d 257
defrost 5:57b06b4b47c6 258 if (((status >>TX_DS)& 01) ==1) {
defrost 5:57b06b4b47c6 259 // maxRT=false;
defrost 5:57b06b4b47c6 260 nrf->flushTx();
defrost 5:57b06b4b47c6 261 nrf->flushRx();
defrost 5:57b06b4b47c6 262 //DBG(" TX_DS");
defrost 5:57b06b4b47c6 263 }
defrost 5:57b06b4b47c6 264
defrost 5:57b06b4b47c6 265 *ledBlue = !*ledBlue;
defrost 5:57b06b4b47c6 266 *ledRed = !maxRT;
defrost 5:57b06b4b47c6 267 }
defrost 5:57b06b4b47c6 268
defrost 5:57b06b4b47c6 269 /**
defrost 5:57b06b4b47c6 270 * Transmits the data and sets up a call back to check data sent 30s later.
defrost 5:57b06b4b47c6 271 */
defrost 5:57b06b4b47c6 272
defrost 5:57b06b4b47c6 273 /**
defrost 5:57b06b4b47c6 274 * Checks to see if transmit failed and then retransmit
defrost 5:57b06b4b47c6 275 *
defrost 5:57b06b4b47c6 276 */
defrost 5:57b06b4b47c6 277 void Battery::retransmit(){
defrost 5:57b06b4b47c6 278
defrost 5:57b06b4b47c6 279 if (maxRT) {
defrost 5:57b06b4b47c6 280 DBG("Retransmit");
defrost 5:57b06b4b47c6 281 *ledRed=1;
defrost 5:57b06b4b47c6 282 *ce = 1;
defrost 5:57b06b4b47c6 283 maxRT=false;
defrost 5:57b06b4b47c6 284 nrf->clearStatus();
defrost 5:57b06b4b47c6 285 nrf->flushRx();
defrost 5:57b06b4b47c6 286 nrf->retransmitData();
defrost 5:57b06b4b47c6 287 }
epgmdm 12:d9b13f31206d 288 if ((!sendingFile)&&(checkedIn == 1)){
epgmdm 12:d9b13f31206d 289 flagGetTime=1;
epgmdm 12:d9b13f31206d 290 flagGetMaxCharge=1;
epgmdm 12:d9b13f31206d 291 }
defrost 5:57b06b4b47c6 292 }
defrost 5:57b06b4b47c6 293
defrost 5:57b06b4b47c6 294 // ------------------------------------------------------------------------
defrost 5:57b06b4b47c6 295 // Main routines
defrost 5:57b06b4b47c6 296 // ------------------------------------------------------------------------
defrost 5:57b06b4b47c6 297
defrost 5:57b06b4b47c6 298 /**
defrost 5:57b06b4b47c6 299 * Checks in the Battery to the locker
defrost 5:57b06b4b47c6 300 * Transmits "C ID"
defrost 5:57b06b4b47c6 301 *
defrost 5:57b06b4b47c6 302 */
defrost 5:57b06b4b47c6 303 void Battery::checkIn() {
defrost 5:57b06b4b47c6 304 sprintf(dataTx, "C %04X", (int) (id&0XFFFF));
defrost 5:57b06b4b47c6 305 DBG("Check into locker [%s]", dataTx);
epgmdm 11:87ab310924f0 306 spiNRF();
defrost 5:57b06b4b47c6 307 nrf->transmitData(dataTx, strlen(dataTx));
defrost 5:57b06b4b47c6 308 }
defrost 5:57b06b4b47c6 309
defrost 5:57b06b4b47c6 310 /**
defrost 5:57b06b4b47c6 311 * Checks in the Battery to the locker
defrost 5:57b06b4b47c6 312 * Acknowledge received.
defrost 5:57b06b4b47c6 313 * Changes the TX pipe address.
defrost 5:57b06b4b47c6 314 *
defrost 5:57b06b4b47c6 315 */
defrost 5:57b06b4b47c6 316 void Battery::doCheckIn() {
defrost 5:57b06b4b47c6 317 nrf->setTxAddress(privateAddr);
defrost 5:57b06b4b47c6 318 checkedIn = 1;
defrost 5:57b06b4b47c6 319 DBG("Checked into locker");
defrost 5:57b06b4b47c6 320 DBG("Nrf Details:");
defrost 5:57b06b4b47c6 321 #ifdef DEBUG
defrost 5:57b06b4b47c6 322 nrf->printDetails();
defrost 5:57b06b4b47c6 323 #endif
defrost 5:57b06b4b47c6 324 }
defrost 5:57b06b4b47c6 325 /**
defrost 5:57b06b4b47c6 326 * Checks in the Battery to the locker
defrost 5:57b06b4b47c6 327 * Acknowledge received.
defrost 5:57b06b4b47c6 328 * Changes the TX pipe address.
defrost 5:57b06b4b47c6 329 *
defrost 5:57b06b4b47c6 330 */
defrost 5:57b06b4b47c6 331 void Battery::doCheckOut() {
defrost 5:57b06b4b47c6 332 nrf->setTxAddress(openAddr);
defrost 5:57b06b4b47c6 333 checkedIn = 0;
defrost 5:57b06b4b47c6 334 DBG("Checked out of locker");
defrost 5:57b06b4b47c6 335 DBG("Nrf Details:");
defrost 5:57b06b4b47c6 336 #ifdef DEBUG
defrost 5:57b06b4b47c6 337 nrf->printDetails();
defrost 5:57b06b4b47c6 338 #endif
defrost 5:57b06b4b47c6 339 }
defrost 5:57b06b4b47c6 340
defrost 5:57b06b4b47c6 341 /**
defrost 5:57b06b4b47c6 342 * Slow routines for Battery
defrost 5:57b06b4b47c6 343 */
defrost 5:57b06b4b47c6 344 void Battery::loop() {
epgmdm 12:d9b13f31206d 345
epgmdm 12:d9b13f31206d 346 *ledGreen = !checkedIn;
defrost 5:57b06b4b47c6 347
epgmdm 12:d9b13f31206d 348 if (flagGetTime) {
epgmdm 12:d9b13f31206d 349 flagGetTime=0;
epgmdm 12:d9b13f31206d 350 requestTime();
epgmdm 12:d9b13f31206d 351
epgmdm 12:d9b13f31206d 352 }
epgmdm 12:d9b13f31206d 353 if (flagGetMaxCharge) {
epgmdm 12:d9b13f31206d 354 flagGetMaxCharge=0;
epgmdm 12:d9b13f31206d 355 requestMaxCharge();
defrost 5:57b06b4b47c6 356
epgmdm 12:d9b13f31206d 357 }
epgmdm 12:d9b13f31206d 358 if (flagNextFile) {
epgmdm 12:d9b13f31206d 359 flagNextFile = 0;
epgmdm 12:d9b13f31206d 360 requestTime();
epgmdm 12:d9b13f31206d 361 nextFileToTx();
epgmdm 12:d9b13f31206d 362 if (fileLength>0){
epgmdm 12:d9b13f31206d 363 INFO("Sending file %s.",txFileName)
epgmdm 12:d9b13f31206d 364 sendDirName();
epgmdm 12:d9b13f31206d 365 } else {
epgmdm 12:d9b13f31206d 366 sendingFile=0;
epgmdm 12:d9b13f31206d 367 INFO("No more files to send.")
defrost 5:57b06b4b47c6 368 }
epgmdm 12:d9b13f31206d 369 }
epgmdm 12:d9b13f31206d 370 if (flagSendFileName) {
epgmdm 12:d9b13f31206d 371 flagSendFileName = 0;
epgmdm 12:d9b13f31206d 372 sendFileName();
defrost 5:57b06b4b47c6 373
epgmdm 12:d9b13f31206d 374 }
epgmdm 12:d9b13f31206d 375 if (flagSendFileSize) {
epgmdm 12:d9b13f31206d 376 flagSendFileSize = 0;
epgmdm 12:d9b13f31206d 377 sendFileSize();
epgmdm 12:d9b13f31206d 378 }
epgmdm 12:d9b13f31206d 379 if (flagSendFile) {
epgmdm 12:d9b13f31206d 380 flagSendFile = 0;
epgmdm 12:d9b13f31206d 381 sendFile();
defrost 5:57b06b4b47c6 382 }
epgmdm 12:d9b13f31206d 383 if (flagSendFileDone) {
epgmdm 12:d9b13f31206d 384 flagSendFileDone = 0;
epgmdm 12:d9b13f31206d 385 sendFileDone();
epgmdm 12:d9b13f31206d 386 INFO("File sent <%s>",txFileName);
epgmdm 12:d9b13f31206d 387 flag = &flagNextFile;
epgmdm 12:d9b13f31206d 388 delay->detach();
epgmdm 12:d9b13f31206d 389 delay->attach(this, &Battery::setFlag, 2.5);
epgmdm 12:d9b13f31206d 390 }
epgmdm 12:d9b13f31206d 391
defrost 5:57b06b4b47c6 392 }
defrost 5:57b06b4b47c6 393
defrost 5:57b06b4b47c6 394 /**
defrost 5:57b06b4b47c6 395 * sends a request for time update.
defrost 5:57b06b4b47c6 396 */
epgmdm 12:d9b13f31206d 397 void Battery::requestTime() {
defrost 5:57b06b4b47c6 398 DBG("getTime");
defrost 5:57b06b4b47c6 399 nrf->transmitData("T ",2);
defrost 5:57b06b4b47c6 400 }
epgmdm 12:d9b13f31206d 401
epgmdm 12:d9b13f31206d 402 /**
epgmdm 12:d9b13f31206d 403 * sends a request for time update.
epgmdm 12:d9b13f31206d 404 */
epgmdm 12:d9b13f31206d 405 void Battery::requestMaxCharge() {
epgmdm 12:d9b13f31206d 406 DBG("getTime");
epgmdm 12:d9b13f31206d 407 nrf->transmitData("M ",2);
epgmdm 12:d9b13f31206d 408 }
defrost 5:57b06b4b47c6 409 /**
defrost 5:57b06b4b47c6 410 * Selects the next file to transmit
defrost 5:57b06b4b47c6 411 * Uses /sd/lastFileTx.txt to store the lst file transmitted
defrost 5:57b06b4b47c6 412 */
defrost 5:57b06b4b47c6 413 void Battery::nextFileToTx() {
defrost 5:57b06b4b47c6 414
defrost 5:57b06b4b47c6 415 DBG("> nextTxFile");
defrost 5:57b06b4b47c6 416
defrost 5:57b06b4b47c6 417 char lastFileName[64];
defrost 5:57b06b4b47c6 418 char fileName[64];
defrost 5:57b06b4b47c6 419 char fn[40];
defrost 5:57b06b4b47c6 420 unsigned int txLength;
defrost 5:57b06b4b47c6 421
defrost 5:57b06b4b47c6 422 sdBuffPnt=0;// Tells sendFile to read from SD the first time.
defrost 5:57b06b4b47c6 423 fileLength = 0;
defrost 5:57b06b4b47c6 424 strcpy(txFileName, "");
defrost 5:57b06b4b47c6 425 spiSD();
defrost 5:57b06b4b47c6 426 // Read in last file name
defrost 5:57b06b4b47c6 427 FILE *fp = fopen("/sd/lastFileTx.txt", "r");
defrost 5:57b06b4b47c6 428 if (fp != NULL) {
defrost 5:57b06b4b47c6 429 if (fscanf(fp, "%s %u", lastFileName, &txLength) != 2) {
defrost 5:57b06b4b47c6 430 sprintf(lastFileName, "a");
defrost 5:57b06b4b47c6 431 }
defrost 5:57b06b4b47c6 432 fclose(fp);
defrost 5:57b06b4b47c6 433 } else {
defrost 5:57b06b4b47c6 434 sprintf(lastFileName, "a");
defrost 5:57b06b4b47c6 435 }
defrost 5:57b06b4b47c6 436 DBG("nextFileToTx>Last Filename=%s len=%u",lastFileName,txLength);
defrost 5:57b06b4b47c6 437 // Open directory and read files
defrost 5:57b06b4b47c6 438 DIR *dp;
defrost 5:57b06b4b47c6 439 struct dirent *dirp;
defrost 5:57b06b4b47c6 440 spiSD();
defrost 5:57b06b4b47c6 441 dp = opendir(logDir);
defrost 5:57b06b4b47c6 442 if (dp == NULL) {
defrost 5:57b06b4b47c6 443 DBG("nextTxFile logdir %s is NULL", logDir);
defrost 5:57b06b4b47c6 444 } else
defrost 5:57b06b4b47c6 445 //read all directory and file names in current directory into filename vector
defrost 5:57b06b4b47c6 446 while ((dirp = readdir(dp)) != NULL) {
defrost 5:57b06b4b47c6 447 DBG("nextFileToTx> WHILE lst [%s] dir [%s] %d",lastFileName, dirp->d_name,strcmp(lastFileName, dirp->d_name));
defrost 5:57b06b4b47c6 448
defrost 5:57b06b4b47c6 449 if (strcmp(lastFileName, dirp->d_name) < 0) {
defrost 5:57b06b4b47c6 450 strcpy(fileName, dirp->d_name);
defrost 5:57b06b4b47c6 451 sprintf(txFileName, "%s/%s", logDir, dirp->d_name);
defrost 5:57b06b4b47c6 452 fp = fopen(txFileName, "r");
defrost 5:57b06b4b47c6 453 fseek(fp, 0L, SEEK_END);
defrost 5:57b06b4b47c6 454 fileLength = ftell(fp);
defrost 5:57b06b4b47c6 455 fclose(fp);
defrost 5:57b06b4b47c6 456 DBG("CHOSEN %s old %s ", fileName, lastFileName );
defrost 5:57b06b4b47c6 457 break;
defrost 5:57b06b4b47c6 458 }
defrost 5:57b06b4b47c6 459 if (strcmp(lastFileName, dirp->d_name) == 0) {
defrost 5:57b06b4b47c6 460
defrost 5:57b06b4b47c6 461 strcpy(fileName, dirp->d_name);
defrost 5:57b06b4b47c6 462 sprintf(fn, "%s/%s", logDir, dirp->d_name);
defrost 5:57b06b4b47c6 463 fp = fopen(fn, "r");
defrost 5:57b06b4b47c6 464 fseek(fp, 0L, SEEK_END);
defrost 5:57b06b4b47c6 465 fileLength = ftell(fp);
defrost 5:57b06b4b47c6 466 fclose(fp);
defrost 5:57b06b4b47c6 467 if (txLength < fileLength) {
defrost 5:57b06b4b47c6 468 sprintf(txFileName, "%s/%s", logDir, dirp->d_name);
defrost 5:57b06b4b47c6 469 DBG("More to send is %s old %u new %u ", fileName, txLength,fileLength );
defrost 5:57b06b4b47c6 470 break;
defrost 5:57b06b4b47c6 471 }
defrost 5:57b06b4b47c6 472 }
defrost 5:57b06b4b47c6 473 // test filename and if greater than last read then choose.
defrost 5:57b06b4b47c6 474 }
defrost 5:57b06b4b47c6 475 closedir(dp);
defrost 5:57b06b4b47c6 476 if (strlen(txFileName) > 0) {
defrost 5:57b06b4b47c6 477 strcpy(txFileName, fileName);
defrost 5:57b06b4b47c6 478 sprintf(fullTxFilePath, "%s/%s", logDir, txFileName);
defrost 5:57b06b4b47c6 479 fileLeft = fileLength;
defrost 5:57b06b4b47c6 480
defrost 5:57b06b4b47c6 481 } else {
defrost 5:57b06b4b47c6 482 fileLength =0;
defrost 5:57b06b4b47c6 483 }
defrost 5:57b06b4b47c6 484 DBG("nextTxFile> Next is [%s] length %d", txFileName, fileLength);
defrost 5:57b06b4b47c6 485
defrost 5:57b06b4b47c6 486 }
defrost 5:57b06b4b47c6 487 /**
defrost 5:57b06b4b47c6 488 * Sends the directory name, allows the otherside to create.
defrost 5:57b06b4b47c6 489 */
defrost 5:57b06b4b47c6 490
defrost 5:57b06b4b47c6 491 void Battery::sendDirName() {
defrost 5:57b06b4b47c6 492 sprintf(dataTx, "D %s", logDir);
defrost 5:57b06b4b47c6 493
defrost 5:57b06b4b47c6 494 DBG("send Dir Name [%s].\n\r", dataTx);
defrost 5:57b06b4b47c6 495
epgmdm 11:87ab310924f0 496 spiNRF();
defrost 5:57b06b4b47c6 497 nrf->transmitData(dataTx, strlen(dataTx));
defrost 5:57b06b4b47c6 498
defrost 5:57b06b4b47c6 499 }
defrost 5:57b06b4b47c6 500 /**
defrost 5:57b06b4b47c6 501 * Sends the file name, if fileLength >0
defrost 5:57b06b4b47c6 502 */
defrost 5:57b06b4b47c6 503
defrost 5:57b06b4b47c6 504 void Battery::sendFileName() {
defrost 5:57b06b4b47c6 505 // delay->detach();
defrost 5:57b06b4b47c6 506 if (fileLength < 1) {
defrost 5:57b06b4b47c6 507 return;
defrost 5:57b06b4b47c6 508 }
defrost 5:57b06b4b47c6 509 sprintf(dataTx, "F %20s", txFileName);
defrost 5:57b06b4b47c6 510
defrost 5:57b06b4b47c6 511 DBG("send File Name [%s] \n\r", dataTx);
defrost 5:57b06b4b47c6 512
epgmdm 11:87ab310924f0 513 spiNRF();
defrost 5:57b06b4b47c6 514 nrf->transmitData(dataTx, strlen(dataTx));
defrost 5:57b06b4b47c6 515 }
defrost 5:57b06b4b47c6 516
defrost 5:57b06b4b47c6 517 /**
defrost 5:57b06b4b47c6 518 * Sends the file length to the locker - this is also the cue that the following bytes are the file.
defrost 5:57b06b4b47c6 519 */
defrost 5:57b06b4b47c6 520 void Battery::sendFileSize() {
defrost 5:57b06b4b47c6 521 if (fileLength < 1) {
defrost 5:57b06b4b47c6 522 return;
defrost 5:57b06b4b47c6 523 }
epgmdm 12:d9b13f31206d 524 sendingFile=1;
defrost 5:57b06b4b47c6 525 filePointer = 0;
defrost 5:57b06b4b47c6 526 sprintf(dataTx, "S %X", fileLength);
defrost 5:57b06b4b47c6 527
defrost 5:57b06b4b47c6 528
defrost 5:57b06b4b47c6 529 DBG("send File size [%s]", dataTx);
defrost 5:57b06b4b47c6 530
epgmdm 11:87ab310924f0 531 spiNRF();
defrost 5:57b06b4b47c6 532 nrf->transmitData(dataTx, strlen(dataTx));
defrost 5:57b06b4b47c6 533 }
defrost 5:57b06b4b47c6 534
defrost 5:57b06b4b47c6 535 /**
defrost 5:57b06b4b47c6 536 * Sends the file length to the locker - this is also the cue that the following bytes are the file.
defrost 5:57b06b4b47c6 537 */
defrost 5:57b06b4b47c6 538 void Battery::sendFile() {
defrost 5:57b06b4b47c6 539
defrost 5:57b06b4b47c6 540 // printf("send File [%s] at %d %d\n\r",fullTxFilePath,fileLength, fileLeft );
defrost 5:57b06b4b47c6 541
epgmdm 11:87ab310924f0 542 // if (fileLength < 1) {
epgmdm 11:87ab310924f0 543 // INFO("File Sent");
epgmdm 11:87ab310924f0 544 // sdBuffPnt=0;
epgmdm 11:87ab310924f0 545 // return;
epgmdm 11:87ab310924f0 546 // }
defrost 5:57b06b4b47c6 547 if (sdBuffPnt>=SDBUFFERSIZE){
defrost 5:57b06b4b47c6 548 sdBuffPnt=0;
defrost 5:57b06b4b47c6 549 }
defrost 5:57b06b4b47c6 550 if (sdBuffPnt == 0) {
defrost 5:57b06b4b47c6 551 spiSD();
defrost 5:57b06b4b47c6 552 FILE *fp = fopen(fullTxFilePath, "rb");
defrost 5:57b06b4b47c6 553 if (fp == NULL) {
epgmdm 11:87ab310924f0 554 spiNRF();
defrost 5:57b06b4b47c6 555 INFO("sendFile> File %s not found for reading",fullTxFilePath);
defrost 5:57b06b4b47c6 556 return;
defrost 5:57b06b4b47c6 557 }
defrost 5:57b06b4b47c6 558 spiSD();
defrost 5:57b06b4b47c6 559 fseek(fp, fileLength - fileLeft, SEEK_SET);
defrost 5:57b06b4b47c6 560 sizeRead = fread(sdBuffer, 1,SDBUFFERSIZE, fp);
defrost 5:57b06b4b47c6 561 fileLeft -= sizeRead;
defrost 5:57b06b4b47c6 562 fclose(fp);
defrost 5:57b06b4b47c6 563 // printf("File %s %d \n\r",fullTxFilePath,sizeRead);
epgmdm 11:87ab310924f0 564 spiNRF();
defrost 5:57b06b4b47c6 565
defrost 5:57b06b4b47c6 566 }
defrost 5:57b06b4b47c6 567
defrost 5:57b06b4b47c6 568 if ((count++) % 256 ==0) {
defrost 5:57b06b4b47c6 569 DBG("W %d %d", fileLeft, sizeRead);
defrost 5:57b06b4b47c6 570 }
defrost 5:57b06b4b47c6 571 int size=32;
defrost 5:57b06b4b47c6 572 if (sizeRead<32){
defrost 5:57b06b4b47c6 573 size=sizeRead;
defrost 5:57b06b4b47c6 574 }
defrost 5:57b06b4b47c6 575 if ((fileLeft==0)&&(sizeRead==0)){
defrost 5:57b06b4b47c6 576 sdBuffPnt=0;
defrost 5:57b06b4b47c6 577 flagSendFileDone=1;
defrost 5:57b06b4b47c6 578 DBG("Done sending");
defrost 5:57b06b4b47c6 579 }else{
defrost 5:57b06b4b47c6 580 sizeRead -= size;
defrost 5:57b06b4b47c6 581 nrf->transmitData(&(sdBuffer[sdBuffPnt]), size);
defrost 5:57b06b4b47c6 582 sdBuffPnt+=size;
defrost 5:57b06b4b47c6 583 }
defrost 5:57b06b4b47c6 584
defrost 5:57b06b4b47c6 585
defrost 5:57b06b4b47c6 586 }
defrost 5:57b06b4b47c6 587
defrost 5:57b06b4b47c6 588 /**
defrost 5:57b06b4b47c6 589 * Update the last file sent file
defrost 5:57b06b4b47c6 590 */
defrost 5:57b06b4b47c6 591 void Battery::sendFileDone() {
defrost 5:57b06b4b47c6 592 if (strlen(txFileName)>0){
defrost 5:57b06b4b47c6 593 spiSD();
defrost 5:57b06b4b47c6 594 FILE *fp = fopen("/sd/lastFileTx.txt", "w");
defrost 5:57b06b4b47c6 595 if (fp != NULL) {
defrost 5:57b06b4b47c6 596 fprintf(fp, "%s %u \n", txFileName, fileLength);
defrost 5:57b06b4b47c6 597 fclose(fp);
defrost 5:57b06b4b47c6 598 DBG("sendFileDone> updated lastFileTx.txt %s %u ", txFileName, fileLength);
defrost 5:57b06b4b47c6 599 }else{
defrost 5:57b06b4b47c6 600 INFO("sendFileDone> Cannot update file lastFiletx.txt");
defrost 5:57b06b4b47c6 601 }
epgmdm 11:87ab310924f0 602 spiNRF();
defrost 5:57b06b4b47c6 603
defrost 5:57b06b4b47c6 604 }
defrost 5:57b06b4b47c6 605
defrost 5:57b06b4b47c6 606 }
defrost 5:57b06b4b47c6 607
defrost 5:57b06b4b47c6 608 /**
defrost 5:57b06b4b47c6 609 * Sets the value pointed to by flag to 1.
defrost 5:57b06b4b47c6 610 */
defrost 5:57b06b4b47c6 611 void Battery::setFlag() {
defrost 5:57b06b4b47c6 612 if (flag != NULL) {
defrost 5:57b06b4b47c6 613 *flag = 1;
defrost 5:57b06b4b47c6 614 }
defrost 5:57b06b4b47c6 615 flag = NULL;
defrost 5:57b06b4b47c6 616 }
epgmdm 12:d9b13f31206d 617
epgmdm 12:d9b13f31206d 618
epgmdm 12:d9b13f31206d 619 /**
epgmdm 12:d9b13f31206d 620 * Returns the max current that can be drawn from the system, in amps
epgmdm 12:d9b13f31206d 621 */
epgmdm 12:d9b13f31206d 622
epgmdm 12:d9b13f31206d 623 float Battery::getMaxCurrent(){
epgmdm 12:d9b13f31206d 624 return maxChargeRate;
epgmdm 12:d9b13f31206d 625 }
epgmdm 12:d9b13f31206d 626
epgmdm 12:d9b13f31206d 627 /**
epgmdm 12:d9b13f31206d 628 * returns a string of the log directory
epgmdm 12:d9b13f31206d 629 */
epgmdm 12:d9b13f31206d 630 char* Battery::getLogDirectory(){
epgmdm 12:d9b13f31206d 631
epgmdm 12:d9b13f31206d 632 return logDir;
epgmdm 12:d9b13f31206d 633 }