The field version of the solarnano grid on the ionQubes

Fork of SolarNanoGridv3 by SONG Project

Committer:
adrienBiz
Date:
Fri Jun 03 13:43:11 2016 +0000
Revision:
9:541c2ae1cfec
Parent:
5:57b06b4b47c6
Child:
10:30c9e8df0032
Fixed the variable initialisation in locker.h and locker.cpp

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