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_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;

View File

@@ -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);