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_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;
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
Reference in New Issue
Block a user