Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <Wire.h>
- #include <LiquidCrystal_I2C.h>
- #include <EEPROM.h>
- #include <EasyTransfer.h>
- #include <SPI.h> // Pour la gestion du port SPI
- #include <Mirf.h> // Pour la gestion de la communication
- #include <nRF24L01.h> // Pour les définitions des registres du nRF24L01
- #include <MirfHardwareSpiDriver.h> // Pour la communication SPI hardware (revient à utiliser SPI.h mais avec une surcouche en plus)
- //create two objects
- EasyTransfer ETin, ETout;
- struct RECEIVE_DATA_STRUCTURE{
- //put your variable definitions here for the data you want to receive
- //THIS MUST BE EXACTLY THE SAME ON THE OTHER ARDUINO
- boolean triggerbutton;
- boolean checktransmit;
- unsigned long ballerx;
- int overheatrx;
- unsigned long tagread;
- };
- struct SEND_DATA_STRUCTURE{
- //put your variable definitions here for the data you want to receive
- //THIS MUST BE EXACTLY THE SAME ON THE OTHER ARDUINO
- int idjoueurtx;
- int idteamtx;
- int rpmtx;
- int fireselecttx;
- int bursttx;
- boolean muzzletx;
- int overheattx;
- int degatstx;
- boolean fireon;
- int sendballe;
- unsigned long loadtag;
- };
- //give a name to the group of data
- RECEIVE_DATA_STRUCTURE rxdata;
- SEND_DATA_STRUCTURE txdata;
- //Definition des broche
- //0 RX
- //1 TX
- #define maxchargeur 400
- #define pinreset 5
- #define ledhit 15
- #define wtsound 18//Et 19A voir
- #define keypin 2//config hc-05
- #define statusBT 3
- #define bouton0 29
- #define boutonMode 28
- #define bouton2 27
- #define bouton3 26
- #define bouton4 25
- #define bouton5 24
- #define bouton6 23
- #define bouton7 22
- #define pinbat A8
- #define vibreur1 A9
- #define vibreur2 A10
- //Variable de jeu
- unsigned char idjoueur = 1; //1 a 99
- unsigned char idteam = 1; //1 a 4
- boolean friendlyfire = 0; //Tir amie
- int ballemax = 20; //De 0=illimité a 250
- int rpm = 1; //de 250 a 850 par pas de 50
- unsigned char fireselect = 1; //0 = Semi auto 1 = auto
- unsigned char burstmode = 3;//2-3-4-5-6
- boolean muzzle = 1; //muzzle flash on, off
- unsigned char overheat = 50;//Temp°C max du canon (1°C/seconde)
- unsigned int numberhit = 0;//nombre de kill du joueur
- boolean respawnauto = 1; //Respawn automatique
- unsigned char respawnmax = 1; // 0 = illimité a 250
- unsigned char delayrespawn = 0; //10 - 180s par pas de 5s
- unsigned char timemax = 20; //Compte a rebours plage de 0 = inactif a 240min(4h)
- int pdv = 0;
- int pdvmax = 100; //1 - 500
- int bouclier = 0;
- int boucliermax = 100; //1 - 500
- unsigned char delaydoctor = 120; //Temps autorisé d'intervention du medecin de 0 = interdit a 180 seconde
- boolean reuppdv = 1; //Activation récuperation des pdv automatique
- unsigned char reuppdvtime = 30; //fréquence de récuperation des pdv en seconde 1 - 120s
- unsigned char reuppdvper = 5; //nombre de point récupéré par cycle 1 - 30pdv
- unsigned char reuppdvmax = 50; //Max de point de vie récuperable automatiquement 1 - 100pdv
- boolean startauto = 1;
- unsigned char startdelay = 10; //0 - 240s
- unsigned char hitdelay = 0; // 0 - 20s temps d'incativité après un tir non mortel
- unsigned char degatsrecue = 0;
- unsigned char timehitled = 120; //Durée d'alluma max des hit led de 1 a 240s
- boolean backshoot = 1;
- char dirhit = 0;
- boolean headshoot = 0;
- boolean zombie = 0;
- //Variable systéme
- unsigned long timeconnect;
- boolean BTconnect;
- boolean TransmitBT;
- boolean inmenuedit = 0;
- unsigned char menu = 1;
- boolean settingsok = 0;
- unsigned char choixdegats = 0; //index des degats (menu config) convertir en hex pour tx
- boolean nooverheat = 1;
- boolean freezelcd = 0;
- unsigned long lastfreeze;
- unsigned long delaymille1;
- unsigned long delaymille2;
- unsigned long start = 0;
- boolean startsync = 0;
- boolean hitledzombie = 0;
- int time = 0;
- unsigned char heure = 0;
- unsigned char minute = 0;
- unsigned char seconde = 0;
- boolean fin = 1;
- unsigned int timertone = 0; // timer counter used for frequency
- unsigned int counttone = 0; // counter for the lenght
- unsigned int resettone[] = {0,0,0,0,0,0,0,0,0,0}; // reset value for above timer sound_freq = 40000 / (reset*2)
- unsigned int lenghttone[] = {0,0,0,0,0,0,0,0,0,0}; // wanted lenght of tone
- unsigned char indextone = 0;
- char valdegats[] = {1,2,4,5,7,10,15,17,20,25,30,35,40,50,75,100};
- unsigned long lastview = 0;
- unsigned long lastmaj = 0;
- boolean waitdoc;
- unsigned long timedoc;
- boolean spawnbox;
- unsigned long counthitled;
- unsigned long lastup;
- int reuppdvcount;
- unsigned char appuielong;
- float niveau_batterie;
- unsigned int prcent_batt;
- boolean backlightlcd = 1;
- boolean backlightoff;
- unsigned long lastbacklight;
- boolean osdchange = 1;
- unsigned int typenrf = 0;
- unsigned int donneenrf1 = 0;
- unsigned int donneenrf2 = 0;
- byte datareceive[6];//Variable de reception nrf 4 octet
- byte datasend[6]; //Variable envoie nrf 4 octet
- int joueurcheck;
- long tagcheck;
- int ballecheck;
- long currenttag = 0;
- int Nballe = 0;
- boolean tagstore = 0;
- int newid = 0;
- unsigned long chargeur[maxchargeur];
- //Stockage des score
- unsigned int score[60];
- //clonage
- unsigned char cloneteam = 0;
- boolean goclone;
- //Valeur EEprom
- #define idjoueurAddr 10
- #define idteamAddr 20
- #define friendlyfireAddr 30
- #define balleAddr 40
- #define rpmAddr 50
- #define fireselectAddr 60
- #define burstmodeAddr 70
- #define muzzleAddr 80
- #define overheatAddr 90
- #define respawnmaxAddr 100
- #define respawnautoAddr 110
- #define delayrespawnAddr 120
- #define timeAddr 130
- #define pdvAddr 140
- #define bouclierAddr 150
- #define delaydoctorAddr 160
- #define reuppdvAddr 170
- #define reuppdvtimeAddr 180
- #define reuppdvperAddr 190
- #define reuppdvmaxAddr 200
- #define startautoAddr 210
- #define startdelayAddr 220
- #define hitdelayAddr 230
- #define choixdegatAddr 250
- #define timehitledAddr 260
- #define backshootAddr 270
- #define dirhitAddr 280
- #define zombieAddr 290
- LiquidCrystal_I2C lcd(0x27,16,2); // set the LCD address to 0x27 for a 16 chars and 2 line display
- #define sbi(port,bit) (port)|=(1<<(bit))
- #define CLR(x,y) (x&=(~(1<<y)))
- #define SET(x,y) (x|=(1<<y))
- // TX_RX const
- #define STATE_IDLE 2
- #define STATE_MARK 3
- #define STATE_SPACE 4
- #define STATE_STOP 5
- #define STATE_HDR 6
- #define MARK 0
- #define SPACE 1
- //RX
- char tempidCodeJ;
- boolean dircapteur;
- boolean rxRead;
- boolean rxRead1; //Capteur 1
- boolean rxRead2; //Capteur 2
- boolean rxRead3; //Capteur 3
- boolean rxRead4; //Capteur 4
- int rxState = STATE_IDLE; // sets the state of the receiver to idle (default)
- unsigned int rxTimer; // state timer, counts 25uS ticks.
- unsigned long rxData; // result will be stored here
- //Raw Analysis
- int rawData[49];
- int rawIndex = 0;
- void setup(){
- //Config NRF
- Mirf.csnPin = 53;
- Mirf.cePin = 10;
- Mirf.spi = &MirfHardwareSpi;
- Mirf.init();
- Mirf.channel = 99; // utilisation canal 0 pour communiquer (128 canaux disponible, de 0 à 127)
- Mirf.payload = 6; //
- Mirf.configRegister(RF_SETUP, 0x26); // 250 Kb/s et 0 dBm (puissance maximum)
- // Mirf.configRegister(CONFIG, 0xa);
- Mirf.config();
- delay(10);
- //Lecture de l'eeprom
- idjoueur = EEPROM.read(idjoueurAddr);
- idteam = EEPROM.read(idteamAddr);
- friendlyfire = EEPROM.read(friendlyfireAddr);
- ballemax = EEPROM.read(balleAddr);
- rpm = EEPROM.read(rpmAddr)*10;
- fireselect = EEPROM.read(fireselectAddr);
- burstmode = EEPROM.read(burstmodeAddr);
- muzzle = EEPROM.read(muzzleAddr);
- overheat = EEPROM.read(overheatAddr);
- respawnmax = EEPROM.read(respawnmaxAddr);
- respawnauto = EEPROM.read(respawnautoAddr);
- delayrespawn = EEPROM.read(delayrespawnAddr);
- timemax = EEPROM.read(timeAddr);
- pdvmax = EEPROM.read(pdvAddr)*10;
- boucliermax = EEPROM.read(bouclierAddr)*10;
- delaydoctor = EEPROM.read(delaydoctorAddr);
- reuppdv = EEPROM.read(reuppdvAddr);
- reuppdvtime = EEPROM.read(reuppdvtimeAddr);
- reuppdvper = EEPROM.read(reuppdvperAddr);
- reuppdvmax = EEPROM.read(reuppdvmaxAddr);
- startauto = EEPROM.read(startautoAddr);
- startdelay = EEPROM.read(startdelayAddr);
- hitdelay = EEPROM.read(hitdelayAddr);
- choixdegats = EEPROM.read(choixdegatAddr);
- timehitled = EEPROM.read(timehitledAddr);
- backshoot = EEPROM.read(backshootAddr);
- dirhit = EEPROM.read(dirhitAddr);
- zombie = EEPROM.read(zombieAddr);
- if(idjoueur > 50 || ballemax > 250 || respawnmax > 250 || pdvmax > 500 || boucliermax > 500 || delaydoctor > 130 || startdelay == 0){
- //Si on a des valeur incohérente on vide la mémoire
- save(1);
- }
- pinMode(pinreset, OUTPUT);
- pinMode(ledhit, OUTPUT);
- pinMode(statusBT, INPUT);
- digitalWrite(ledhit, LOW);
- pinMode(keypin, OUTPUT);
- pinMode(boutonMode, INPUT);
- pinMode(pinbat ,INPUT);
- pinMode(wtsound, OUTPUT); //Buzzer pin
- digitalWrite(wtsound, LOW); //Buzzer
- //Initialisation de l"ecran
- lcd.init();
- defCarSpeciaux();
- lcd.backlight();
- lcd.setCursor(0,0);
- lcd.print(F("Laser Tag System"));
- lcd.setCursor(4,1);
- lcd.print(F("FR V2.1"));
- startBt();
- boolean etatboutonmode = digitalRead(boutonMode);
- boolean etatbouton0 = digitalRead(bouton0);
- //Accés au menu Edition
- if(etatbouton0 == LOW){
- inmenuedit = 1;
- lcd.clear();
- lcd.setCursor(0,0);
- lcd.print(F(" Menu config "));
- }
- if(etatboutonmode == LOW){
- inmenuedit = 2;
- lcd.clear();
- lcd.setCursor(0,0);
- lcd.print(F(" Clone Menu ")) ;
- }
- delay(700);
- lcd.clear();
- //-------
- // PWM
- //-------
- pinMode(6, INPUT); //set up pin for receiving
- digitalWrite(6, LOW);
- pinMode(7, INPUT); //set up pin for receiving
- digitalWrite(7, LOW);
- pinMode(8, INPUT); //set up pin for receiving
- digitalWrite(8, LOW);
- pinMode(9, INPUT); //set up pin for receiving
- digitalWrite(9, LOW);
- TCCR2A = _BV(WGM21) | _BV(WGM20);
- TCCR2B = _BV(WGM22) | _BV(CS21);
- OCR2A = 49;
- OCR2B = 24;
- TIMSK2 |= _BV(TOIE2); //activate interrupt on overflow (TOV flag, triggers at OCR2A)
- //Easy transfer
- //start the library, pass in the data details and the name of the serial port. Can be Serial, Serial1, Serial2, etc.
- ETin.begin(details(rxdata), &Serial);
- ETout.begin(details(txdata), &Serial);
- }
- void startBt(){
- Serial.begin(38400);
- digitalWrite(keypin, HIGH);
- digitalWrite(pinreset, LOW);
- delay(10);
- digitalWrite(pinreset, HIGH);
- delay(500);
- Serial.print("AT+UART=19200,0,0\r\n");
- delay(1000);
- Serial.print("AT+ROLE=1\r\n");
- delay(1000);
- Serial.print("AT+INIT\r\n");
- delay(1000);
- Serial.print("AT+CMODE=1\r\n");
- delay(1000);
- Serial.print("AT+CLASS=0\r\n");
- delay(500);
- Serial.begin(19200);
- digitalWrite(keypin, LOW);
- digitalWrite(pinreset, LOW);
- delay(10);
- digitalWrite(pinreset, HIGH);
- }
- void loop(){
- if(inmenuedit == 1){
- menuedit();
- }
- else if(inmenuedit == 2){
- clonemenu();
- }
- else if(BTconnect == 0 && inmenuedit == 0){
- TransmitBT = 0;
- rxdata.checktransmit = 0;
- lcd.backlight();
- backlightlcd = 1;
- osdchange = 1;
- lcd.setCursor(0,0);
- lcd.print(F(" CONNEXION ")) ;
- lcd.setCursor(0,1);
- lcd.print(F(" LANCEUR ")) ;
- lastbacklight = millis()/1000;
- if(millis()/1000 > timeconnect + 30){
- startBt();
- timeconnect = millis()/1000;
- }
- }else if(BTconnect == 1){
- if(rxdata.checktransmit == 0 || TransmitBT == 0){
- ETout.sendData();
- delay(10);
- transmitBt();
- TransmitBT = 1;
- }
- else{
- game();
- }
- }
- //Statut connection bluetooth
- if(digitalRead(statusBT) == HIGH){
- BTconnect = 1;
- }
- else{
- BTconnect = 0;
- }
- }
- void game(){
- //NRF SEND TEST LOOP
- //nrfsend(5, 49, 49, 0);
- //delay(1000);
- if(settingsok == 0){
- // Configure reciving NRF address.
- byte transmetteur[] = {11,22,33,44,idjoueur};
- Mirf.setRADDR(transmetteur);
- settingsok = 1;
- }
- IRreceive();
- nrfreceive();
- if(startauto == 0 && startsync == 0){
- lcd.setCursor(0,0);
- lcd.print(F("Attente du droit"));
- lcd.setCursor(0,1);
- lcd.print(F(" d'engager "));
- }
- if(startdelay != 0 &&(startauto == 1 || startsync == 1)){
- lcd.setCursor(0,0);
- lcd.print(F("Engagement dans "));
- lcd.setCursor(0,1);
- lcd.print(printtolcd(startdelay,1));
- lcd.print(" ");
- delay(1000);
- if(startdelay <= 1){
- playtone(2000, 400, 0);
- txdata.fireon = 1;
- fin = 0;
- if(zombie == 1 && idteam == 0){
- txdata.fireselecttx = 2;
- txdata.rpmtx = 250;
- txdata.degatstx = 5;//=10pts
- pdv = 200;
- bouclier = 200;
- respawnmax = 1;
- idteam = 0;
- txdata.idteamtx = 0;
- ETout.sendData();
- }else{
- pdv = pdvmax;
- bouclier = boucliermax;
- ETout.sendData();
- }
- start = millis();
- lastbacklight = millis()/1000;
- lcd.clear();
- }else{
- playtone(2700, 40, 0);
- }
- startdelay --;
- }
- if(startdelay == 0){//La partie demarre
- if(fin != 1){
- //Gestion backlight
- if(backlightlcd == 1){
- lcd.backlight();
- backlightoff = 0;
- }else if(backlightlcd == 0 && backlightoff == 0){
- backlightoff = 1;
- lcd.noBacklight();
- }
- //AnalyseRFID
- if(rxdata.tagread > 0){
- backlightlcd = 1;
- lastbacklight = millis()/1000;
- if(currenttag > 0 && currenttag == chargeur[newid] >> 12){
- // chargeur[newid] = (currenttag << 12) |(rxdata.ballerx);//On stocke le dernier etat du chargeur avant de traiter le nouveaux
- }
- currenttag = rxdata.tagread;
- /*
- Serial.println("-------------");
- Serial.println("L'analyse recoit le tag :");
- Serial.println(currenttag);
- */
- for(int c=0;c <= maxchargeur;c++){
- if(chargeur[c] != 0){
- if((chargeur[c] >> 12) == currenttag){
- if((chargeur[c] & 0xFFF) > 0){
- Nballe = (chargeur[c] & 0xFFF);
- }else{
- Nballe = byte(000000000000);
- }
- tagstore = 1;
- newid = c;
- /*
- Serial.println("l'id trouver est :");
- Serial.println(newid);
- Serial.println("le tag est déjà stocker,raw code :");
- Serial.println(chargeur[c],BIN);
- Serial.print(chargeur[c] >> 12);
- Serial.print(" ");
- Serial.print(chargeur[c] & 0xFFF);
- Serial.println("--------------");
- */
- break;
- }
- }
- if(chargeur[c] == NULL){
- newid = c;
- break;
- }
- }
- if(tagstore == 1){
- checkchargeur(currenttag, Nballe);
- tagstore = 0;
- }else{
- chargeur[newid] = (currenttag << 12) | (ballemax);
- Nballe = ballemax;
- checkchargeur(currenttag, Nballe);
- }
- txdata.loadtag = currenttag;
- txdata.sendballe = Nballe;
- rxdata.tagread = 0;
- ETout.sendData();
- txdata.sendballe = -1;
- lastmaj = millis();
- }
- if(waitdoc != 1){
- osd();
- }
- //Allumage osd
- boolean etatboutonmode = digitalRead(boutonMode);
- if(etatboutonmode == LOW){
- backlightlcd = 1;
- lastbacklight = millis()/1000;
- freezelcd = 1;
- osdchange = 1;
- delaymille2 = 0;
- lastfreeze = millis()/1000;
- lcd.setCursor(0,1);
- niveau_batterie = analogRead(pinbat);
- niveau_batterie = (niveau_batterie/227.5) - 2.5;//227.5 = 1024/4.5v
- if(niveau_batterie >= 0){
- niveau_batterie = 100*niveau_batterie;
- }else{
- niveau_batterie = 0;
- }
- prcent_batt = niveau_batterie;
- lcd.write((uint8_t) 4);//Batt
- lcd.print(printtolcd(prcent_batt,0));
- lcd.print(F("%"));
- switch(idteam){
- case 0:
- lcd.print(F(" Rouge "));
- break;
- case 1:
- lcd.print(F(" Bleu "));
- break;
- case 2:
- lcd.print(F(" Jaune "));
- break;
- case 3:
- lcd.print(F(" Vert "));
- break;
- }
- lcd.print(printtolcd(numberhit,0));
- lcd.print(F("K"));
- }
- //Selecteur de tir 2s sur bouton mode
- boolean etatbouton0 = digitalRead(bouton0);
- if(etatbouton0 == LOW){
- if(zombie == 0 || idteam != 0){
- playtone(1500, 25, 0);
- if(txdata.fireselecttx < 2){
- fireselect ++;
- txdata.fireselecttx = fireselect;
- ETout.sendData();
- }
- else{
- fireselect = 0;
- txdata.fireselecttx = fireselect;
- ETout.sendData();
- appuielong = 0;
- }
- }
- delay(300);
- }
- if(waitdoc == 1){
- osdchange = 1;
- if((millis()/1000 > timedoc+delaydoctor) || delaydoctor == 0){
- //le medecin n'est pas arriver le joueur perd une vie
- if(respawnmax != 1){
- if(respawnauto == 1){
- lcd.setCursor(0,0);
- lcd.print(F(" RESPAWN "));
- int i = 0;
- while(i < delayrespawn){
- lcd.print(printtolcd(delayrespawn - i,1));
- lcd.print(F(" "));
- delay(1000);
- i ++;
- }
- if(respawnmax != 0){
- respawnmax --;
- }
- pdv = pdvmax;
- bouclier = boucliermax;
- //prepare for next data
- for(rawIndex=0; rawIndex<49; rawIndex++){ //clear rawData array
- rawData[rawIndex] = 0;
- }
- rxData = 0;
- rawIndex = 0;
- rxState = STATE_IDLE; // sets the state of the receiver to idle (default)
- digitalWrite(ledhit, LOW);
- lastbacklight = millis()/1000;
- if(zombie == 1 && idteam != 0){
- txdata.fireselecttx = 2;
- txdata.rpmtx = 250;
- txdata.degatstx = 5;
- pdv = 200;
- bouclier = 200;
- respawnmax = 1;
- txdata.idteamtx = 0;
- idteam = 0;
- }
- txdata.fireon = 1;
- waitdoc = 0;
- ETout.sendData();
- freezelcd = 0;
- fin = 0;
- }else{
- spawnbox = 1;
- lcd.setCursor(0,0);
- lcd.print(F(" ATTENTE "));
- lcd.setCursor(0,1);
- lcd.print(F(" RESPAWN "));
- waitdoc = 0;
- counthitled = millis()/1000;
- }
- }else{
- lcd.setCursor(0,0);
- lcd.print(F(" GAME "));
- lcd.setCursor(0,1);
- lcd.print(F(" OVER "));
- waitdoc = 0;
- counthitled = millis()/1000;
- }
- }
- else{
- lcd.setCursor(0,1);
- lcd.print(F(" "));
- if((timedoc+delaydoctor) - (millis()/1000) < 100 && ((timedoc+delaydoctor) - (millis()/1000) >= 10)){lcd.print(F("0"));}
- if((timedoc+delaydoctor) - (millis()/1000) < 10){lcd.print(F("00"));}
- lcd.print((timedoc+delaydoctor) - (millis()/1000));
- lcd.print(F(" "));
- }
- }
- //reuppdv
- if(reuppdv == 1){
- //Re up vie
- if(millis()/1000 > (lastup+reuppdvtime)){
- if((pdv + reuppdvper) < pdvmax){
- if((reuppdvcount+reuppdvper) <= reuppdvmax){
- pdv += reuppdvper;
- reuppdvcount += reuppdvper;
- }
- else{
- pdv += reuppdvmax - reuppdvcount;
- }
- }
- else{
- pdv = pdvmax;
- }
- lastup = millis()/1000;
- osdchange = 1;
- }
- }
- if((millis()/1000) >= counthitled +timehitled && counthitled != 0){
- digitalWrite(ledhit, LOW); //surveillance hit led
- counthitled = 0;
- }
- }
- }
- }
- void osd(){
- if(osdchange == 1){
- //PDV
- lcd.setCursor(0,0);
- lcd.write((uint8_t) 2);//pdv
- lcd.print(printtolcd(pdv,0));
- //bouclier
- lcd.setCursor(4,0);
- lcd.write((uint8_t) 3);//bouclier
- lcd.print(printtolcd(bouclier,0));
- //Respawn
- lcd.setCursor(12,0);
- lcd.write((uint8_t) 5);//respawn
- if(respawnmax > 0){
- lcd.print(printtolcd(respawnmax,0));
- }
- else{
- lcd.print(F("Inf"));
- }
- }
- //Extinction backlight lcd
- if(millis()/1000 >= lastbacklight + 2.5){
- backlightlcd = 0;
- }
- //MAJ munition
- if(millis() >= lastmaj + 500){
- ETin.receiveData();
- lastmaj = millis();
- /*
- Serial.println("---------------");
- Serial.println("Etat recue par lanceur :");
- Serial.print(rxdata.ballerx >> 12);
- Serial.print(" ");
- Serial.println(rxdata.ballerx & 0xFFF);
- Serial.println("MAJ du chargeur avec :");
- Serial.print(chargeur[newid] >> 12);
- Serial.print(" ");
- Serial.println(chargeur[newid] & 0xFFF);
- Serial.println("---------------");
- */
- if(currenttag > 0 && (rxdata.ballerx >> 12) == chargeur[newid] >> 12){
- chargeur[newid] = rxdata.ballerx;
- }
- }
- //Led Zombie & overheat
- if(millis() >= lastview + 250){
- lastview = millis();
- if(zombie == 1 && idteam == 0){
- hitledzombie = !hitledzombie;
- digitalWrite(ledhit,hitledzombie);
- }
- }
- if(millis()/1000 >= delaymille1 + 1 && txdata.fireon == 1){
- lcd.setCursor(8,0);
- lcd.write((uint8_t) 0);//balle
- /*
- Serial.println("-------------");
- Serial.print("Affichage recue :");
- Serial.println(rxdata.ballerx & 0xFFF);
- Serial.println("--------------");
- */
- lcd.print(printtolcd((rxdata.ballerx & 0xFFF),0));
- delaymille1 = millis()/1000;
- }
- if(rxdata.overheatrx > overheat){
- freezelcd = 1;
- osdchange = 1;
- backlightlcd = 1;
- nooverheat = 0;
- lcd.setCursor(0,1);
- lcd.print(F(" SURCHAUFFE "));
- lastbacklight = millis()/1000;
- lastfreeze = millis()/1000;
- }
- if(nooverheat == 0 && rxdata.overheatrx < overheat){
- txdata.fireon = 1;
- nooverheat = 1;
- ETout.sendData();
- }
- if(millis()/1000 >= lastfreeze + 1.5){
- freezelcd = 0;
- }
- if(freezelcd == 0 && osdchange == 1){
- //Pseudo
- lcd.setCursor(10,1);
- lcd.print(realname(idjoueur));
- lcd.print(F(" "));
- //Minuteur et affichage sequenciel
- if(fin == 0){
- if(timemax == 0){
- lcd.setCursor(0,1);
- lcd.print(F("0o:o0 "));
- }
- }
- osdchange = 0;
- }
- if(timemax != 0 && fin == 0 && freezelcd == 0){
- time = (timemax - (((millis()-start) / 1000) / 60)) - 1;
- seconde = ((millis()-start) / 1000) % 60;
- minute = time % 60;
- heure = time / 60;
- if(millis()/1000 >= delaymille2 + 1){
- lcd.setCursor(0,1);
- lcd.print(F("0"));
- lcd.print(heure);
- lcd.print(F("h"));
- if(minute < 10){
- lcd.print(F("0"));
- }
- lcd.print(minute);
- lcd.print(F("m"));
- if(59-seconde < 10){
- lcd.print(F("0"));
- }
- lcd.print(59-seconde);
- lcd.print(F("s "));
- delaymille2 = millis()/1000;
- }
- }
- //Minuteur et affichage sequenciel
- if(timemax != 0){
- if(heure <= 0 && minute <= 0 && 59-seconde < 1){
- lcd.clear();
- lcd.setCursor(0,0);
- lcd.backlight();
- freezelcd = 1;
- osdchange = 1;
- backlightlcd = 1;
- lcd.print(F("Partie terminee "));
- fin = 1;
- txdata.fireon = 0;
- ETout.sendData();
- }
- }
- }
- void IRreceive(){
- // COMPUTE INCOMING DATA
- if(rxState == STATE_STOP){ // DATA! a STOP has been issued meaning there's something to compute
- for(rawIndex = 0; rawIndex < 49; rawIndex++){
- if(rawIndex % 2 == 0){ //even positions, no spaces
- if(rawIndex == 0 && !match_hdr(rawData[rawIndex])) { //first position (hdr)
- break;
- }
- else if(rawIndex != 0) { //not the hdr
- if(match_one(rawData[rawIndex])) rxData = (rxData << 1) | 1;
- else if(match_zero(rawData[rawIndex])) rxData <<= 1;
- else{
- break;
- }
- }
- }
- else{ //odd positions, spaces
- if(rawData[rawIndex] == 0) break;
- else if(!match_zero(rawData[rawIndex])){
- break;
- }
- }
- //Serial.print(" ");
- //Serial.print(rawData[rawIndex]);
- }
- //Serial.println("");
- //Serial.println(rxData,HEX);
- if(rxData==0 || rawIndex<29){ // if check failed
- //Near miss
- }
- else{
- //Code valide
- if(rawIndex == 29){
- //Si c'est un tir standard :
- if(fin != 1 && waitdoc == 0){
- receivehit((rxData & 48) >> 4, (rxData & 0x1FC0) >> 6, valdegats[(rxData & 15)]);
- }
- }
- if(rawIndex == 49){
- //Commande et message
- backlightlcd = 1;
- lastbacklight = millis()/1000;
- freezelcd = 1;
- osdchange = 1;
- delaymille2 = 0;
- lastfreeze = millis()/1000;
- switch((rxData & 0x10000) >> 16){
- case 0:
- //Add health
- if(pdv + ((rxData & 0xFF00) >> 8) <= pdvmax){
- pdv += ((rxData & 0xFF00) >> 8);
- }
- else{
- pdv = pdvmax;
- }
- break;
- case 1:
- //Add spawn
- respawnmax += ((rxData & 0xFF00) >> 8);
- break;
- case 2:
- //Add Armor
- if(bouclier + ((rxData & 0xFF00) >> 8) <= boucliermax){
- bouclier += ((rxData & 0xFF00) >> 8);
- }
- else{
- bouclier = boucliermax;
- }
- break;
- case 3:
- //Command
- switch((rxData & 0xFF00) >> 8){
- case 0:
- //Admin kill
- break;
- case 1:
- //Pause
- break;
- case 2:
- //Start game
- break;
- case 4:
- //Respawn
- break;
- case 5:
- //New game(fast)
- break;
- case 7:
- //End game
- break;
- case 8:
- //Reset clock
- break;
- case 11:
- //Explode joueur (explosion)
- break;
- case 12:
- //New game(ready)
- break;
- case 13:
- //Full health
- break;
- case 15:
- //Full Armor
- break;
- case 20:
- //Clear score
- break;
- case 21:
- //Test sensos
- break;
- case 22:
- //stun player (étourdir)
- break;
- case 23:
- //Disarm player
- break;
- }
- }
- }
- }
- //prepare for next data
- for(rawIndex=0; rawIndex<49; rawIndex++){ //clear rawData array
- rawData[rawIndex] = 0;
- }
- rxData = 0;
- rawIndex = 0;
- rxState = STATE_IDLE; // sets the state of the receiver to idle (default)
- }
- }
- void receivehit(char tempteam, char tempidCodeJ, char tempdegats){
- if(tempteam != idteam || friendlyfire == 1 || tempidCodeJ >= 57 ){ // no friendly fire
- // apply damage, transmitted as half
- if(tempidCodeJ != idjoueur){
- lcd.backlight();
- backlightlcd = 1;
- freezelcd = 1;
- osdchange = 1;
- lcd.setCursor(0,0);
- //Mode dir OFF
- if(dirhit == 0){
- lcd.print(F(" Tir de "));
- }
- //Mode Gilet+Tete
- if(dirhit == 1){
- if(dircapteur == 0){
- lcd.print(F(" Tir Gilet de "));
- }
- else if(dircapteur == 1){
- if(headshoot == 1){
- tempdegats = 500;//Degats headshoot a 100%
- }
- lcd.print(F(" Tir Tete de "));
- }
- }
- //Mode Gilet AV+AR
- if(dirhit >= 2){
- if(dircapteur == 0){
- lcd.print(F("Tir Gilet AV de "));
- }
- else if(dircapteur == 1){
- lcd.print(F("Tir Gilet AR de "));
- }
- }
- //Mode Gilet AV+AR+TETE
- if(dirhit == 3){
- if(dircapteur == 2){
- if(headshoot == 1){
- tempdegats = 500;//Degats headshoot a 100%
- }
- lcd.print(F(" Tir Tete "));
- }
- }
- //Mode Full
- if(dirhit == 4){
- if(dircapteur == 2){
- if(headshoot == 1){
- tempdegats = 500;//Degats headshoot a 100%
- }
- lcd.print(F("Tir Tete AV de "));
- }
- else if(dircapteur == 3){
- if(headshoot == 1){
- tempdegats = 500;//Degats headshoot a 100%
- }
- lcd.print(F("Tir Tete AR de "));
- }
- }
- lcd.setCursor(0,1);
- lcd.print(" ");
- lcd.print(realname(tempidCodeJ));
- lcd.print(" ");
- if(tempdegats >= bouclier){
- if(pdv > tempdegats - bouclier){
- pdv -= (tempdegats - bouclier);//Le joueur ne prend qu'une partie du tir
- playerhit(0,tempidCodeJ);
- }
- else{
- pdv = 0;//Le joueur perd tout ses pdv
- playerhit(1,tempidCodeJ);
- }
- bouclier = 0;//Le bouclier est détruit
- }
- if(tempdegats < bouclier){
- bouclier -= tempdegats;//Le bouclier absorbe le tir
- playerhit(0,tempidCodeJ);
- }
- }
- }
- }
- void playerhit(int dead,int tempidCodeJNRF){
- reuppdvcount = 0;
- txdata.fireon = 0;
- ETout.sendData();
- if(dead == 0){
- if(dirhit >= 2){
- if(dircapteur == 0 || dircapteur == 2){
- digitalWrite(vibreur1, HIGH);
- }else if(dircapteur == 1 || dircapteur == 3){
- digitalWrite(vibreur2, HIGH);
- }
- }
- digitalWrite(ledhit, HIGH);
- //Transmission de l'info au tireur
- if(backshoot == 1){
- nrfsend(5, tempidCodeJNRF, idjoueur, 0);
- }
- playtone(3500, 160, 0);
- digitalWrite(vibreur1, LOW);
- digitalWrite(vibreur2, LOW);
- delay(hitdelay*1000+100);
- digitalWrite(ledhit, LOW);
- txdata.fireon = 1;
- lastbacklight = millis()/1000;
- ETout.sendData();
- lastup = millis()/1000;
- }else{
- //Transmission de l'info au tireur
- if(backshoot == 1){
- nrfsend(5, tempidCodeJNRF, idjoueur, 1);
- }
- delay(50);
- numberhit ++;
- //fin = 1;
- if(zombie == 1 && idteam != 0){
- delayrespawn = 30;
- delaydoctor = 10;
- }
- playtone(3500, 2500, 0);
- if(dirhit >= 2){
- if(dircapteur == 0 || dircapteur == 2){
- digitalWrite(vibreur1, HIGH);
- }else if(dircapteur == 1 || dircapteur == 3){
- digitalWrite(vibreur2, HIGH);
- }
- }
- digitalWrite(ledhit, HIGH);
- delay(600);
- digitalWrite(vibreur1, LOW);
- digitalWrite(vibreur2, LOW);
- if(delaydoctor > 0){
- lcd.setCursor(0,0);
- lcd.print(F(" ATTENTE DOC "));
- lcd.setCursor(0,1);
- timedoc = millis()/1000;
- }
- waitdoc = 1;
- }
- score[tempidCodeJNRF] ++;
- }
- void checkchargeur(long tag,int ballenrf){
- for(int jAll = 0; jAll<59;jAll++){
- nrfsend((idjoueur & 0xFF) << 8 | (8 & 0x00FF), jAll, (tag & 0xFFFF), ballenrf << 4 | ((tag >> 16) & 0x000F ));
- }
- }
- void nrfsend(int type, int destinataire, int valdata1 ,int valdata2){
- Serial.println(type);
- Serial.println(destinataire);
- Serial.println(valdata1);
- Serial.println(valdata2);
- byte dest[] = {11,22,33,44,destinataire};
- Mirf.setTADDR((byte *)dest);
- datasend[0] = type & 0xFF; //1ème octet
- datasend[1] = (type & 0xFF00) >> 8; //2ème octet
- datasend[2] = valdata1 & 0xFF; // 1er octet
- datasend[3] = (valdata1 & 0xFF00) >> 8; // 2ème octet
- datasend[4] = valdata2 & 0xFF; // 1er octet
- datasend[5] = (valdata2 & 0xFF00) >> 8; // 2ème octet
- Mirf.send(datasend);
- while(Mirf.isSending()){
- delay(5);
- }
- }
- void nrfreceive(){
- if(Mirf.dataReady()) {
- //Si bug remettre c trois variable en long
- Mirf.getData(datareceive); // récupére 6 octets
- typenrf = datareceive[0];
- joueurcheck = datareceive[1];
- donneenrf1 = datareceive[2] + (datareceive[3] << 8);
- donneenrf2 = datareceive[4] + (datareceive[5] << 8);
- Serial.println(" ");
- Serial.print(" type : ");
- Serial.println(typenrf, DEC);
- Serial.print("donnee1 : ");
- Serial.println(donneenrf1, DEC);
- Serial.print("donnee2 : ");
- Serial.println(donneenrf2, DEC);
- Serial.println(" ");
- //Commande
- if((typenrf) < 50){
- switch(typenrf){
- case 5:
- if(backshoot == 1 && fin == 0){
- //Comfirmation de tir
- lcd.backlight();
- backlightlcd = 1;
- freezelcd = 1;
- osdchange = 1;
- lcd.setCursor(0,1);
- lcd.print(F(" "));
- lcd.print(realname(donneenrf1));
- if(donneenrf2 == 0){
- lcd.print(F(" toucher "));
- }else{
- lcd.print(F(" mort "));
- }
- lastbacklight = millis()/1000;
- lastfreeze = millis()/1000;
- }
- break;
- case 6:
- if(startauto == 0 && startsync == 0){
- //Signal depart syncroniser
- startsync = 1;
- lcd.clear();
- }
- break;
- case 7:
- if(fin == 0){
- playerhit(1,51);
- }
- break;
- case 8:
- //check chargeur
- tagcheck = (datareceive[4] & 0x0F);
- tagcheck = (tagcheck << 16) + donneenrf1;
- ballecheck = donneenrf2 >> 4;
- for(int Cc=0;Cc <= maxchargeur;Cc++){
- if(chargeur[Cc] != 0){
- if((chargeur[Cc] >> 12) == tagcheck){
- if((chargeur[Cc] & 0xFFF) < ballecheck){
- //tag trouver MAJ necessaire
- nrfsend(9, joueurcheck, (chargeur[Cc] & 0xFFF), 0);
- }
- }
- }
- }
- break;
- case 9:
- //MAJ chargeur recue
- if(donneenrf1 < (rxdata.ballerx & 0xFFF)){
- txdata.sendballe = donneenrf1;
- ETout.sendData();
- delay(5);
- txdata.sendballe = -1;
- }
- break;
- }
- }else{
- if(donneenrf1 == idteam || donneenrf1 == 4){
- switch(typenrf >> 8){
- case 50:
- friendlyfire = donneenrf2;
- EEPROM.write(friendlyfireAddr, friendlyfire);
- break;
- case 51:
- ballemax = donneenrf2;
- EEPROM.write(balleAddr, ballemax);
- break;
- case 52:
- rpm = donneenrf2;
- EEPROM.write(rpmAddr, rpm);
- break;
- case 53:
- fireselect = donneenrf2;
- EEPROM.write(fireselectAddr, fireselect);
- break;
- case 54:
- burstmode = donneenrf2;
- EEPROM.write(burstmodeAddr, burstmode);
- break;
- case 55:
- muzzle = donneenrf2;
- EEPROM.write(muzzleAddr, muzzle);
- break;
- case 56:
- overheat = donneenrf2;
- EEPROM.write(overheatAddr,overheat);
- break;
- case 57:
- respawnmax = donneenrf2;
- EEPROM.write(respawnmaxAddr, respawnmax);
- break;
- case 58:
- respawnauto = donneenrf2;
- EEPROM.write(respawnautoAddr, respawnauto);
- break;
- case 59:
- delayrespawn = donneenrf2;
- EEPROM.write(delayrespawnAddr, delayrespawn);
- break;
- case 60:
- timemax = donneenrf2;
- EEPROM.write(timeAddr, timemax);
- break;
- case 61:
- pdvmax = donneenrf2;
- EEPROM.write(pdvAddr, pdvmax);
- break;
- case 62:
- boucliermax = donneenrf2;
- EEPROM.write(bouclierAddr, boucliermax);
- break;
- case 63:
- delaydoctor = donneenrf2;
- EEPROM.write(delaydoctorAddr, delaydoctor);
- break;
- case 64:
- reuppdv = donneenrf2;
- EEPROM.write(reuppdvAddr, reuppdv);
- break;
- case 65:
- reuppdvtime = donneenrf2;
- EEPROM.write(reuppdvtimeAddr, reuppdvtime);
- break;
- case 66:
- reuppdvper = donneenrf2;
- EEPROM.write(reuppdvperAddr, reuppdvper);
- break;
- case 67:
- reuppdvmax = donneenrf2;
- EEPROM.write(reuppdvmaxAddr, reuppdvmax);
- break;
- case 68:
- startauto = donneenrf2;
- EEPROM.write(startautoAddr, startauto);
- break;
- case 69:
- startdelay = donneenrf2;
- EEPROM.write(startdelayAddr, startdelay);
- break;
- case 70:
- hitdelay = donneenrf2;
- EEPROM.write(hitdelayAddr, hitdelay);
- break;
- case 71:
- choixdegats = donneenrf2;
- EEPROM.write(choixdegatAddr, choixdegats);
- break;
- case 72:
- timehitled = donneenrf2;
- EEPROM.write(timehitledAddr, timehitled);
- break;
- case 73:
- backshoot = donneenrf2;
- EEPROM.write(backshootAddr, backshoot);
- break;
- case 74:
- dirhit = donneenrf2;
- EEPROM.write(dirhitAddr, dirhit);
- break;
- case 75:
- zombie = donneenrf2;
- EEPROM.write(zombieAddr, zombie);
- break;
- }
- }
- }
- }
- }
- void transmitBt(){
- //Le lanceur n'a pas les info donc on lui envoie
- txdata.idjoueurtx = idjoueur;
- txdata.idteamtx = idteam;
- txdata.rpmtx = rpm;
- txdata.fireselecttx = fireselect;
- txdata.bursttx = burstmode;
- txdata.muzzletx = muzzle;
- txdata.overheattx = overheat;
- txdata.degatstx = choixdegats;
- ETout.sendData();
- lcd.setCursor(0,0);
- lcd.print(F(" Transmission "));
- lcd.setCursor(0,1);
- lcd.print(F(" au lanceur "));
- playtone(3900, 20, 0);
- ETin.receiveData();
- delay(200);
- osdchange = 1;
- }
- void clonemenu(){
- boolean etatboutonmode = digitalRead(boutonMode);
- boolean etatbouton0 = digitalRead(bouton0);
- delay(100);
- if(etatbouton0 == LOW && goclone == 0){
- if(cloneteam == 5){
- inmenuedit = 0;
- lcd.clear();
- }
- else{
- goclone = 1;
- }
- }
- if(goclone == 1){
- lcd.clear();
- lcd.setCursor(0,0);
- lcd.print(F("Clonage en cours"));
- //On commence le clonage
- for(int j=0;j < 50;j++){
- nrfsend(50, j, cloneteam, friendlyfire);
- delay(5);
- nrfsend(51, j, cloneteam, ballemax);
- delay(5);
- nrfsend(52, j, cloneteam, rpm);
- delay(5);
- nrfsend(53, j, cloneteam, fireselect);
- delay(5);
- nrfsend(54, j, cloneteam, burstmode);
- delay(5);
- nrfsend(55, j, cloneteam, muzzle);
- delay(5);
- nrfsend(56, j, cloneteam, overheat);
- delay(5);
- nrfsend(57, j, cloneteam, respawnmax);
- delay(5);
- nrfsend(58, j, cloneteam, respawnauto);
- delay(5);
- nrfsend(59, j, cloneteam, delayrespawn);
- delay(5);
- nrfsend(60, j, cloneteam, timemax);
- delay(5);
- nrfsend(61, j, cloneteam, pdvmax);
- delay(5);
- nrfsend(62, j, cloneteam, boucliermax);
- delay(5);
- nrfsend(63, j, cloneteam, delaydoctor);
- delay(5);
- nrfsend(64, j, cloneteam, reuppdv);
- delay(5);
- nrfsend(65, j, cloneteam, reuppdvtime);
- delay(5);
- nrfsend(66, j, cloneteam, reuppdvper);
- delay(5);
- nrfsend(67, j, cloneteam, reuppdvmax);
- delay(5);
- nrfsend(68, j, cloneteam, startauto);
- delay(5);
- nrfsend(69, j, cloneteam, startdelay);
- delay(5);
- nrfsend(70, j, cloneteam, hitdelay);
- delay(5);
- nrfsend(71, j, cloneteam, choixdegats);
- delay(5);
- nrfsend(72, j, cloneteam, timehitled);
- delay(5);
- nrfsend(73, j, cloneteam, backshoot);
- delay(5);
- nrfsend(74, j, cloneteam, dirhit);
- delay(5);
- nrfsend(75, j, cloneteam, zombie);
- delay(5);
- lcd.setCursor(7,1);
- lcd.print(j*2);
- lcd.print(F("%"));
- }
- lcd.setCursor(0,1);
- lcd.print(F("Clonage terminee"));
- delay(1000);
- goclone = 0;
- }
- else{
- lcd.setCursor(0,0);
- lcd.print(F(" Cloner : "));
- if(etatboutonmode == LOW){
- if(cloneteam < 5){
- cloneteam ++;
- }
- else{
- cloneteam = 0;
- }
- delay(200);
- }
- lcd.setCursor(0,1);
- switch(cloneteam){
- case 0:
- lcd.print(F(" Rouge "));
- break;
- case 1:
- lcd.print(F(" Bleu "));
- break;
- case 2:
- lcd.print(F(" Jaune "));
- break;
- case 3:
- lcd.print(F(" Vert "));
- break;
- case 4:
- lcd.print(F(" Toutes "));
- break;
- case 5:
- lcd.print(F(" Exit "));
- break;
- }
- }
- }
- void menuedit(){
- boolean etatboutonmode = digitalRead(boutonMode);
- boolean etatbouton0 = digitalRead(bouton0);
- if(etatbouton0 == LOW){
- //Appuis sur le bouton tir
- if(menu < 31){
- menu ++;
- }else{
- menu = 1;
- }
- delay(200);
- lcd.clear();
- etatbouton0 = LOW;
- }
- switch(menu){
- case 1: //Id joueur
- lcd.setCursor(0,0);
- lcd.print(F(" ID Joueur "));
- if(idjoueur == 0){
- idjoueur = 0;
- }
- if(etatboutonmode == LOW){
- //Trigger préssé
- if(idjoueur < 49){
- idjoueur ++;
- }else{
- idjoueur = 0;
- }
- etatboutonmode = HIGH;
- delay(70);
- }
- lcd.setCursor(4,1);
- if(idjoueur < 10){
- lcd.print(F("0"));
- }
- lcd.print(idjoueur);
- lcd.print(F(" "));
- lcd.print(realname(idjoueur));
- break;
- case 2: //ID team
- lcd.setCursor(0,0);
- lcd.print(F(" Equipe "));
- if(idteam == 0){
- idteam = 0;
- }
- if(etatboutonmode == LOW){
- //Trigger préssé
- if(idteam < 3){
- idteam ++;
- }else{
- idteam = 0;
- }
- etatboutonmode = HIGH;
- delay(150);
- }
- lcd.setCursor(0,1);
- switch(idteam){
- case 0:
- lcd.print(F(" Rouge "));
- break;
- case 1:
- lcd.print(F(" Bleu "));
- break;
- case 2:
- lcd.print(F(" Jaune "));
- break;
- case 3:
- lcd.print(F(" Vert "));
- break;
- }
- break;
- case 3: //Friendly fire
- lcd.setCursor(0,0);
- lcd.print(F(" Tir amie "));
- if(etatboutonmode == LOW){
- //Trigger préssé
- if(friendlyfire < 1){
- friendlyfire = 1;
- }else{
- friendlyfire = 0;
- }
- etatboutonmode = HIGH;
- delay(200);
- }
- lcd.setCursor(6,1);
- if(friendlyfire == 1){
- lcd.print(F("On "));
- }else{
- lcd.print(F("off"));
- }
- break;
- case 4: //Qte de balle
- lcd.setCursor(0,0);
- lcd.print(F("Balle par Charge"));
- if(etatboutonmode == LOW){
- //Trigger préssé
- if(ballemax < 250){
- ballemax ++;
- }else{
- ballemax = 0;
- }
- etatboutonmode = HIGH;
- delay(100);
- }
- if(ballemax == 0){
- lcd.setCursor(4,1);
- lcd.print(F("Infini "));
- }else{
- lcd.setCursor(0,1);
- lcd.print(F(" "));
- lcd.print(printtolcd(ballemax,0));
- lcd.print(F("/250 "));
- }
- break;
- case 5: //RPM
- lcd.setCursor(0,0);
- lcd.print(F(" RPM "));
- if(rpm < 250){
- rpm = 650;
- }
- if(etatboutonmode == LOW){
- //Trigger préssé
- if(rpm < 800){
- rpm += 50;
- }else{
- rpm = 250;
- }
- etatboutonmode = HIGH;
- delay(150);
- }
- lcd.setCursor(6,1);
- lcd.print(rpm);
- break;
- case 6: //Fire select
- lcd.setCursor(0,0);
- lcd.print(F("Selecteur de tir"));
- if(etatboutonmode == LOW){
- //Trigger préssé
- if(fireselect < 2){
- fireselect ++;
- }else{
- fireselect = 0;
- }
- etatboutonmode = HIGH;
- delay(200);
- }
- lcd.setCursor(0,1);
- if(fireselect == 2){
- lcd.print(F(" Semi-auto "));
- }else if(fireselect == 1){
- lcd.print(F(" Burst "));
- }else{
- lcd.print(F(" Full Auto "));
- }
- break;
- case 7: //Burst mode
- lcd.setCursor(0,0);
- lcd.print(F(" Burst mode "));
- if(etatboutonmode == LOW){
- //Trigger préssé
- if(burstmode < 6){
- burstmode ++;
- }else{
- burstmode = 2;
- }
- etatboutonmode = HIGH;
- delay(200);
- }
- lcd.setCursor(7,1);
- lcd.print(burstmode);
- break;
- case 8: //Muzzle
- lcd.setCursor(0,0);
- lcd.print(F(" Muzzle led "));
- if(etatboutonmode == LOW){
- //Trigger préssé
- if(muzzle < 1){
- muzzle = 1;
- }else{
- muzzle = 0;
- }
- etatboutonmode = HIGH;
- delay(200);
- }
- lcd.setCursor(6,1);
- if(muzzle == 1){
- lcd.print(F("On "));
- }else{
- lcd.print(F("off"));
- }
- break;
- case 9: //Overheat
- lcd.setCursor(0,0);
- lcd.print(F("Overheat Temp C "));
- if(etatboutonmode == LOW){
- //Trigger préssé
- if(overheat < 160){
- overheat ++;
- }else{
- overheat = 49;
- }
- etatboutonmode = HIGH;
- delay(100);
- }
- if(overheat == 49){
- lcd.setCursor(4,1);
- lcd.print(F(" Off "));
- }else{
- lcd.setCursor(4,1);
- lcd.print(printtolcd(overheat,0));
- lcd.print(F("/160 "));
- }
- break;
- case 10: //Respawn max
- lcd.setCursor(0,0);
- lcd.print(F(" Vies "));
- if(etatboutonmode == LOW){
- //Trigger préssé
- if(respawnmax < 250){
- respawnmax ++;
- }else{
- respawnmax = 0;
- }
- etatboutonmode = HIGH;
- delay(100);
- }
- if(respawnmax == 0){
- lcd.setCursor(4,1);
- lcd.print(F(" Infini "));
- }else{
- lcd.setCursor(0,1);
- lcd.print(F(" "));
- lcd.print(printtolcd(respawnmax,0));
- lcd.print(F("/250 "));
- }
- break;
- case 11: //Respawn automatique
- lcd.setCursor(0,0);
- lcd.print(F(" Spawn auto "));
- if(etatboutonmode == LOW){
- //Trigger préssé
- if(respawnauto < 1){
- respawnauto = 1;
- }else{
- respawnauto = 0;
- }
- etatboutonmode = HIGH;
- delay(200);
- }
- lcd.setCursor(6,1);
- if(respawnauto == 1){
- lcd.print(F("On "));
- }else{
- lcd.print(F("off"));
- }
- break;
- case 12: //Delay respawn
- lcd.setCursor(0,0);
- lcd.print(F(" Delai Spawn "));
- if(delayrespawn < 10){
- delayrespawn = 10;
- }
- if(etatboutonmode == LOW){
- //Trigger préssé
- if(delayrespawn < 180){
- delayrespawn += 5;
- }else{
- delayrespawn = 10;
- }
- etatboutonmode = HIGH;
- delay(150);
- }
- lcd.setCursor(4,1);
- lcd.print(printtolcd(delayrespawn,0));
- lcd.print(F("/180s "));
- break;
- case 13: //game time
- lcd.setCursor(0,0);
- lcd.print(F(" Duree partie "));
- if(etatboutonmode == LOW){
- //Trigger préssé
- if(timemax < 240){
- timemax += 1;
- }else{
- timemax = 0;
- }
- etatboutonmode = HIGH;
- delay(100);
- }
- if(timemax == 0){
- lcd.setCursor(3,1);
- lcd.print(F(" Infini "));
- }else{
- lcd.setCursor(3,1);
- lcd.print(printtolcd(timemax,0));
- lcd.print(F("/240min"));
- }
- break;
- case 14: //pdv
- lcd.setCursor(0,0);
- lcd.print(F(" Point de vie "));
- if(pdvmax == 0){
- pdvmax = 100;
- }
- if(etatboutonmode == LOW){
- //Trigger préssé
- if(pdvmax < 500){
- pdvmax += 10;
- }else{
- pdvmax = 10;
- }
- etatboutonmode = HIGH;
- delay(100);
- }
- lcd.setCursor(4,1);
- lcd.print(printtolcd(pdvmax,0));
- lcd.print(F("/500 "));
- break;
- case 15: //Armure
- lcd.setCursor(0,0);
- lcd.print(F(" Armure "));
- if(etatboutonmode == LOW){
- //Trigger préssé
- if(boucliermax < 500){
- boucliermax += 10;
- }else{
- boucliermax = 0;
- }
- etatboutonmode = HIGH;
- delay(100);
- }
- lcd.setCursor(4,1);
- lcd.print(printtolcd(boucliermax,0));
- lcd.print(F("/500 "));
- break;
- case 16: //Delay medecin
- lcd.setCursor(0,0);
- lcd.print(F(" Delai medecin "));
- if(etatboutonmode == LOW){
- //Trigger préssé
- if(delaydoctor < 180){
- delaydoctor ++;
- }else{
- delaydoctor = 0;
- }
- etatboutonmode = HIGH;
- delay(100);
- }
- lcd.setCursor(3,1);
- if(delaydoctor == 0){
- lcd.print(F(" Off "));
- }else{
- lcd.setCursor(3,1);
- lcd.print(printtolcd(delaydoctor,0));
- lcd.print(F("/180s "));
- }
- break;
- case 17: //recup pdv
- lcd.setCursor(0,0);
- lcd.print(F(" Recup auto pdv "));
- if(etatboutonmode == LOW){
- //Trigger préssé
- if(reuppdv < 1){
- reuppdv = 1;
- }else{
- reuppdv = 0;
- }
- etatboutonmode = HIGH;
- delay(200);
- }
- lcd.setCursor(6,1);
- if(reuppdv == 1){
- lcd.print(F("On "));
- }else{
- lcd.print(F("off"));
- }
- break;
- case 18: //Delay avant recup pdv
- lcd.setCursor(0,0);
- lcd.print(F("Delai recup pdv "));
- if(etatboutonmode == LOW){
- //Trigger préssé
- if(reuppdvtime < 120){
- reuppdvtime ++;
- }else{
- reuppdvtime = 1;
- }
- etatboutonmode = HIGH;
- delay(100);
- }
- lcd.setCursor(4,1);
- lcd.print(printtolcd(reuppdvtime,0));
- lcd.print(F("/120s "));
- break;
- case 19: //pdv par cycle recup auto
- lcd.setCursor(0,0);
- lcd.print(F(" Nbr pdv recup "));
- if(etatboutonmode == LOW){
- //Trigger préssé
- if(reuppdvper < 30){
- reuppdvper ++;
- }else{
- reuppdvper = 1;
- }
- etatboutonmode = HIGH;
- delay(150);
- }
- lcd.setCursor(3,1);
- lcd.print(printtolcd(reuppdvper,0));
- lcd.print(F("/30pdv"));
- break;
- case 20: //pdv max recup auto
- lcd.setCursor(0,0);
- lcd.print(F(" Max pdv recup "));
- if(etatboutonmode == LOW){
- //Trigger préssé
- if(reuppdvmax < 100){
- reuppdvmax ++;
- }else{
- reuppdvmax = 1;
- }
- etatboutonmode = HIGH;
- delay(100);
- }
- lcd.setCursor(3,1);
- lcd.print(printtolcd(reuppdvmax,0));
- lcd.print(F("/100pdv"));
- break;
- case 21: //Start auto
- lcd.setCursor(0,0);
- lcd.print(F(" Demarrage auto "));
- if(etatboutonmode == LOW){
- //Trigger préssé
- if(startauto < 1){
- startauto = 1;
- }else{
- startauto = 0;
- }
- etatboutonmode = HIGH;
- delay(200);
- }
- lcd.setCursor(6,1);
- if(startauto == 1){
- lcd.print(F("On "));
- }else{
- lcd.print(F("off"));
- }
- break;
- case 22: //délais debut de partie
- lcd.setCursor(0,0);
- lcd.print(F(" Start delais "));
- if(etatboutonmode == LOW){
- //Trigger préssé
- if(startdelay < 240){
- startdelay ++;
- }else{
- startdelay = 1;
- }
- etatboutonmode = HIGH;
- delay(100);
- }
- lcd.setCursor(4,1);
- lcd.print(printtolcd(startdelay,0));
- lcd.print(F("/240s "));
- break;
- case 23: //hit delay
- lcd.setCursor(0,0);
- lcd.print(F("Handicap de tir"));
- if(etatboutonmode == LOW){
- //Trigger préssé
- if(hitdelay < 20){
- hitdelay ++;
- }else{
- hitdelay = 0;
- }
- etatboutonmode = HIGH;
- delay(150);
- }
- lcd.setCursor(4,1);
- if(hitdelay == 0){
- lcd.print(F(" Off "));
- }else{
- lcd.setCursor(5,1);
- lcd.print(printtolcd(hitdelay,0));
- lcd.print(F("/20s "));
- }
- break;
- case 24: //degats
- lcd.setCursor(0,0);
- lcd.print(F(" Degats "));
- if(etatboutonmode == LOW){
- //Trigger préssé
- if(choixdegats < 15){
- choixdegats ++;
- }else{
- choixdegats = 0;
- }
- etatboutonmode = HIGH;
- delay(150);
- }
- lcd.setCursor(4,1);
- lcd.print(printtolcd(valdegats[choixdegats],0));
- lcd.print(F("/100 "));
- break;
- case 25: //max hit delay
- lcd.setCursor(0,0);
- lcd.print(F(" Max hit led "));
- if(timehitled == 0){
- timehitled = 120;
- }
- if(etatboutonmode == LOW){
- //Trigger préssé
- if(timehitled < 240){
- timehitled ++;
- }else{
- timehitled = 1;
- }
- etatboutonmode = HIGH;
- delay(100);
- }
- lcd.setCursor(4,1);
- lcd.print(printtolcd(timehitled,0));
- lcd.print(F("/240s "));
- break;
- case 26: //Info nrf joueur hit
- lcd.setCursor(0,0);
- lcd.print(F(" Info RF hit "));
- if(etatboutonmode == LOW){
- //Trigger préssé
- if(backshoot < 1){
- backshoot = 1;
- }else{
- backshoot = 0;
- }
- etatboutonmode = HIGH;
- delay(200);
- }
- lcd.setCursor(6,1);
- if(backshoot == 1){
- lcd.print(F("On "));
- }else{
- lcd.print(F("off"));
- }
- break;
- case 27: //Info direction hit
- lcd.setCursor(0,0);
- lcd.print(F(" Info Sens hit "));
- if(etatboutonmode == LOW){
- //Trigger préssé
- if(dirhit < 3){
- dirhit ++;
- }else{
- dirhit = 0;
- }
- etatboutonmode = HIGH;
- delay(150);
- }
- lcd.setCursor(0,1);
- if(dirhit == 0){
- lcd.print(F(" Off "));
- }else if(dirhit == 1){
- lcd.print(F(" Gilet+Tete "));
- }else if(dirhit == 2){
- lcd.print(F(" GiletAV+AR "));
- }else if(dirhit == 3){
- lcd.print(F("GiletAV+AR+Tete "));
- }else{
- lcd.print(F(" Full "));
- }
- break;
- case 28: //Headshoot
- lcd.setCursor(0,0);
- lcd.print(F("Head shoot 100% "));
- if(etatboutonmode == LOW){
- //Trigger préssé
- if(headshoot < 1){
- headshoot = 1;
- }else{
- headshoot = 0;
- }
- etatboutonmode = HIGH;
- delay(200);
- }
- lcd.setCursor(6,1);
- if(headshoot == 1){
- lcd.print(F("On "));
- }else{
- lcd.print(F("off"));
- }
- break;
- case 29: //Zombie
- lcd.setCursor(0,0);
- lcd.print(F(" Zombie "));
- if(etatboutonmode == LOW){
- //Trigger préssé
- if(zombie < 1){
- zombie = 1;
- }else{
- zombie = 0;
- }
- etatboutonmode = HIGH;
- delay(200);
- }
- lcd.setCursor(6,1);
- if(zombie == 1){
- lcd.print(F("On "));
- }else{
- lcd.print(F("off"));
- }
- break;
- case 30: //RAZ config
- lcd.setCursor(0,0);
- lcd.print(F(" RAZ "));
- if(etatboutonmode == LOW){
- //Trigger préssé
- save(1);
- delay(5);
- inmenuedit = 0;
- transmitBt();
- lcd.clear();
- }
- etatboutonmode = HIGH;
- delay(200);
- break;
- case 31: //Exit config
- lcd.setCursor(0,0);
- lcd.print(F(" Save & Exit "));
- if(etatboutonmode == LOW){
- //Trigger préssé
- save(0);
- delay(5);
- inmenuedit = 0;
- lcd.clear();
- }
- etatboutonmode = HIGH;
- delay(200);
- break;
- }
- }
- String printtolcd(int valeur_lcd, boolean addspace){
- String retour_valeur_lcd;
- if(valeur_lcd < 10){
- retour_valeur_lcd = "00";
- }
- if(valeur_lcd >= 10 && valeur_lcd < 100){
- retour_valeur_lcd = "0";
- }
- if(addspace == 1){
- lcd.setCursor(0,1);
- retour_valeur_lcd = " " + retour_valeur_lcd;
- }
- retour_valeur_lcd = retour_valeur_lcd + String(valeur_lcd);
- return retour_valeur_lcd;
- }
- void defCarSpeciaux(){
- byte deadC[8] = {
- B00000,
- B01010,
- B00000,
- B00000,
- B01110,
- B10001,
- B00000,
- B00000
- };
- lcd.createChar(1, deadC);
- byte respawnC[8] = {
- B00000,
- B01111,
- B01111,
- B01000,
- B01000,
- B01000,
- B11100,
- B00000
- };
- lcd.createChar(5, respawnC);
- byte balleC[8] = {
- B01110,
- B11111,
- B11111,
- B11111,
- B11111,
- B11111,
- B01110,
- B11111
- };
- lcd.createChar(0, balleC);
- byte pdvC[8] = {
- B00000,
- B01010,
- B11111,
- B11111,
- B01110,
- B00100,
- B00000,
- B00000
- };
- lcd.createChar(2, pdvC);
- byte shieldC[8] = {
- B01111,
- B01110,
- B11100,
- B11110,
- B01100,
- B01000,
- B10000,
- B00000
- };
- lcd.createChar(3, shieldC);
- byte batC[8] = {
- B01110,
- B11111,
- B10001,
- B11111,
- B10001,
- B11111,
- B10001,
- B11111
- };
- lcd.createChar(4, batC);
- }
- void save(int raz){
- if(raz == 1){
- idjoueur = 0;
- idteam = 0;
- friendlyfire = 0;
- ballemax = 30;
- rpm = 450;
- fireselect = 0;
- burstmode = 3;
- muzzle = 1;
- overheat = 49;
- respawnauto = 1;
- respawnmax = 0;
- delayrespawn = 10;
- timemax = 0;
- pdvmax = 100;
- boucliermax = 50;
- delaydoctor = 30;
- reuppdv = 0;
- reuppdvtime = 30;
- reuppdvper = 5;
- reuppdvmax = 50;
- startauto = 1;
- startdelay = 5;
- hitdelay = 1;
- choixdegats = 12;
- timehitled = 120;
- backshoot = 1;
- dirhit = 0;
- zombie = 0;
- }
- EEPROM.write(idjoueurAddr, idjoueur);
- EEPROM.write(idteamAddr, idteam);
- EEPROM.write(friendlyfireAddr, friendlyfire);
- EEPROM.write(balleAddr, ballemax);
- EEPROM.write(rpmAddr, rpm/10);
- EEPROM.write(fireselectAddr, fireselect);
- EEPROM.write(burstmodeAddr, burstmode);
- EEPROM.write(muzzleAddr, muzzle);
- EEPROM.write(overheatAddr, overheat);
- EEPROM.write(respawnmaxAddr, respawnmax);
- EEPROM.write(respawnautoAddr, respawnauto);
- EEPROM.write(delayrespawnAddr, delayrespawn);
- EEPROM.write(timeAddr, timemax);
- EEPROM.write(pdvAddr, pdvmax/10);
- EEPROM.write(bouclierAddr, boucliermax/10);
- EEPROM.write(delaydoctorAddr, delaydoctor);
- EEPROM.write(reuppdvAddr, reuppdv);
- EEPROM.write(reuppdvtimeAddr, reuppdvtime);
- EEPROM.write(reuppdvperAddr, reuppdvper);
- EEPROM.write(reuppdvmaxAddr, reuppdvmax);
- EEPROM.write(startautoAddr, startauto);
- EEPROM.write(startdelayAddr, startdelay);
- EEPROM.write(hitdelayAddr, hitdelay);
- EEPROM.write(choixdegatAddr, choixdegats);
- EEPROM.write(timehitledAddr, timehitled);
- EEPROM.write(backshootAddr, backshoot);
- EEPROM.write(dirhitAddr, dirhit);
- EEPROM.write(zombieAddr, zombie);
- }
- void playtone(int frequence, int length, int numnote){
- lenghttone[numnote] = length / 0.017; //lenghttone specifies duration in number of ticks (25us) milliseconde = lengthtone * 0.025
- resettone[numnote] = 56000 / (frequence * 2); // play hit sound. freq_son = 40000 / (reset * 2)
- }
- String realname(int idname){
- String name;
- switch(idname){
- case 0:
- name = "Eagle";
- break;
- case 1:
- name = "Joker";
- break;
- case 2:
- name = "Raven";
- break;
- case 3:
- name = "Sarge";
- break;
- case 4:
- name = "Angel";
- break;
- case 5:
- name = "Cosmo";
- break;
- case 6:
- name = "Gecko";
- break;
- case 7:
- name = "Blaze";
- break;
- case 8:
- name = "Camo";
- break;
- case 9:
- name = "Fury";
- break;
- case 10:
- name = "Flash";
- break;
- case 11:
- name = "Gizmo";
- break;
- case 12:
- name = "Homer";
- break;
- case 13:
- name = "Storm";
- break;
- case 14:
- name = "Habit";
- break;
- case 15:
- name = "Click";
- break;
- case 16:
- name = "Ronin";
- break;
- case 17:
- name = "Lucky";
- break;
- case 18:
- name = "Radar";
- break;
- case 19:
- name = "Blade";
- break;
- case 20:
- name = "Ninja";
- break;
- case 21:
- name = "Magic";
- break;
- case 22:
- name = "Gonzo";
- break;
- case 23:
- name = "Cobra";
- break;
- case 24:
- name = "Pappy";
- break;
- case 25:
- name = "Rambo";
- break;
- case 26:
- name = "Snake";
- break;
- case 27:
- name = "Audie";
- break;
- case 28:
- name = "Sting";
- break;
- case 29:
- name = "Zeena";
- break;
- case 30:
- name = "Bugsy";
- break;
- case 31:
- name = "Viper";
- break;
- case 32:
- name = "Jewel";
- break;
- case 33:
- name = "Genie";
- break;
- case 34:
- name = "Logan";
- break;
- case 35:
- name = "Razor";
- break;
- case 36:
- name = "Slick";
- break;
- case 37:
- name = "Venom";
- break;
- case 38:
- name = "Rocky";
- break;
- case 39:
- name = "Saber";
- break;
- case 40:
- name = "Crush";
- break;
- case 41:
- name = "Titan";
- break;
- case 42:
- name = "Orbit";
- break;
- case 43:
- name = "Vixen";
- break;
- case 44:
- name = "Tank";
- break;
- case 45:
- name = "Rogue";
- break;
- case 46:
- name = "Sheik";
- break;
- case 47:
- name = "Gizmo";
- break;
- case 48:
- name = "Siren";
- break;
- case 49:
- name = "Dozer";
- break;
- case 50:
- name = "Micro";
- break;
- case 51:
- name = "LgtMG";
- break;
- case 52:
- name = "HvyMG";
- break;
- case 53:
- name = "ZOOKA";
- break;
- case 54:
- name = "ROCKT";
- break;
- case 55:
- name = "GRNDE";
- break;
- case 56:
- name = "CLYMR";
- break;
- case 57:
- name = "MINE";
- break;
- case 58:
- name = "BOMB";
- break;
- case 59:
- name = "NUKE";
- break;
- }
- return name;
- }
- //ISR ROUTINE
- ISR(TIMER2_OVF_vect, ISR_BLOCK){
- //TONE GENERATION
- if(resettone[indextone] > 0){
- timertone++;
- counttone++;
- if(timertone == resettone[indextone]){
- sbi(PIND,3);
- timertone = 0;
- if(counttone >= lenghttone[indextone] && lenghttone[indextone] != 0){
- resettone[indextone] = 0;
- counttone = 0;
- CLR(PORTD,3) ;
- if(indextone < sizeof(resettone)){
- indextone ++;
- }
- else{
- indextone = 0;
- }
- }
- }
- }
- else if(indextone > 0){ indextone = 0; }
- //RECEPTION
- rxRead1 = (PINH & B00001000) >> 3; //aka read pin 6 (PH3), the fast way AV
- rxRead2 = (PINH & B00010000) >> 4; //aka read pin 7 (PH4), the fast way AR
- rxRead3 = (PINH & B00100000) >> 5; //aka read pin 8 (PH4), the fast way AR
- rxRead4 = (PINH & B01000000) >> 6; //aka read pin 9 (PH4), the fast way AR
- rxTimer++;
- if(rxState == STATE_IDLE){
- if(dirhit >= 2){
- if(rxRead4 == MARK){
- dircapteur = 3;
- rxTimer = 0;
- rxState = STATE_MARK; // transmission begins, check HDR (header)
- }
- if(rxRead3 == MARK){
- dircapteur = 2;
- rxTimer = 0;
- rxState = STATE_MARK; // transmission begins, check HDR (header)
- }
- }
- if(dirhit >= 1){
- if(rxRead2 == MARK){
- dircapteur = 1;
- rxTimer = 0;
- rxState = STATE_MARK; // transmission begins, check HDR (header)
- }
- }
- if(rxRead1 == MARK){
- dircapteur = 0;
- rxTimer = 0;
- rxState = STATE_MARK; // transmission begins, check HDR (header)
- }
- }
- switch(dircapteur){
- case 0:
- rxRead = rxRead1;
- break;
- case 1:
- rxRead = rxRead2;
- break;
- case 2:
- rxRead = rxRead3;
- break;
- case 3:
- rxRead = rxRead4;
- break;
- }
- switch (rxState) { //check current state of rx message CAPTEUR 1
- case STATE_MARK: // timing MARK
- if (rxRead == SPACE){ // MARK ended, record time
- rawData[rawIndex] = rxTimer;
- rawIndex++;
- rxTimer = 0;
- rxState = STATE_SPACE;
- }
- break;
- case STATE_SPACE: // timing SPACE
- if (rxRead == MARK){ // MARK ended, record time
- rawData[rawIndex] = rxTimer;
- rawIndex++;
- rxTimer = 0;
- rxState = STATE_MARK;
- }
- else if(rxTimer > 34) {
- rxState = STATE_STOP;
- }
- break;
- }
- }
- boolean match_hdr(int timer){
- if(timer > 86 && timer < 106) return true;
- return false;
- }
- boolean match_one(int timer){
- if(timer > 38 && timer < 58) return true;
- return false;
- }
- boolean match_zero(int timer){
- if(timer > 14 && timer < 34) return true;
- return false;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement