mirror of
https://github.com/Next-Flip/Momentum-Firmware.git
synced 2026-05-24 05:34:45 -07:00
added send_time option to start a signal at a specific DWT->CYCCNT value
This commit is contained in:
@@ -253,6 +253,7 @@ void digital_sequence_alloc_sequence(DigitalSequence* sequence, uint32_t size) {
|
||||
sequence->sequence_used = 0;
|
||||
sequence->sequence_size = size;
|
||||
sequence->sequence = malloc(sequence->sequence_size);
|
||||
sequence->send_time = 0;
|
||||
}
|
||||
|
||||
DigitalSequence* digital_sequence_alloc(uint32_t size, const GpioPin* gpio) {
|
||||
@@ -288,6 +289,10 @@ void digital_sequence_set_signal(DigitalSequence* sequence, uint8_t signal_index
|
||||
digital_signal_prepare(signal);
|
||||
}
|
||||
|
||||
void digital_sequence_set_sendtime(DigitalSequence* sequence, uint32_t send_time) {
|
||||
sequence->send_time = send_time;
|
||||
}
|
||||
|
||||
void digital_sequence_add(DigitalSequence* sequence, uint8_t signal_index) {
|
||||
furi_assert(sequence);
|
||||
furi_assert(signal_index < sequence->signals_size);
|
||||
@@ -352,7 +357,8 @@ void digital_signal_update_dma(DigitalSignal* signal) {
|
||||
LL_DMA_ClearFlag_TC2(DMA1);
|
||||
}
|
||||
|
||||
static bool digital_sequence_send_signal(DigitalSignal* signal) {
|
||||
static bool digital_sequence_send_signal(DigitalSequence* sequence, DigitalSignal* signal) {
|
||||
furi_assert(sequence);
|
||||
furi_assert(signal);
|
||||
|
||||
/* the first iteration has to set up the whole machinery */
|
||||
@@ -362,6 +368,17 @@ static bool digital_sequence_send_signal(DigitalSignal* signal) {
|
||||
return false;
|
||||
}
|
||||
digital_signal_setup_timer();
|
||||
|
||||
/* if the send time is specified, wait till the core timer passed beyond that time */
|
||||
if(sequence->send_time != 0) {
|
||||
while(true) {
|
||||
uint32_t delta = sequence->send_time - DWT->CYCCNT;
|
||||
/* yeah, it's making use of underflows... */
|
||||
if(delta > 0x80000000) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
digital_signal_start_timer();
|
||||
} else {
|
||||
/* configure next polarities and timings */
|
||||
@@ -440,7 +457,7 @@ bool digital_sequence_send(DigitalSequence* sequence) {
|
||||
sequence->signals_prolonged[signal_index] = needs_prolongation;
|
||||
}
|
||||
|
||||
bool success = digital_sequence_send_signal(sig);
|
||||
bool success = digital_sequence_send_signal(sequence, sig);
|
||||
|
||||
if(!success) {
|
||||
break;
|
||||
|
||||
@@ -42,6 +42,7 @@ typedef struct {
|
||||
bool* signals_prolonged;
|
||||
uint8_t* sequence;
|
||||
const GpioPin* gpio;
|
||||
uint32_t send_time;
|
||||
} DigitalSequence;
|
||||
|
||||
|
||||
@@ -69,6 +70,7 @@ void digital_signal_send(DigitalSignal* signal, const GpioPin* gpio);
|
||||
DigitalSequence* digital_sequence_alloc(uint32_t size, const GpioPin* gpio);
|
||||
void digital_sequence_free(DigitalSequence* sequence);
|
||||
void digital_sequence_set_signal(DigitalSequence* sequence, uint8_t signal_index, DigitalSignal* signal);
|
||||
void digital_sequence_set_sendtime(DigitalSequence* sequence, uint32_t send_time);
|
||||
void digital_sequence_add(DigitalSequence* sequence, uint8_t signal_index);
|
||||
bool digital_sequence_send(DigitalSequence* sequence);
|
||||
void digital_sequence_clear(DigitalSequence* sequence);
|
||||
|
||||
Reference in New Issue
Block a user