Projet_S5 / Mbed 2 deprecated Repo_Noeud_Mobile_refactor

Dependencies:   mbed-rtos mbed

Fork of Repo_Noeud_Mobile by Projet_S5

Committer:
groygirard
Date:
Mon Apr 06 19:28:16 2015 +0000
Revision:
35:02c1049699aa
Parent:
34:ac7c8d759009
Child:
37:28f1122a858c
Removed unused mailbox + publish test fix

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