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:
28:e85a86fc8b59
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 * Locker extends SolarNanoGrid.
defrost 5:57b06b4b47c6 5 * Locker interacts with the batteries.
defrost 5:57b06b4b47c6 6 * The ID must 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 "Locker.c"
defrost 5:57b06b4b47c6 28 */
defrost 5:57b06b4b47c6 29 #include "Locker.h"
defrost 10:30c9e8df0032 30 #define FUNCNAME "LOCKER"
defrost 10:30c9e8df0032 31 #include "defs.h"
defrost 5:57b06b4b47c6 32
epgmdm 11:87ab310924f0 33 Locker::Locker(FILE* fp,Serial *pc) :
epgmdm 18:be77ad141fac 34 SolarNanoGrid(fp,pc)
epgmdm 18:be77ad141fac 35 {
epgmdm 11:87ab310924f0 36 DBG("Initialize class locker");
epgmdm 11:87ab310924f0 37
defrost 5:57b06b4b47c6 38
adrienBiz 9:541c2ae1cfec 39 // ***** variables initialization *****
adrienBiz 9:541c2ae1cfec 40
adrienBiz 9:541c2ae1cfec 41 // Protected variables: *
adrienBiz 9:541c2ae1cfec 42 /**
adrienBiz 9:541c2ae1cfec 43 * Open channel address of the locker
adrienBiz 9:541c2ae1cfec 44 */
adrienBiz 9:541c2ae1cfec 45 openAddr=0;
adrienBiz 9:541c2ae1cfec 46
adrienBiz 9:541c2ae1cfec 47 /**
adrienBiz 9:541c2ae1cfec 48 * Channel address for Utility
adrienBiz 9:541c2ae1cfec 49 */
adrienBiz 9:541c2ae1cfec 50 addrUtil=0;
adrienBiz 9:541c2ae1cfec 51 /**
adrienBiz 9:541c2ae1cfec 52 * Array of battery states
adrienBiz 9:541c2ae1cfec 53 */
adrienBiz 9:541c2ae1cfec 54 sdBuffPnt=0;
adrienBiz 9:541c2ae1cfec 55 battQP=0; // Battery queue pointer
adrienBiz 9:541c2ae1cfec 56 pipeQP=0; // pipe q pointer (Add 2)
adrienBiz 9:541c2ae1cfec 57 pipe = 0;
adrienBiz 9:541c2ae1cfec 58 width = 0;
adrienBiz 9:541c2ae1cfec 59 now=0;
adrienBiz 9:541c2ae1cfec 60 lastRxTme=0;
epgmdm 18:be77ad141fac 61 maxCharge=1.0;
adrienBiz 9:541c2ae1cfec 62
adrienBiz 9:541c2ae1cfec 63 // flags
adrienBiz 9:541c2ae1cfec 64 flagRotate=false;
adrienBiz 9:541c2ae1cfec 65 flagNrf=0;
adrienBiz 9:541c2ae1cfec 66 flagOneSecond=0;
epgmdm 11:87ab310924f0 67
adrienBiz 9:541c2ae1cfec 68 // ***** end of varibale initialization *****
adrienBiz 9:541c2ae1cfec 69
epgmdm 11:87ab310924f0 70 // No other information needed from the config file
epgmdm 11:87ab310924f0 71 fclose(fp);
epgmdm 11:87ab310924f0 72 DBG("Close file");
epgmdm 11:87ab310924f0 73
defrost 5:57b06b4b47c6 74 battIn = (char *) calloc(256, 1);
defrost 5:57b06b4b47c6 75 battPipes = (char *) calloc(6, 1);
defrost 5:57b06b4b47c6 76 for (int i = 0; i < 4; i++) {
defrost 5:57b06b4b47c6 77 dirNames[i] = (char *) calloc(32, 1);
defrost 5:57b06b4b47c6 78 fileNames[i] = (char *) calloc(32, 1);
defrost 5:57b06b4b47c6 79 }
defrost 5:57b06b4b47c6 80
defrost 5:57b06b4b47c6 81 temp = (char *) calloc(64, 1);
defrost 5:57b06b4b47c6 82 timeValue = (char *) calloc(32, 1);
epgmdm 18:be77ad141fac 83 maxChargeValue= (char *) calloc(32, 1);
defrost 5:57b06b4b47c6 84 sdBuffer = (char *) calloc(SDBUFFERSIZE,1);
defrost 5:57b06b4b47c6 85 doOneSecond();
defrost 5:57b06b4b47c6 86 //
defrost 5:57b06b4b47c6 87 // Setup NRF
defrost 5:57b06b4b47c6 88 //
defrost 5:57b06b4b47c6 89 openAddr = ((long long) communityID << 16) + (id & 0XFFFF);
epgmdm 11:87ab310924f0 90 addrUtil = (openAddr & 0XFFFFFF0000) | 0xFE00;
defrost 5:57b06b4b47c6 91
defrost 13:de43f28c0365 92 DBG(" Channel:%x, Address %llx Util Address %llx", chan, openAddr, addrUtil);
defrost 5:57b06b4b47c6 93
epgmdm 11:87ab310924f0 94 setAsRX(addrUtil);
epgmdm 11:87ab310924f0 95 nrf->setRxAddress(openAddr, 1); //Default battery pipe address 1
epgmdm 11:87ab310924f0 96
defrost 5:57b06b4b47c6 97 DBG("Nrf Details:");
defrost 5:57b06b4b47c6 98 #ifdef DEBUG
defrost 5:57b06b4b47c6 99 nrf->printDetails();
defrost 5:57b06b4b47c6 100 #endif
epgmdm 11:87ab310924f0 101 //
epgmdm 11:87ab310924f0 102 //Pods
epgmdm 11:87ab310924f0 103 //
epgmdm 11:87ab310924f0 104 pods[0]=new DigitalOut(PTE24,0);
epgmdm 11:87ab310924f0 105 pods[1]=new DigitalOut(PTE25,0);
epgmdm 11:87ab310924f0 106 pods[2]=new DigitalOut(PTD1,0);
epgmdm 11:87ab310924f0 107 pods[3]=new DigitalOut(PTD3,0);
epgmdm 11:87ab310924f0 108 pods[4]=new DigitalOut(PTD2,0);
epgmdm 11:87ab310924f0 109 pods[5]=new DigitalOut(PTD0,0);
epgmdm 11:87ab310924f0 110 pods[6]=new DigitalOut(PTC4,0);
epgmdm 11:87ab310924f0 111 pods[7]=new DigitalOut(PTE26,0);
epgmdm 11:87ab310924f0 112 pods[8]=new DigitalOut(PTC5,0);
epgmdm 11:87ab310924f0 113 pods[9]=new DigitalOut(PTC7,0);
epgmdm 11:87ab310924f0 114 pods[10]=new DigitalOut(PTC0,0);
epgmdm 11:87ab310924f0 115 pods[11]=new DigitalOut(PTC9,0);
epgmdm 11:87ab310924f0 116 pods[12]=new DigitalOut(PTC8,0);
epgmdm 11:87ab310924f0 117 pods[13]=new DigitalOut(PTC1,0);
epgmdm 11:87ab310924f0 118 pods[14]=new DigitalOut(PTB19,0);
epgmdm 11:87ab310924f0 119 pods[15]=new DigitalOut(PTB18,0);
epgmdm 11:87ab310924f0 120
epgmdm 11:87ab310924f0 121
defrost 5:57b06b4b47c6 122
defrost 5:57b06b4b47c6 123 //
defrost 5:57b06b4b47c6 124 // Interrupts
defrost 5:57b06b4b47c6 125 //
defrost 5:57b06b4b47c6 126
defrost 5:57b06b4b47c6 127 nrfInt = new InterruptIn(PTC18);
defrost 5:57b06b4b47c6 128 nrfInt->fall(this, &Locker::intNrf); // attach nrf interrupt.
defrost 5:57b06b4b47c6 129
defrost 5:57b06b4b47c6 130 button = new InterruptIn(SW2);
defrost 5:57b06b4b47c6 131 button->fall(this, &Locker::intButton);
defrost 5:57b06b4b47c6 132
defrost 5:57b06b4b47c6 133 rxWatch = new Ticker();
defrost 5:57b06b4b47c6 134 rxWatch->attach(this, &Locker::intRxClean, 30.14151);
defrost 5:57b06b4b47c6 135
defrost 5:57b06b4b47c6 136 oneSecond = new Ticker();
defrost 5:57b06b4b47c6 137 oneSecond->attach(this, &Locker::intOneSecond, 1.0);
defrost 5:57b06b4b47c6 138
defrost 5:57b06b4b47c6 139 loop();
defrost 5:57b06b4b47c6 140 }
defrost 5:57b06b4b47c6 141
defrost 5:57b06b4b47c6 142 // Protected
defrost 5:57b06b4b47c6 143
defrost 5:57b06b4b47c6 144 // ------------------------------------------------------------------------
defrost 5:57b06b4b47c6 145 // Interrupt routines
defrost 5:57b06b4b47c6 146 // ------------------------------------------------------------------------
defrost 5:57b06b4b47c6 147
epgmdm 18:be77ad141fac 148 void Locker::intOneSecond()
epgmdm 18:be77ad141fac 149 {
defrost 5:57b06b4b47c6 150 flagOneSecond = 1;
defrost 5:57b06b4b47c6 151 }
defrost 5:57b06b4b47c6 152
epgmdm 18:be77ad141fac 153 void Locker::doOneSecond()
epgmdm 18:be77ad141fac 154 {
defrost 5:57b06b4b47c6 155 now = time(NULL);
defrost 5:57b06b4b47c6 156 sprintf(timeValue, "T %x", now);
epgmdm 18:be77ad141fac 157 sprintf(maxChargeValue,"M %4.2f",maxCharge);
epgmdm 18:be77ad141fac 158
defrost 5:57b06b4b47c6 159 *ledGreen = !*ledGreen;
defrost 5:57b06b4b47c6 160
defrost 5:57b06b4b47c6 161 // DBG("One second: %s", timeValue);
defrost 5:57b06b4b47c6 162 }
defrost 5:57b06b4b47c6 163 /**
defrost 5:57b06b4b47c6 164 * called when the nrf creates an interrupt.
defrost 5:57b06b4b47c6 165 *
defrost 5:57b06b4b47c6 166 */
epgmdm 18:be77ad141fac 167 void Locker::intNrf()
epgmdm 18:be77ad141fac 168 {
defrost 5:57b06b4b47c6 169
defrost 5:57b06b4b47c6 170 int bID = 0;
defrost 5:57b06b4b47c6 171 int status = 0;
defrost 5:57b06b4b47c6 172 //
defrost 5:57b06b4b47c6 173 //Get status and pipe
defrost 5:57b06b4b47c6 174 //
epgmdm 11:87ab310924f0 175 spiNRF();
defrost 5:57b06b4b47c6 176 status = nrf->checkStatus();
defrost 5:57b06b4b47c6 177 pipe = (status >> 1);
defrost 5:57b06b4b47c6 178 pipe = (pipe & 0x0007);
defrost 5:57b06b4b47c6 179
defrost 5:57b06b4b47c6 180 //
defrost 5:57b06b4b47c6 181 // Check if data received
defrost 5:57b06b4b47c6 182 //
defrost 5:57b06b4b47c6 183 if (((status >> RX_DR) & 01) == 1) { // Received a packet
defrost 5:57b06b4b47c6 184 // Get the data
defrost 5:57b06b4b47c6 185 width = nrf->getRxData(dataRx);
defrost 5:57b06b4b47c6 186 dataRx[width] = '\0';
defrost 5:57b06b4b47c6 187 //Process the acknowledge
defrost 28:e85a86fc8b59 188 if ((pipe>=2)&&(battIn[battPipes[pipe - 2]] == SENDING)) { // A file is being transferred.
defrost 5:57b06b4b47c6 189 nrf->acknowledgeData("S ", 2, pipe);
defrost 5:57b06b4b47c6 190 flagNrf = 1;
defrost 28:e85a86fc8b59 191 DBG("A file is being transferred");
defrost 5:57b06b4b47c6 192 } else if (dataRx[0] == 'T') {
defrost 5:57b06b4b47c6 193 // Sends the time - this is updated in doOneSecond()
defrost 28:e85a86fc8b59 194 nrf->acknowledgeData(timeValue, strlen(timeValue), pipe);
defrost 24:6aba7f16e0c6 195 DBG("Send Time in acknowledge");
epgmdm 18:be77ad141fac 196 } else if (dataRx[0] == 'M') {
epgmdm 18:be77ad141fac 197 // Sends the maxCharge value - this is updated in doOneSecond()
defrost 28:e85a86fc8b59 198 nrf->acknowledgeData(maxChargeValue, strlen(maxChargeValue), pipe);
defrost 24:6aba7f16e0c6 199 DBG("Sent maxCharge: %s in acknowledge", maxChargeValue);
defrost 5:57b06b4b47c6 200 } else {
defrost 5:57b06b4b47c6 201 nrf->acknowledgeData(dataRx, 2, pipe);
defrost 5:57b06b4b47c6 202 DBG("intNrf>%s %x",dataRx,bID);
defrost 5:57b06b4b47c6 203 }
defrost 5:57b06b4b47c6 204 if (pipe == 1) { // Open channel
epgmdm 11:87ab310924f0 205 DBG("intNrf>Pipe 1 %s",dataRx);
defrost 5:57b06b4b47c6 206 if (dataRx[0] == 'C') { //Request for check in
defrost 5:57b06b4b47c6 207 int battID;
defrost 5:57b06b4b47c6 208 sscanf(&dataRx[2], "%x", &battID);
defrost 5:57b06b4b47c6 209 bID = battID & 0x00ff;
defrost 5:57b06b4b47c6 210 if (battIn[bID] == CHECKED_OUT) {
defrost 5:57b06b4b47c6 211 battIn[bID] = CHECKED_IN;
defrost 5:57b06b4b47c6 212 DBG("intNrf>Check in %d", bID);
defrost 5:57b06b4b47c6 213 } else {
defrost 5:57b06b4b47c6 214 WARN("Battery %04X is already checked in.", battID);
defrost 5:57b06b4b47c6 215 }
defrost 5:57b06b4b47c6 216 flagRotate = 1;
epgmdm 18:be77ad141fac 217 } else if (dataRx[0] == 'b') { //Battery drop off
defrost 28:e85a86fc8b59 218 // DBG("intNrf>User check in %s",dataRx);
epgmdm 11:87ab310924f0 219 sscanf (&dataRx[2], "%x %x", &userIDDrop, &numBatDrop);
epgmdm 11:87ab310924f0 220 int pod = (userIDDrop&0XF0)>>4;
epgmdm 18:be77ad141fac 221 if (dataRx[1] == 'd') {
epgmdm 11:87ab310924f0 222 turnPodOn(pod,1);
epgmdm 11:87ab310924f0 223 *ledRed=0;
epgmdm 11:87ab310924f0 224 }
epgmdm 18:be77ad141fac 225 if (dataRx[1] == 'p') {
epgmdm 11:87ab310924f0 226 turnPodOn(pod,0);
epgmdm 11:87ab310924f0 227 *ledRed=1;
epgmdm 11:87ab310924f0 228 }
epgmdm 11:87ab310924f0 229
epgmdm 11:87ab310924f0 230
defrost 5:57b06b4b47c6 231 }
epgmdm 18:be77ad141fac 232 } else if (pipe>1) {
epgmdm 18:be77ad141fac 233 if (dataRx[0] == 'O') { //Request for check out
epgmdm 18:be77ad141fac 234 int battID;
epgmdm 18:be77ad141fac 235 sscanf(&dataRx[2], "%x", &battID);
epgmdm 18:be77ad141fac 236 bID = battID & 0x00ff;
epgmdm 18:be77ad141fac 237
epgmdm 18:be77ad141fac 238 battIn[bID] = CHECKED_OUT;
epgmdm 18:be77ad141fac 239 DBG("intNrf>Check out %d", bID);
epgmdm 18:be77ad141fac 240
epgmdm 18:be77ad141fac 241 flagRotate = 1;
epgmdm 18:be77ad141fac 242 }
defrost 5:57b06b4b47c6 243 flagNrf = 1;
defrost 5:57b06b4b47c6 244 }
defrost 5:57b06b4b47c6 245
defrost 5:57b06b4b47c6 246 lastRxTme = now;
epgmdm 11:87ab310924f0 247
defrost 5:57b06b4b47c6 248 }
defrost 5:57b06b4b47c6 249
epgmdm 11:87ab310924f0 250 DBG("intNRF> int rx");
defrost 5:57b06b4b47c6 251 nrf->clearStatus();
defrost 5:57b06b4b47c6 252 *ledBlue = !*ledBlue;
defrost 5:57b06b4b47c6 253
defrost 5:57b06b4b47c6 254 }
defrost 5:57b06b4b47c6 255
defrost 5:57b06b4b47c6 256 /**
defrost 5:57b06b4b47c6 257 * Responds to the received signals from Master and Batteries
defrost 5:57b06b4b47c6 258 */
defrost 5:57b06b4b47c6 259 void Locker::doNrf()
defrost 5:57b06b4b47c6 260 {
defrost 5:57b06b4b47c6 261 //DBG("doNrf>>");
defrost 5:57b06b4b47c6 262 // Now check which pipe
defrost 5:57b06b4b47c6 263 if (pipe>1) { //A battery
defrost 5:57b06b4b47c6 264 int bID = battPipes[pipe]; // get battery ID from pipe.
defrost 5:57b06b4b47c6 265 int p = pipe-2;
defrost 5:57b06b4b47c6 266 if (battIn[battPipes[p]] == SENDING) {
defrost 5:57b06b4b47c6 267 saveFile(p,dataRx,width);
defrost 5:57b06b4b47c6 268 } else {
defrost 5:57b06b4b47c6 269 switch (dataRx[0]) {
epgmdm 18:be77ad141fac 270 case ('D'): { // Directory name.
epgmdm 18:be77ad141fac 271 *ce = 0;
epgmdm 18:be77ad141fac 272 sscanf (&dataRx[2],"%s",&(dirNames[p][0]));
epgmdm 18:be77ad141fac 273 spiSD();
epgmdm 18:be77ad141fac 274 DBG("doNrf>>>Making dir %s:",dirNames[p]);
epgmdm 18:be77ad141fac 275 int ok = mkdir(dirNames[p],777);
epgmdm 18:be77ad141fac 276 spiNRF();
epgmdm 18:be77ad141fac 277 DBG("doNrf>>>Directory name[%d] = <%s> OK=%d",p,dirNames[p],ok);
epgmdm 18:be77ad141fac 278 *ce = 1;
epgmdm 18:be77ad141fac 279 break;
epgmdm 18:be77ad141fac 280 }
epgmdm 18:be77ad141fac 281 case ('F'): { // File name
epgmdm 18:be77ad141fac 282 *ce = 0;
epgmdm 18:be77ad141fac 283 strncpy(&fileNames[p][0],&dataRx[2],30);
epgmdm 18:be77ad141fac 284 // sscanf (&dataRx[2],"%20s",&fileNames[p][0]);
epgmdm 18:be77ad141fac 285 sprintf(temp,"%s/%s",dirNames[p],fileNames[p]);
epgmdm 18:be77ad141fac 286 DBG("doNrf>>> Creating File name<%s>",temp);
epgmdm 18:be77ad141fac 287 spiSD();
epgmdm 18:be77ad141fac 288 // Make sure file is created and reset
epgmdm 18:be77ad141fac 289 FILE *fp = fopen(temp,"wb");
epgmdm 18:be77ad141fac 290 fclose(fp);
epgmdm 18:be77ad141fac 291 spiNRF();
epgmdm 18:be77ad141fac 292 DBG("doNrf>>>File name[%d] = <%s>",p,fileNames[p]);
epgmdm 18:be77ad141fac 293 *ce = 1;
epgmdm 18:be77ad141fac 294 break;
defrost 5:57b06b4b47c6 295
epgmdm 18:be77ad141fac 296 }
epgmdm 18:be77ad141fac 297 case ('S'): { // File name
epgmdm 18:be77ad141fac 298 battIn[battPipes[p]] = SENDING;
epgmdm 18:be77ad141fac 299 sscanf (&dataRx[2],"%x",&lengthFile[p]);
epgmdm 18:be77ad141fac 300 sdBuffPnt=0; // set buffer to start
epgmdm 18:be77ad141fac 301 DBG("doNrf>>>File Length[%d] = <%u>",p,lengthFile[p]);
epgmdm 18:be77ad141fac 302 break;
defrost 5:57b06b4b47c6 303
epgmdm 18:be77ad141fac 304 }
defrost 5:57b06b4b47c6 305
defrost 5:57b06b4b47c6 306 }
defrost 5:57b06b4b47c6 307 }
defrost 5:57b06b4b47c6 308
defrost 5:57b06b4b47c6 309 }
defrost 5:57b06b4b47c6 310 }
defrost 5:57b06b4b47c6 311
defrost 5:57b06b4b47c6 312 /**
defrost 5:57b06b4b47c6 313 * When the button is pressed print status
defrost 5:57b06b4b47c6 314 */
epgmdm 18:be77ad141fac 315 void Locker::intButton()
epgmdm 18:be77ad141fac 316 {
defrost 5:57b06b4b47c6 317 DBG("int Button");
defrost 5:57b06b4b47c6 318 intRxClean();
defrost 5:57b06b4b47c6 319 }
defrost 5:57b06b4b47c6 320
defrost 5:57b06b4b47c6 321 /**
defrost 5:57b06b4b47c6 322 * Cleans the receiver
defrost 5:57b06b4b47c6 323 */
epgmdm 18:be77ad141fac 324 void Locker::intRxClean()
epgmdm 18:be77ad141fac 325 {
epgmdm 18:be77ad141fac 326 if (now - lastRxTme>60) {
defrost 5:57b06b4b47c6 327 nrfFlush();
defrost 5:57b06b4b47c6 328 wait(0.01);
defrost 5:57b06b4b47c6 329 nrfFlush();
defrost 5:57b06b4b47c6 330 DBG("intRxClean < status=%x", nrf->checkStatus());
defrost 5:57b06b4b47c6 331 }
defrost 5:57b06b4b47c6 332 }
defrost 5:57b06b4b47c6 333
defrost 5:57b06b4b47c6 334
defrost 5:57b06b4b47c6 335 // Loop through slow routines
defrost 5:57b06b4b47c6 336
epgmdm 18:be77ad141fac 337 void Locker::loop(void)
epgmdm 18:be77ad141fac 338 {
defrost 5:57b06b4b47c6 339 while (1) {
defrost 5:57b06b4b47c6 340 if (flagRotate == 1) {
defrost 5:57b06b4b47c6 341 flagRotate = 0;
defrost 5:57b06b4b47c6 342 DBG("R");
defrost 5:57b06b4b47c6 343
defrost 5:57b06b4b47c6 344 doRotate();
defrost 5:57b06b4b47c6 345 }
defrost 5:57b06b4b47c6 346 if (flagNrf == 1) {
defrost 5:57b06b4b47c6 347 flagNrf = 0;
defrost 5:57b06b4b47c6 348 doNrf();
defrost 5:57b06b4b47c6 349 }
defrost 5:57b06b4b47c6 350 if (flagOneSecond == 1) {
defrost 5:57b06b4b47c6 351 flagOneSecond = 0;
defrost 5:57b06b4b47c6 352 doOneSecond();
defrost 5:57b06b4b47c6 353 }
defrost 5:57b06b4b47c6 354
defrost 5:57b06b4b47c6 355 __WFI();
defrost 5:57b06b4b47c6 356 };
defrost 5:57b06b4b47c6 357
defrost 5:57b06b4b47c6 358 }
defrost 5:57b06b4b47c6 359 /**
defrost 5:57b06b4b47c6 360 * Rotates one battery the ON_AIR batteries.
defrost 5:57b06b4b47c6 361 */
epgmdm 18:be77ad141fac 362 void Locker::doRotate()
epgmdm 18:be77ad141fac 363 {
defrost 5:57b06b4b47c6 364 DBG("Rotate");
defrost 5:57b06b4b47c6 365
defrost 5:57b06b4b47c6 366 // Select battery
defrost 5:57b06b4b47c6 367 for (int b = 0; b < 255; b++, battQP++) {
defrost 5:57b06b4b47c6 368 battQP %= 256;
defrost 5:57b06b4b47c6 369 //INFO(" Bat %d stat %d",battQP,battIn[battQP]);
defrost 5:57b06b4b47c6 370 if (battIn[battQP] == CHECKED_IN) {
defrost 5:57b06b4b47c6 371 pipeQP = (pipeQP) % 4;
defrost 5:57b06b4b47c6 372 for (int p = 0; p < 4; p++) {
defrost 5:57b06b4b47c6 373 // Select pipe
defrost 5:57b06b4b47c6 374
defrost 5:57b06b4b47c6 375 if ((battPipes[pipeQP] == 0)
defrost 5:57b06b4b47c6 376 && (battIn[battPipes[pipeQP]] != SENDING)) {
defrost 5:57b06b4b47c6 377 // Remove existing battery from pipes and place back in queue
defrost 5:57b06b4b47c6 378 if (battIn[battPipes[pipeQP]] == ON_AIR) {
defrost 5:57b06b4b47c6 379 battIn[battPipes[pipeQP]] = CHECKED_IN;
defrost 5:57b06b4b47c6 380 }
defrost 5:57b06b4b47c6 381 battPipes[pipeQP] = battQP; // New battery in
defrost 5:57b06b4b47c6 382 battIn[battQP] = ON_AIR;
defrost 5:57b06b4b47c6 383 // int address = (addrBattery & 0XFFFFFF00)|battQP;
defrost 5:57b06b4b47c6 384 long long address = openAddr | battQP;
defrost 5:57b06b4b47c6 385 nrf->setRxAddress(address, pipeQP + 2);
defrost 5:57b06b4b47c6 386 nrf->setPwrDown();
defrost 5:57b06b4b47c6 387 nrf->setPwrUp();
defrost 13:de43f28c0365 388 DBG("=====> Rotate battQ %d pipeQ %d Addr %llX", battQP, pipeQP, address);
defrost 5:57b06b4b47c6 389 DBG("Nrf Details:");
defrost 5:57b06b4b47c6 390 #ifdef DEBUG
defrost 5:57b06b4b47c6 391 nrf->printDetails();
defrost 5:57b06b4b47c6 392 #endif
defrost 5:57b06b4b47c6 393 break;
defrost 5:57b06b4b47c6 394 };
defrost 5:57b06b4b47c6 395 pipeQP = (pipeQP + 1) % 4;
defrost 5:57b06b4b47c6 396 }
defrost 5:57b06b4b47c6 397 break;
defrost 5:57b06b4b47c6 398 }
defrost 5:57b06b4b47c6 399
defrost 5:57b06b4b47c6 400 }
defrost 5:57b06b4b47c6 401
defrost 5:57b06b4b47c6 402 }
defrost 5:57b06b4b47c6 403 /**
defrost 5:57b06b4b47c6 404 * Take the info and saves to a file via a buffer.
defrost 5:57b06b4b47c6 405 **/
defrost 5:57b06b4b47c6 406 void Locker::saveFile (int p,char *data, int width)
defrost 5:57b06b4b47c6 407 {
defrost 5:57b06b4b47c6 408 *ledRed=!*ledRed;
defrost 5:57b06b4b47c6 409 memcpy (&sdBuffer[sdBuffPnt],data,width);
defrost 5:57b06b4b47c6 410 sdBuffPnt += width;
defrost 5:57b06b4b47c6 411 lengthFile[p] -= width;
defrost 5:57b06b4b47c6 412
defrost 5:57b06b4b47c6 413 //INFO("%d",lengthFile[p]);
defrost 5:57b06b4b47c6 414 if ( lengthFile[p] <=0) {
defrost 5:57b06b4b47c6 415 flushSDBuffer(p);
defrost 5:57b06b4b47c6 416 sdBuffPnt=0; // reset for next one
defrost 5:57b06b4b47c6 417 battIn[battPipes[p]] = ON_AIR;
defrost 5:57b06b4b47c6 418 INFO("saveFile> File saved: %s/%s ",dirNames[p], fileNames[p]);
defrost 5:57b06b4b47c6 419 *ledRed=1;
defrost 5:57b06b4b47c6 420 return;
defrost 5:57b06b4b47c6 421 }
defrost 5:57b06b4b47c6 422
defrost 5:57b06b4b47c6 423
defrost 5:57b06b4b47c6 424 if (sdBuffPnt >= SDBUFFERSIZE) {
defrost 5:57b06b4b47c6 425 DBG("Left %u",lengthFile[p]);
defrost 5:57b06b4b47c6 426 flushSDBuffer(p);
defrost 5:57b06b4b47c6 427 sdBuffPnt=0;
defrost 5:57b06b4b47c6 428
defrost 5:57b06b4b47c6 429 }
defrost 5:57b06b4b47c6 430
defrost 5:57b06b4b47c6 431 }
defrost 5:57b06b4b47c6 432 /**
defrost 5:57b06b4b47c6 433 * writes the sdbuffer to file
defrost 5:57b06b4b47c6 434 */
defrost 5:57b06b4b47c6 435 void Locker::flushSDBuffer(int p)
defrost 5:57b06b4b47c6 436 {
defrost 5:57b06b4b47c6 437 //INFO("z");
defrost 5:57b06b4b47c6 438 Timer t;
defrost 5:57b06b4b47c6 439 t.start();
defrost 5:57b06b4b47c6 440 strcpy(temp,dirNames[p]);
defrost 5:57b06b4b47c6 441 strcat(temp,"/");
defrost 5:57b06b4b47c6 442 strcat(temp,fileNames[p]);
defrost 5:57b06b4b47c6 443 //DBG("SD W %s",temp);
defrost 5:57b06b4b47c6 444 spiSD();
defrost 5:57b06b4b47c6 445 FILE *fp = fopen(temp,"ab");
defrost 5:57b06b4b47c6 446 if (fp!=NULL) {
defrost 5:57b06b4b47c6 447 fwrite(sdBuffer,1,sdBuffPnt,fp);
defrost 5:57b06b4b47c6 448 sdBuffPnt=0;
defrost 5:57b06b4b47c6 449 fclose(fp);
defrost 5:57b06b4b47c6 450 } else {
defrost 5:57b06b4b47c6 451 ;
defrost 5:57b06b4b47c6 452 }
epgmdm 11:87ab310924f0 453 spiNRF();
defrost 5:57b06b4b47c6 454 t.stop();
defrost 5:57b06b4b47c6 455 DBG("flush> Timer = %d ms %d us",t.read_ms(), t.read_us())
defrost 5:57b06b4b47c6 456 }
defrost 5:57b06b4b47c6 457
epgmdm 11:87ab310924f0 458 ///**
epgmdm 11:87ab310924f0 459 // * Set NRF as RX
epgmdm 11:87ab310924f0 460 // */
epgmdm 11:87ab310924f0 461 //void Locker::setAsRX(){
epgmdm 11:87ab310924f0 462 //
epgmdm 11:87ab310924f0 463 // spiNRF();
epgmdm 11:87ab310924f0 464 // nrf->quickRxSetup(chan, addrUtil); // Pipe 0
epgmdm 11:87ab310924f0 465 //
epgmdm 11:87ab310924f0 466 // nrf->setRadio(0x01, 0x03); // 2MB/S 0dB
epgmdm 11:87ab310924f0 467 // nrfFlush();
epgmdm 11:87ab310924f0 468 //}
epgmdm 11:87ab310924f0 469 //
epgmdm 11:87ab310924f0 470 ///**
epgmdm 11:87ab310924f0 471 // * Set NRF as TX
epgmdm 11:87ab310924f0 472 // */
epgmdm 11:87ab310924f0 473 //void Locker::setAsTX(){
epgmdm 11:87ab310924f0 474 // spiNRF();
epgmdm 11:87ab310924f0 475 //
epgmdm 11:87ab310924f0 476 //}
defrost 5:57b06b4b47c6 477
defrost 5:57b06b4b47c6 478 /**
epgmdm 11:87ab310924f0 479 * Turns a pod power on
defrost 5:57b06b4b47c6 480 */
epgmdm 18:be77ad141fac 481 void Locker::turnPodOn(int pod,int on)
epgmdm 18:be77ad141fac 482 {
epgmdm 11:87ab310924f0 483 DBG("Pod %d on %d",pod,on);
epgmdm 11:87ab310924f0 484 pods[pod]->write(on);
defrost 5:57b06b4b47c6 485 }