The field version of the solarnano grid on the ionQubes
Fork of SolarNanoGridv3 by
Locker/Locker.cpp@13:de43f28c0365, 2016-06-10 (annotated)
- 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?
User | Revision | Line number | New 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 | } |