102 lines
2.7 KiB
C++
102 lines
2.7 KiB
C++
/**
|
|
* @file AccessoryOutputs.h
|
|
* @brief Accessory Output Controller (N-channel MOSFETs)
|
|
*
|
|
* Controls 2 N-channel MOSFET outputs for accessories like smoke generators,
|
|
* sound modules, or other low-side switched loads.
|
|
*/
|
|
|
|
#ifndef ACCESSORY_OUTPUTS_H
|
|
#define ACCESSORY_OUTPUTS_H
|
|
|
|
#include <Arduino.h>
|
|
|
|
enum AccessoryMode {
|
|
ACC_OFF = 0, // Always off
|
|
ACC_ON = 1, // Always on
|
|
ACC_FUNCTION = 2, // Controlled by DCC function
|
|
ACC_PWM = 3, // PWM control
|
|
ACC_BLINK = 4, // Blinking mode
|
|
ACC_SPEED_DEPENDENT = 5 // Output follows speed
|
|
};
|
|
|
|
class AccessoryOutputs {
|
|
public:
|
|
AccessoryOutputs();
|
|
|
|
/**
|
|
* @brief Initialize accessory outputs
|
|
* @param output1Pin GPIO for accessory output 1 (N-FET gate)
|
|
* @param output2Pin GPIO for accessory output 2 (N-FET gate)
|
|
* @return true if successful
|
|
*/
|
|
bool begin(uint8_t output1Pin, uint8_t output2Pin);
|
|
|
|
/**
|
|
* @brief Set output mode
|
|
* @param outputNum Output number (1 or 2)
|
|
* @param mode Accessory mode
|
|
*/
|
|
void setMode(uint8_t outputNum, AccessoryMode mode);
|
|
|
|
/**
|
|
* @brief Set PWM duty cycle for output
|
|
* @param outputNum Output number (1 or 2)
|
|
* @param dutyCycle Duty cycle (0-255)
|
|
*/
|
|
void setPWM(uint8_t outputNum, uint8_t dutyCycle);
|
|
|
|
/**
|
|
* @brief Map DCC function to output
|
|
* @param outputNum Output number (1 or 2)
|
|
* @param functionNum DCC function number (0-28)
|
|
*/
|
|
void mapFunction(uint8_t outputNum, uint8_t functionNum);
|
|
|
|
/**
|
|
* @brief Update function state
|
|
* @param functionNum Function number (0-28)
|
|
* @param state Function state (true = on)
|
|
*/
|
|
void setFunctionState(uint8_t functionNum, bool state);
|
|
|
|
/**
|
|
* @brief Set speed for speed-dependent mode
|
|
* @param speed Speed value (0-126)
|
|
*/
|
|
void setSpeed(uint8_t speed);
|
|
|
|
/**
|
|
* @brief Update outputs (call regularly from loop)
|
|
*/
|
|
void update();
|
|
|
|
/**
|
|
* @brief Direct output control
|
|
* @param outputNum Output number (1 or 2)
|
|
* @param state Output state (true = on)
|
|
*/
|
|
void setOutput(uint8_t outputNum, bool state);
|
|
|
|
private:
|
|
uint8_t pins[2];
|
|
AccessoryMode modes[2];
|
|
uint8_t pwmValues[2];
|
|
uint8_t mappedFunctions[2];
|
|
bool functionStates[29]; // F0-F28
|
|
uint8_t currentSpeed;
|
|
|
|
// PWM channels
|
|
const uint8_t pwmChannels[2] = {2, 3};
|
|
const uint32_t pwmFrequency = 1000; // 1 kHz
|
|
const uint8_t pwmResolution = 8;
|
|
|
|
// Blink timing
|
|
unsigned long lastBlinkUpdate;
|
|
bool blinkState;
|
|
|
|
void updateOutput(uint8_t outputNum);
|
|
};
|
|
|
|
#endif // ACCESSORY_OUTPUTS_H
|