added send_time option to start a signal at a specific DWT->CYCCNT value

This commit is contained in:
g3gg0
2022-12-01 18:43:22 +01:00
parent 38eef0703b
commit 8c34f28992
2 changed files with 21 additions and 2 deletions

View File

@@ -253,6 +253,7 @@ void digital_sequence_alloc_sequence(DigitalSequence* sequence, uint32_t size) {
sequence->sequence_used = 0; sequence->sequence_used = 0;
sequence->sequence_size = size; sequence->sequence_size = size;
sequence->sequence = malloc(sequence->sequence_size); sequence->sequence = malloc(sequence->sequence_size);
sequence->send_time = 0;
} }
DigitalSequence* digital_sequence_alloc(uint32_t size, const GpioPin* gpio) { 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); 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) { void digital_sequence_add(DigitalSequence* sequence, uint8_t signal_index) {
furi_assert(sequence); furi_assert(sequence);
furi_assert(signal_index < sequence->signals_size); furi_assert(signal_index < sequence->signals_size);
@@ -352,7 +357,8 @@ void digital_signal_update_dma(DigitalSignal* signal) {
LL_DMA_ClearFlag_TC2(DMA1); 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); furi_assert(signal);
/* the first iteration has to set up the whole machinery */ /* the first iteration has to set up the whole machinery */
@@ -362,6 +368,17 @@ static bool digital_sequence_send_signal(DigitalSignal* signal) {
return false; return false;
} }
digital_signal_setup_timer(); 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(); digital_signal_start_timer();
} else { } else {
/* configure next polarities and timings */ /* configure next polarities and timings */
@@ -440,7 +457,7 @@ bool digital_sequence_send(DigitalSequence* sequence) {
sequence->signals_prolonged[signal_index] = needs_prolongation; sequence->signals_prolonged[signal_index] = needs_prolongation;
} }
bool success = digital_sequence_send_signal(sig); bool success = digital_sequence_send_signal(sequence, sig);
if(!success) { if(!success) {
break; break;

View File

@@ -42,6 +42,7 @@ typedef struct {
bool* signals_prolonged; bool* signals_prolonged;
uint8_t* sequence; uint8_t* sequence;
const GpioPin* gpio; const GpioPin* gpio;
uint32_t send_time;
} DigitalSequence; } DigitalSequence;
@@ -69,6 +70,7 @@ void digital_signal_send(DigitalSignal* signal, const GpioPin* gpio);
DigitalSequence* digital_sequence_alloc(uint32_t size, const GpioPin* gpio); DigitalSequence* digital_sequence_alloc(uint32_t size, const GpioPin* gpio);
void digital_sequence_free(DigitalSequence* sequence); void digital_sequence_free(DigitalSequence* sequence);
void digital_sequence_set_signal(DigitalSequence* sequence, uint8_t signal_index, DigitalSignal* signal); 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); void digital_sequence_add(DigitalSequence* sequence, uint8_t signal_index);
bool digital_sequence_send(DigitalSequence* sequence); bool digital_sequence_send(DigitalSequence* sequence);
void digital_sequence_clear(DigitalSequence* sequence); void digital_sequence_clear(DigitalSequence* sequence);