Projet_S5 / Mbed 2 deprecated Repo_Noeud_Mobile_refactor

Dependencies:   mbed-rtos mbed

Fork of Repo_Noeud_Mobile by Projet_S5

Committer:
groygirard
Date:
Sun Apr 12 18:59:37 2015 +0000
Revision:
58:4cdc85ed04a9
Parent:
57:ce80fbd67161
no workerino, no puterino

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