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!

Dependencies:   RTOS mbed

Fork of rtos_basic by mbed official

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?

UserRevisionLine numberNew 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 // MAIL
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 }