MAJ DCS BIOS M2000C

Fabrication de cockpit et divers ( palonnier , panels ..) c est ICI
Avatar de l’utilisateur

ergo
Webmaster
Webmaster
Messages : 14485
Inscription : 27 avril 2008

Re: MAJ DCS BIOS M2000C

#76

Message par ergo »

J'en profite, Exo7, si jamais tu trouves un intérêt là dedans, voici les extensions à DCSBios que j'ai ajouté pour ma carte Arduino.

Ne pas oublier de mettre à jour la library de DCS-BIOS avec le bug que j'ai remonté ici : http://www.checksix-forums.com/viewtopi ... 1#p1612201

J'ai donc ajouter 2 classes :

Code : Tout sélectionner

namespace DcsBios { class ErgoButton : PollingInput { private: const char* msg_; bool (*callback_)(char)=0 ; bool lastState_; char key_; void init_(const char* msg, bool (*callback)(char), char key) { msg_ = msg; callback_ = callback; lastState_ = false; key_ = key; } void pollInput() { bool state = callback_(key_); if (state != lastState_) { if (tryToSendDcsBiosMessage(msg_, state == true ? "0" : "1")) { lastState_ = state; } } } public: ErgoButton(const char* msg, bool (*callback)(char),char key) { init_(msg, callback,key); } }; class ErgoKnob : PollingInput { private: const char* msg_; int (*callback_)()=0 ; int lastPos_; void init_(const char* msg, int (*callback)()) { msg_ = msg; callback_ = callback; lastPos_ = callback(); } void pollInput() { int pos = callback_(); if (pos != lastPos_) { byte buff[] = " " ; String(pos).getBytes(buff,3); if (tryToSendDcsBiosMessage(msg_, buff) ) { lastPos_ = pos; } } } public: ErgoKnob(const char* msg, int (*callback)()) { init_(msg, callback); } }; }
Le but de mes modifications c'est :

ErgoButton, permet d'interroger une fonction qui retourne vrai si le bouton est appuyé ou pas.
La subtilité c'est que la fonction appelé en callback prend en paramètre un char qui est le "nom" de la touche. Ainsi j'ai ensuite ces lignes de codes :

Code : Tout sélectionner

DcsBios::ErgoButton insButtonVAL( "INS_VAL_SW", bouttonPress,'V');
ErgoKnob, permet avec une callback de retourner le numéro qui correspond à la position du rotary qui m'intérese :

Code : Tout sélectionner

DcsBios::ErgoKnob insKnobVal( "INS_ROT_VAL", rotaryPos);
J'ai pas retouché au code depuis un moment, attendant une solution pour l'écran qui semble ne pas venir ...

Le code complet, brute de fonderie ca donne ça, il y a surement des optimisations possible, si y'a un truc qui se comprend pas n'hésitez pas à me poser des questions :

Code : Tout sélectionner

