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 00:39:07 2015 +0000
Revision:
55:adde1b6081b8
Parent:
54:8709cb24abe3
Child:
57:ce80fbd67161
dont know

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