The field version of the solarnano grid on the ionQubes
Fork of SolarNanoGridv3 by
Locker/Locker.cpp@36:a5620262f296, 2016-09-06 (annotated)
- 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?
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 | 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 | } |