Projet_S5 / Mbed 2 deprecated Repo_Noeud_Mobile_refactor

Dependencies:   mbed-rtos mbed

Fork of Repo_Noeud_Mobile by Projet_S5

Committer:
llarose
Date:
Sun Mar 22 19:57:40 2015 +0000
Revision:
22:cccb77300fd5
Parent:
17:1a634bb615f3
Child:
26:5700cde2350b
Child:
30:389d09853cd1
sending data via 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 17:1a634bb615f3 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);
groygirard 12:ebb08773dbdb 30 void get_sensor_data(void const* args);
llarose 17:1a634bb615f3 31 void flex(void const* args);
groygirard 15:dc18545822b3 32 void analyze_sensor_data(void const* args);
groygirard 15:dc18545822b3 33 void analyze_GUNNER(uint8_t axe_x);
groygirard 15:dc18545822b3 34 void analyze_RPS(uint8_t axe_z);
groygirard 15:dc18545822b3 35 void analyze_GUITAR(uint8_t axe_z);
groygirard 15:dc18545822b3 36 void etat_de_jeu(void const *args);
groygirard 15:dc18545822b3 37 void reception_coord(void const *args);
llarose 22:cccb77300fd5 38 void ReadConfig();
groygirard 14:bda91cead7f2 39
groygirard 12:ebb08773dbdb 40 uint8_t play = 0;
groygirard 14:bda91cead7f2 41
llarose 17:1a634bb615f3 42 FlexSensor flexSensors(p15, p16, p17); // flex sensor 1.
groygirard 6:fd1bf5563299 43 Accel accel;
groygirard 12:ebb08773dbdb 44 RtosTimer *sync;
llarose 22:cccb77300fd5 45 GameMode_e mode = GUNNER;
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
llarose 17:1a634bb615f3 53 Thread* flex_thread_ptr = NULL; // Lecture des entrées analogiques
groygirard 14:bda91cead7f2 54
groygirard 12:ebb08773dbdb 55 typedef struct {
groygirard 12:ebb08773dbdb 56 accel_t accel_data;
groygirard 12:ebb08773dbdb 57 flex_t flex_data;
groygirard 12:ebb08773dbdb 58 } sensors_t;
groygirard 14:bda91cead7f2 59
groygirard 12:ebb08773dbdb 60 Mail<sensors_t, 32> mailbox_sensors;
groygirard 14:bda91cead7f2 61
groygirard 14:bda91cead7f2 62
llarose 1:601d2922ff06 63 int main(void const* args)
llarose 1:601d2922ff06 64 {
llarose 17:1a634bb615f3 65 m_pc.printf("==== PROGRAM START MOBILE ====\r\n");
groygirard 6:fd1bf5563299 66 // Initializing the accelerometer
llarose 22:cccb77300fd5 67
llarose 22:cccb77300fd5 68 ReadConfig(); //read config file
llarose 22:cccb77300fd5 69 m_pc.printf("PANID %#04x\r\n", PanId);
llarose 22:cccb77300fd5 70 xbee = new Xbee(PanId, p13, p14); //set PAN ID
llarose 22:cccb77300fd5 71
llarose 17:1a634bb615f3 72 #if ACTIVATE_ACCEL
llarose 17:1a634bb615f3 73 accel = Accel();
llarose 17:1a634bb615f3 74 accel.init_MMA8452();
llarose 17:1a634bb615f3 75 RtosTimer timer(get_sensor_data, osTimerPeriodic, (void *)0);
llarose 17:1a634bb615f3 76 sync = &timer;
llarose 17:1a634bb615f3 77 #endif
groygirard 15:dc18545822b3 78
groygirard 6:fd1bf5563299 79 switch(mode) {
llarose 1:601d2922ff06 80 case GUNNER:
llarose 1:601d2922ff06 81 gunner_thread_ptr = new Thread(gunner);
llarose 17:1a634bb615f3 82 flex_thread_ptr = new Thread(flex);
llarose 17:1a634bb615f3 83 m_pc.printf("gunner mode started\r\n");
llarose 1:601d2922ff06 84 break;
llarose 1:601d2922ff06 85 case RPS:
llarose 1:601d2922ff06 86 rps_thread_ptr = new Thread(rps);
llarose 1:601d2922ff06 87 break;
llarose 1:601d2922ff06 88 case AirGuitar:
llarose 1:601d2922ff06 89 airguitar_thread_ptr = new Thread(airGuitar);
llarose 1:601d2922ff06 90 break;
llarose 1:601d2922ff06 91 default:
llarose 1:601d2922ff06 92 break;
llarose 1:601d2922ff06 93 }
llarose 17:1a634bb615f3 94 #if ACTIVATE_ACCEL
llarose 17:1a634bb615f3 95 Thread thread0(reception_coord);
llarose 17:1a634bb615f3 96 Thread thread1(etat_de_jeu);
llarose 17:1a634bb615f3 97 Thread thread2(analyze_sensor_data);
llarose 17:1a634bb615f3 98 threads[0] = &thread0;
llarose 17:1a634bb615f3 99 threads[1] = &thread1;
llarose 17:1a634bb615f3 100 threads[2] = &thread2;
llarose 17:1a634bb615f3 101 #endif
groygirard 14:bda91cead7f2 102
groygirard 12:ebb08773dbdb 103 while(true) {
groygirard 6:fd1bf5563299 104 }
llarose 1:601d2922ff06 105 }
groygirard 14:bda91cead7f2 106
llarose 1:601d2922ff06 107 void gunner(void const* args)
groygirard 12:ebb08773dbdb 108 {
groygirard 12:ebb08773dbdb 109 // local variables
llarose 3:a77d02cb5694 110 Cible* cible = new Cible();
llarose 17:1a634bb615f3 111 CountDown countDown(500);
llarose 3:a77d02cb5694 112 countDown.run();
groygirard 14:bda91cead7f2 113
groygirard 12:ebb08773dbdb 114 while(true) {
llarose 3:a77d02cb5694 115 // Thread::signal_wait(GO);
llarose 3:a77d02cb5694 116 cible->reset();
llarose 3:a77d02cb5694 117 int target = rand() % 3;
llarose 3:a77d02cb5694 118 cible->set(target);
llarose 3:a77d02cb5694 119 countDown.run();
llarose 17:1a634bb615f3 120
llarose 17:1a634bb615f3 121 flex_t data = flexSensors.get_flex_values();
llarose 17:1a634bb615f3 122 m_pc.printf("index: %u, majeur: %u, annulaire: %u\n\r", data.index, data.majeur, data.annulaire);
llarose 22:cccb77300fd5 123 char data_test[3] = {data.index, data.majeur, data.annulaire};
llarose 22:cccb77300fd5 124 xbee->EnvoyerDonnees(data_test,3);
llarose 1:601d2922ff06 125 }
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
llarose 1:601d2922ff06 133 void rps(void const* args)
llarose 1:601d2922ff06 134 {
groygirard 6:fd1bf5563299 135 // local variables
groygirard 14:bda91cead7f2 136
groygirard 6:fd1bf5563299 137 while(true) {
llarose 1:601d2922ff06 138 Thread::signal_wait(GO);
llarose 1:601d2922ff06 139 // code...
llarose 1:601d2922ff06 140 }
llarose 1:601d2922ff06 141 }
groygirard 14:bda91cead7f2 142
llarose 1:601d2922ff06 143 void airGuitar(void const* args)
llarose 1:601d2922ff06 144 {
groygirard 6:fd1bf5563299 145 // local variables
groygirard 14:bda91cead7f2 146
groygirard 6:fd1bf5563299 147 while(true) {
llarose 1:601d2922ff06 148 Thread::signal_wait(GO);
llarose 1:601d2922ff06 149 // code...
llarose 1:601d2922ff06 150 }
llarose 1:601d2922ff06 151 }
groygirard 14:bda91cead7f2 152
groygirard 14:bda91cead7f2 153
groygirard 12:ebb08773dbdb 154 void get_sensor_data(void const* args)
groygirard 6:fd1bf5563299 155 {
groygirard 12:ebb08773dbdb 156 sensors_t *mail = mailbox_sensors.alloc();
groygirard 12:ebb08773dbdb 157 mail->accel_data = accel.get_axis_values();
llarose 17:1a634bb615f3 158 mail->flex_data = flexSensors.get_flex_values();
groygirard 12:ebb08773dbdb 159 m_pc.printf("I2C Communication success: Data received %d; %d; %d;\r\n", mail->accel_data.x, mail->accel_data.y, mail->accel_data.z);
groygirard 12:ebb08773dbdb 160 mailbox_sensors.put(mail);
groygirard 14:bda91cead7f2 161 }
groygirard 14:bda91cead7f2 162
groygirard 15:dc18545822b3 163 void analyze_GUNNER(uint8_t axe_x)
groygirard 15:dc18545822b3 164 {
groygirard 15:dc18545822b3 165 }
groygirard 15:dc18545822b3 166
groygirard 15:dc18545822b3 167 void analyze_RPS(uint8_t axe_z)
groygirard 15:dc18545822b3 168 {
groygirard 15:dc18545822b3 169
groygirard 15:dc18545822b3 170 }
groygirard 15:dc18545822b3 171
groygirard 15:dc18545822b3 172 void analyze_GUITAR(uint8_t axe_z)
groygirard 15:dc18545822b3 173 {
groygirard 15:dc18545822b3 174 }
groygirard 15:dc18545822b3 175
groygirard 15:dc18545822b3 176 void etat_de_jeu(void const *args)
groygirard 15:dc18545822b3 177 {
groygirard 15:dc18545822b3 178
groygirard 15:dc18545822b3 179 while(true) {
groygirard 15:dc18545822b3 180 Thread::signal_wait(0x1);
groygirard 15:dc18545822b3 181 m_pc.printf("Etat \r\n");
groygirard 15:dc18545822b3 182 switch(play) {
groygirard 15:dc18545822b3 183 case 0:
groygirard 15:dc18545822b3 184 sync->stop();
groygirard 15:dc18545822b3 185 break;
groygirard 15:dc18545822b3 186 case 1:
groygirard 15:dc18545822b3 187 sync->start(250);
groygirard 15:dc18545822b3 188 break;
groygirard 15:dc18545822b3 189 default:
groygirard 15:dc18545822b3 190 break;
groygirard 15:dc18545822b3 191 }
groygirard 15:dc18545822b3 192 }
groygirard 15:dc18545822b3 193 }
groygirard 15:dc18545822b3 194
groygirard 15:dc18545822b3 195 void reception_coord(void const *args)
groygirard 15:dc18545822b3 196 {
groygirard 15:dc18545822b3 197 while(true) {
groygirard 15:dc18545822b3 198 if(play == 0) {
groygirard 15:dc18545822b3 199 play = 1;
groygirard 15:dc18545822b3 200 threads[1]->signal_set(0x1);
groygirard 15:dc18545822b3 201 Thread::wait(2000);
groygirard 15:dc18545822b3 202 } else {
groygirard 15:dc18545822b3 203 play = 0;
groygirard 15:dc18545822b3 204 threads[1]->signal_set(0x1);
groygirard 15:dc18545822b3 205 Thread::wait(2000);
groygirard 15:dc18545822b3 206 }
groygirard 15:dc18545822b3 207 }
groygirard 15:dc18545822b3 208 }
groygirard 15:dc18545822b3 209
groygirard 14:bda91cead7f2 210 void analyze_sensor_data(void const* args)
groygirard 14:bda91cead7f2 211 {
groygirard 14:bda91cead7f2 212 while (true) {
groygirard 14:bda91cead7f2 213 // attente et lecture d'un événement digital
groygirard 14:bda91cead7f2 214 osEvent evtD = mailbox_sensors.get();
groygirard 14:bda91cead7f2 215 if (evtD.status == osEventMail) {
groygirard 14:bda91cead7f2 216 sensors_t *mail = (sensors_t*)evtD.value.p;
groygirard 14:bda91cead7f2 217 // écriture de l'événement en sortie (port série)
groygirard 15:dc18545822b3 218 m_pc.printf("Valeur des trois axes de l'accelerometre: %d, %d, %d\r\n" , mail->accel_data.x, mail->accel_data.y, mail->accel_data.z);
groygirard 14:bda91cead7f2 219 switch(mode) {
groygirard 14:bda91cead7f2 220 case GUNNER:
groygirard 15:dc18545822b3 221 analyze_GUNNER(mail->accel_data.x);
groygirard 14:bda91cead7f2 222 break;
groygirard 14:bda91cead7f2 223 case RPS:
groygirard 14:bda91cead7f2 224 analyze_RPS(mail->accel_data.z);
groygirard 14:bda91cead7f2 225 break;
groygirard 14:bda91cead7f2 226 case AirGuitar:
groygirard 15:dc18545822b3 227 analyze_GUITAR(mail->accel_data.z);
groygirard 14:bda91cead7f2 228 break;
groygirard 14:bda91cead7f2 229 default:
groygirard 14:bda91cead7f2 230 break;
groygirard 14:bda91cead7f2 231 }
groygirard 14:bda91cead7f2 232 mailbox_sensors.free(mail);
groygirard 14:bda91cead7f2 233 }
groygirard 14:bda91cead7f2 234 }
groygirard 15:dc18545822b3 235 }
llarose 22:cccb77300fd5 236
llarose 22:cccb77300fd5 237 //read config file
llarose 22:cccb77300fd5 238 void ReadConfig()
llarose 22:cccb77300fd5 239 {
llarose 22:cccb77300fd5 240 FILE* file = fopen("/local/config.txt","r");
llarose 22:cccb77300fd5 241 if (file != NULL)
llarose 22:cccb77300fd5 242 {
llarose 22:cccb77300fd5 243 char buffer[2];
llarose 22:cccb77300fd5 244 //char time;
llarose 22:cccb77300fd5 245 //char selector;
llarose 22:cccb77300fd5 246
llarose 22:cccb77300fd5 247 fscanf(file, "%x", &buffer); //panID = 2 char
llarose 22:cccb77300fd5 248 //fscanf(file, "%d", &time); //read period = 1 decimal
llarose 22:cccb77300fd5 249 //fscanf(file, "%d", &selector); //end device selector = 1 decimal
llarose 22:cccb77300fd5 250
llarose 22:cccb77300fd5 251 PanId = buffer[1] << 8 | buffer[0]; //set PAN ID global variable
llarose 22:cccb77300fd5 252 //ReadPeriod = time; //set read period global variable
llarose 22:cccb77300fd5 253 //EndDeviceSelection = selector; //set end device selection global variable
llarose 22:cccb77300fd5 254
llarose 22:cccb77300fd5 255 fclose(file); //close file
llarose 22:cccb77300fd5 256 }
llarose 22:cccb77300fd5 257 else //if file is not found
llarose 22:cccb77300fd5 258 {
llarose 22:cccb77300fd5 259 m_pc.printf("ERROR AT CONFIG FILE \r\n");
llarose 22:cccb77300fd5 260 }
llarose 22:cccb77300fd5 261 }