The field version of the solarnano grid on the ionQubes

Fork of SolarNanoGridv3 by SONG Project

Committer:
defrost
Date:
Fri Jun 10 14:17:38 2016 +0000
Revision:
13:de43f28c0365
Parent:
11:87ab310924f0
Child:
18:be77ad141fac
- File transmission is starting to work, it still does not complete.; - Fixed all of the warnings in the code. Many of them were related to 'regular' string format specifiers being used with 'long' variables. %x -> %llx.

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