Versie 0.2 Het versturen via de NRF werkt nog niet helemaal omdat er per 4 bytes verstuurd moet worden. Wordt gefixt d.m.v. dynamic stuff!
Fork of rtos_basic by
main.cpp@7:88ba5138f810, 2016-04-29 (annotated)
- Committer:
- Reynier
- Date:
- Fri Apr 29 15:27:26 2016 +0000
- Revision:
- 7:88ba5138f810
- Parent:
- 3:c92e21f305d8
Versie 0.2 Het versturen via de NRF werkt nog niet helemaal omdat er per 4 bytes verstuurd moet worden. Wordt gefixt d.m.v. dynamic stuff!
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
Reynier | 7:88ba5138f810 | 1 | /* *** INCLUDE **********************************************************************/ |
Reynier | 7:88ba5138f810 | 2 | #include "mbed.h" |
Reynier | 7:88ba5138f810 | 3 | #include "rtos.h" |
Reynier | 7:88ba5138f810 | 4 | #include "nRF24L01P.h" |
Reynier | 7:88ba5138f810 | 5 | |
Reynier | 7:88ba5138f810 | 6 | /* *** DEFINE ***********************************************************************/ |
Reynier | 7:88ba5138f810 | 7 | #define sDestination_SIZE 20 |
Reynier | 7:88ba5138f810 | 8 | #define sMessage_SIZE 100 |
Reynier | 7:88ba5138f810 | 9 | |
Reynier | 7:88ba5138f810 | 10 | #define MF_RESET PC_13 |
Reynier | 7:88ba5138f810 | 11 | #define TRANSFER_SIZE_NRF 4 |
Reynier | 7:88ba5138f810 | 12 | #define TRANSFER_SIZE_UART 100 |
Reynier | 7:88ba5138f810 | 13 | #define nCS PA_15 |
Reynier | 7:88ba5138f810 | 14 | #define SCK PB_3 |
Reynier | 7:88ba5138f810 | 15 | #define MISO PB_4 |
Reynier | 7:88ba5138f810 | 16 | #define MOSI PB_5 |
Reynier | 7:88ba5138f810 | 17 | #define IRQ PB_6 |
Reynier | 7:88ba5138f810 | 18 | #define CE PB_7 |
Reynier | 7:88ba5138f810 | 19 | |
Reynier | 7:88ba5138f810 | 20 | /* *** THREADS **********************************************************************/ |
Reynier | 7:88ba5138f810 | 21 | void LED_thread(void const *args); |
Reynier | 7:88ba5138f810 | 22 | void MAIL_thread(void const *args); |
Reynier | 7:88ba5138f810 | 23 | |
Reynier | 7:88ba5138f810 | 24 | /* *** FUNCTIONS ********************************************************************/ |
Reynier | 7:88ba5138f810 | 25 | void initUART (void); |
Reynier | 7:88ba5138f810 | 26 | void initWireLess(void); |
Reynier | 7:88ba5138f810 | 27 | void UART_GetMessage(void); |
Reynier | 7:88ba5138f810 | 28 | void WLESS_GetMessage(void); |
Reynier | 7:88ba5138f810 | 29 | void flushCArray(char str[]); |
Reynier | 7:88ba5138f810 | 30 | |
Reynier | 7:88ba5138f810 | 31 | /* *** GLOBAL DATA ******************************************************************/ |
Reynier | 7:88ba5138f810 | 32 | // UART |
Reynier | 7:88ba5138f810 | 33 | Serial raspPi(USBTX, USBRX); |
Reynier | 7:88ba5138f810 | 34 | char getRaspPiData[TRANSFER_SIZE_UART], sendRaspPiData[TRANSFER_SIZE_UART]; |
Reynier | 7:88ba5138f810 | 35 | int getRaspPiDataCnt, sendRaspPiDataCnt = 0; |
Reynier | 7:88ba5138f810 | 36 | |
Reynier | 7:88ba5138f810 | 37 | // WIRELESS |
Reynier | 7:88ba5138f810 | 38 | InterruptIn irqWLESS(IRQ); |
Reynier | 7:88ba5138f810 | 39 | nRF24L01P NRF(MOSI, MISO, SCK, nCS, CE, IRQ); |
Reynier | 7:88ba5138f810 | 40 | char getWLESSData[TRANSFER_SIZE_NRF], sendWLESSData[TRANSFER_SIZE_NRF]; |
Reynier | 7:88ba5138f810 | 41 | int getWLESSDataCnt, sendWLESSDataCnt = 0; |
Reynier | 7:88ba5138f810 | 42 | unsigned long long myAdress = 0x010203; |
Reynier | 7:88ba5138f810 | 43 | unsigned long long otherAdress = 0x030201; |
Reynier | 7:88ba5138f810 | 44 | |
Reynier | 7:88ba5138f810 | 45 | |
Reynier | 7:88ba5138f810 | 46 | typedef struct mail_t { |
Reynier | 7:88ba5138f810 | 47 | char sDestination[sDestination_SIZE]; // Name of the Thread |
Reynier | 7:88ba5138f810 | 48 | char sMessage[sMessage_SIZE]; // Type here you message |
Reynier | 7:88ba5138f810 | 49 | }mail_t; |
Reynier | 7:88ba5138f810 | 50 | |
Reynier | 7:88ba5138f810 | 51 | Mail<mail_t, 10> mailBox; |
Reynier | 7:88ba5138f810 | 52 | mail_t *mail; |
Reynier | 7:88ba5138f810 | 53 | |
emilmont | 1:491820ee784d | 54 | DigitalOut led2(LED2); |
Reynier | 7:88ba5138f810 | 55 | //Use for debug!! |
Reynier | 7:88ba5138f810 | 56 | DigitalOut check1(PB_15); |
Reynier | 7:88ba5138f810 | 57 | DigitalOut check2(PB_14); |
Reynier | 7:88ba5138f810 | 58 | DigitalOut check3(PB_13); |
Reynier | 7:88ba5138f810 | 59 | // End debug |
Reynier | 7:88ba5138f810 | 60 | |
Reynier | 7:88ba5138f810 | 61 | /* *** MAIN *************************************************************************/ |
Reynier | 7:88ba5138f810 | 62 | int main() { |
Reynier | 7:88ba5138f810 | 63 | |
Reynier | 7:88ba5138f810 | 64 | Thread threadLED(LED_thread); |
Reynier | 7:88ba5138f810 | 65 | Thread threadMAIL(MAIL_thread); |
Reynier | 7:88ba5138f810 | 66 | initUART(); |
Reynier | 7:88ba5138f810 | 67 | initWireLess(); |
Reynier | 7:88ba5138f810 | 68 | irqWLESS.fall(&WLESS_GetMessage); |
Reynier | 7:88ba5138f810 | 69 | |
Reynier | 7:88ba5138f810 | 70 | while(1) { |
Reynier | 7:88ba5138f810 | 71 | ; |
emilmont | 1:491820ee784d | 72 | } |
emilmont | 1:491820ee784d | 73 | } |
Reynier | 7:88ba5138f810 | 74 | |
Reynier | 7:88ba5138f810 | 75 | /* *** LED THREAD *******************************************************************/ |
Reynier | 7:88ba5138f810 | 76 | void LED_thread(void const *args) { |
Reynier | 7:88ba5138f810 | 77 | while (true) { |
Reynier | 7:88ba5138f810 | 78 | led2 = !led2; |
Reynier | 7:88ba5138f810 | 79 | Thread::wait(500); |
Reynier | 7:88ba5138f810 | 80 | } |
Reynier | 7:88ba5138f810 | 81 | } |
Reynier | 7:88ba5138f810 | 82 | |
Reynier | 7:88ba5138f810 | 83 | /* *** MAIL THREAD ******************************************************************/ |
Reynier | 7:88ba5138f810 | 84 | void MAIL_thread(void const *args) { |
Reynier | 7:88ba5138f810 | 85 | while(true) { |
Reynier | 7:88ba5138f810 | 86 | osEvent evt = mailBox.get(); |
Reynier | 7:88ba5138f810 | 87 | /* |
Reynier | 7:88ba5138f810 | 88 | if (evt.status == osEventMail) { |
Reynier | 7:88ba5138f810 | 89 | if (strcmp(mail->sDestination, "WLESS") == 0) { |
Reynier | 7:88ba5138f810 | 90 | // functie aanroepen voor de NRF |
Reynier | 7:88ba5138f810 | 91 | } |
Reynier | 7:88ba5138f810 | 92 | else if (strcmp(mail->sDestination, "UART") == 0) { |
Reynier | 7:88ba5138f810 | 93 | // functie aanroepen voor de UART |
Reynier | 7:88ba5138f810 | 94 | } |
Reynier | 7:88ba5138f810 | 95 | else if (strcmp(mail->sDestination, "LED") == 0) { |
Reynier | 7:88ba5138f810 | 96 | // functie aanroepen voor de LED |
Reynier | 7:88ba5138f810 | 97 | } |
Reynier | 7:88ba5138f810 | 98 | mailBox.free(mail); |
Reynier | 7:88ba5138f810 | 99 | } |
Reynier | 7:88ba5138f810 | 100 | */ |
Reynier | 7:88ba5138f810 | 101 | if (evt.status == osEventMail) { |
Reynier | 7:88ba5138f810 | 102 | if (strcmp(mail->sDestination, "WLESS") == 0) { |
Reynier | 7:88ba5138f810 | 103 | |
Reynier | 7:88ba5138f810 | 104 | raspPi.printf("Data from mail: %s ", mail->sMessage); |
Reynier | 7:88ba5138f810 | 105 | |
Reynier | 7:88ba5138f810 | 106 | sendWLESSDataCnt = 0; |
Reynier | 7:88ba5138f810 | 107 | // Deze functie werkt nog helemaal omdat er per 4 bytes verstuurd moeten worden... |
Reynier | 7:88ba5138f810 | 108 | // Wanneer dit aangepast wordt doet hij het voor 100%! |
Reynier | 7:88ba5138f810 | 109 | for (int sndData = 0; mail->sMessage[sndData] != '!'; sndData++) { |
Reynier | 7:88ba5138f810 | 110 | |
Reynier | 7:88ba5138f810 | 111 | |
Reynier | 7:88ba5138f810 | 112 | sendWLESSData[sendWLESSDataCnt++] = mail->sMessage[sndData]; |
Reynier | 7:88ba5138f810 | 113 | |
Reynier | 7:88ba5138f810 | 114 | if (sendWLESSDataCnt == TRANSFER_SIZE_NRF) { |
Reynier | 7:88ba5138f810 | 115 | |
Reynier | 7:88ba5138f810 | 116 | NRF.write( NRF24L01P_PIPE_P0, sendWLESSData, TRANSFER_SIZE_NRF); |
Reynier | 7:88ba5138f810 | 117 | sendWLESSDataCnt = 0; |
Reynier | 7:88ba5138f810 | 118 | } |
Reynier | 7:88ba5138f810 | 119 | else if (mail->sMessage[sndData] == '!') { |
Reynier | 7:88ba5138f810 | 120 | |
Reynier | 7:88ba5138f810 | 121 | for (int sndRestData = sendWLESSDataCnt; sndRestData <= TRANSFER_SIZE_NRF; sndRestData++) { |
Reynier | 7:88ba5138f810 | 122 | sendWLESSData[sndRestData] = 0; |
Reynier | 7:88ba5138f810 | 123 | } |
Reynier | 7:88ba5138f810 | 124 | NRF.write( NRF24L01P_PIPE_P0, sendWLESSData, TRANSFER_SIZE_NRF ); |
Reynier | 7:88ba5138f810 | 125 | } |
Reynier | 7:88ba5138f810 | 126 | } |
Reynier | 7:88ba5138f810 | 127 | |
Reynier | 7:88ba5138f810 | 128 | flushCArray(sendWLESSData); |
Reynier | 7:88ba5138f810 | 129 | mailBox.free(mail); |
Reynier | 7:88ba5138f810 | 130 | } |
Reynier | 7:88ba5138f810 | 131 | } |
Reynier | 7:88ba5138f810 | 132 | Thread::wait(100); |
Reynier | 7:88ba5138f810 | 133 | } |
Reynier | 7:88ba5138f810 | 134 | } |
Reynier | 7:88ba5138f810 | 135 | |
Reynier | 7:88ba5138f810 | 136 | /* *** INIT UART ********************************************************************/ |
Reynier | 7:88ba5138f810 | 137 | void initUART () { |
Reynier | 7:88ba5138f810 | 138 | raspPi.baud(9600); |
Reynier | 7:88ba5138f810 | 139 | raspPi.attach(&UART_GetMessage); |
Reynier | 7:88ba5138f810 | 140 | flushCArray(getRaspPiData); |
Reynier | 7:88ba5138f810 | 141 | flushCArray(sendRaspPiData); |
Reynier | 7:88ba5138f810 | 142 | raspPi.printf("Hi, from NUCLEO! \r\n"); |
Reynier | 7:88ba5138f810 | 143 | } |
Reynier | 7:88ba5138f810 | 144 | |
Reynier | 7:88ba5138f810 | 145 | |
Reynier | 7:88ba5138f810 | 146 | /* *** INIT WIRELESS ****************************************************************/ |
Reynier | 7:88ba5138f810 | 147 | void initWireLess() { |
Reynier | 7:88ba5138f810 | 148 | flushCArray(getWLESSData); |
Reynier | 7:88ba5138f810 | 149 | flushCArray(sendWLESSData); |
Reynier | 7:88ba5138f810 | 150 | |
Reynier | 7:88ba5138f810 | 151 | NRF.powerUp(); |
Reynier | 7:88ba5138f810 | 152 | NRF.setTransferSize( TRANSFER_SIZE_NRF ); |
Reynier | 7:88ba5138f810 | 153 | NRF.setTxAddress(otherAdress, 3); |
Reynier | 7:88ba5138f810 | 154 | NRF.setRxAddress(otherAdress, 3, NRF24L01P_PIPE_P0); |
Reynier | 7:88ba5138f810 | 155 | NRF.enableAutoAcknowledge(NRF24L01P_PIPE_P0); |
Reynier | 7:88ba5138f810 | 156 | NRF.enableAutoRetransmit(1000, 10); |
Reynier | 7:88ba5138f810 | 157 | NRF.setAirDataRate(NRF24L01P_DATARATE_250_KBPS); |
Reynier | 7:88ba5138f810 | 158 | NRF.setRfOutputPower(NRF24L01P_TX_PWR_ZERO_DB); |
Reynier | 7:88ba5138f810 | 159 | NRF.setRxAddress(myAdress, 3, NRF24L01P_PIPE_P1); |
Reynier | 7:88ba5138f810 | 160 | NRF.setRfFrequency(2500); |
emilmont | 1:491820ee784d | 161 | |
Reynier | 7:88ba5138f810 | 162 | NRF.setReceiveMode(); |
Reynier | 7:88ba5138f810 | 163 | NRF.enable(); |
Reynier | 7:88ba5138f810 | 164 | |
Reynier | 7:88ba5138f810 | 165 | // USE FOR DEBUG |
Reynier | 7:88ba5138f810 | 166 | raspPi.printf( "NRF+ Frequency : %d MHz\r\n", NRF.getRfFrequency() ); |
Reynier | 7:88ba5138f810 | 167 | raspPi.printf( "NRF+ Output power : %d dBm\r\n", NRF.getRfOutputPower() ); |
Reynier | 7:88ba5138f810 | 168 | raspPi.printf( "NRF+ Data Rate : %d kbps\r\n", NRF.getAirDataRate() ); |
Reynier | 7:88ba5138f810 | 169 | raspPi.printf( "NRF+ TX Address : 0x%010llX\r\n", NRF.getTxAddress() ); |
Reynier | 7:88ba5138f810 | 170 | raspPi.printf( "NRF+ RX0 Address : 0x%010llX\r\n", NRF.getRxAddress(0) ); |
Reynier | 7:88ba5138f810 | 171 | raspPi.printf( "NRF+ RX1 Address : 0x%010llX\r\n", NRF.getRxAddress(1) ); |
Reynier | 7:88ba5138f810 | 172 | raspPi.printf( "Type keys to test transfers:\r\n (transfers are grouped into %d characters)\r\n", TRANSFER_SIZE_NRF ); |
Reynier | 7:88ba5138f810 | 173 | |
Reynier | 7:88ba5138f810 | 174 | } |
Reynier | 7:88ba5138f810 | 175 | |
Reynier | 7:88ba5138f810 | 176 | /* *** UART GET MESSAGE *************************************************************/ |
Reynier | 7:88ba5138f810 | 177 | void UART_GetMessage () { |
Reynier | 7:88ba5138f810 | 178 | |
Reynier | 7:88ba5138f810 | 179 | if (getRaspPiDataCnt <= TRANSFER_SIZE_UART){ |
Reynier | 7:88ba5138f810 | 180 | getRaspPiData[getRaspPiDataCnt] = raspPi.getc(); |
Reynier | 7:88ba5138f810 | 181 | raspPi.putc(getRaspPiData[getRaspPiDataCnt]); |
Reynier | 7:88ba5138f810 | 182 | getRaspPiDataCnt++; |
emilmont | 1:491820ee784d | 183 | } |
Reynier | 7:88ba5138f810 | 184 | |
Reynier | 7:88ba5138f810 | 185 | if(getRaspPiData[getRaspPiDataCnt-1] == '!'){ |
Reynier | 7:88ba5138f810 | 186 | mail = mailBox.alloc(); |
Reynier | 7:88ba5138f810 | 187 | //strncpy (mail->sDestination, "WLESS", strlen("WLESS")); |
Reynier | 7:88ba5138f810 | 188 | //strncpy (mail->sMessage, getRaspPiData, getRaspPiDataCnt-1); |
Reynier | 7:88ba5138f810 | 189 | strcpy (mail->sDestination, "WLESS"); |
Reynier | 7:88ba5138f810 | 190 | strcpy (mail->sMessage, getRaspPiData); |
Reynier | 7:88ba5138f810 | 191 | mailBox.put(mail); |
Reynier | 7:88ba5138f810 | 192 | getRaspPiDataCnt = 0; |
Reynier | 7:88ba5138f810 | 193 | flushCArray(getRaspPiData); |
Reynier | 7:88ba5138f810 | 194 | } |
emilmont | 1:491820ee784d | 195 | } |
Reynier | 7:88ba5138f810 | 196 | |
Reynier | 7:88ba5138f810 | 197 | /* *** WIRELESS GET MESSAGE *********************************************************/ |
Reynier | 7:88ba5138f810 | 198 | void WLESS_GetMessage () { |
Reynier | 7:88ba5138f810 | 199 | // Deze functie nog niet getest! |
Reynier | 7:88ba5138f810 | 200 | getWLESSDataCnt = NRF.read( NRF24L01P_PIPE_P0, getWLESSData, sizeof( getWLESSData ) ); |
Reynier | 7:88ba5138f810 | 201 | |
Reynier | 7:88ba5138f810 | 202 | for ( int i = 0; getWLESSDataCnt > 0; getWLESSDataCnt--, i++ ) { |
Reynier | 7:88ba5138f810 | 203 | raspPi.putc( getWLESSData[i] ); |
Reynier | 7:88ba5138f810 | 204 | } |
Reynier | 7:88ba5138f810 | 205 | } |
Reynier | 7:88ba5138f810 | 206 | |
Reynier | 7:88ba5138f810 | 207 | /* *** FLUSH CHAR ARRAY *************************************************************/ |
Reynier | 7:88ba5138f810 | 208 | void flushCArray(char str[]) { |
Reynier | 7:88ba5138f810 | 209 | memset(str, '\n', strlen(str)); |
Reynier | 7:88ba5138f810 | 210 | } |