Ajout CV standards
This commit is contained in:
+71
-3
@@ -3,28 +3,48 @@
|
||||
#include <NmraDcc.h>
|
||||
#include <EEPROM.h>
|
||||
|
||||
// Affectation des PINs Arduino
|
||||
#define DCC_SIGNAL_PIN 2
|
||||
#define LED_PIN 3
|
||||
#define PWM_PIN 5
|
||||
#define SERVO_PIN 6
|
||||
|
||||
// Valeurs des CV (Configuration Variables)
|
||||
#define CV_ADDRESS_LSB 513
|
||||
#define CV_ADDRESS_MSB 521
|
||||
#define CV_PALES_SPEED 100
|
||||
#define CV_MAX_UP 101
|
||||
#define CV_MAX_DOWN 102
|
||||
|
||||
// Valeurs par défaut des CV
|
||||
#define DEFAULT_PALES_SPEED 255
|
||||
#define DEFAULT_MAX_UP 180
|
||||
#define DEFAULT_MAX_DOWN 0
|
||||
#define DEFAULT_ADDRESS 1
|
||||
#define VITESSE 20 // Temps en millisecondes entre chaque pas de servo
|
||||
|
||||
#define EEPROM_SIG_ADDR 0
|
||||
#define EEPROM_SIG_VALUE 0xA5
|
||||
#define DIY_MANUFACTURER_ID 13
|
||||
|
||||
struct DCCAccessoryConfig {
|
||||
byte Sig; // Signature pour vérifier la validité de la structure (0x45)
|
||||
byte ManufacturerID; // Manufacturer ID (0-255)
|
||||
byte Version; // Version of the accessory decoder (0-255)
|
||||
|
||||
int address; // From 1 to 2044
|
||||
byte MotorSpeed; // Speed of the motor (0-255)
|
||||
byte ServoMaxUp; // Maximum position for servo up (0-180)
|
||||
byte ServoMaxDown; // Maximum position for servo down (0-180)
|
||||
};
|
||||
|
||||
|
||||
NmraDcc Dcc;
|
||||
Servo servoMotor;
|
||||
uint8_t PalesSpeed = DEFAULT_PALES_SPEED;
|
||||
uint8_t ServoMaxUp = DEFAULT_MAX_UP;
|
||||
uint8_t ServoMaxDown = DEFAULT_MAX_DOWN;
|
||||
uint16_t currentAddress = DEFAULT_ADDRESS;
|
||||
int STROBE_ON = 0;
|
||||
int HelicoUP = 0;
|
||||
int currentServoPos = 90;
|
||||
@@ -54,9 +74,34 @@ void notifyCVChange(uint16_t CV, uint8_t Value)
|
||||
ServoMaxUp = Value;
|
||||
} else if (CV == CV_MAX_DOWN) {
|
||||
ServoMaxDown = Value;
|
||||
} else if (CV == CV_ADDRESS_LSB || CV == CV_ACCESSORY_DECODER_ADDRESS_LSB) {
|
||||
currentAddress = (currentAddress & 0xFF00) | Value;
|
||||
if (CV == CV_ADDRESS_LSB) {
|
||||
Dcc.setCV(CV_ACCESSORY_DECODER_ADDRESS_LSB, Value);
|
||||
} else {
|
||||
Dcc.setCV(CV_ADDRESS_LSB, Value);
|
||||
}
|
||||
} else if (CV == CV_ADDRESS_MSB || CV == CV_ACCESSORY_DECODER_ADDRESS_MSB) {
|
||||
currentAddress = (currentAddress & 0x00FF) | ((Value & 0x07) << 8);
|
||||
if (CV == CV_ADDRESS_MSB) {
|
||||
Dcc.setCV(CV_ACCESSORY_DECODER_ADDRESS_MSB, Value & 0x07);
|
||||
} else {
|
||||
Dcc.setCV(CV_ADDRESS_MSB, Value);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
uint8_t notifyCVValid (uint16_t CV, uint8_t Writable)
|
||||
{
|
||||
if (CV == CV_PALES_SPEED || CV == CV_MAX_UP || CV == CV_MAX_DOWN ||
|
||||
CV == CV_ADDRESS_LSB || CV == CV_ADDRESS_MSB ||
|
||||
CV == CV_ACCESSORY_DECODER_ADDRESS_LSB || CV == CV_ACCESSORY_DECODER_ADDRESS_MSB) {
|
||||
return 1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* Notifie la réinitialisation des valeurs par défaut de la CV.
|
||||
*/
|
||||
@@ -65,6 +110,8 @@ void notifyCVResetFactoryDefault()
|
||||
Dcc.setCV(CV_PALES_SPEED, DEFAULT_PALES_SPEED);
|
||||
Dcc.setCV(CV_MAX_UP, DEFAULT_MAX_UP);
|
||||
Dcc.setCV(CV_MAX_DOWN, DEFAULT_MAX_DOWN);
|
||||
Dcc.setCV(CV_ACCESSORY_DECODER_ADDRESS_LSB, DEFAULT_ADDRESS & 0xFF);
|
||||
Dcc.setCV(CV_ACCESSORY_DECODER_ADDRESS_MSB, (DEFAULT_ADDRESS >> 8) & 0x07);
|
||||
EEPROM.update(EEPROM_SIG_ADDR, EEPROM_SIG_VALUE);
|
||||
}
|
||||
|
||||
@@ -78,6 +125,9 @@ void loadCvDefaultsIfNeeded()
|
||||
Dcc.setCV(CV_PALES_SPEED, DEFAULT_PALES_SPEED);
|
||||
Dcc.setCV(CV_MAX_UP, DEFAULT_MAX_UP);
|
||||
Dcc.setCV(CV_MAX_DOWN, DEFAULT_MAX_DOWN);
|
||||
Dcc.setCV(CV_ACCESSORY_DECODER_ADDRESS_LSB, DEFAULT_ADDRESS & 0xFF);
|
||||
Dcc.setCV(CV_ACCESSORY_DECODER_ADDRESS_MSB, (DEFAULT_ADDRESS >> 8) & 0x07);
|
||||
|
||||
EEPROM.update(EEPROM_SIG_ADDR, EEPROM_SIG_VALUE);
|
||||
}
|
||||
}
|
||||
@@ -102,6 +152,24 @@ void loadCvFromDcc()
|
||||
if (ServoMaxDown == 0) {
|
||||
ServoMaxDown = DEFAULT_MAX_DOWN;
|
||||
}
|
||||
|
||||
uint8_t addrLo = Dcc.getCV(CV_ADDRESS_LSB);
|
||||
uint8_t addrHi = Dcc.getCV(CV_ADDRESS_MSB) & 0x07;
|
||||
uint16_t address = ((uint16_t)addrHi << 8) | addrLo;
|
||||
if (address == 0) {
|
||||
addrLo = Dcc.getCV(CV_ACCESSORY_DECODER_ADDRESS_LSB);
|
||||
addrHi = Dcc.getCV(CV_ACCESSORY_DECODER_ADDRESS_MSB) & 0x07;
|
||||
address = ((uint16_t)addrHi << 8) | addrLo;
|
||||
}
|
||||
if (address == 0) {
|
||||
address = DEFAULT_ADDRESS;
|
||||
}
|
||||
currentAddress = address;
|
||||
|
||||
Dcc.setCV(CV_ACCESSORY_DECODER_ADDRESS_LSB, addrLo);
|
||||
Dcc.setCV(CV_ACCESSORY_DECODER_ADDRESS_MSB, addrHi);
|
||||
Dcc.setCV(CV_ADDRESS_LSB, addrLo);
|
||||
Dcc.setCV(CV_ADDRESS_MSB, addrHi);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -151,9 +219,9 @@ void setup()
|
||||
Dcc.pin(0, DCC_SIGNAL_PIN, 1);
|
||||
#endif
|
||||
|
||||
// Initialise le décodeur DCC avec l'adresse 10 et les fonctionnalités de décodeur d'accessoires et de mode d'adresse de sortie.
|
||||
Dcc.init(MAN_ID_DIY, 10, CV29_ACCESSORY_DECODER | CV29_OUTPUT_ADDRESS_MODE, 0);
|
||||
// Charge les valeurs par défaut des CV si elles n'ont pas encore été initialisées.
|
||||
// Initialise le décodeur DCC en mode accessoire avec filtrage d'adresse sur l'adresse DCC courante.
|
||||
Dcc.init(MAN_ID_DIY, 10, FLAGS_MY_ADDRESS_ONLY | FLAGS_DCC_ACCESSORY_DECODER | FLAGS_OUTPUT_ADDRESS_MODE, 0);
|
||||
|
||||
loadCvDefaultsIfNeeded();
|
||||
loadCvFromDcc();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user