Projet_S5 / Mbed 2 deprecated Repo_Noeud_Mobile_refactor

Dependencies:   mbed-rtos mbed

Fork of Repo_Noeud_Mobile by Projet_S5

Committer:
groygirard
Date:
Sat Apr 11 22:55:35 2015 +0000
Revision:
52:10fb8ca4ed03
Parent:
51:299408ceee3a
Child:
54:8709cb24abe3
Xbee communication fix, some testing code still polluting the repo.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
llarose 1:601d2922ff06 1 /* S5 Projet - Conception d'un systeme embarque reseaute
llarose 1:601d2922ff06 2 * main.cpp
groygirard 6:fd1bf5563299 3 *
llarose 1:601d2922ff06 4 * @author Equipe de projet 2
groygirard 6:fd1bf5563299 5 *
llarose 1:601d2922ff06 6 */
groygirard 14:bda91cead7f2 7
groygirard 6:fd1bf5563299 8 // System libraries
llarose 1:601d2922ff06 9 #include "mbed.h"
llarose 1:601d2922ff06 10 #include "rtos.h"
groygirard 14:bda91cead7f2 11
groygirard 6:fd1bf5563299 12 // Proprietary libraries
groygirard 8:51f6c8f59449 13 #include "Cible.h"
groygirard 6:fd1bf5563299 14 #include "CountDown.h"
llarose 1:601d2922ff06 15 #include "FlexSensor.h"
groygirard 6:fd1bf5563299 16 #include "MMA8452Q.h"
llarose 22:cccb77300fd5 17 #include "Structure.h"
llarose 22:cccb77300fd5 18 #include "Xbee.h"
groygirard 14:bda91cead7f2 19
llarose 1:601d2922ff06 20 #define GO 0x01
llarose 48:bc531288c220 21 #define ACTIVATE_FLEX 1
Thierry19 50:48e8da5fc1ae 22 #define ACTIVATE_ACCEL 1
groygirard 52:10fb8ca4ed03 23 #define XBEE_TRANSMIT 3
groygirard 14:bda91cead7f2 24
groygirard 12:ebb08773dbdb 25 Serial m_pc(USBTX, USBRX);
llarose 22:cccb77300fd5 26 LocalFileSystem local("local"); // file system for config.txt
groygirard 14:bda91cead7f2 27
groygirard 6:fd1bf5563299 28 //PROTOTYPES DE FONCTION
llarose 1:601d2922ff06 29 void gunner(void const* args);
llarose 1:601d2922ff06 30 void rps(void const* args);
llarose 1:601d2922ff06 31 void airGuitar(void const* args);
llarose 17:1a634bb615f3 32 void flex(void const* args);
groygirard 52:10fb8ca4ed03 33 void transmit_xbee_data(void const* args);
groygirard 15:dc18545822b3 34 void analyze_sensor_data(void const* args);
groygirard 26:5700cde2350b 35 void configure_GUNNER();
groygirard 26:5700cde2350b 36 void configure_RPS();
groygirard 26:5700cde2350b 37 void configure_GUITAR();
llarose 22:cccb77300fd5 38 void ReadConfig();
groygirard 25:184915935d68 39 void timer2_init(void);
Thierry19 50:48e8da5fc1ae 40 void GetGameMode(void const* args);
groygirard 14:bda91cead7f2 41
groygirard 12:ebb08773dbdb 42 uint8_t play = 0;
Thierry19 50:48e8da5fc1ae 43 uint8_t windup = 0;
groygirard 14:bda91cead7f2 44
llarose 48:bc531288c220 45 FlexSensor flexSensors(p18, p19, p20, p17); // flex sensor 1.
groygirard 6:fd1bf5563299 46 Accel accel;
groygirard 25:184915935d68 47 flex_t flex_data;
groygirard 52:10fb8ca4ed03 48 Mobile_Vers_Fixe mail_mvf;
Thierry19 50:48e8da5fc1ae 49 //RtosTimer *sync;
groygirard 52:10fb8ca4ed03 50 GameMode_e mode = WAITING;
llarose 22:cccb77300fd5 51 short PanId;
pete1801 45:20f5867f15de 52 char GantID;
pete1801 39:558cd5780490 53 Xbee xbee;
groygirard 14:bda91cead7f2 54
groygirard 52:10fb8ca4ed03 55 Thread *threads[4];
groygirard 6:fd1bf5563299 56 Thread* gunner_thread_ptr = NULL; // Possiblement mettre dans un tableau
groygirard 6:fd1bf5563299 57 Thread* rps_thread_ptr = NULL; // avec des position codees
groygirard 6:fd1bf5563299 58 Thread* airguitar_thread_ptr = NULL; // dans des define. guillaume
llarose 17:1a634bb615f3 59 Thread* flex_thread_ptr = NULL; // Lecture des entrées analogiques
pete1801 39:558cd5780490 60 Thread* Thread_Send_Data_To_Fixe = NULL;// Thread pour envoyer les données des sensors au fixe
groygirard 52:10fb8ca4ed03 61 Thread* transmit_xbee_data_thread_ptr = NULL;
groygirard 14:bda91cead7f2 62
Thierry19 50:48e8da5fc1ae 63 Thread* xbeeReceive = NULL;
Thierry19 50:48e8da5fc1ae 64 Thread* threadGetGameMode = NULL;
groygirard 14:bda91cead7f2 65
groygirard 14:bda91cead7f2 66
groygirard 25:184915935d68 67 extern "C" void TIMER2_IRQHandler(void)
groygirard 25:184915935d68 68 {
groygirard 25:184915935d68 69 /*Flag du decodage - s'execute a chaque fronts, descendants et montants*/
groygirard 25:184915935d68 70 if ((LPC_TIM2->IR & 0x20) == 0x20) {
groygirard 25:184915935d68 71 LPC_TIM2->IR |= 0x20; // clear Timer2 interrupt register
groygirard 29:9a932d354ae3 72 threads[mode]->signal_set(0x02);
groygirard 25:184915935d68 73 }
groygirard 25:184915935d68 74 }
groygirard 14:bda91cead7f2 75
Thierry19 50:48e8da5fc1ae 76 //Fonction qui part le thread
Thierry19 50:48e8da5fc1ae 77 void startXbeeReceive(void const* args)
Thierry19 50:48e8da5fc1ae 78 {
Thierry19 50:48e8da5fc1ae 79 xbee.Recevoir();
Thierry19 50:48e8da5fc1ae 80 }
groygirard 14:bda91cead7f2 81
Thierry19 50:48e8da5fc1ae 82 int main(void const* args)
llarose 1:601d2922ff06 83 {
pete1801 30:389d09853cd1 84 m_pc.printf("\r\n==== PROGRAM START MOBILE ====\r\n");
groygirard 6:fd1bf5563299 85 // Initializing the accelerometer
groygirard 26:5700cde2350b 86
llarose 22:cccb77300fd5 87 ReadConfig(); //read config file
pete1801 30:389d09853cd1 88 m_pc.printf("PANID %x\r\n", PanId);
pete1801 39:558cd5780490 89 xbee = Xbee(PanId, p13, p14); //set PAN ID
Thierry19 50:48e8da5fc1ae 90 xbeeReceive = new Thread(startXbeeReceive);
Thierry19 50:48e8da5fc1ae 91 threadGetGameMode = new Thread(GetGameMode);
groygirard 26:5700cde2350b 92
groygirard 26:5700cde2350b 93 #if ACTIVATE_ACCEL
groygirard 6:fd1bf5563299 94 accel = Accel();
groygirard 6:fd1bf5563299 95 accel.init_MMA8452();
groygirard 25:184915935d68 96 timer2_init();
groygirard 26:5700cde2350b 97 #endif
groygirard 52:10fb8ca4ed03 98 transmit_xbee_data_thread_ptr = new Thread(transmit_xbee_data);
Thierry19 50:48e8da5fc1ae 99 gunner_thread_ptr = new Thread(gunner);
Thierry19 50:48e8da5fc1ae 100 flex_thread_ptr = new Thread(flex);
Thierry19 50:48e8da5fc1ae 101 rps_thread_ptr = new Thread(rps);
groygirard 52:10fb8ca4ed03 102
Thierry19 50:48e8da5fc1ae 103 airguitar_thread_ptr = new Thread(airGuitar);
Thierry19 50:48e8da5fc1ae 104
groygirard 29:9a932d354ae3 105 threads[GUNNER] = gunner_thread_ptr;
groygirard 29:9a932d354ae3 106 threads[RPS] = rps_thread_ptr;
groygirard 29:9a932d354ae3 107 threads[AirGuitar] = airguitar_thread_ptr;
groygirard 52:10fb8ca4ed03 108 threads[XBEE_TRANSMIT] = transmit_xbee_data_thread_ptr;
groygirard 29:9a932d354ae3 109
Thierry19 50:48e8da5fc1ae 110 while(true) {
Thierry19 50:48e8da5fc1ae 111 }
llarose 1:601d2922ff06 112 }
groygirard 14:bda91cead7f2 113
groygirard 25:184915935d68 114 void timer2_init(void)
groygirard 12:ebb08773dbdb 115 {
groygirard 25:184915935d68 116 LPC_PINCON->PINSEL0 |= 0xc00; // set P0.5 to CAP2.1
llarose 48:bc531288c220 117 LPC_PINCON->PINMODE0 |= 0xc00; // pull-down enable
groygirard 25:184915935d68 118 LPC_SC->PCONP |= (1 << 22); // Timer2 power on
groygirard 25:184915935d68 119 LPC_SC->PCLKSEL1 |= (1 << 12); // Divide CCLK by 1 for Timer2
groygirard 25:184915935d68 120 LPC_TIM2->CCR |= 0x30; // set cap2.1 rising-edge/falling-edge and interrupt
groygirard 25:184915935d68 121 LPC_TIM2->TCR |= (1 << 0); // start Timer2
groygirard 25:184915935d68 122 LPC_TIM2->EMR = 0x20; //
groygirard 25:184915935d68 123 LPC_TIM2->IR |= 0xFFFFFFFF;
groygirard 25:184915935d68 124 NVIC_EnableIRQ(TIMER2_IRQn);
llarose 1:601d2922ff06 125 }
groygirard 14:bda91cead7f2 126
llarose 17:1a634bb615f3 127 void flex(void const* args)
llarose 17:1a634bb615f3 128 {
llarose 17:1a634bb615f3 129 flexSensors.Run();
llarose 17:1a634bb615f3 130 }
llarose 17:1a634bb615f3 131
pete1801 46:5fdd45fef08d 132 void GetGameMode(void const* args)
pete1801 46:5fdd45fef08d 133 {
pete1801 46:5fdd45fef08d 134 while (true) {
Thierry19 44:0862bc49ffa7 135 // attente et lecture d'un événement digital
Thierry19 50:48e8da5fc1ae 136 osEvent evtD = xbee.mailbox_TypeDeJeu.get(25);
Thierry19 44:0862bc49ffa7 137 if (evtD.status == osEventMail) {
Thierry19 44:0862bc49ffa7 138 Fixe_Vers_Mobile *mail = (Fixe_Vers_Mobile*)evtD.value.p;
Thierry19 44:0862bc49ffa7 139 mode = mail->game;
Thierry19 44:0862bc49ffa7 140 // Envoyer la structure
Thierry19 44:0862bc49ffa7 141 xbee.mailbox_TypeDeJeu.free(mail);
Thierry19 50:48e8da5fc1ae 142 switch(mode) {
Thierry19 50:48e8da5fc1ae 143 case 0:
Thierry19 50:48e8da5fc1ae 144 m_pc.printf("Led Gunner Start! \n\r");
Thierry19 50:48e8da5fc1ae 145 configure_GUNNER();
Thierry19 50:48e8da5fc1ae 146 break;
Thierry19 50:48e8da5fc1ae 147 case 1:
Thierry19 50:48e8da5fc1ae 148 m_pc.printf("RPS Start! \n\r");
Thierry19 50:48e8da5fc1ae 149 configure_RPS();
Thierry19 50:48e8da5fc1ae 150 break;
Thierry19 50:48e8da5fc1ae 151 case 2:
Thierry19 50:48e8da5fc1ae 152 m_pc.printf("Air Guitar Start! \n\r");
Thierry19 50:48e8da5fc1ae 153 configure_GUITAR();
Thierry19 50:48e8da5fc1ae 154 break;
Thierry19 50:48e8da5fc1ae 155 default:
Thierry19 50:48e8da5fc1ae 156 break;
Thierry19 50:48e8da5fc1ae 157 }
Thierry19 50:48e8da5fc1ae 158 m_pc.printf("\n\r Mode recu: %x", mode);
Thierry19 44:0862bc49ffa7 159 }
Thierry19 44:0862bc49ffa7 160 }
Thierry19 44:0862bc49ffa7 161 }
Thierry19 44:0862bc49ffa7 162
groygirard 26:5700cde2350b 163
llarose 1:601d2922ff06 164 void gunner(void const* args)
groygirard 12:ebb08773dbdb 165 {
groygirard 12:ebb08773dbdb 166 // local variables
groygirard 52:10fb8ca4ed03 167 while(true) {
groygirard 29:9a932d354ae3 168 Thread::signal_wait(0x02);
groygirard 29:9a932d354ae3 169 flex_data = flexSensors.get_flex_values();
pete1801 45:20f5867f15de 170 while(flex_data.index != 0) {
pete1801 45:20f5867f15de 171 wait(10);
pete1801 45:20f5867f15de 172 flex_data = flexSensors.get_flex_values();
pete1801 45:20f5867f15de 173 }
groygirard 52:10fb8ca4ed03 174 mail_mvf.flexSensor = flex_data;
groygirard 52:10fb8ca4ed03 175 mail_mvf.gants = 'D';
groygirard 52:10fb8ca4ed03 176 mail_mvf.accelData.x = 0x00;
groygirard 52:10fb8ca4ed03 177 mail_mvf.accelData.y = 0x00;
groygirard 52:10fb8ca4ed03 178 mail_mvf.accelData.z = 0x01;
groygirard 52:10fb8ca4ed03 179 threads[XBEE_TRANSMIT]->signal_set(0x01);
llarose 1:601d2922ff06 180 }
llarose 1:601d2922ff06 181 }
groygirard 14:bda91cead7f2 182
groygirard 26:5700cde2350b 183 void configure_GUNNER()
llarose 17:1a634bb615f3 184 {
groygirard 29:9a932d354ae3 185 accel.set_TRANSIENT_MODE(0x18, 0x05, 0x08); // z plan transient motion detection
llarose 17:1a634bb615f3 186 }
llarose 17:1a634bb615f3 187
groygirard 52:10fb8ca4ed03 188 void transmit_xbee_data(void const* args)
groygirard 52:10fb8ca4ed03 189 {
groygirard 52:10fb8ca4ed03 190 while(1)
groygirard 52:10fb8ca4ed03 191 {
groygirard 52:10fb8ca4ed03 192 Thread::signal_wait(0x01);
groygirard 52:10fb8ca4ed03 193 xbee.EnvoyerStructure(mail_mvf);
groygirard 52:10fb8ca4ed03 194 wait(0.1);
groygirard 52:10fb8ca4ed03 195 }
groygirard 52:10fb8ca4ed03 196 }
groygirard 52:10fb8ca4ed03 197
llarose 1:601d2922ff06 198 void rps(void const* args)
llarose 1:601d2922ff06 199 {
groygirard 52:10fb8ca4ed03 200 Mobile_Vers_Fixe mailGauche;
groygirard 52:10fb8ca4ed03 201 mailGauche.flexSensor.index = true;
groygirard 52:10fb8ca4ed03 202 mailGauche.flexSensor.annulaire = true;
groygirard 52:10fb8ca4ed03 203 mailGauche.flexSensor.majeur = true;
groygirard 52:10fb8ca4ed03 204 mailGauche.gants = 'G'; // Gauche ou Droit
groygirard 52:10fb8ca4ed03 205 mailGauche.accelData.x = 0x01;
groygirard 52:10fb8ca4ed03 206 mailGauche.accelData.y = 0x00;
groygirard 52:10fb8ca4ed03 207 mailGauche.accelData.z = 0x01;
Thierry19 50:48e8da5fc1ae 208
groygirard 6:fd1bf5563299 209 // local variables
Thierry19 50:48e8da5fc1ae 210
groygirard 52:10fb8ca4ed03 211 while(true) {
groygirard 25:184915935d68 212 Thread::signal_wait(0x02);
groygirard 25:184915935d68 213 windup++;
groygirard 25:184915935d68 214 m_pc.printf("Decide in : %d \n\r", windup);
groygirard 26:5700cde2350b 215 if(windup >= 3) {
groygirard 25:184915935d68 216 windup = 0;
groygirard 25:184915935d68 217 Thread::wait(500);
Thierry19 50:48e8da5fc1ae 218 //flex_data = flexSensors.get_flex_values();
groygirard 52:10fb8ca4ed03 219 mail_mvf.flexSensor.index = false;
groygirard 52:10fb8ca4ed03 220 mail_mvf.flexSensor.annulaire = false;
groygirard 52:10fb8ca4ed03 221 mail_mvf.flexSensor.majeur = false;
groygirard 52:10fb8ca4ed03 222 mail_mvf.gants = 'D'; // Gauche ou Droit
groygirard 52:10fb8ca4ed03 223 mail_mvf.accelData.x = 0x01;
groygirard 52:10fb8ca4ed03 224 mail_mvf.accelData.y = 0x00;
groygirard 52:10fb8ca4ed03 225 mail_mvf.accelData.z = 0x00;
Thierry19 50:48e8da5fc1ae 226 m_pc.printf("Envoie de mail");
groygirard 52:10fb8ca4ed03 227 threads[XBEE_TRANSMIT]->signal_set(0x01);
groygirard 52:10fb8ca4ed03 228 mail_mvf = mailGauche;
groygirard 52:10fb8ca4ed03 229 threads[XBEE_TRANSMIT]->signal_set(0x01);
groygirard 52:10fb8ca4ed03 230
groygirard 25:184915935d68 231 // send data frame to the fixed mbed for analyze
groygirard 25:184915935d68 232 }
llarose 48:bc531288c220 233 accel.clear_TRANSIENT_INTERRUPT();
llarose 1:601d2922ff06 234 }
llarose 1:601d2922ff06 235 }
groygirard 14:bda91cead7f2 236
groygirard 28:6f9c5af9e272 237
groygirard 26:5700cde2350b 238 void configure_RPS()
groygirard 26:5700cde2350b 239 {
groygirard 26:5700cde2350b 240 accel.set_TRANSIENT_MODE(0x12, 0x05, 0x08);
llarose 1:601d2922ff06 241 }
groygirard 14:bda91cead7f2 242
llarose 1:601d2922ff06 243 void airGuitar(void const* args)
llarose 1:601d2922ff06 244 {
groygirard 6:fd1bf5563299 245 // local variables
groygirard 14:bda91cead7f2 246
groygirard 6:fd1bf5563299 247 while(true) {
llarose 1:601d2922ff06 248 Thread::signal_wait(GO);
llarose 1:601d2922ff06 249 // code...
llarose 1:601d2922ff06 250 }
llarose 1:601d2922ff06 251 }
groygirard 14:bda91cead7f2 252
groygirard 26:5700cde2350b 253 void configure_GUITAR()
groygirard 15:dc18545822b3 254 {
Thierry19 50:48e8da5fc1ae 255 accel.set_TRANSIENT_MODE(0x18, 0x05, 0x08); // z plan transient motion detection
groygirard 15:dc18545822b3 256 }
llarose 22:cccb77300fd5 257
llarose 22:cccb77300fd5 258 //read config file
llarose 22:cccb77300fd5 259 void ReadConfig()
llarose 22:cccb77300fd5 260 {
llarose 22:cccb77300fd5 261 FILE* file = fopen("/local/config.txt","r");
groygirard 26:5700cde2350b 262 if (file != NULL) {
llarose 22:cccb77300fd5 263 char buffer[2];
pete1801 45:20f5867f15de 264
llarose 22:cccb77300fd5 265 fscanf(file, "%x", &buffer); //panID = 2 char
llarose 22:cccb77300fd5 266 PanId = buffer[1] << 8 | buffer[0]; //set PAN ID global variable
Thierry19 50:48e8da5fc1ae 267
Thierry19 50:48e8da5fc1ae 268 fscanf(file, "%x", &buffer);
pete1801 47:f372ca93d6c1 269 GantID = buffer[0];
Thierry19 50:48e8da5fc1ae 270
llarose 22:cccb77300fd5 271 fclose(file); //close file
groygirard 26:5700cde2350b 272 } else { //if file is not found
llarose 22:cccb77300fd5 273 m_pc.printf("ERROR AT CONFIG FILE \r\n");
llarose 22:cccb77300fd5 274 }
groygirard 27:0c0dfdf8d953 275 }