working version of song control with initialization from sd card

Dependencies:   MFRC522 NRF2401P SDFileSystem SPI_TFT_ILI9341 TFT_fonts mbed

Fork of Song_Control by Malcolm McCulloch

Committer:
dxyang
Date:
Mon Feb 29 14:53:35 2016 +0000
Revision:
9:72e93d9ddc8c
Parent:
2:d1eae91343a9
added posh logging

Who changed what in which revision?

UserRevisionLine numberNew contents of line
epgmdm 0:c0f34d23943d 1 /**
epgmdm 0:c0f34d23943d 2 * All the code associated to run the mbed as a locker.
epgmdm 0:c0f34d23943d 3 * Link with hub
epgmdm 0:c0f34d23943d 4 * Link with battery
epgmdm 0:c0f34d23943d 5 */
epgmdm 0:c0f34d23943d 6 #include "mbed.h"
epgmdm 0:c0f34d23943d 7 #include "utils.h"
epgmdm 2:d1eae91343a9 8 #include "NRF2401P.h"
epgmdm 0:c0f34d23943d 9 #define debug
epgmdm 0:c0f34d23943d 10
epgmdm 0:c0f34d23943d 11 // Flags
epgmdm 2:d1eae91343a9 12 unsigned char flagNrfReceive = 0;
epgmdm 0:c0f34d23943d 13 // Variables
epgmdm 2:d1eae91343a9 14 char nrfStateL;
epgmdm 2:d1eae91343a9 15 float currentMaxL = 1.5; // Maximum current that each cube can consume.
epgmdm 2:d1eae91343a9 16
epgmdm 0:c0f34d23943d 17 // tx nRF2401
epgmdm 0:c0f34d23943d 18
epgmdm 0:c0f34d23943d 19 long long addrHub=0xBBBBBBBBBB;
epgmdm 2:d1eae91343a9 20 extern NRF2401P nrf1;
epgmdm 1:c2232b1eaf31 21 extern int channel;
epgmdm 2:d1eae91343a9 22 InterruptIn nrf1IntL(PTC18); // IRQ of nRF24
epgmdm 2:d1eae91343a9 23
epgmdm 2:d1eae91343a9 24 // -----------------------------------------------------------------------------
epgmdm 2:d1eae91343a9 25 // Interupt routines
epgmdm 2:d1eae91343a9 26 // -----------------------------------------------------------------------------
epgmdm 2:d1eae91343a9 27 /**
epgmdm 2:d1eae91343a9 28 * Interrupt from nrf
epgmdm 2:d1eae91343a9 29 *
epgmdm 2:d1eae91343a9 30 * RX_DR Data Ready RX FIFO interrupt.
epgmdm 2:d1eae91343a9 31 * TX_DS Data Sent TX FIFO interrupt. Asserted when packet transmitted on TX.
epgmdm 2:d1eae91343a9 32 * - - If AUTO_ACK is activated, this bit is set high only when ACK is received.
epgmdm 2:d1eae91343a9 33 * MAX_RT Maximum number of TX retransmits interrupt (tx failed)
epgmdm 2:d1eae91343a9 34 * TX_FULL TX FIFO full flag.
epgmdm 2:d1eae91343a9 35 */
epgmdm 2:d1eae91343a9 36 void intNrfL(){
epgmdm 2:d1eae91343a9 37 spiNrf();
epgmdm 2:d1eae91343a9 38 flagNrfReceive = nrf1.checkStatus();
epgmdm 2:d1eae91343a9 39 if ((flagNrfReceive >>6) &0x01) { // RX_DR - RX ready
epgmdm 2:d1eae91343a9 40 flagNrfReceive = 1;
epgmdm 2:d1eae91343a9 41 }
epgmdm 2:d1eae91343a9 42 }
epgmdm 0:c0f34d23943d 43
epgmdm 2:d1eae91343a9 44 void doNrfL(){
epgmdm 2:d1eae91343a9 45 int width;
epgmdm 2:d1eae91343a9 46 char data[33];
epgmdm 2:d1eae91343a9 47 #ifdef debug
epgmdm 2:d1eae91343a9 48 printf("intNrf %02X %s \n\r",nrf1.status, nrf1.statusString());
epgmdm 2:d1eae91343a9 49 #endif
epgmdm 2:d1eae91343a9 50 spiNrf();
epgmdm 2:d1eae91343a9 51 char pipe = (nrf1.checkStatus() >> 1) & 7;
epgmdm 2:d1eae91343a9 52 width= nrf1.getRxData(data);
epgmdm 2:d1eae91343a9 53 data[width]='\0';
epgmdm 2:d1eae91343a9 54 // Now check which pipe
epgmdm 2:d1eae91343a9 55 if (pipe==0) { //The hub
epgmdm 2:d1eae91343a9 56 // Check command
epgmdm 2:d1eae91343a9 57 switch (data[0]){
epgmdm 2:d1eae91343a9 58 case ('T'):{ // Time signal
epgmdm 2:d1eae91343a9 59 time_t newTime;
epgmdm 2:d1eae91343a9 60 sscanf (data,"%*c %x",&newTime);
epgmdm 2:d1eae91343a9 61 set_time(newTime);
epgmdm 2:d1eae91343a9 62 printf(" New Time %s\n\r", ctime(&newTime));
epgmdm 2:d1eae91343a9 63 break;
epgmdm 2:d1eae91343a9 64 }
epgmdm 2:d1eae91343a9 65 case ('I'):{ // maxCurrent
epgmdm 2:d1eae91343a9 66 sscanf (data,"%*c %x",&currentMaxL);
epgmdm 2:d1eae91343a9 67 printf(" New Current %4.2f\n\r",currentMaxL);
epgmdm 2:d1eae91343a9 68 break;
epgmdm 2:d1eae91343a9 69 }
epgmdm 2:d1eae91343a9 70 }
epgmdm 2:d1eae91343a9 71 }
epgmdm 2:d1eae91343a9 72 printf("==>RX Pipe %d [%d]:%s: %s\n\r",pipe, width, data, nrf1.statusString());
epgmdm 2:d1eae91343a9 73 nrf1.clearStatus();
epgmdm 2:d1eae91343a9 74 }
epgmdm 2:d1eae91343a9 75 // -----------------------------------------------------------------------------
epgmdm 0:c0f34d23943d 76 // Initializaton
epgmdm 2:d1eae91343a9 77 // -----------------------------------------------------------------------------
epgmdm 2:d1eae91343a9 78
epgmdm 2:d1eae91343a9 79 /**
epgmdm 2:d1eae91343a9 80 * Sets up the interrupts for the locker
epgmdm 2:d1eae91343a9 81 */
epgmdm 2:d1eae91343a9 82 void initInteruptsLocker(){
epgmdm 2:d1eae91343a9 83 nrf1IntL.fall(&intNrfL); // attach nrf
epgmdm 2:d1eae91343a9 84 }
epgmdm 2:d1eae91343a9 85
epgmdm 2:d1eae91343a9 86
epgmdm 0:c0f34d23943d 87 /**
epgmdm 0:c0f34d23943d 88 * Initialise for a locker
epgmdm 0:c0f34d23943d 89 */
epgmdm 0:c0f34d23943d 90 void initialiseLocker(FILE *fp){
epgmdm 0:c0f34d23943d 91 #ifdef debug
epgmdm 0:c0f34d23943d 92 printf("Initialise Locker\n\r");
epgmdm 0:c0f34d23943d 93 #endif
epgmdm 0:c0f34d23943d 94
epgmdm 0:c0f34d23943d 95 // Read in hub address and channel
epgmdm 0:c0f34d23943d 96 if (fscanf (fp,"%x %*c %*s",&channel )!=1) writeError("Locker config: cannot read channel");
epgmdm 0:c0f34d23943d 97 if (fscanf (fp,"%llx %*c %*s",&addrHub )!=1) writeError("Locker config: cannot read hub address");
epgmdm 0:c0f34d23943d 98
epgmdm 0:c0f34d23943d 99 #ifdef debug
epgmdm 0:c0f34d23943d 100 printf(" Channel:%x, Hub Address %llx \n\r",channel, addrHub);
epgmdm 0:c0f34d23943d 101 #endif
epgmdm 2:d1eae91343a9 102 // Setup nrf
epgmdm 0:c0f34d23943d 103
epgmdm 2:d1eae91343a9 104 #ifdef debug
epgmdm 2:d1eae91343a9 105 printf("Steup doNrf \n\r");
epgmdm 2:d1eae91343a9 106 #endif
epgmdm 2:d1eae91343a9 107 spiNrf();
epgmdm 2:d1eae91343a9 108 nrf1.quickRxSetup(channel, addrHub);
epgmdm 2:d1eae91343a9 109 #ifdef debug
epgmdm 2:d1eae91343a9 110 nrf1.printDetails();
epgmdm 2:d1eae91343a9 111 nrf1.checkStatus();
epgmdm 2:d1eae91343a9 112 printf("Setup doNrf complete [nrf:%s]\n\r",nrf1.statusString());
epgmdm 2:d1eae91343a9 113 #endif
epgmdm 2:d1eae91343a9 114
epgmdm 2:d1eae91343a9 115 // Setup interupts
epgmdm 2:d1eae91343a9 116 initInteruptsLocker();
epgmdm 0:c0f34d23943d 117
epgmdm 0:c0f34d23943d 118 }
epgmdm 0:c0f34d23943d 119 // Interupt routines
epgmdm 0:c0f34d23943d 120
epgmdm 0:c0f34d23943d 121
epgmdm 0:c0f34d23943d 122 // Loop through slow routines
epgmdm 0:c0f34d23943d 123
epgmdm 0:c0f34d23943d 124 void loopLocker(){
epgmdm 2:d1eae91343a9 125 if (flagNrfReceive){
epgmdm 2:d1eae91343a9 126 doNrfL();
epgmdm 2:d1eae91343a9 127 flagNrfReceive = 0;
epgmdm 2:d1eae91343a9 128 }
epgmdm 0:c0f34d23943d 129
epgmdm 0:c0f34d23943d 130 }