Reorganization of library structure to better match Arduino spec (#20)
Note, this will also require to you "uninstall and reinstall" the Arduino library due to the library file location changes. Reviewed-on: https://git.pinkduck.xyz/awonak/libGravity/pulls/20
This commit is contained in:
94
src/digital_output.h
Normal file
94
src/digital_output.h
Normal file
@ -0,0 +1,94 @@
|
||||
/**
|
||||
* @file digital_output.h
|
||||
* @author Adam Wonak (https://github.com/awonak)
|
||||
* @brief Class for interacting with trigger / gate outputs.
|
||||
* @version 0.1
|
||||
* @date 2025-04-17
|
||||
*
|
||||
* @copyright MIT - (c) 2025 - Adam Wonak - adam.wonak@gmail.com
|
||||
*
|
||||
*/
|
||||
#ifndef DIGITAL_OUTPUT_H
|
||||
#define DIGITAL_OUTPUT_H
|
||||
|
||||
#include <Arduino.h>
|
||||
|
||||
const byte DEFAULT_TRIGGER_DURATION_MS = 5;
|
||||
|
||||
class DigitalOutput {
|
||||
public:
|
||||
/**
|
||||
* Initializes an CV Output paired object.
|
||||
*
|
||||
* @param cv_pin gpio pin for the cv output
|
||||
*/
|
||||
void Init(uint8_t cv_pin) {
|
||||
pinMode(cv_pin, OUTPUT); // Gate/Trigger Output
|
||||
cv_pin_ = cv_pin;
|
||||
trigger_duration_ = DEFAULT_TRIGGER_DURATION_MS;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the trigger duration in miliseconds.
|
||||
*
|
||||
* @param duration_ms trigger duration in miliseconds
|
||||
*/
|
||||
void SetTriggerDuration(uint8_t duration_ms) {
|
||||
trigger_duration_ = duration_ms;
|
||||
}
|
||||
|
||||
/**
|
||||
* Turn the CV and LED on or off according to the input state.
|
||||
*
|
||||
* @param state Arduino digital HIGH or LOW values.
|
||||
*/
|
||||
inline void Update(uint8_t state) {
|
||||
if (state == HIGH) High(); // Rising
|
||||
if (state == LOW) Low(); // Falling
|
||||
}
|
||||
|
||||
// Sets the cv output HIGH to about 5v.
|
||||
inline void High() { update(HIGH); }
|
||||
|
||||
// Sets the cv output LOW to 0v.
|
||||
inline void Low() { update(LOW); }
|
||||
|
||||
/**
|
||||
* Begin a Trigger period for this output.
|
||||
*/
|
||||
inline void Trigger() {
|
||||
update(HIGH);
|
||||
last_triggered_ = millis();
|
||||
}
|
||||
|
||||
/**
|
||||
* Return a bool representing the on/off state of the output.
|
||||
*/
|
||||
inline void Process() {
|
||||
// If trigger is HIGH and the trigger duration time has elapsed, set the output low.
|
||||
if (on_ && (millis() - last_triggered_) >= trigger_duration_) {
|
||||
update(LOW);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Return a bool representing the on/off state of the output.
|
||||
*
|
||||
* @return true if current cv state is high, false if current cv state is low
|
||||
*/
|
||||
inline bool On() { return on_; }
|
||||
|
||||
private:
|
||||
unsigned long last_triggered_;
|
||||
uint8_t trigger_duration_;
|
||||
uint8_t cv_pin_;
|
||||
uint8_t led_pin_;
|
||||
bool on_;
|
||||
|
||||
void update(uint8_t state) {
|
||||
digitalWrite(cv_pin_, state);
|
||||
on_ = state == HIGH;
|
||||
}
|
||||
};
|
||||
|
||||
#endif
|
||||
Reference in New Issue
Block a user