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
locker.cpp@9:72e93d9ddc8c, 2016-02-29 (annotated)
- 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?
User | Revision | Line number | New 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",¤tMaxL); |
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 | } |