Projet_S5 / Mbed 2 deprecated Repo_Noeud_Mobile_refactor

Dependencies:   mbed-rtos mbed

Fork of Repo_Noeud_Mobile by Projet_S5

Committer:
pete1801
Date:
Wed Apr 08 20:29:22 2015 +0000
Revision:
47:f372ca93d6c1
Parent:
46:5fdd45fef08d
Parent:
45:20f5867f15de
Child:
48:bc531288c220
Child:
50:48e8da5fc1ae
merge

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