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:58:48 2015 +0000
Revision:
54:8709cb24abe3
Parent:
53:7b15fe4c9edf
Parent:
52:10fb8ca4ed03
Child:
55:adde1b6081b8
Merge code LAL AirGuitar avec fix comm xbee

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