Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Fork of Repo_Noeud_Mobile by
main.cpp@52:10fb8ca4ed03, 2015-04-11 (annotated)
- Committer:
- groygirard
- Date:
- Sat Apr 11 22:55:35 2015 +0000
- Revision:
- 52:10fb8ca4ed03
- Parent:
- 51:299408ceee3a
- Child:
- 54:8709cb24abe3
Xbee communication fix, some testing code still polluting the repo.
Who changed what in which revision?
User | Revision | Line number | New 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 | 22:cccb77300fd5 | 51 | short PanId; |
pete1801 | 45:20f5867f15de | 52 | char GantID; |
pete1801 | 39:558cd5780490 | 53 | Xbee xbee; |
groygirard | 14:bda91cead7f2 | 54 | |
groygirard | 52:10fb8ca4ed03 | 55 | Thread *threads[4]; |
groygirard | 6:fd1bf5563299 | 56 | Thread* gunner_thread_ptr = NULL; // Possiblement mettre dans un tableau |
groygirard | 6:fd1bf5563299 | 57 | Thread* rps_thread_ptr = NULL; // avec des position codees |
groygirard | 6:fd1bf5563299 | 58 | Thread* airguitar_thread_ptr = NULL; // dans des define. guillaume |
llarose | 17:1a634bb615f3 | 59 | Thread* flex_thread_ptr = NULL; // Lecture des entrées analogiques |
pete1801 | 39:558cd5780490 | 60 | Thread* Thread_Send_Data_To_Fixe = NULL;// Thread pour envoyer les données des sensors au fixe |
groygirard | 52:10fb8ca4ed03 | 61 | Thread* transmit_xbee_data_thread_ptr = NULL; |
groygirard | 14:bda91cead7f2 | 62 | |
Thierry19 | 50:48e8da5fc1ae | 63 | Thread* xbeeReceive = NULL; |
Thierry19 | 50:48e8da5fc1ae | 64 | Thread* threadGetGameMode = NULL; |
groygirard | 14:bda91cead7f2 | 65 | |
groygirard | 14:bda91cead7f2 | 66 | |
groygirard | 25:184915935d68 | 67 | extern "C" void TIMER2_IRQHandler(void) |
groygirard | 25:184915935d68 | 68 | { |
groygirard | 25:184915935d68 | 69 | /*Flag du decodage - s'execute a chaque fronts, descendants et montants*/ |
groygirard | 25:184915935d68 | 70 | if ((LPC_TIM2->IR & 0x20) == 0x20) { |
groygirard | 25:184915935d68 | 71 | LPC_TIM2->IR |= 0x20; // clear Timer2 interrupt register |
groygirard | 29:9a932d354ae3 | 72 | threads[mode]->signal_set(0x02); |
groygirard | 25:184915935d68 | 73 | } |
groygirard | 25:184915935d68 | 74 | } |
groygirard | 14:bda91cead7f2 | 75 | |
Thierry19 | 50:48e8da5fc1ae | 76 | //Fonction qui part le thread |
Thierry19 | 50:48e8da5fc1ae | 77 | void startXbeeReceive(void const* args) |
Thierry19 | 50:48e8da5fc1ae | 78 | { |
Thierry19 | 50:48e8da5fc1ae | 79 | xbee.Recevoir(); |
Thierry19 | 50:48e8da5fc1ae | 80 | } |
groygirard | 14:bda91cead7f2 | 81 | |
Thierry19 | 50:48e8da5fc1ae | 82 | int main(void const* args) |
llarose | 1:601d2922ff06 | 83 | { |
pete1801 | 30:389d09853cd1 | 84 | m_pc.printf("\r\n==== PROGRAM START MOBILE ====\r\n"); |
groygirard | 6:fd1bf5563299 | 85 | // Initializing the accelerometer |
groygirard | 26:5700cde2350b | 86 | |
llarose | 22:cccb77300fd5 | 87 | ReadConfig(); //read config file |
pete1801 | 30:389d09853cd1 | 88 | m_pc.printf("PANID %x\r\n", PanId); |
pete1801 | 39:558cd5780490 | 89 | xbee = Xbee(PanId, p13, p14); //set PAN ID |
Thierry19 | 50:48e8da5fc1ae | 90 | xbeeReceive = new Thread(startXbeeReceive); |
Thierry19 | 50:48e8da5fc1ae | 91 | threadGetGameMode = new Thread(GetGameMode); |
groygirard | 26:5700cde2350b | 92 | |
groygirard | 26:5700cde2350b | 93 | #if ACTIVATE_ACCEL |
groygirard | 6:fd1bf5563299 | 94 | accel = Accel(); |
groygirard | 6:fd1bf5563299 | 95 | accel.init_MMA8452(); |
groygirard | 25:184915935d68 | 96 | timer2_init(); |
groygirard | 26:5700cde2350b | 97 | #endif |
groygirard | 52:10fb8ca4ed03 | 98 | transmit_xbee_data_thread_ptr = new Thread(transmit_xbee_data); |
Thierry19 | 50:48e8da5fc1ae | 99 | gunner_thread_ptr = new Thread(gunner); |
Thierry19 | 50:48e8da5fc1ae | 100 | flex_thread_ptr = new Thread(flex); |
Thierry19 | 50:48e8da5fc1ae | 101 | rps_thread_ptr = new Thread(rps); |
groygirard | 52:10fb8ca4ed03 | 102 | |
Thierry19 | 50:48e8da5fc1ae | 103 | airguitar_thread_ptr = new Thread(airGuitar); |
Thierry19 | 50:48e8da5fc1ae | 104 | |
groygirard | 29:9a932d354ae3 | 105 | threads[GUNNER] = gunner_thread_ptr; |
groygirard | 29:9a932d354ae3 | 106 | threads[RPS] = rps_thread_ptr; |
groygirard | 29:9a932d354ae3 | 107 | threads[AirGuitar] = airguitar_thread_ptr; |
groygirard | 52:10fb8ca4ed03 | 108 | threads[XBEE_TRANSMIT] = transmit_xbee_data_thread_ptr; |
groygirard | 29:9a932d354ae3 | 109 | |
Thierry19 | 50:48e8da5fc1ae | 110 | while(true) { |
Thierry19 | 50:48e8da5fc1ae | 111 | } |
llarose | 1:601d2922ff06 | 112 | } |
groygirard | 14:bda91cead7f2 | 113 | |
groygirard | 25:184915935d68 | 114 | void timer2_init(void) |
groygirard | 12:ebb08773dbdb | 115 | { |
groygirard | 25:184915935d68 | 116 | LPC_PINCON->PINSEL0 |= 0xc00; // set P0.5 to CAP2.1 |
llarose | 48:bc531288c220 | 117 | LPC_PINCON->PINMODE0 |= 0xc00; // pull-down enable |
groygirard | 25:184915935d68 | 118 | LPC_SC->PCONP |= (1 << 22); // Timer2 power on |
groygirard | 25:184915935d68 | 119 | LPC_SC->PCLKSEL1 |= (1 << 12); // Divide CCLK by 1 for Timer2 |
groygirard | 25:184915935d68 | 120 | LPC_TIM2->CCR |= 0x30; // set cap2.1 rising-edge/falling-edge and interrupt |
groygirard | 25:184915935d68 | 121 | LPC_TIM2->TCR |= (1 << 0); // start Timer2 |
groygirard | 25:184915935d68 | 122 | LPC_TIM2->EMR = 0x20; // |
groygirard | 25:184915935d68 | 123 | LPC_TIM2->IR |= 0xFFFFFFFF; |
groygirard | 25:184915935d68 | 124 | NVIC_EnableIRQ(TIMER2_IRQn); |
llarose | 1:601d2922ff06 | 125 | } |
groygirard | 14:bda91cead7f2 | 126 | |
llarose | 17:1a634bb615f3 | 127 | void flex(void const* args) |
llarose | 17:1a634bb615f3 | 128 | { |
llarose | 17:1a634bb615f3 | 129 | flexSensors.Run(); |
llarose | 17:1a634bb615f3 | 130 | } |
llarose | 17:1a634bb615f3 | 131 | |
pete1801 | 46:5fdd45fef08d | 132 | void GetGameMode(void const* args) |
pete1801 | 46:5fdd45fef08d | 133 | { |
pete1801 | 46:5fdd45fef08d | 134 | while (true) { |
Thierry19 | 44:0862bc49ffa7 | 135 | // attente et lecture d'un événement digital |
Thierry19 | 50:48e8da5fc1ae | 136 | osEvent evtD = xbee.mailbox_TypeDeJeu.get(25); |
Thierry19 | 44:0862bc49ffa7 | 137 | if (evtD.status == osEventMail) { |
Thierry19 | 44:0862bc49ffa7 | 138 | Fixe_Vers_Mobile *mail = (Fixe_Vers_Mobile*)evtD.value.p; |
Thierry19 | 44:0862bc49ffa7 | 139 | mode = mail->game; |
Thierry19 | 44:0862bc49ffa7 | 140 | // Envoyer la structure |
Thierry19 | 44:0862bc49ffa7 | 141 | xbee.mailbox_TypeDeJeu.free(mail); |
Thierry19 | 50:48e8da5fc1ae | 142 | switch(mode) { |
Thierry19 | 50:48e8da5fc1ae | 143 | case 0: |
Thierry19 | 50:48e8da5fc1ae | 144 | m_pc.printf("Led Gunner Start! \n\r"); |
Thierry19 | 50:48e8da5fc1ae | 145 | configure_GUNNER(); |
Thierry19 | 50:48e8da5fc1ae | 146 | break; |
Thierry19 | 50:48e8da5fc1ae | 147 | case 1: |
Thierry19 | 50:48e8da5fc1ae | 148 | m_pc.printf("RPS Start! \n\r"); |
Thierry19 | 50:48e8da5fc1ae | 149 | configure_RPS(); |
Thierry19 | 50:48e8da5fc1ae | 150 | break; |
Thierry19 | 50:48e8da5fc1ae | 151 | case 2: |
Thierry19 | 50:48e8da5fc1ae | 152 | m_pc.printf("Air Guitar Start! \n\r"); |
Thierry19 | 50:48e8da5fc1ae | 153 | configure_GUITAR(); |
Thierry19 | 50:48e8da5fc1ae | 154 | break; |
Thierry19 | 50:48e8da5fc1ae | 155 | default: |
Thierry19 | 50:48e8da5fc1ae | 156 | break; |
Thierry19 | 50:48e8da5fc1ae | 157 | } |
Thierry19 | 50:48e8da5fc1ae | 158 | m_pc.printf("\n\r Mode recu: %x", mode); |
Thierry19 | 44:0862bc49ffa7 | 159 | } |
Thierry19 | 44:0862bc49ffa7 | 160 | } |
Thierry19 | 44:0862bc49ffa7 | 161 | } |
Thierry19 | 44:0862bc49ffa7 | 162 | |
groygirard | 26:5700cde2350b | 163 | |
llarose | 1:601d2922ff06 | 164 | void gunner(void const* args) |
groygirard | 12:ebb08773dbdb | 165 | { |
groygirard | 12:ebb08773dbdb | 166 | // local variables |
groygirard | 52:10fb8ca4ed03 | 167 | while(true) { |
groygirard | 29:9a932d354ae3 | 168 | Thread::signal_wait(0x02); |
groygirard | 29:9a932d354ae3 | 169 | flex_data = flexSensors.get_flex_values(); |
pete1801 | 45:20f5867f15de | 170 | while(flex_data.index != 0) { |
pete1801 | 45:20f5867f15de | 171 | wait(10); |
pete1801 | 45:20f5867f15de | 172 | flex_data = flexSensors.get_flex_values(); |
pete1801 | 45:20f5867f15de | 173 | } |
groygirard | 52:10fb8ca4ed03 | 174 | mail_mvf.flexSensor = flex_data; |
groygirard | 52:10fb8ca4ed03 | 175 | mail_mvf.gants = 'D'; |
groygirard | 52:10fb8ca4ed03 | 176 | mail_mvf.accelData.x = 0x00; |
groygirard | 52:10fb8ca4ed03 | 177 | mail_mvf.accelData.y = 0x00; |
groygirard | 52:10fb8ca4ed03 | 178 | mail_mvf.accelData.z = 0x01; |
groygirard | 52:10fb8ca4ed03 | 179 | threads[XBEE_TRANSMIT]->signal_set(0x01); |
llarose | 1:601d2922ff06 | 180 | } |
llarose | 1:601d2922ff06 | 181 | } |
groygirard | 14:bda91cead7f2 | 182 | |
groygirard | 26:5700cde2350b | 183 | void configure_GUNNER() |
llarose | 17:1a634bb615f3 | 184 | { |
groygirard | 29:9a932d354ae3 | 185 | accel.set_TRANSIENT_MODE(0x18, 0x05, 0x08); // z plan transient motion detection |
llarose | 17:1a634bb615f3 | 186 | } |
llarose | 17:1a634bb615f3 | 187 | |
groygirard | 52:10fb8ca4ed03 | 188 | void transmit_xbee_data(void const* args) |
groygirard | 52:10fb8ca4ed03 | 189 | { |
groygirard | 52:10fb8ca4ed03 | 190 | while(1) |
groygirard | 52:10fb8ca4ed03 | 191 | { |
groygirard | 52:10fb8ca4ed03 | 192 | Thread::signal_wait(0x01); |
groygirard | 52:10fb8ca4ed03 | 193 | xbee.EnvoyerStructure(mail_mvf); |
groygirard | 52:10fb8ca4ed03 | 194 | wait(0.1); |
groygirard | 52:10fb8ca4ed03 | 195 | } |
groygirard | 52:10fb8ca4ed03 | 196 | } |
groygirard | 52:10fb8ca4ed03 | 197 | |
llarose | 1:601d2922ff06 | 198 | void rps(void const* args) |
llarose | 1:601d2922ff06 | 199 | { |
groygirard | 52:10fb8ca4ed03 | 200 | Mobile_Vers_Fixe mailGauche; |
groygirard | 52:10fb8ca4ed03 | 201 | mailGauche.flexSensor.index = true; |
groygirard | 52:10fb8ca4ed03 | 202 | mailGauche.flexSensor.annulaire = true; |
groygirard | 52:10fb8ca4ed03 | 203 | mailGauche.flexSensor.majeur = true; |
groygirard | 52:10fb8ca4ed03 | 204 | mailGauche.gants = 'G'; // Gauche ou Droit |
groygirard | 52:10fb8ca4ed03 | 205 | mailGauche.accelData.x = 0x01; |
groygirard | 52:10fb8ca4ed03 | 206 | mailGauche.accelData.y = 0x00; |
groygirard | 52:10fb8ca4ed03 | 207 | mailGauche.accelData.z = 0x01; |
Thierry19 | 50:48e8da5fc1ae | 208 | |
groygirard | 6:fd1bf5563299 | 209 | // local variables |
Thierry19 | 50:48e8da5fc1ae | 210 | |
groygirard | 52:10fb8ca4ed03 | 211 | while(true) { |
groygirard | 25:184915935d68 | 212 | Thread::signal_wait(0x02); |
groygirard | 25:184915935d68 | 213 | windup++; |
groygirard | 25:184915935d68 | 214 | m_pc.printf("Decide in : %d \n\r", windup); |
groygirard | 26:5700cde2350b | 215 | if(windup >= 3) { |
groygirard | 25:184915935d68 | 216 | windup = 0; |
groygirard | 25:184915935d68 | 217 | Thread::wait(500); |
Thierry19 | 50:48e8da5fc1ae | 218 | //flex_data = flexSensors.get_flex_values(); |
groygirard | 52:10fb8ca4ed03 | 219 | mail_mvf.flexSensor.index = false; |
groygirard | 52:10fb8ca4ed03 | 220 | mail_mvf.flexSensor.annulaire = false; |
groygirard | 52:10fb8ca4ed03 | 221 | mail_mvf.flexSensor.majeur = false; |
groygirard | 52:10fb8ca4ed03 | 222 | mail_mvf.gants = 'D'; // Gauche ou Droit |
groygirard | 52:10fb8ca4ed03 | 223 | mail_mvf.accelData.x = 0x01; |
groygirard | 52:10fb8ca4ed03 | 224 | mail_mvf.accelData.y = 0x00; |
groygirard | 52:10fb8ca4ed03 | 225 | mail_mvf.accelData.z = 0x00; |
Thierry19 | 50:48e8da5fc1ae | 226 | m_pc.printf("Envoie de mail"); |
groygirard | 52:10fb8ca4ed03 | 227 | threads[XBEE_TRANSMIT]->signal_set(0x01); |
groygirard | 52:10fb8ca4ed03 | 228 | mail_mvf = mailGauche; |
groygirard | 52:10fb8ca4ed03 | 229 | threads[XBEE_TRANSMIT]->signal_set(0x01); |
groygirard | 52:10fb8ca4ed03 | 230 | |
groygirard | 25:184915935d68 | 231 | // send data frame to the fixed mbed for analyze |
groygirard | 25:184915935d68 | 232 | } |
llarose | 48:bc531288c220 | 233 | accel.clear_TRANSIENT_INTERRUPT(); |
llarose | 1:601d2922ff06 | 234 | } |
llarose | 1:601d2922ff06 | 235 | } |
groygirard | 14:bda91cead7f2 | 236 | |
groygirard | 28:6f9c5af9e272 | 237 | |
groygirard | 26:5700cde2350b | 238 | void configure_RPS() |
groygirard | 26:5700cde2350b | 239 | { |
groygirard | 26:5700cde2350b | 240 | accel.set_TRANSIENT_MODE(0x12, 0x05, 0x08); |
llarose | 1:601d2922ff06 | 241 | } |
groygirard | 14:bda91cead7f2 | 242 | |
llarose | 1:601d2922ff06 | 243 | void airGuitar(void const* args) |
llarose | 1:601d2922ff06 | 244 | { |
groygirard | 6:fd1bf5563299 | 245 | // local variables |
groygirard | 14:bda91cead7f2 | 246 | |
groygirard | 6:fd1bf5563299 | 247 | while(true) { |
llarose | 1:601d2922ff06 | 248 | Thread::signal_wait(GO); |
llarose | 1:601d2922ff06 | 249 | // code... |
llarose | 1:601d2922ff06 | 250 | } |
llarose | 1:601d2922ff06 | 251 | } |
groygirard | 14:bda91cead7f2 | 252 | |
groygirard | 26:5700cde2350b | 253 | void configure_GUITAR() |
groygirard | 15:dc18545822b3 | 254 | { |
Thierry19 | 50:48e8da5fc1ae | 255 | accel.set_TRANSIENT_MODE(0x18, 0x05, 0x08); // z plan transient motion detection |
groygirard | 15:dc18545822b3 | 256 | } |
llarose | 22:cccb77300fd5 | 257 | |
llarose | 22:cccb77300fd5 | 258 | //read config file |
llarose | 22:cccb77300fd5 | 259 | void ReadConfig() |
llarose | 22:cccb77300fd5 | 260 | { |
llarose | 22:cccb77300fd5 | 261 | FILE* file = fopen("/local/config.txt","r"); |
groygirard | 26:5700cde2350b | 262 | if (file != NULL) { |
llarose | 22:cccb77300fd5 | 263 | char buffer[2]; |
pete1801 | 45:20f5867f15de | 264 | |
llarose | 22:cccb77300fd5 | 265 | fscanf(file, "%x", &buffer); //panID = 2 char |
llarose | 22:cccb77300fd5 | 266 | PanId = buffer[1] << 8 | buffer[0]; //set PAN ID global variable |
Thierry19 | 50:48e8da5fc1ae | 267 | |
Thierry19 | 50:48e8da5fc1ae | 268 | fscanf(file, "%x", &buffer); |
pete1801 | 47:f372ca93d6c1 | 269 | GantID = buffer[0]; |
Thierry19 | 50:48e8da5fc1ae | 270 | |
llarose | 22:cccb77300fd5 | 271 | fclose(file); //close file |
groygirard | 26:5700cde2350b | 272 | } else { //if file is not found |
llarose | 22:cccb77300fd5 | 273 | m_pc.printf("ERROR AT CONFIG FILE \r\n"); |
llarose | 22:cccb77300fd5 | 274 | } |
groygirard | 27:0c0dfdf8d953 | 275 | } |