Signal SD card write thread from M4 event.

This commit is contained in:
Jared Boone 2016-03-27 22:49:30 -07:00
parent daa2f7aed0
commit 8e14d2f4e8
3 changed files with 19 additions and 3 deletions

View File

@ -67,11 +67,23 @@ public:
~AudioThread() { ~AudioThread() {
chThdTerminate(thread); chThdTerminate(thread);
chEvtSignal(thread, EVT_FIFO_HIGHWATER);
chThdWait(thread); chThdWait(thread);
} }
static void check_fifo_isr() {
if( (shared_memory.FIFO_HACK != nullptr) && (thread != nullptr) ) {
auto fifo = reinterpret_cast<FIFO<uint8_t>*>(shared_memory.FIFO_HACK);
if( fifo->len() >= write_size ) {
chEvtSignalI(thread, EVT_FIFO_HIGHWATER);
}
}
}
private: private:
static constexpr size_t write_size = 4096; static constexpr size_t write_size = 4096;
static constexpr eventmask_t EVT_FIFO_HIGHWATER = 1;
const std::string file_path; const std::string file_path;
File file; File file;
@ -95,7 +107,7 @@ private:
} }
while( !chThdShouldTerminate() ) { while( !chThdShouldTerminate() ) {
// SUCH A HACK!!! chEvtWaitAny(EVT_FIFO_HIGHWATER);
auto fifo = reinterpret_cast<FIFO<uint8_t>*>(shared_memory.FIFO_HACK); auto fifo = reinterpret_cast<FIFO<uint8_t>*>(shared_memory.FIFO_HACK);
if( !fifo ) { if( !fifo ) {
@ -117,8 +129,6 @@ private:
} }
led_usb.off(); led_usb.off();
} }
chThdSleepMilliseconds(25);
} }
file.close(); file.close();

View File

@ -31,6 +31,8 @@
#include "irq_controls.hpp" #include "irq_controls.hpp"
#include "audio_thread.hpp"
#include "ch.h" #include "ch.h"
#include "lpc43xx_cpp.hpp" #include "lpc43xx_cpp.hpp"
@ -44,6 +46,7 @@ CH_IRQ_HANDLER(M4Core_IRQHandler) {
CH_IRQ_PROLOGUE(); CH_IRQ_PROLOGUE();
chSysLockFromIsr(); chSysLockFromIsr();
AudioThread::check_fifo_isr();
EventDispatcher::events_flag_isr(EVT_MASK_APPLICATION); EventDispatcher::events_flag_isr(EVT_MASK_APPLICATION);
chSysUnlockFromIsr(); chSysUnlockFromIsr();
@ -56,6 +59,7 @@ CH_IRQ_HANDLER(M4Core_IRQHandler) {
MessageHandlerMap EventDispatcher::message_map_; MessageHandlerMap EventDispatcher::message_map_;
Thread* EventDispatcher::thread_event_loop = nullptr; Thread* EventDispatcher::thread_event_loop = nullptr;
Thread* EventDispatcher::thread_record = nullptr;
EventDispatcher::EventDispatcher( EventDispatcher::EventDispatcher(
ui::Widget* const top_widget, ui::Widget* const top_widget,

View File

@ -73,6 +73,8 @@ public:
return message_map_; return message_map_;
} }
static Thread* thread_record;
private: private:
static MessageHandlerMap message_map_; static MessageHandlerMap message_map_;
static Thread* thread_event_loop; static Thread* thread_event_loop;