The field version of the solarnano grid on the ionQubes

Fork of SolarNanoGridv3 by SONG Project

Committer:
defrost
Date:
Tue Sep 06 06:08:56 2016 +0000
Revision:
36:a5620262f296
Parent:
35:ede6d8bad011
Turned off the charge rate update from hub

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 18:be77ad141fac 37 Battery::Battery(FILE* fp, Serial *pc) : SolarNanoGrid(fp,pc)
epgmdm 18:be77ad141fac 38 {
defrost 5:57b06b4b47c6 39 DBG("Initialize class");
adrienBiz 8:0acda4f2e0a8 40 // ***** Variable initialisation *****
adrienBiz 8:0acda4f2e0a8 41 // Public variable initialisation
epgmdm 11:87ab310924f0 42
defrost 35:ede6d8bad011 43 maxChargeRate=1.5; // Charge rate in amps
epgmdm 11:87ab310924f0 44
adrienBiz 8:0acda4f2e0a8 45 // Protected variables initialisation
adrienBiz 8:0acda4f2e0a8 46 count=0;
adrienBiz 8:0acda4f2e0a8 47 sizeRead=0;
adrienBiz 8:0acda4f2e0a8 48 fileLength=0;
adrienBiz 8:0acda4f2e0a8 49 filePointer=0;
adrienBiz 8:0acda4f2e0a8 50 fileLeft=0;
epgmdm 11:87ab310924f0 51
adrienBiz 8:0acda4f2e0a8 52 sdBuffPnt=0;
adrienBiz 8:0acda4f2e0a8 53 /**
adrienBiz 8:0acda4f2e0a8 54 * Open channel address of the locker
adrienBiz 8:0acda4f2e0a8 55 */
adrienBiz 8:0acda4f2e0a8 56 openAddr=0;
adrienBiz 8:0acda4f2e0a8 57
adrienBiz 8:0acda4f2e0a8 58 /**
adrienBiz 8:0acda4f2e0a8 59 * Private channel address of the locker
adrienBiz 8:0acda4f2e0a8 60 */
adrienBiz 8:0acda4f2e0a8 61 privateAddr=0;
adrienBiz 8:0acda4f2e0a8 62
adrienBiz 8:0acda4f2e0a8 63 countSD=0;
adrienBiz 8:0acda4f2e0a8 64
adrienBiz 8:0acda4f2e0a8 65 // Protected flags: *
adrienBiz 8:0acda4f2e0a8 66 checkedIn=0;
epgmdm 18:be77ad141fac 67 flagDirFileName=0;
adrienBiz 8:0acda4f2e0a8 68 flagGetTime=0;
adrienBiz 8:0acda4f2e0a8 69 flagNextFile=0;
adrienBiz 8:0acda4f2e0a8 70 flagSendFileName=0;
adrienBiz 8:0acda4f2e0a8 71 flagSendFileSize=0;
adrienBiz 8:0acda4f2e0a8 72 flagSendFile=0;
adrienBiz 8:0acda4f2e0a8 73 flagSendFileDone=0;
epgmdm 12:d9b13f31206d 74 flagGetMaxCharge=0;
epgmdm 12:d9b13f31206d 75 sendingFile=0;
epgmdm 18:be77ad141fac 76 flagStartFileTx=0;
defrost 17:dc19b3b39790 77 startCharge = false;
epgmdm 18:be77ad141fac 78 flagHubNotReady=0;
epgmdm 18:be77ad141fac 79 flagCheckOut=0;
defrost 28:e85a86fc8b59 80 sending=0;
adrienBiz 8:0acda4f2e0a8 81 // Protected interrupts
adrienBiz 8:0acda4f2e0a8 82 button=NULL;
adrienBiz 8:0acda4f2e0a8 83 txWatch=NULL;
adrienBiz 8:0acda4f2e0a8 84 delay=NULL;
epgmdm 11:87ab310924f0 85
adrienBiz 8:0acda4f2e0a8 86 //Private variables initialisation
adrienBiz 8:0acda4f2e0a8 87 maxRT=false;
epgmdm 11:87ab310924f0 88
adrienBiz 8:0acda4f2e0a8 89 // ***** End of variables initialisation *****
epgmdm 11:87ab310924f0 90
epgmdm 11:87ab310924f0 91 // No other information needed from the config file
epgmdm 11:87ab310924f0 92 fclose(fp);
epgmdm 11:87ab310924f0 93 //
epgmdm 11:87ab310924f0 94 // Setup variables
epgmdm 11:87ab310924f0 95 //
epgmdm 11:87ab310924f0 96 txFileName = (char*) calloc(80, 1);
epgmdm 11:87ab310924f0 97 fullTxFilePath = (char*) calloc(80, 1);
epgmdm 11:87ab310924f0 98 logDir = (char*) calloc(20, 1);
epgmdm 11:87ab310924f0 99 sdBuffer = (char*) calloc(SDBUFFERSIZE, 1);
epgmdm 11:87ab310924f0 100
epgmdm 11:87ab310924f0 101
epgmdm 11:87ab310924f0 102
epgmdm 11:87ab310924f0 103
defrost 5:57b06b4b47c6 104 //
defrost 5:57b06b4b47c6 105 // Setup NRF
defrost 5:57b06b4b47c6 106 //
defrost 5:57b06b4b47c6 107 privateAddr = ((long long)communityID <<16)+ (id &0XFFFF);
defrost 5:57b06b4b47c6 108 openAddr = privateAddr & 0xFFFFFFFF00;
defrost 5:57b06b4b47c6 109
defrost 5:57b06b4b47c6 110 DBG("Channel %x Address %llx Address Locker %llx", chan, privateAddr, openAddr);
defrost 5:57b06b4b47c6 111
epgmdm 11:87ab310924f0 112 spiNRF();
defrost 5:57b06b4b47c6 113 nrf->quickTxSetup(chan, openAddr);
defrost 5:57b06b4b47c6 114 nrf->setRadio(0x01, 0x03); // 2MB/S 0dB
defrost 5:57b06b4b47c6 115 nrf->setTxRetry(0x0F, 0x0F);
defrost 5:57b06b4b47c6 116 nrfFlush();
defrost 5:57b06b4b47c6 117 DBG("Nrf Details:");
defrost 5:57b06b4b47c6 118 #ifdef DEBUG
defrost 5:57b06b4b47c6 119 nrf->printDetails();
defrost 5:57b06b4b47c6 120 #endif
defrost 5:57b06b4b47c6 121 //
defrost 5:57b06b4b47c6 122 // Setup logging directories
defrost 5:57b06b4b47c6 123 //
defrost 5:57b06b4b47c6 124 sprintf(logDir, "/sd/data/%02X%04X", (communityID&0XFF),(id&0XFFFF));
defrost 5:57b06b4b47c6 125 DBG(" Log directory %s", logDir);
defrost 5:57b06b4b47c6 126 spiSD();
defrost 5:57b06b4b47c6 127 mkdir("/sd/data", 777);
defrost 5:57b06b4b47c6 128 mkdir(logDir, 777);
defrost 5:57b06b4b47c6 129 DBG(" made");
defrost 5:57b06b4b47c6 130 //
defrost 5:57b06b4b47c6 131 // Setup interrupts
defrost 5:57b06b4b47c6 132 //
defrost 5:57b06b4b47c6 133 button = new InterruptIn(SW2);
defrost 5:57b06b4b47c6 134 button->fall(this, &Battery::intButton);
defrost 5:57b06b4b47c6 135
defrost 5:57b06b4b47c6 136 nrfInt = new InterruptIn(PTC18);
defrost 5:57b06b4b47c6 137 nrfInt->fall(this, &Battery::intNrf); // attach nrf interrupt.
defrost 5:57b06b4b47c6 138
defrost 5:57b06b4b47c6 139 txWatch = new Ticker ();
defrost 5:57b06b4b47c6 140 txWatch->attach(this,&Battery::retransmit,10.01);
defrost 5:57b06b4b47c6 141
defrost 5:57b06b4b47c6 142 delay = new Timeout();
defrost 5:57b06b4b47c6 143
defrost 5:57b06b4b47c6 144 loop();
defrost 5:57b06b4b47c6 145 }
defrost 5:57b06b4b47c6 146
defrost 5:57b06b4b47c6 147 // ------------------------------------------------------------------------
defrost 5:57b06b4b47c6 148 // Interrupt routines
defrost 5:57b06b4b47c6 149 // ------------------------------------------------------------------------
defrost 5:57b06b4b47c6 150
defrost 5:57b06b4b47c6 151 /**
defrost 5:57b06b4b47c6 152 * When the button is pressed transmit something
defrost 5:57b06b4b47c6 153 */
epgmdm 18:be77ad141fac 154 void Battery::intButton()
epgmdm 18:be77ad141fac 155 {
epgmdm 18:be77ad141fac 156 if (!maxRT) {
defrost 5:57b06b4b47c6 157 *ce = 1;
epgmdm 18:be77ad141fac 158 if(checkedIn==0) {
defrost 5:57b06b4b47c6 159 checkIn();
epgmdm 18:be77ad141fac 160 } else {
defrost 5:57b06b4b47c6 161 flagNextFile = 1;
defrost 5:57b06b4b47c6 162 }
defrost 5:57b06b4b47c6 163
defrost 5:57b06b4b47c6 164 }
defrost 5:57b06b4b47c6 165 }
defrost 5:57b06b4b47c6 166
defrost 5:57b06b4b47c6 167 /**
defrost 5:57b06b4b47c6 168 * Called when the nrf creates an interrupt.
defrost 5:57b06b4b47c6 169 *
defrost 5:57b06b4b47c6 170 */
epgmdm 18:be77ad141fac 171 void Battery::intNrf()
epgmdm 18:be77ad141fac 172 {
defrost 5:57b06b4b47c6 173 // DBG("NRF Interrupt Started.");
defrost 5:57b06b4b47c6 174 int pipe=0;
defrost 5:57b06b4b47c6 175 int status=0;
defrost 5:57b06b4b47c6 176 int width=0;
defrost 5:57b06b4b47c6 177
defrost 28:e85a86fc8b59 178 //INFO("intNrf");
defrost 28:e85a86fc8b59 179
defrost 5:57b06b4b47c6 180 //
defrost 5:57b06b4b47c6 181 //Get status and pipe
defrost 5:57b06b4b47c6 182 //
epgmdm 11:87ab310924f0 183 spiNRF();
defrost 5:57b06b4b47c6 184 status = nrf->checkStatus();
defrost 5:57b06b4b47c6 185 pipe = (status >> 1);
defrost 5:57b06b4b47c6 186 pipe = (pipe & 0x0007);
defrost 5:57b06b4b47c6 187
defrost 5:57b06b4b47c6 188 //
defrost 5:57b06b4b47c6 189 // Check if max RT is reached
defrost 5:57b06b4b47c6 190 //
defrost 29:bbdbe1094a63 191 /*if (((status >>MAX_RT)& 01) ==1) {
epgmdm 18:be77ad141fac 192 if (flagStartFileTx==1) { // Locker not ready to reacieve - wait 25s.
epgmdm 18:be77ad141fac 193 flagHubNotReady = 1;
epgmdm 18:be77ad141fac 194 nrf->clearStatus();
epgmdm 18:be77ad141fac 195 flag = &flagDirFileName;
epgmdm 18:be77ad141fac 196 delay->detach();
epgmdm 18:be77ad141fac 197 delay->attach(this, &Battery::setFlag, 25.0f);
epgmdm 18:be77ad141fac 198 } else {
epgmdm 18:be77ad141fac 199 maxRT=true;
epgmdm 18:be77ad141fac 200 DBG("MAX RT flag is set. PTB20= %d status=%x",(unsigned int) *ce,status);
epgmdm 18:be77ad141fac 201 *ce = 0;
epgmdm 18:be77ad141fac 202 DBG("PTB20= %d status=%x",(unsigned int) *ce,status);
epgmdm 18:be77ad141fac 203 nrf->clearStatus();
epgmdm 18:be77ad141fac 204 *ledRed=0;
epgmdm 18:be77ad141fac 205 }
defrost 29:bbdbe1094a63 206 }*/
defrost 5:57b06b4b47c6 207
defrost 5:57b06b4b47c6 208 //
defrost 5:57b06b4b47c6 209 // Check if data received
defrost 5:57b06b4b47c6 210 //
defrost 5:57b06b4b47c6 211 if (((status >>RX_DR)& 01) ==1) { // Received a packet
defrost 5:57b06b4b47c6 212 width= nrf->getRxData(dataRx);
defrost 5:57b06b4b47c6 213 dataRx[width]='\0';
epgmdm 18:be77ad141fac 214 if (dataRx[0]!='S') {
defrost 5:57b06b4b47c6 215 DBG("intNrf>D[p=%1d]=<%2s> ",pipe,dataRx);
defrost 5:57b06b4b47c6 216 }
defrost 5:57b06b4b47c6 217 maxRT=false;
epgmdm 18:be77ad141fac 218 flagHubNotReady = 0;
defrost 5:57b06b4b47c6 219 *ce = 1;
defrost 5:57b06b4b47c6 220 nrf->clearStatus();
defrost 5:57b06b4b47c6 221 switch (dataRx[0]) {
epgmdm 18:be77ad141fac 222 case ('C'): {
epgmdm 18:be77ad141fac 223 doCheckIn();
epgmdm 18:be77ad141fac 224 flagNextFile = 1;
epgmdm 18:be77ad141fac 225 DBG("Flag Set");
epgmdm 18:be77ad141fac 226 break;
epgmdm 18:be77ad141fac 227 }
epgmdm 18:be77ad141fac 228 case ('D'): {
epgmdm 18:be77ad141fac 229 flagStartFileTx=0; // Hub commmunicating.
epgmdm 18:be77ad141fac 230 flag = &flagSendFileName;
epgmdm 18:be77ad141fac 231 delay->detach();
epgmdm 18:be77ad141fac 232 delay->attach(this, &Battery::setFlag, 1.5);
epgmdm 18:be77ad141fac 233 break;
epgmdm 18:be77ad141fac 234 }
epgmdm 18:be77ad141fac 235 case ('F'): {
epgmdm 18:be77ad141fac 236 flag = &flagSendFileSize;
epgmdm 18:be77ad141fac 237 countSD = 0;
epgmdm 18:be77ad141fac 238 delay->detach();
epgmdm 18:be77ad141fac 239 delay->attach(this, &Battery::setFlag, 1.50);
epgmdm 18:be77ad141fac 240 break;
epgmdm 18:be77ad141fac 241 }
epgmdm 18:be77ad141fac 242 case ('O'): {
epgmdm 18:be77ad141fac 243 doCheckOut();
epgmdm 18:be77ad141fac 244 break;
epgmdm 18:be77ad141fac 245 }
epgmdm 18:be77ad141fac 246 case ('S'): {
epgmdm 18:be77ad141fac 247 flag = &flagSendFile;
defrost 28:e85a86fc8b59 248
epgmdm 18:be77ad141fac 249 delay->detach();
epgmdm 18:be77ad141fac 250 // printf("%d\n\r",countSD%16);
epgmdm 18:be77ad141fac 251 //delay->attach(this, &Battery::setFlag, 0.05);
defrost 5:57b06b4b47c6 252
epgmdm 30:47f73b850a5e 253 if (countSD % (SDBUFFERSIZE/32) == 0) {
epgmdm 18:be77ad141fac 254 delay->attach(this, &Battery::setFlag, 1.5); // wait to write to SD card
epgmdm 18:be77ad141fac 255 } else {
defrost 28:e85a86fc8b59 256 delay->attach_us(this, &Battery::setFlag, 800); // was 800
epgmdm 18:be77ad141fac 257 }
epgmdm 18:be77ad141fac 258 countSD++;
epgmdm 18:be77ad141fac 259 break;
defrost 5:57b06b4b47c6 260 }
epgmdm 18:be77ad141fac 261 case ('T'): {
epgmdm 18:be77ad141fac 262 time_t now;
epgmdm 18:be77ad141fac 263 sscanf (&dataRx[2],"%x",&now );
epgmdm 18:be77ad141fac 264 set_time(now);
epgmdm 18:be77ad141fac 265 now= time(NULL);
epgmdm 18:be77ad141fac 266 struct tm * timeInf = localtime(&now);
defrost 25:1979c129acb0 267 DBG ("Time is now: %04d-%02d-%02d %02d:%02d:%02d",timeInf->tm_year+1900,timeInf->tm_mon+1,timeInf->tm_mday,timeInf->tm_hour, timeInf->tm_min,timeInf->tm_sec);
defrost 5:57b06b4b47c6 268
epgmdm 18:be77ad141fac 269 break;
epgmdm 18:be77ad141fac 270 }
defrost 5:57b06b4b47c6 271
epgmdm 12:d9b13f31206d 272
epgmdm 18:be77ad141fac 273 case ('M'): {
defrost 36:a5620262f296 274 #ifdef USEHUBCHARGERATE
defrost 36:a5620262f296 275 sscanf (&dataRx[2],"%f",&maxChargeRate );
defrost 36:a5620262f296 276 if(maxChargeRate>2.0f) {
defrost 36:a5620262f296 277 maxChargeRate=2.0f;
defrost 36:a5620262f296 278 }
defrost 36:a5620262f296 279 if (maxChargeRate<0.0f) {
defrost 36:a5620262f296 280 maxChargeRate=0.0f;
defrost 36:a5620262f296 281 }
defrost 36:a5620262f296 282 DBG ("Max charge %f",maxChargeRate);
defrost 36:a5620262f296 283 #else
defrost 36:a5620262f296 284 DBG("Max charge rate being ignored...");
defrost 36:a5620262f296 285 #endif
epgmdm 18:be77ad141fac 286 break;
epgmdm 12:d9b13f31206d 287 }
defrost 5:57b06b4b47c6 288 }
epgmdm 12:d9b13f31206d 289
defrost 5:57b06b4b47c6 290 }
epgmdm 12:d9b13f31206d 291
defrost 5:57b06b4b47c6 292 if (((status >>TX_DS)& 01) ==1) {
defrost 5:57b06b4b47c6 293 // maxRT=false;
defrost 5:57b06b4b47c6 294 nrf->flushTx();
defrost 5:57b06b4b47c6 295 nrf->flushRx();
defrost 5:57b06b4b47c6 296 //DBG(" TX_DS");
defrost 5:57b06b4b47c6 297 }
defrost 5:57b06b4b47c6 298
defrost 5:57b06b4b47c6 299 *ledBlue = !*ledBlue;
defrost 5:57b06b4b47c6 300 *ledRed = !maxRT;
defrost 5:57b06b4b47c6 301 }
defrost 5:57b06b4b47c6 302
defrost 5:57b06b4b47c6 303 /**
defrost 5:57b06b4b47c6 304 * Transmits the data and sets up a call back to check data sent 30s later.
defrost 5:57b06b4b47c6 305 */
defrost 5:57b06b4b47c6 306
defrost 5:57b06b4b47c6 307 /**
defrost 5:57b06b4b47c6 308 * Checks to see if transmit failed and then retransmit
defrost 5:57b06b4b47c6 309 *
defrost 5:57b06b4b47c6 310 */
epgmdm 18:be77ad141fac 311 void Battery::retransmit()
epgmdm 18:be77ad141fac 312 {
defrost 5:57b06b4b47c6 313
defrost 5:57b06b4b47c6 314 if (maxRT) {
defrost 5:57b06b4b47c6 315 DBG("Retransmit");
defrost 5:57b06b4b47c6 316 *ledRed=1;
defrost 5:57b06b4b47c6 317 *ce = 1;
defrost 5:57b06b4b47c6 318 maxRT=false;
defrost 5:57b06b4b47c6 319 nrf->clearStatus();
defrost 5:57b06b4b47c6 320 nrf->flushRx();
defrost 5:57b06b4b47c6 321 nrf->retransmitData();
defrost 5:57b06b4b47c6 322 }
epgmdm 18:be77ad141fac 323 if ((!sendingFile)&&(checkedIn == 1)) {
epgmdm 12:d9b13f31206d 324 flagGetTime=1;
epgmdm 12:d9b13f31206d 325 flagGetMaxCharge=1;
epgmdm 12:d9b13f31206d 326 }
defrost 5:57b06b4b47c6 327 }
defrost 5:57b06b4b47c6 328
defrost 5:57b06b4b47c6 329 // ------------------------------------------------------------------------
defrost 5:57b06b4b47c6 330 // Main routines
defrost 5:57b06b4b47c6 331 // ------------------------------------------------------------------------
defrost 5:57b06b4b47c6 332
defrost 5:57b06b4b47c6 333 /**
defrost 5:57b06b4b47c6 334 * Checks in the Battery to the locker
defrost 5:57b06b4b47c6 335 * Transmits "C ID"
defrost 5:57b06b4b47c6 336 *
defrost 5:57b06b4b47c6 337 */
epgmdm 18:be77ad141fac 338 void Battery::checkIn()
epgmdm 18:be77ad141fac 339 {
defrost 5:57b06b4b47c6 340 sprintf(dataTx, "C %04X", (int) (id&0XFFFF));
defrost 5:57b06b4b47c6 341 DBG("Check into locker [%s]", dataTx);
epgmdm 11:87ab310924f0 342 spiNRF();
defrost 5:57b06b4b47c6 343 nrf->transmitData(dataTx, strlen(dataTx));
defrost 5:57b06b4b47c6 344 }
defrost 5:57b06b4b47c6 345
epgmdm 18:be77ad141fac 346
epgmdm 18:be77ad141fac 347 /**
epgmdm 18:be77ad141fac 348 * Checks out. Sends O %d, ID to locker
epgmdm 18:be77ad141fac 349 *
epgmdm 18:be77ad141fac 350 */
epgmdm 18:be77ad141fac 351 void Battery::checkOut()
epgmdm 18:be77ad141fac 352 {
epgmdm 18:be77ad141fac 353 sprintf(dataTx, "O %04X", (int) (id&0XFFFF));
epgmdm 18:be77ad141fac 354 DBG("Check out locker [%s]", dataTx);
epgmdm 18:be77ad141fac 355 spiNRF();
epgmdm 18:be77ad141fac 356 nrf->transmitData(dataTx, strlen(dataTx));
epgmdm 18:be77ad141fac 357 // Reset to locker public comms channel
epgmdm 18:be77ad141fac 358 }
epgmdm 18:be77ad141fac 359
epgmdm 18:be77ad141fac 360
defrost 5:57b06b4b47c6 361 /**
defrost 5:57b06b4b47c6 362 * Checks in the Battery to the locker
defrost 5:57b06b4b47c6 363 * Acknowledge received.
defrost 5:57b06b4b47c6 364 * Changes the TX pipe address.
defrost 5:57b06b4b47c6 365 *
defrost 5:57b06b4b47c6 366 */
epgmdm 18:be77ad141fac 367 void Battery::doCheckIn()
epgmdm 18:be77ad141fac 368 {
defrost 5:57b06b4b47c6 369 nrf->setTxAddress(privateAddr);
defrost 5:57b06b4b47c6 370 checkedIn = 1;
defrost 5:57b06b4b47c6 371 DBG("Checked into locker");
defrost 5:57b06b4b47c6 372 DBG("Nrf Details:");
defrost 5:57b06b4b47c6 373 #ifdef DEBUG
defrost 5:57b06b4b47c6 374 nrf->printDetails();
defrost 5:57b06b4b47c6 375 #endif
defrost 5:57b06b4b47c6 376 }
defrost 5:57b06b4b47c6 377 /**
defrost 5:57b06b4b47c6 378 * Checks in the Battery to the locker
defrost 5:57b06b4b47c6 379 * Acknowledge received.
defrost 5:57b06b4b47c6 380 * Changes the TX pipe address.
defrost 5:57b06b4b47c6 381 *
defrost 5:57b06b4b47c6 382 */
epgmdm 18:be77ad141fac 383 void Battery::doCheckOut()
epgmdm 18:be77ad141fac 384 {
defrost 5:57b06b4b47c6 385 nrf->setTxAddress(openAddr);
defrost 5:57b06b4b47c6 386 checkedIn = 0;
defrost 5:57b06b4b47c6 387 DBG("Checked out of locker");
defrost 5:57b06b4b47c6 388 DBG("Nrf Details:");
defrost 5:57b06b4b47c6 389 #ifdef DEBUG
defrost 5:57b06b4b47c6 390 nrf->printDetails();
defrost 5:57b06b4b47c6 391 #endif
defrost 5:57b06b4b47c6 392 }
defrost 5:57b06b4b47c6 393
defrost 5:57b06b4b47c6 394 /**
defrost 5:57b06b4b47c6 395 * Slow routines for Battery
defrost 5:57b06b4b47c6 396 */
epgmdm 18:be77ad141fac 397 void Battery::loop()
epgmdm 18:be77ad141fac 398 {
defrost 28:e85a86fc8b59 399 //INFO("In Battery Loop");
epgmdm 12:d9b13f31206d 400 *ledGreen = !checkedIn;
epgmdm 18:be77ad141fac 401
defrost 5:57b06b4b47c6 402
epgmdm 12:d9b13f31206d 403 if (flagGetTime) {
epgmdm 12:d9b13f31206d 404 flagGetTime=0;
epgmdm 12:d9b13f31206d 405 requestTime();
epgmdm 12:d9b13f31206d 406
epgmdm 12:d9b13f31206d 407 }
epgmdm 12:d9b13f31206d 408 if (flagGetMaxCharge) {
epgmdm 12:d9b13f31206d 409 flagGetMaxCharge=0;
epgmdm 12:d9b13f31206d 410 requestMaxCharge();
defrost 5:57b06b4b47c6 411
epgmdm 12:d9b13f31206d 412 }
epgmdm 12:d9b13f31206d 413 if (flagNextFile) {
epgmdm 12:d9b13f31206d 414 flagNextFile = 0;
defrost 28:e85a86fc8b59 415 sending=1;
defrost 13:de43f28c0365 416 DBG("NextFile called");
epgmdm 12:d9b13f31206d 417 requestTime();
epgmdm 12:d9b13f31206d 418 nextFileToTx();
epgmdm 18:be77ad141fac 419 if (fileLength>0) {
epgmdm 12:d9b13f31206d 420 INFO("Sending file %s.",txFileName)
epgmdm 18:be77ad141fac 421 flagDirFileName=1;
epgmdm 12:d9b13f31206d 422 } else {
epgmdm 12:d9b13f31206d 423 sendingFile=0;
epgmdm 18:be77ad141fac 424 flagStartFileTx=0;
epgmdm 12:d9b13f31206d 425 INFO("No more files to send.")
defrost 25:1979c129acb0 426 startCharge = true;
epgmdm 18:be77ad141fac 427 checkOut();
defrost 28:e85a86fc8b59 428 sending=0;
defrost 5:57b06b4b47c6 429 }
epgmdm 12:d9b13f31206d 430 }
epgmdm 18:be77ad141fac 431 if (flagDirFileName) {
epgmdm 18:be77ad141fac 432 flagDirFileName=0;
epgmdm 18:be77ad141fac 433 sendDirName();
epgmdm 18:be77ad141fac 434 }
epgmdm 12:d9b13f31206d 435 if (flagSendFileName) {
epgmdm 12:d9b13f31206d 436 flagSendFileName = 0;
epgmdm 12:d9b13f31206d 437 sendFileName();
defrost 5:57b06b4b47c6 438
epgmdm 12:d9b13f31206d 439 }
epgmdm 12:d9b13f31206d 440 if (flagSendFileSize) {
epgmdm 12:d9b13f31206d 441 flagSendFileSize = 0;
epgmdm 12:d9b13f31206d 442 sendFileSize();
epgmdm 12:d9b13f31206d 443 }
epgmdm 12:d9b13f31206d 444 if (flagSendFile) {
epgmdm 12:d9b13f31206d 445 flagSendFile = 0;
defrost 28:e85a86fc8b59 446 sending=1;
epgmdm 12:d9b13f31206d 447 sendFile();
defrost 5:57b06b4b47c6 448 }
epgmdm 12:d9b13f31206d 449 if (flagSendFileDone) {
epgmdm 12:d9b13f31206d 450 flagSendFileDone = 0;
epgmdm 12:d9b13f31206d 451 sendFileDone();
epgmdm 12:d9b13f31206d 452 INFO("File sent <%s>",txFileName);
defrost 32:f586ce639168 453 //flag = &flagNextFile;
defrost 32:f586ce639168 454 //delay->detach();
defrost 32:f586ce639168 455 //delay->attach(this, &Battery::setFlag, 2.5);
defrost 32:f586ce639168 456 flagNextFile = 1;
epgmdm 12:d9b13f31206d 457 }
epgmdm 18:be77ad141fac 458 if (flagCheckOut) {
epgmdm 18:be77ad141fac 459 flagCheckOut=0;
epgmdm 18:be77ad141fac 460 doCheckOut();
epgmdm 18:be77ad141fac 461 }
defrost 28:e85a86fc8b59 462 //INFO("Out Battery Loop");
defrost 28:e85a86fc8b59 463 return;
defrost 5:57b06b4b47c6 464 }
defrost 5:57b06b4b47c6 465
defrost 5:57b06b4b47c6 466 /**
defrost 5:57b06b4b47c6 467 * sends a request for time update.
defrost 5:57b06b4b47c6 468 */
epgmdm 18:be77ad141fac 469 void Battery::requestTime()
epgmdm 18:be77ad141fac 470 {
defrost 28:e85a86fc8b59 471 if(sending==0) {
defrost 28:e85a86fc8b59 472 DBG("getTime");
defrost 28:e85a86fc8b59 473 nrf->transmitData("T ",2);
defrost 28:e85a86fc8b59 474 }
defrost 5:57b06b4b47c6 475 }
epgmdm 12:d9b13f31206d 476
epgmdm 12:d9b13f31206d 477 /**
epgmdm 12:d9b13f31206d 478 * sends a request for time update.
epgmdm 12:d9b13f31206d 479 */
epgmdm 18:be77ad141fac 480 void Battery::requestMaxCharge()
epgmdm 18:be77ad141fac 481 {
defrost 28:e85a86fc8b59 482 if(sending==0) {
defrost 28:e85a86fc8b59 483 DBG("Get Max Charge Rate");
defrost 28:e85a86fc8b59 484 nrf->transmitData("M ",2);
defrost 28:e85a86fc8b59 485 }
epgmdm 12:d9b13f31206d 486 }
defrost 5:57b06b4b47c6 487 /**
defrost 5:57b06b4b47c6 488 * Selects the next file to transmit
defrost 5:57b06b4b47c6 489 * Uses /sd/lastFileTx.txt to store the lst file transmitted
defrost 5:57b06b4b47c6 490 */
epgmdm 18:be77ad141fac 491 void Battery::nextFileToTx()
epgmdm 18:be77ad141fac 492 {
defrost 5:57b06b4b47c6 493
defrost 5:57b06b4b47c6 494 DBG("> nextTxFile");
defrost 5:57b06b4b47c6 495
defrost 5:57b06b4b47c6 496 char lastFileName[64];
defrost 5:57b06b4b47c6 497 char fileName[64];
defrost 5:57b06b4b47c6 498 char fn[40];
defrost 5:57b06b4b47c6 499 unsigned int txLength;
defrost 5:57b06b4b47c6 500
defrost 5:57b06b4b47c6 501 sdBuffPnt=0;// Tells sendFile to read from SD the first time.
defrost 5:57b06b4b47c6 502 fileLength = 0;
defrost 5:57b06b4b47c6 503 strcpy(txFileName, "");
defrost 5:57b06b4b47c6 504 spiSD();
defrost 5:57b06b4b47c6 505 // Read in last file name
defrost 5:57b06b4b47c6 506 FILE *fp = fopen("/sd/lastFileTx.txt", "r");
defrost 5:57b06b4b47c6 507 if (fp != NULL) {
defrost 5:57b06b4b47c6 508 if (fscanf(fp, "%s %u", lastFileName, &txLength) != 2) {
defrost 28:e85a86fc8b59 509 sprintf(lastFileName, "0");
defrost 5:57b06b4b47c6 510 }
defrost 5:57b06b4b47c6 511 fclose(fp);
defrost 5:57b06b4b47c6 512 } else {
defrost 28:e85a86fc8b59 513 sprintf(lastFileName, "0");
defrost 28:e85a86fc8b59 514 txLength = 0;
defrost 5:57b06b4b47c6 515 }
defrost 5:57b06b4b47c6 516 DBG("nextFileToTx>Last Filename=%s len=%u",lastFileName,txLength);
defrost 5:57b06b4b47c6 517 // Open directory and read files
defrost 5:57b06b4b47c6 518 DIR *dp;
defrost 5:57b06b4b47c6 519 struct dirent *dirp;
defrost 5:57b06b4b47c6 520 spiSD();
defrost 5:57b06b4b47c6 521 dp = opendir(logDir);
defrost 5:57b06b4b47c6 522 if (dp == NULL) {
defrost 5:57b06b4b47c6 523 DBG("nextTxFile logdir %s is NULL", logDir);
defrost 5:57b06b4b47c6 524 } else
defrost 5:57b06b4b47c6 525 //read all directory and file names in current directory into filename vector
defrost 5:57b06b4b47c6 526 while ((dirp = readdir(dp)) != NULL) {
defrost 5:57b06b4b47c6 527 DBG("nextFileToTx> WHILE lst [%s] dir [%s] %d",lastFileName, dirp->d_name,strcmp(lastFileName, dirp->d_name));
defrost 5:57b06b4b47c6 528
defrost 5:57b06b4b47c6 529 if (strcmp(lastFileName, dirp->d_name) < 0) {
defrost 5:57b06b4b47c6 530 strcpy(fileName, dirp->d_name);
defrost 5:57b06b4b47c6 531 sprintf(txFileName, "%s/%s", logDir, dirp->d_name);
defrost 5:57b06b4b47c6 532 fp = fopen(txFileName, "r");
defrost 5:57b06b4b47c6 533 fseek(fp, 0L, SEEK_END);
defrost 5:57b06b4b47c6 534 fileLength = ftell(fp);
defrost 5:57b06b4b47c6 535 fclose(fp);
defrost 5:57b06b4b47c6 536 DBG("CHOSEN %s old %s ", fileName, lastFileName );
defrost 5:57b06b4b47c6 537 break;
defrost 5:57b06b4b47c6 538 }
defrost 5:57b06b4b47c6 539 if (strcmp(lastFileName, dirp->d_name) == 0) {
defrost 5:57b06b4b47c6 540
defrost 5:57b06b4b47c6 541 strcpy(fileName, dirp->d_name);
defrost 5:57b06b4b47c6 542 sprintf(fn, "%s/%s", logDir, dirp->d_name);
defrost 5:57b06b4b47c6 543 fp = fopen(fn, "r");
defrost 5:57b06b4b47c6 544 fseek(fp, 0L, SEEK_END);
defrost 5:57b06b4b47c6 545 fileLength = ftell(fp);
defrost 5:57b06b4b47c6 546 fclose(fp);
defrost 5:57b06b4b47c6 547 if (txLength < fileLength) {
defrost 5:57b06b4b47c6 548 sprintf(txFileName, "%s/%s", logDir, dirp->d_name);
defrost 5:57b06b4b47c6 549 DBG("More to send is %s old %u new %u ", fileName, txLength,fileLength );
defrost 5:57b06b4b47c6 550 break;
defrost 5:57b06b4b47c6 551 }
defrost 5:57b06b4b47c6 552 }
defrost 5:57b06b4b47c6 553 // test filename and if greater than last read then choose.
defrost 5:57b06b4b47c6 554 }
defrost 5:57b06b4b47c6 555 closedir(dp);
defrost 5:57b06b4b47c6 556 if (strlen(txFileName) > 0) {
defrost 5:57b06b4b47c6 557 strcpy(txFileName, fileName);
defrost 5:57b06b4b47c6 558 sprintf(fullTxFilePath, "%s/%s", logDir, txFileName);
defrost 5:57b06b4b47c6 559 fileLeft = fileLength;
defrost 5:57b06b4b47c6 560
defrost 5:57b06b4b47c6 561 } else {
defrost 5:57b06b4b47c6 562 fileLength =0;
defrost 5:57b06b4b47c6 563 }
defrost 5:57b06b4b47c6 564 DBG("nextTxFile> Next is [%s] length %d", txFileName, fileLength);
defrost 5:57b06b4b47c6 565
defrost 5:57b06b4b47c6 566 }
epgmdm 18:be77ad141fac 567
defrost 5:57b06b4b47c6 568 /**
defrost 5:57b06b4b47c6 569 * Sends the directory name, allows the otherside to create.
defrost 5:57b06b4b47c6 570 */
defrost 5:57b06b4b47c6 571
epgmdm 18:be77ad141fac 572 void Battery::sendDirName()
epgmdm 18:be77ad141fac 573 {
epgmdm 18:be77ad141fac 574 flagStartFileTx=1;
defrost 5:57b06b4b47c6 575 sprintf(dataTx, "D %s", logDir);
defrost 5:57b06b4b47c6 576
defrost 28:e85a86fc8b59 577 DBG("send Dir Name [%s].", dataTx);
defrost 5:57b06b4b47c6 578
epgmdm 11:87ab310924f0 579 spiNRF();
defrost 5:57b06b4b47c6 580 nrf->transmitData(dataTx, strlen(dataTx));
defrost 5:57b06b4b47c6 581
defrost 5:57b06b4b47c6 582 }
defrost 5:57b06b4b47c6 583 /**
defrost 5:57b06b4b47c6 584 * Sends the file name, if fileLength >0
defrost 5:57b06b4b47c6 585 */
defrost 5:57b06b4b47c6 586
epgmdm 18:be77ad141fac 587 void Battery::sendFileName()
epgmdm 18:be77ad141fac 588 {
defrost 5:57b06b4b47c6 589 // delay->detach();
defrost 5:57b06b4b47c6 590 if (fileLength < 1) {
defrost 5:57b06b4b47c6 591 return;
defrost 5:57b06b4b47c6 592 }
defrost 5:57b06b4b47c6 593 sprintf(dataTx, "F %20s", txFileName);
defrost 5:57b06b4b47c6 594
defrost 5:57b06b4b47c6 595 DBG("send File Name [%s] \n\r", dataTx);
defrost 5:57b06b4b47c6 596
epgmdm 11:87ab310924f0 597 spiNRF();
defrost 5:57b06b4b47c6 598 nrf->transmitData(dataTx, strlen(dataTx));
defrost 5:57b06b4b47c6 599 }
defrost 5:57b06b4b47c6 600
defrost 5:57b06b4b47c6 601 /**
defrost 5:57b06b4b47c6 602 * Sends the file length to the locker - this is also the cue that the following bytes are the file.
defrost 5:57b06b4b47c6 603 */
epgmdm 18:be77ad141fac 604 void Battery::sendFileSize()
epgmdm 18:be77ad141fac 605 {
defrost 5:57b06b4b47c6 606 if (fileLength < 1) {
defrost 5:57b06b4b47c6 607 return;
defrost 5:57b06b4b47c6 608 }
epgmdm 12:d9b13f31206d 609 sendingFile=1;
defrost 5:57b06b4b47c6 610 filePointer = 0;
defrost 5:57b06b4b47c6 611 sprintf(dataTx, "S %X", fileLength);
defrost 5:57b06b4b47c6 612
defrost 5:57b06b4b47c6 613
defrost 5:57b06b4b47c6 614 DBG("send File size [%s]", dataTx);
defrost 5:57b06b4b47c6 615
epgmdm 11:87ab310924f0 616 spiNRF();
defrost 5:57b06b4b47c6 617 nrf->transmitData(dataTx, strlen(dataTx));
defrost 5:57b06b4b47c6 618 }
defrost 5:57b06b4b47c6 619
defrost 5:57b06b4b47c6 620 /**
defrost 5:57b06b4b47c6 621 * Sends the file length to the locker - this is also the cue that the following bytes are the file.
defrost 5:57b06b4b47c6 622 */
epgmdm 18:be77ad141fac 623 void Battery::sendFile()
epgmdm 18:be77ad141fac 624 {
epgmdm 30:47f73b850a5e 625 char * packet;
epgmdm 30:47f73b850a5e 626 unsigned int packetSize=32;
epgmdm 30:47f73b850a5e 627 spiNRF();
defrost 5:57b06b4b47c6 628
epgmdm 30:47f73b850a5e 629 while (packetSize>0) {
epgmdm 30:47f73b850a5e 630 packet = getPacket(&packetSize,fullTxFilePath);
epgmdm 30:47f73b850a5e 631 nrf->transmitData(packet, packetSize);
epgmdm 30:47f73b850a5e 632 };
epgmdm 30:47f73b850a5e 633 resetPackets();
epgmdm 31:3bf76548e024 634 flagSendFileDone=1;
epgmdm 31:3bf76548e024 635 DBG("Done sending");
defrost 5:57b06b4b47c6 636
defrost 5:57b06b4b47c6 637 }
defrost 5:57b06b4b47c6 638
defrost 32:f586ce639168 639
defrost 5:57b06b4b47c6 640 /**
defrost 5:57b06b4b47c6 641 * Update the last file sent file
defrost 5:57b06b4b47c6 642 */
epgmdm 18:be77ad141fac 643 void Battery::sendFileDone()
epgmdm 18:be77ad141fac 644 {
defrost 32:f586ce639168 645 int check;
defrost 32:f586ce639168 646 if (strlen(txFileName)>0) {
defrost 32:f586ce639168 647 spiSD();
defrost 32:f586ce639168 648 FILE *fp = fopen("/sd/lastFileTx.txt", "w");
defrost 32:f586ce639168 649 if (fp != NULL) {
defrost 32:f586ce639168 650 check = fprintf(fp, "%s %u \n", txFileName, fileLength);
defrost 32:f586ce639168 651 fclose(fp);
defrost 32:f586ce639168 652 DBG("sendFileDone> updated lastFileTx.txt %s %u chk = %d", txFileName, fileLength, check);
defrost 32:f586ce639168 653 } else {
defrost 32:f586ce639168 654 INFO("sendFileDone> Cannot update file lastFiletx.txt");
defrost 32:f586ce639168 655 }
defrost 32:f586ce639168 656 spiNRF();
defrost 5:57b06b4b47c6 657
defrost 32:f586ce639168 658 }
defrost 5:57b06b4b47c6 659
defrost 5:57b06b4b47c6 660 }
defrost 5:57b06b4b47c6 661
defrost 5:57b06b4b47c6 662 /**
defrost 5:57b06b4b47c6 663 * Sets the value pointed to by flag to 1.
defrost 5:57b06b4b47c6 664 */
epgmdm 18:be77ad141fac 665 void Battery::setFlag()
epgmdm 18:be77ad141fac 666 {
defrost 5:57b06b4b47c6 667 if (flag != NULL) {
defrost 5:57b06b4b47c6 668 *flag = 1;
defrost 5:57b06b4b47c6 669 }
defrost 5:57b06b4b47c6 670 flag = NULL;
defrost 5:57b06b4b47c6 671 }
epgmdm 12:d9b13f31206d 672
epgmdm 12:d9b13f31206d 673
epgmdm 12:d9b13f31206d 674 /**
epgmdm 12:d9b13f31206d 675 * Returns the max current that can be drawn from the system, in amps
epgmdm 12:d9b13f31206d 676 */
epgmdm 12:d9b13f31206d 677
epgmdm 18:be77ad141fac 678 float Battery::getMaxCurrent()
epgmdm 18:be77ad141fac 679 {
epgmdm 12:d9b13f31206d 680 return maxChargeRate;
epgmdm 12:d9b13f31206d 681 }
epgmdm 12:d9b13f31206d 682
epgmdm 12:d9b13f31206d 683 /**
epgmdm 12:d9b13f31206d 684 * returns a string of the log directory
epgmdm 12:d9b13f31206d 685 */
epgmdm 18:be77ad141fac 686 char* Battery::getLogDirectory()
epgmdm 18:be77ad141fac 687 {
epgmdm 12:d9b13f31206d 688
epgmdm 12:d9b13f31206d 689 return logDir;
epgmdm 12:d9b13f31206d 690 }
defrost 17:dc19b3b39790 691
defrost 17:dc19b3b39790 692 /**
defrost 17:dc19b3b39790 693 * Returns true if we are authorized to start charging.
defrost 17:dc19b3b39790 694 */
epgmdm 18:be77ad141fac 695 bool Battery::startCharging(void)
epgmdm 18:be77ad141fac 696 {
defrost 17:dc19b3b39790 697 return startCharge;
defrost 17:dc19b3b39790 698 }
defrost 17:dc19b3b39790 699
epgmdm 18:be77ad141fac 700 bool Battery::isCheckedIn(void)
epgmdm 18:be77ad141fac 701 {
epgmdm 18:be77ad141fac 702 if(checkedIn == 1) {
defrost 17:dc19b3b39790 703 return true;
epgmdm 18:be77ad141fac 704 } else {
defrost 17:dc19b3b39790 705 return false;
defrost 17:dc19b3b39790 706 }
defrost 17:dc19b3b39790 707 }
defrost 24:6aba7f16e0c6 708
defrost 24:6aba7f16e0c6 709 void Battery::disableInt(void)
defrost 24:6aba7f16e0c6 710 {
defrost 24:6aba7f16e0c6 711 // Detaches all interrupts:
defrost 24:6aba7f16e0c6 712 txWatch->detach();
defrost 24:6aba7f16e0c6 713 delay->detach();
defrost 25:1979c129acb0 714 nrf->setPwrDown();
defrost 28:e85a86fc8b59 715
defrost 24:6aba7f16e0c6 716 return;
defrost 24:6aba7f16e0c6 717 }
epgmdm 30:47f73b850a5e 718 /**
epgmdm 30:47f73b850a5e 719 * Resets the buffers to start reading the file from the beginning again.
epgmdm 30:47f73b850a5e 720 *
epgmdm 30:47f73b850a5e 721 */
epgmdm 30:47f73b850a5e 722
epgmdm 31:3bf76548e024 723 void Battery::resetPackets()
epgmdm 30:47f73b850a5e 724 {
epgmdm 30:47f73b850a5e 725 sdBuffPnt=0;
epgmdm 30:47f73b850a5e 726 fileLeft = fileLength;
epgmdm 30:47f73b850a5e 727 }
epgmdm 30:47f73b850a5e 728 /**
epgmdm 30:47f73b850a5e 729 * Gathers a packet from the file defined by fullTxFilePath
epgmdm 30:47f73b850a5e 730 * @param readOnly if true then it does not move the internal pointers on.
epgmdm 30:47f73b850a5e 731 */
epgmdm 30:47f73b850a5e 732 char* Battery::getPacket(unsigned int *sizePackett,char * fullTxFilePath)
epgmdm 30:47f73b850a5e 733 {
epgmdm 30:47f73b850a5e 734 //DBG("Get packet");
epgmdm 30:47f73b850a5e 735
epgmdm 30:47f73b850a5e 736 // printf("send File [%s] at %d %d\n\r",fullTxFilePath,fileLength, fileLeft );
epgmdm 30:47f73b850a5e 737
epgmdm 30:47f73b850a5e 738 // if (fileLength < 1) {
epgmdm 30:47f73b850a5e 739 // INFO("File Sent");
epgmdm 30:47f73b850a5e 740 // sdBuffPnt=0;
epgmdm 30:47f73b850a5e 741 // return;
epgmdm 30:47f73b850a5e 742 // }
epgmdm 30:47f73b850a5e 743 if (sdBuffPnt>=SDBUFFERSIZE) {
epgmdm 30:47f73b850a5e 744 sdBuffPnt=0;
epgmdm 30:47f73b850a5e 745 }
epgmdm 30:47f73b850a5e 746 if (sdBuffPnt == 0) {
epgmdm 30:47f73b850a5e 747 DBG("File %s",fullTxFilePath);
epgmdm 30:47f73b850a5e 748 spiSD();
epgmdm 30:47f73b850a5e 749 FILE *fp;
epgmdm 30:47f73b850a5e 750 fp= fopen(fullTxFilePath, "rb");
epgmdm 30:47f73b850a5e 751 wait(0.1);
epgmdm 30:47f73b850a5e 752 DBG("Open");
epgmdm 30:47f73b850a5e 753 while (fp == NULL) {
epgmdm 30:47f73b850a5e 754 WARN("sendFile> File %s not found for reading",fullTxFilePath);
epgmdm 30:47f73b850a5e 755 fp= fopen(fullTxFilePath, "rb");
epgmdm 30:47f73b850a5e 756 }
epgmdm 30:47f73b850a5e 757 spiSD();
epgmdm 30:47f73b850a5e 758 //DBG("Seek");
epgmdm 30:47f73b850a5e 759 fseek(fp, fileLength - fileLeft, SEEK_SET);
epgmdm 30:47f73b850a5e 760 //DBG("Read");
epgmdm 30:47f73b850a5e 761 sizeRead = fread(sdBuffer, 1,SDBUFFERSIZE, fp);
epgmdm 30:47f73b850a5e 762 //DBG("Read %d",sizeRead);
epgmdm 30:47f73b850a5e 763 fileLeft -= sizeRead;
epgmdm 30:47f73b850a5e 764
epgmdm 30:47f73b850a5e 765 fclose(fp);
epgmdm 30:47f73b850a5e 766 DBG("File %s %d \n\r",fullTxFilePath,sizeRead);
epgmdm 30:47f73b850a5e 767 //spiNRF();
epgmdm 30:47f73b850a5e 768
epgmdm 30:47f73b850a5e 769 }
epgmdm 30:47f73b850a5e 770
epgmdm 30:47f73b850a5e 771 unsigned int bpNow =sdBuffPnt;
epgmdm 30:47f73b850a5e 772
epgmdm 30:47f73b850a5e 773 unsigned int size=*sizePackett;
epgmdm 30:47f73b850a5e 774 if (sizeRead<size) {
epgmdm 30:47f73b850a5e 775 size=sizeRead;
epgmdm 30:47f73b850a5e 776 }
epgmdm 30:47f73b850a5e 777 if ((fileLeft==0)&&(sizeRead==0)) {
epgmdm 30:47f73b850a5e 778 sdBuffPnt=0;
epgmdm 30:47f73b850a5e 779 //flagSendFileDone=1;
epgmdm 30:47f73b850a5e 780 *sizePackett = 0;
epgmdm 30:47f73b850a5e 781 INFO("Done sending file %s",fullTxFilePath);
epgmdm 30:47f73b850a5e 782
epgmdm 30:47f73b850a5e 783 } else {
epgmdm 30:47f73b850a5e 784
epgmdm 30:47f73b850a5e 785 sizeRead -= size;
epgmdm 30:47f73b850a5e 786 //sendPacket(&(sdBuffer[sdBuffPnt]), size);
epgmdm 30:47f73b850a5e 787 sdBuffPnt+=size;
epgmdm 30:47f73b850a5e 788 //*sizePackett = size;
epgmdm 30:47f73b850a5e 789 DBG("Left to send %d",(fileLeft+sizeRead));
epgmdm 30:47f73b850a5e 790 return &(sdBuffer[bpNow]);
epgmdm 30:47f73b850a5e 791 }
epgmdm 30:47f73b850a5e 792 return NULL;
epgmdm 30:47f73b850a5e 793 }