/* Nicolas DUMAS -- PCN Poste de Commande Navigation */ #define VERSION "0.2b" #define AUTHOR "Ergo" #define DCSBIOS_IRQ_SERIAL // include the library code: #include <LiquidCrystal.h> #include <DcsBios.h> // ----------------------------------------- // Le LCD : // ----------------------------------------- LiquidCrystal lcd(12, 11, 10, 9, 8, 7); #define LCD_LEDPWR 6 // ----------------------------------------- // ----------------------------------------- // Registre pour les LEDS : // ----------------------------------------- #define LED_LUMI 3 #define LED_SDIN 46 #define LED_RCLK 48 #define LED_SRCLK 50 #define LED_SRCLR 52 // registre qui permet d'allumer les leds ou non int registers[8] = {LOW,LOW,LOW,LOW,LOW,LOW,LOW,LOW} ; // ----------------------------------------- // ----------------------------------------- // le clavier : // ----------------------------------------- #define KEY_PREP 45 #define KEY_VAL 35 #define KEY_ROW1 43 #define KEY_ROW2 41 #define KEY_ROW3 39 #define KEY_ROW4 37 #define KEY_COL1 25 #define KEY_COL2 27 #define KEY_COL3 29 #define KEY_COL4 31 char KEY_Map[][4] = {"D123", // D 1 2 3 "B456", // B 4 5 6 "M789", // R 7 8 9 "RE0I"} ; // M E 0 I // ----------------------------------------- // ----------------------------------------- // le rotary : // ----------------------------------------- // les numéros sont dans l'ordre de la position TR/VS // et incremetalement dans le sens des aiguilles d'une montre : int ROT_index[12] = { 30, 32, 34, 36, 38, 40, 42, 23, 22, 24, 26, 28} ; int ROT_cur = 0; int ROT_lst = 0; // ----------------------------------------- // ----------------------------------------- // variable global pour les traitements : // ----------------------------------------- String LCD_ligne1("") ; // ce qui va être affiché sur le LCD ligne 1 String LCD_ligne0("") ; // ce qui va être affiché sur le LCD ligne 0 bool LCD_cleared = false ; // demande d'effacement du LCD bool LCD_render = true; char KEY_cur = ' ' ; // touche pressé courante char KEY_lst = ' ' ; // touche pressé precedante int LCD_lumi = 160 ; // luminosité appliqué au système int LED_lumi = 120 ; // luminosité appliqué au système // ----------------------------------------- // ----------------------------------------- // Variable pour le "mini OS" : // ----------------------------------------- #define DEBUG false unsigned long SYS_precTime = 0; void(* SYS_reset) (void) = 0; bool SYS_startup = true ; #define CC_time 50 // ----------------------------------------- // Variable pour ecrire à l'ecran // ----------------------------------------- char* TOP_LEFT; char* TOP_RIGHT; // ----------------------------------------- #if DEBUG == true void debug(String txt) { Serial.print(String("DEBUG : "+ txt + "\n")); } void error(String txt) { Serial.print(String("ERROR : "+ txt + "\n")); } #else void debug(String txt) {;} void error(String txt) {;} #endif void setup() { // set up the LCD's number of columns and rows: lcd.begin(16, 2); // Print a message to the LCD. lcd.print("init ..."); pinMode(LCD_LEDPWR, OUTPUT) ; analogWrite(LCD_LEDPWR,LCD_lumi); //keyboard pinMode(KEY_COL1, OUTPUT); pinMode(KEY_COL2, OUTPUT); pinMode(KEY_COL3, OUTPUT); pinMode(KEY_COL4, OUTPUT); pinMode(KEY_ROW1, INPUT_PULLUP); pinMode(KEY_ROW2, INPUT_PULLUP); pinMode(KEY_ROW3, INPUT_PULLUP); pinMode(KEY_ROW4, INPUT_PULLUP); pinMode(KEY_PREP, INPUT_PULLUP); pinMode(KEY_VAL , INPUT_PULLUP); //led shifter pinMode(LED_LUMI, OUTPUT); // pwn enable pinMode(LED_SDIN, OUTPUT); // Serial data input SER_Pin pinMode(LED_RCLK, OUTPUT); // Storage register RCLK_Pin pinMode(LED_SRCLK, OUTPUT); // Shift register SRCLK_Pin pinMode(LED_SRCLR, OUTPUT); // Master reclear SRCLR_Pin //le rotary : for(int i=0; i<12; i++) { pinMode(ROT_index[i] , INPUT_PULLUP); } analogWrite(LED_LUMI,255-LED_lumi); digitalWrite(LED_SRCLR, HIGH); // master reclear desactive = HIGH DcsBios::setup(); //Serial.begin(9600); //while (!Serial) { } } void loop() { unsigned long SYS_currentTime ; SYS_currentTime = millis() ; if (SYS_currentTime - SYS_precTime >= CC_time) { SYS_precTime = SYS_currentTime ; if (SYS_startup) { SYS_start(); } else { SYS_main() ; } } if (millis() - SYS_currentTime >CC_time) { error(String("overtime (01) : ")+ (millis() - SYS_currentTime) + "ms"); } } // ============================================= // fonction appelé tant que SYS_startup = true // ============================================= void SYS_start() { lireEntree() ; //truc à la con pour faire joli : static bool startup = false ; static int step_start = 0 ; if (! startup) { step_start++ ; switch (step_start) { case 1 : setRegisterPin(6,HIGH) ; break ; case 3 : setRegisterPin(5,HIGH) ; break ; case 5 : setRegisterPin(4,HIGH) ; break ; case 7 : setRegisterPin(3,HIGH) ; break ; case 9 : setRegisterPin(2,HIGH) ; break ; case 11 : LCD_ligne0 = String("Ready "); setRegisterPin(2,HIGH) ; break ; case 16 : LCD_cleared = true ; clearRegisters(); startup = true; invertRegisters(); break ; } ecrireSortie(); return ; } //-- fin du truc à la con LCD_ligne0 = String(" >>> PCN <<< "); static int page_cur = 0 ; static int page_lst = 0 ; page_lst = page_cur ; if (isPress('I')) page_cur ++ ; if (isPress('E')) SYS_reset() ; if (page_cur != page_lst) LCD_cleared = true ; switch (page_cur) { case 0 : LCD_ligne1 = String(" v") + VERSION + " by " + AUTHOR + " "; break; case 1 : // reglage de la luminosité : if (isPress('1')) LCD_lumi += 25 ; if (isPress('3')) LCD_lumi += 25 ; if (isPress('7')) LCD_lumi -= 25 ; if (isPress('9')) LCD_lumi -= 25 ; if (LCD_lumi > 255) LCD_lumi = 255 ; if (LCD_lumi < 0) LCD_lumi = 0 ; LCD_ligne1 = String("Lumi LCD : ") + String(LCD_lumi) + " "; break; case 2 : // reglage de la luminosité : setRegisters() ; if (isPress('1')) LED_lumi += 25 ; if (isPress('3')) LED_lumi += 25 ; if (isPress('7')) LED_lumi -= 25 ; if (isPress('9')) LED_lumi -= 25 ; if (LED_lumi > 255) LED_lumi = 255 ; if (LED_lumi < 0) LED_lumi = 0 ; LCD_ligne1 = String("Lumi LED : ") + String(LED_lumi) + " "; break; case 3 : LCD_ligne1 = String("conf saved"); break; case 4 : SYS_startup = false ; clearRegisters(); LCD_cleared = true ; LCD_render = false ; break ; } ecrireSortie(); } // ============================================= // fonction pour les traitements // ============================================= void SYS_main() { lireEntree() ; activerTraitement(); ecrireSortie(); } void activerTraitement() { /* if (KEY_cur != ' ' && KEY_cur != KEY_lst) { switch (KEY_cur) { case 'E' : clearRegisters(); LCD_cleared = true ; break; case '1': invertRegisterPin(1); break; case '2': invertRegisterPin(2); break; case '3': invertRegisterPin(3); break; case '4': invertRegisterPin(4); break; case '5': invertRegisterPin(5); break; case '6': invertRegisterPin(6); break; case '7': invertRegisterPin(7); break; default : break ; } LCD_ligne1 += KEY_cur ; } */ DcsBios::loop(); // LCD_ligne0 = TOP_LEFT + " " + TOP_RIGHT ; } void lireEntree() { int row = 0 ; int col = 0 ; digitalWrite(KEY_COL1, false); if (digitalRead(KEY_ROW1) != HIGH) {row = 1 ; col = 1 ; } if (digitalRead(KEY_ROW2) != HIGH) {row = 2 ; col = 1 ; } if (digitalRead(KEY_ROW3) != HIGH) {row = 3 ; col = 1 ; } if (digitalRead(KEY_ROW3) != HIGH) {row = 4 ; col = 1 ; } digitalWrite(KEY_COL1, true); digitalWrite(KEY_COL2, false); if (digitalRead(KEY_ROW1) != HIGH) {row = 1 ; col = 2 ; } if (digitalRead(KEY_ROW2) != HIGH) {row = 2 ; col = 2 ; } if (digitalRead(KEY_ROW3) != HIGH) {row = 3 ; col = 2 ; } if (digitalRead(KEY_ROW4) != HIGH) {row = 4 ; col = 2 ; } digitalWrite(KEY_COL2, true); digitalWrite(KEY_COL3, false); if (digitalRead(KEY_ROW1) != HIGH) {row = 1 ; col = 3 ; } if (digitalRead(KEY_ROW2) != HIGH) {row = 2 ; col = 3 ; } if (digitalRead(KEY_ROW3) != HIGH) {row = 3 ; col = 3 ; } if (digitalRead(KEY_ROW4) != HIGH) {row = 4 ; col = 3 ; } digitalWrite(KEY_COL3, true); digitalWrite(KEY_COL4, false); if (digitalRead(KEY_ROW1) != HIGH) {row = 1 ; col = 4 ; } if (digitalRead(KEY_ROW2) != HIGH) {row = 2 ; col = 4 ; } if (digitalRead(KEY_ROW3) != HIGH) {row = 3 ; col = 4 ; } if (digitalRead(KEY_ROW4) != HIGH) {row = 4 ; col = 4 ; } digitalWrite(KEY_COL4, true); KEY_lst = KEY_cur ; if (row != 0 && col !=0) { KEY_cur = KEY_Map[row-1][col-1] ; debug(String("touch : ") + row + ":" + col + " : " + KEY_Map[row-1][col-1]) ; } else { KEY_cur = ' ' ; } if (digitalRead(KEY_VAL) != HIGH) KEY_cur = 'V'; if (digitalRead(KEY_PREP) != HIGH) KEY_cur = 'P' ; // lecture du rotary : ROT_lst = ROT_cur ; for(int i=0; i<12; i++) { if (digitalRead(ROT_index[i]) != HIGH) { ROT_cur = i ; } } } void ecrireSortie() { //------- //gestion du LCD : //------- if (LCD_cleared) { lcd.setCursor(0, 0); lcd.print(" "); lcd.setCursor(0, 1); lcd.print(" "); LCD_ligne0 = String(); LCD_ligne1 = String(); LCD_cleared = false ; } else if (LCD_render) { lcd.setCursor(0, 0); lcd.print(LCD_ligne0) ; lcd.setCursor(0, 1); lcd.print(LCD_ligne1) ; } //------- //------- // gestion de la luminosité : //------- analogWrite(LCD_LEDPWR,LCD_lumi); analogWrite(LED_LUMI,255-LED_lumi); //------- //------- // gestion des leds : //------- digitalWrite(LED_RCLK, LOW); for(int i = 7; i >= 0; i--) { digitalWrite(LED_SRCLK, LOW); int val = registers[i]; digitalWrite(LED_SDIN, val); digitalWrite(LED_SRCLK, HIGH); } digitalWrite(LED_RCLK, HIGH); //------- } //============================================================================== // fonctions annexes (libraries interne) //============================================================================== bool isPress(char c) { return (KEY_cur != KEY_lst) && (KEY_cur == c) ; } void invertRegisters() { for(int i = 7; i >= 0; i--) { invertRegisterPin(i); } } void clearRegisters() { for(int i = 7; i >= 0; i--) { registers[i] = LOW; } } void setRegisters() { for(int i = 7; i >= 0; i--) { registers[i] = HIGH; } } void setRegisterPin(int index, int value) { registers[index] = value; } void invertRegisterPin(int index) { if (registers[index] == LOW) { registers[index] = HIGH ; } else { registers[index] = LOW ; } } String substr(String s, int start) { if (start > 0) return s.substring(start); return s.substring(s.length() + start) ; } /*** DCS BIOS part ***/ namespace DcsBios { class ErgoButton : PollingInput { private: const char* msg_; bool (*callback_)(char)=0 ; bool lastState_; char key_; void init_(const char* msg, bool (*callback)(char), char key) { msg_ = msg; callback_ = callback; lastState_ = false; key_ = key; } void pollInput() { bool state = callback_(key_); if (state != lastState_) { if (tryToSendDcsBiosMessage(msg_, state == true ? "0" : "1")) { lastState_ = state; } } } public: ErgoButton(const char* msg, bool (*callback)(char),char key) { init_(msg, callback,key); } }; class ErgoKnob : PollingInput { private: const char* msg_; int (*callback_)()=0 ; int lastPos_; void init_(const char* msg, int (*callback)()) { msg_ = msg; callback_ = callback; lastPos_ = callback(); } void pollInput() { int pos = callback_(); if (pos != lastPos_) { byte buff[] = " " ; String(pos).getBytes(buff,3); if (tryToSendDcsBiosMessage(msg_, buff) ) { lastPos_ = pos; } } } public: ErgoKnob(const char* msg, int (*callback)()) { init_(msg, callback); } }; } // VOYANT UNI (rouge) void onPcnUniChange(unsigned int newValue) { setRegisterPin(1, (newValue == 0 ? LOW : HIGH)) ; } DcsBios::IntegerBuffer pcnUniBuffer(0x3082, 0x1000, 12, onPcnUniChange); // VOYANT PRET (vert) void onPcnPretChange(unsigned int newValue) { setRegisterPin(2, (newValue == 0 ? LOW : HIGH)) ; } DcsBios::IntegerBuffer pcnPretBuffer(0x3082, 0x0080, 7, onPcnPretChange); // VOYANT ALN (jaune) void onPcnAlnChange(unsigned int newValue) { setRegisterPin(3, (newValue == 0 ? LOW : HIGH)) ; } DcsBios::IntegerBuffer pcnAlnBuffer(0x3082, 0x0100, 8, onPcnAlnChange); // VOYANT MIP void onPcnMipChange(unsigned int newValue) { setRegisterPin(4, (newValue == 0 ? LOW : HIGH)) ; } DcsBios::IntegerBuffer pcnMipBuffer(0x3082, 0x0200, 9, onPcnMipChange); // VOYANT NDEG void onPcnNdegChange(unsigned int newValue) { setRegisterPin(5, (newValue == 0 ? LOW : HIGH)) ; } DcsBios::IntegerBuffer pcnNdegBuffer(0x3082, 0x0400, 10, onPcnNdegChange); // VOYANT SEC void onPcnSecChange(unsigned int newValue) { setRegisterPin(6, (newValue == 0 ? LOW : HIGH)) ; } DcsBios::IntegerBuffer pcnSecBuffer(0x3082, 0x0800, 11, onPcnSecChange); //BOUTONS bool bouttonPress(char c) { return isPress(c); } DcsBios::ErgoButton insButtonVAL( "INS_VAL_SW", bouttonPress,'V'); DcsBios::ErgoButton insButtonPREP("INS_PREP_SW", bouttonPress,'P'); DcsBios::ErgoButton insButtonDEST("INS_DEST_SW", bouttonPress,'D'); DcsBios::ErgoButton insButtonINS( "INS_BUTTON_INS", bouttonPress,'I'); DcsBios::ErgoButton insButtonEFF( "INS_BUTTON_EFF", bouttonPress,'E'); DcsBios::ErgoButton insButton1( "INS_BUTTON_1", bouttonPress,'1'); DcsBios::ErgoButton insButton2( "INS_BUTTON_2", bouttonPress,'2'); DcsBios::ErgoButton insButton3( "INS_BUTTON_3", bouttonPress,'3'); DcsBios::ErgoButton insButton4( "INS_BUTTON_4", bouttonPress,'4'); DcsBios::ErgoButton insButton5( "INS_BUTTON_5", bouttonPress,'5'); DcsBios::ErgoButton insButton6( "INS_BUTTON_6", bouttonPress,'6'); DcsBios::ErgoButton insButton7( "INS_BUTTON_7", bouttonPress,'7'); DcsBios::ErgoButton insButton8( "INS_BUTTON_8", bouttonPress,'8'); DcsBios::ErgoButton insButton9( "INS_BUTTON_9", bouttonPress,'9'); DcsBios::ErgoButton insButton0( "INS_BUTTON_0", bouttonPress,'0'); //KNOBS int rotaryPos() { return ROT_cur; } DcsBios::ErgoKnob insKnobVal( "INS_ROT_VAL", rotaryPos); void onPcnDispLChange(char* newValue) { //TOP_LEFT = newValue; lcd.setCursor(1, 0); lcd.print(newValue); } DcsBios::StringBuffer<8> pcnDispLBuffer(0x3084, onPcnDispLChange); void onPcnDispRChange(char* newValue) { //TOP_RIGHT = newValue; lcd.setCursor(7, 1); lcd.print(newValue); } DcsBios::StringBuffer<9> pcnDispRBuffer(0x308c, onPcnDispRChange); void onPcnDispDChange(char* newValue) { lcd.setCursor(3, 1); lcd.print(newValue); } DcsBios::StringBuffer<2> pcnDispDBuffer(0x3096, onPcnDispDChange); void onPcnDispPChange(char* newValue) { lcd.setCursor(0, 1); lcd.print(newValue); } DcsBios::StringBuffer<2> pcnDispPBuffer(0x3098, onPcnDispPChange); void onPcnDisDlChange(char* newValue) { lcd.setCursor(0, 0); lcd.print(newValue); } DcsBios::StringBuffer<1> pcnDisDlBuffer(0x309a, onPcnDisDlChange); void onPcnDisDrChange(char* newValue) { lcd.setCursor(6, 1); lcd.print(newValue); } DcsBios::StringBuffer<1> pcnDisDrBuffer(0x309c, onPcnDisDrChange);
Tout travail mérite son dû, n'est-ce pas "Oui Oui" ?
(Vainqueur de la Boulet's Cup Démo Team C6 en 2011 et 2013)
[F.A.Q.] Bien paramètrer ses forums Checksix
Avatar de l’utilisateur

Topic author
exo7
Nouvelle Recrue
Nouvelle Recrue
Messages : 155
Inscription : 29 avril 2014

Re: MAJ DCS BIOS M2000C

#77

Message par exo7 »

Salut Ergo,

Bravo pour le job ! impressionnant !!
tu manies bien les langues... :hum: :banana:

Je n'ai pas bien saisi le "plus" apporté par tes classes ErgoButton et ErgoKnob...
Si tu m'expliques, ça m'intéresse !

Et si l’intérêt est vraiment présent, j’intégrerais ces classes dans la bibliothèque Arduino directement pour ne pas avoir à les retaper dans chaque sketch.
Il restera à modifier le script pour la documentation automatique.

(Il ne faut pas oublier que la philosophie de DCS-BIOS, et de son développeur original ([FSF] Ian), veut que ce soit le plus simple possible à utiliser, et par toute personne ayant un minimum de connaissances en programmation Arduino)

Sinon, perso, je ne rencontre pas d'erreurs de compilation sans la modif du Pollinginput.h...
Peux tu ré essayer avec une version "toute neuve" et en utilisant un skecth simple avec du code tiré du control-reference ?
Je sais qu'à force de chercher et de tester, on arrive parfois à créer des bugs...


Pour l'écran, c'est un choix difficile.
Soit tu restes sur un LCD, ça marche, mais niveau immersion...
Les 7Segments, difficiles à mettre en oeuvre, avec tout le cablage que ça implique (CI)( j'ai un fournisseur chinois qui fait des CI 2 ou 3 faces pas trop cher...) le top au niveau immersion...
ou il y a une piste intéressante, les écrans "vaccum" comme ceux ci :
Image
Image

ca marche comme un LCD.


Au dela de tout ca, si tu penses un jour créer d'autres modules, je te conseille vivement de regarder la partie RS485 dispo dans DCS BIOS et de le prévoir sur tes CI. il faut 2- 3 composants supplémentaires et ca te permet de chainer tes modules.
perso j'ai fais faire des CI qui embarquent directement la liaison RS485, l'arduino (NANO) et la commande du rétro-éclairage du panel.

Image

j'en colles une par panel et tout est chainé.

Faut vraiment qu'on se capte pour discuter des possibilités...

@++
Avatar de l’utilisateur

Raclette_
Nouvelle Recrue
Nouvelle Recrue
Messages : 10
Inscription : 12 juin 2017

Re: MAJ DCS BIOS M2000C

#78

Message par Raclette_ »

Exo7 a écrit : Pour l'écran, c'est un choix difficile.
Soit tu restes sur un LCD, ça marche, mais niveau immersion...
Les 7Segments, difficiles à mettre en oeuvre, avec tout le cablage que ça implique (CI)( j'ai un fournisseur chinois qui fait des CI 2 ou 3 faces pas trop cher...) le top au niveau immersion...
Il existe des modules tout fait à base de max7219 qui sont assez simple à mettre en oeuvre. Chaque circuit peut piloter 8 digits de 8 segments mais ils peuvent se chainer ensemble de façon enfantine pour augmenter le nombre de digit comme pour le PCN.
Y a moyen de faire quelquechose d'assez propre et sans trop perdre de temps et se prendre la tête. Aprés, c'est sur que si on veut un PCN visuellement proche du vrai, ça va prendre de temps mais c'est faisable :D

Il me semble même que les bibliothéques arduino sont disponibles ...
Avatar de l’utilisateur

matbog
Pilote Philanthrope
Pilote Philanthrope
Messages : 2329
Inscription : 13 octobre 2009

Re: MAJ DCS BIOS M2000C

#79

Message par matbog »

Très intéressant ton PCB Exo7. Je comptais tout faire sur des plaque a trous mais si tu as un bon plan pour la réalisation de PCB ça peut valoir le coup de regarder. A combien te revienne tes PCB?
Tu compte tout faire a base de nano? Pour certain instrument complexe il en faudrait plusieurs. Ou alors tout piloté a base de bus I2C ou autre...
Avatar de l’utilisateur

Topic author
exo7
Nouvelle Recrue
Nouvelle Recrue
Messages : 155
Inscription : 29 avril 2014

Re: MAJ DCS BIOS M2000C

#80

Message par exo7 »

Le PCB "Master" qui se plug sur une Arduino MEGA pour l'interface USB / RS485 - 3 BUS RS - me coute 1.19$ pièce en 2 couches (faut en prendre 10 pour avoir ce prix)...
Le PCB "Slave" pour Arduino NANO (celui de la photo) me coute 0.75$ pièce en 2 couches (faut en prendre 50 pour ce prix)...

Plus t'en prend moins c'est cher. d'ailleurs s'il y a des intéressés, j'en ai quelques uns sinon on peut grouper une commande.

il y a environ 30$ de frais de port.
il faut fournir les fichiers GERBER.

ca se passe ici : https://www.shenzhen2u.com


Pour les panels complexes, je pense mettre une MEGA. je suis en train de faire un PCB "Slave" qui se plug dessus..
Avatar de l’utilisateur

matbog
Pilote Philanthrope
Pilote Philanthrope
Messages : 2329
Inscription : 13 octobre 2009

Re: MAJ DCS BIOS M2000C

#81

Message par matbog »

A ce prix la je suis très intéressé. Si tu pense qu'une commande groupé peut valoir le coup, j'en suis!
Avatar de l’utilisateur

Topic author
exo7
Nouvelle Recrue
Nouvelle Recrue
Messages : 155
Inscription : 29 avril 2014

Re: MAJ DCS BIOS M2000C

#82

Message par exo7 »

Voici le PCB "Master" 3 BUS RS485

Image
Avatar de l’utilisateur

matbog
Pilote Philanthrope
Pilote Philanthrope
Messages : 2329
Inscription : 13 octobre 2009

Re: MAJ DCS BIOS M2000C

#83

Message par matbog »

Q'utilise tu comme controleur RS485? J'avais fait une commande de sample de MAX489E il me semble...
Avatar de l’utilisateur

Topic author
exo7
Nouvelle Recrue
Nouvelle Recrue
Messages : 155
Inscription : 29 avril 2014

Re: MAJ DCS BIOS M2000C

#84

Message par exo7 »

j'utilise les MAX487E
Avatar de l’utilisateur

matbog
Pilote Philanthrope
Pilote Philanthrope
Messages : 2329
Inscription : 13 octobre 2009

Re: MAJ DCS BIOS M2000C

#85

Message par matbog »

Aaarfff je regarderais si c'est compatible.
En tout cas si tu vends les PCB que tu as en trop, je suis très intéressé par un Master et des Slaves...
Avatar de l’utilisateur

Topic author
exo7
Nouvelle Recrue
Nouvelle Recrue
Messages : 155
Inscription : 29 avril 2014

Re: MAJ DCS BIOS M2000C

#86

Message par exo7 »

Oui je peux proposer des PCB nus ou des cartes prêtes à fonctionner.

Carte "Master" 1, 2 ou 3 BUS RS (sans la MEGA)
Carte "Slave" avec / sans la NANO.


Mat ==> Check MP
Avatar de l’utilisateur

Topic author
exo7
Nouvelle Recrue
Nouvelle Recrue
Messages : 155
Inscription : 29 avril 2014

Re: MAJ DCS BIOS M2000C

#87

Message par exo7 »

Dernière version à jour, incluant les Afficheurs du PCA (que j'avais honteusement oublié...)

https://github.com/Exo7/DCS_BIOS-M2000C ... ses/latest
Avatar de l’utilisateur

matbog
Pilote Philanthrope
Pilote Philanthrope
Messages : 2329
Inscription : 13 octobre 2009

Re: MAJ DCS BIOS M2000C

#88

Message par matbog »

Je viens de jeter un oeil au fichier control-reference.html.
Je me suis intéressé à l'ADI (ou Boule) et je remarque qu'il n'y a pas le signal correspondant à la bille n'y celui correspondant à l'indicateur de roulis (pas la rotation de la boule sur l'axe de roulis mais le petit triangle blanc). Est ce un oublie ou est ce que les signaux ne sont pas rendu disponible par DCS?
Avatar de l’utilisateur

Topic author
exo7
Nouvelle Recrue
Nouvelle Recrue
Messages : 155
Inscription : 29 avril 2014

Re: MAJ DCS BIOS M2000C

#89

Message par exo7 »

je vais regarder pour la bille...

pour le triangle, il doit utiliser la même variable que la boule...
Avatar de l’utilisateur

matbog
Pilote Philanthrope
Pilote Philanthrope
Messages : 2329
Inscription : 13 octobre 2009

Re: MAJ DCS BIOS M2000C

#90

Message par matbog »

Non je pense que c'est une autre variable car si tu fais une boucle parfaite le triangle reste plein Sud pendant le premier quart de la boucle et il passe plein Nord lorsque tu franchis la verticale alors que le roulis est resté à 0°. Le triangle repasse plein Sud une fois que tu refranchis la verticale nez bas (3/4 de boucle).
Il manque également le signal Feux PC.
Avatar de l’utilisateur

Topic author
exo7
Nouvelle Recrue
Nouvelle Recrue
Messages : 155
Inscription : 29 avril 2014

Re: MAJ DCS BIOS M2000C

#91

Message par exo7 »

hum...

Oui mais lorsque tu passes les 90°, virtuellement tu viens de faire un 180° en roulis... idem au passage des 270°...
quoi qu'il arrive, le triangle suit bien le " pole SUD" (la partie noire) de la boule...

Mais je vais chercher...

Le feu PC est passé au travers... je l'avais bien préparé, mais pas inscrit dans le LUA... :hum:
Avatar de l’utilisateur

matbog
Pilote Philanthrope
Pilote Philanthrope
Messages : 2329
Inscription : 13 octobre 2009

Re: MAJ DCS BIOS M2000C

#92

Message par matbog »

Quand je disait que le triangle passe du Sud au Nord et vice versa je ne parlais pas des pôles de la sphère. J'aurais du parler du bas et du haut du cadran...

EDIT: Je viens de comprendre ce que tu voulais dire. Tu pense que c'est le passage instantané du signal de roulis de 0 à 180 qui pilote l'indicateur triangulaire... C'est possible effectivement.
Avatar de l’utilisateur

Topic author
exo7
Nouvelle Recrue
Nouvelle Recrue
Messages : 155
Inscription : 29 avril 2014

Re: MAJ DCS BIOS M2000C

#93

Message par exo7 »

v1.16 : Github

Modifying Memory Allocation Address to match with existants modules
Adding "FEU PC", "LIM" & "IFF" Indicator Light
Adding Oxy Flow Indicator
Adding ADI "Bille"


@Matbog : Aucune variable trouvée pour le triangle, pour le moment...
Avatar de l’utilisateur

matbog
Pilote Philanthrope
Pilote Philanthrope
Messages : 2329
Inscription : 13 octobre 2009

Re: MAJ DCS BIOS M2000C

#94

Message par matbog »

Merci Exo7.
Pas de soucis pour le triangle, on peut de toute façon s'en sortir avec le signal de roulis.
Avatar de l’utilisateur

ergo
Webmaster
Webmaster
Messages : 14485
Inscription : 27 avril 2008

Re: MAJ DCS BIOS M2000C

#95

Message par ergo »

Exo7 a écrit :Salut Ergo,

Bravo pour le job ! impressionnant !!
tu manies bien les langues... :hum: :banana:

Je n'ai pas bien saisi le "plus" apporté par tes classes ErgoButton et ErgoKnob...
Si tu m'expliques, ça m'intéresse !

Merci Exo7 :)

Pour répondre à ta question :

Mon idée de départ était de créer un code qui puisse être tester sans DCSBios avant de l'intégrer a mon code.
J'ai donc créé des routines qui me permettent de faire plein de truc.

J'ai une routine qui scrute les entrées ( lireEntree() ) et qui me permet de savoir si j'appuie sur un bouton, la position du rotacteur etc ...
J'ai une routine qui effectue les traitements, là c'est pas bien méchant, car c'est juste faire tourner le loop() de DCSBios.

Le principe des traitements que j'utilise c'est de se nourrir des entrée pour effectuer une action, et de nourrir les sorties (les strings ligne0 et ligne1, et le registres pour les leds). Jusque là, quand la loop() de DCSBios à fini, rien n'est encore affiché.

Enfin j'ai une routine qui affiche ( ecrireSortie() ) et qui permet en fonction des variables internes de savoir quoi affiché dans le LCD, de savoir quoi allumé comme leds et de modifier la luminosité.

Mais résultat, le système de DCSBios me limitait, car il part du principe qu'il va directement scruté les pins de ma carte pour les boutons et knobs. Donc résultat j'ai créé deux classes dans DCSBios pour faire en sorte que DCSBios puisse connaitre l'état d'un bouton, ou la position d'un knobs, en ayant comme référence une fonction d'entrée. (la fameuse callback).

Déjà je commence par la callback :

bouttonPress( char c ) , renvoie VRAI si la touche c est appuyé.

Donc pour la touche "1" si je veux savoir si elle est appuyé j'ai juste besoin de faire buttonPress('1'); (important les simple guillemet, c'est un char, pas une string ).

Et donc coté DCSBios::ErgoButton, pour chaque bouton je donne les bon paramètres :
DcsBios::ErgoButton insButton1( "INS_BUTTON_1", bouttonPress,'1');
DcsBios::ErgoButton insButton2( "INS_BUTTON_2", bouttonPress,'2');
DcsBios::ErgoButton insButton3( "INS_BUTTON_3", bouttonPress,'3');
DcsBios::ErgoButton insButton4( "INS_BUTTON_4", bouttonPress,'4');

Coté DCSBios::ErgoKnob c'est le même principe, sauf que la fonction rotaryPos() au lieu de renvoyer vrai renvoye la position du rotary, et il me reste plus qu'a faire :
DcsBios::ErgoKnob insKnobVal( "INS_ROT_VAL", rotaryPos);

Je suis bien conscient que pour quelqu'un qui veut pas faire une ligne de code c'est moins simple, mais ca fait gagner de la flexibilité au code ;)
Tout travail mérite son dû, n'est-ce pas "Oui Oui" ?
(Vainqueur de la Boulet's Cup Démo Team C6 en 2011 et 2013)
[F.A.Q.] Bien paramètrer ses forums Checksix
Avatar de l’utilisateur

Roger01
Nouvelle Recrue
Nouvelle Recrue
Messages : 165
Inscription : 17 avril 2017

Re: MAJ DCS BIOS M2000C

#96

Message par Roger01 »

Exo7 a écrit :Voici le PCB "Master" 3 BUS RS485

Image
https://www.hostingpics.net/viewer.php? ... MG1776.jpg

Salut Exo,



Quand je regarde ta carte Slave, il y a 2 port rj11/45, c'est pour un branchement en série (slave <=> slave <=> (...) <=> slave <=> master)?

Du coup, les 3 max sur le Master, c'est pour avoir 3 circuits en série?

Et je n'ai pas compris l'utilité des autres composants.

En tout cas je suis trèèèèèèèès intéressé par tes pcb (à acheter ou plan), car c'est ce que je cherche depuis cet aprem. :notworthy

Et éventuellement, je cherche le bout de code pour gérer le rs485, j'ai beau fouiller sur le forum de dcs, je ne trouve pas :(
Referral code Star Citizen : STAR-WSYD-HCHK
Avatar de l’utilisateur

TheSkyline35
Apprenti-Mécano
Apprenti-Mécano
Messages : 245
Inscription : 16 septembre 2012

Re: MAJ DCS BIOS M2000C

#97

Message par TheSkyline35 »

Bonjour et déjà merci beaucoup pour ton travail (Et Ergo aussi de ce que j'ai vu !), c'est exactement ce que je cherchais et m'attaquer à fond dans le LUA me faisais bien peur, trop de langage en même temps j'en peu plus.

En revanche j'ai pas du saisir un truc, et ça ne vient pas de ton travail mais rien que de base... je n'arrive pas modifier le fichier DCS BIOS pour arduino (IRQSerial) de base sans une erreur.

Le fichier de base :

Code : Tout sélectionner

#define DCSBIOS_IRQ_SERIAL #include "DcsBios.h" void setup() { DcsBios::setup(); } void loop() { DcsBios::loop(); }

Bon, j'ajoute le Serial, simplement, rien de plus, rien de moins !

Code : Tout sélectionner

#define DCSBIOS_IRQ_SERIAL #include "DcsBios.h" /* paste code snippets from the reference documentation here */ void setup() { DcsBios::setup(); Serial.begin(9600); } void loop() { DcsBios::loop(); }
Et voici mon erreur :

Code : Tout sélectionner

HardwareSerial0.cpp.o (symbol from plugin): In function `Serial': (.text+0x0): multiple definition of `__vector_18' sketch\IRQSerial_Test.ino.cpp.o (symbol from plugin):(.text+0x0): first defined here collect2.exe: error: ld returned 1 exit status exit status 1 Erreur de compilation pour la carte Arduino/Genuino Uno
J'ai commencé Arduino y a même pas 1 mois, le LUA y a 2 jours, honnêtement, je suis perdu, j'apprend vite, mais là, ça me semble être un conflit de librairie c'est ça ? Comment c'est possible que le Serial soit en opposition, y a difficilement plus basique en usage Arduino... Et j'utilise un TM1638 pour afficher mes éléments, pareil si j'essai d'ajouter la librarie, même erreur, même sans ajouter le Serial en fait, je comprend pas :ouin:
https://imgur.com/a/yg12w

J'ai réussi à parfaitement faire marcher ma carte avec mon TM1638 sur d'autres simulateur comme Assetto Corsa (des voitures, certes) mais DCS déjà est nettement moins sympa avec le LUA et je comprend pas trop ce qui se passe de mal...
Image
i5 3570k OC 4.2GhZ -- GTX970 4Go Inno3D -- 8Go RAM -- 2To HDD -- Saitek X52 + Rudder Pedals -- Logitech GT Driving Force
Avatar de l’utilisateur

Topic author
exo7
Nouvelle Recrue
Nouvelle Recrue
Messages : 155
Inscription : 29 avril 2014

Re: MAJ DCS BIOS M2000C

#98

Message par exo7 »

TheSkyline35 a écrit :...
Bon, j'ajoute le Serial, simplement, rien de plus, rien de moins ![/u]

Code : Tout sélectionner

#define DCSBIOS_IRQ_SERIAL #include "DcsBios.h" /* paste code snippets from the reference documentation here */ void setup() { DcsBios::setup(); Serial.begin(9600); } void loop() { DcsBios::loop(); }

Salut TheSkyline35,

il n'y a pas besoin de déclarer le serial.
il est automatiquement déclaré dans le DcsBios.h.
en fait tout le Setup est dans le DcsBios.h, il n'y a rien a ajouter, juste tes lignes extraites du control-reference.html.

@++
Avatar de l’utilisateur

TheSkyline35
Apprenti-Mécano
Apprenti-Mécano
Messages : 245
Inscription : 16 septembre 2012

Re: MAJ DCS BIOS M2000C

#99

Message par TheSkyline35 »

Exo7 a écrit :
TheSkyline35 a écrit :...
Bon, j'ajoute le Serial, simplement, rien de plus, rien de moins ![/u]

Code : Tout sélectionner

#define DCSBIOS_IRQ_SERIAL #include "DcsBios.h" /* paste code snippets from the reference documentation here */ void setup() { DcsBios::setup(); Serial.begin(9600); } void loop() { DcsBios::loop(); }

Salut TheSkyline35,

il n'y a pas besoin de déclarer le serial.
il est automatiquement déclaré dans le DcsBios.h.
en fait tout le Setup est dans le DcsBios.h, il n'y a rien a ajouter, juste tes lignes extraites du control-reference.html.

@++
Merci et je viens en plus de résoudre le problème totalement, en fait Serial rentre en conflit, donc si une bibliothèque utilise le Serial, il y a erreur. Ma bibliothèque pour mon TM1638 utilisait une fois la classe Serial, donc erreur ! J'ai passé la ligne en commentaire, elle n'est pas bien importante, problème résolu.

Aller je m'élance dans l'intégration du Mirage maintenant ! Merci pour ta réponse :)
Image
i5 3570k OC 4.2GhZ -- GTX970 4Go Inno3D -- 8Go RAM -- 2To HDD -- Saitek X52 + Rudder Pedals -- Logitech GT Driving Force
Avatar de l’utilisateur

TheSkyline35
Apprenti-Mécano
Apprenti-Mécano
Messages : 245
Inscription : 16 septembre 2012

Re: MAJ DCS BIOS M2000C

#100

Message par TheSkyline35 »

Je m'y suis mit et....bah ça marche pas super et je ne sais pas pourquoi.

Le Mig-21 marche parfaitement, je récupérer la vitesse, je l'affiche.

Mais le Mirage ne marche pas chez moi... Il n'y a pourtant qu'à modifier le dossier script non ? Car autant le connect-serial-port.cmd affiche pleins de choses, tout de même moins que le Mig, rien que faire marcher la LED PC ne marche pas, la vitesse non plus, j'ai du rater une étape ?

Ce qui me dit que le problème ne vient pas de mon code arduino c'est que le Live Data ne marche même pas alors que sur le Mig il lit immédiatement les donnés en temps réel.

EDIT
Bien sur j'ai rajouté la ligne dans l'Export, enfait mon DCS-BIOS marche à 100%...mais il veut pas du mirage ^^ Pourtant la librairie arduino est là et reconnus, les fichier DCS-BIOS sont les bons....je comprend pas là o_O
Image
i5 3570k OC 4.2GhZ -- GTX970 4Go Inno3D -- 8Go RAM -- 2To HDD -- Saitek X52 + Rudder Pedals -- Logitech GT Driving Force
Répondre

Revenir à « Cockpit & mod perso »