#pragma once #include #include #include #include #include "LinkedList.h" #include "Dequeue.h" class Message; class TermView { static size_t constexpr MESSAGE_LIMIT = 64; struct RadioItem { RadioHandle handle; RadioRxSubscriptionId rxSubId; }; ThreadHandle thread; MutexHandle lvglMutex; MutexHandle mutex; bool signalStop = false; bool signalHasMsgs = false; LinkedList radios; RadioHandle selectedRadio = nullptr; Dequeue inMsgQueue; LinkedList messages; lv_obj_t* mainPanel = nullptr; lv_obj_t* messageList = nullptr; lv_obj_t* inputField = nullptr; lv_obj_t* sendButton = nullptr; lv_timer_t* renderMessagesTimer = nullptr; static int32_t threadMain(void* context) { static_cast(context)->run(); return 0; } void initUi(lv_obj_t* parent); void cleanupRadios(); void setSignalStop() { tt_mutex_lock(mutex, portMAX_DELAY); signalStop = true; tt_mutex_unlock(mutex); } bool getSignalStop() { //tt_mutex_lock(mutex, portMAX_DELAY); auto s = signalStop; //tt_mutex_unlock(mutex); return s; } void setSignalHasMsg() { tt_mutex_lock(mutex, portMAX_DELAY); signalHasMsgs = true; tt_mutex_unlock(mutex); } void clearSignalHasMsg() { tt_mutex_lock(mutex, portMAX_DELAY); signalHasMsgs = false; tt_mutex_unlock(mutex); } bool getSignalHasMsg() { tt_mutex_lock(mutex, portMAX_DELAY); auto s = signalHasMsgs; tt_mutex_unlock(mutex); return s; } void run(); RadioHandle getRadioForDeviceId(DeviceId devid) { for (auto iter = radios.begin(); iter != radios.end(); iter++) { if (tt_hal_radio_get_device_id(iter->handle) == devid) { return iter->handle; } } return nullptr; } public: TermView(MutexHandle lvglMutex, lv_obj_t* parent) : lvglMutex(lvglMutex) { initUi(parent); thread = tt_thread_alloc_ext("RadioTerm.TermView", 2*4096, threadMain, this); mutex = tt_mutex_alloc(MUTEX_TYPE_RECURSIVE); //tt_thread_start(thread); } virtual ~TermView() { setSignalStop(); tt_thread_join(thread, portMAX_DELAY); tt_thread_free(thread); cleanupRadios(); } void setVisible(bool visible); void addRadio(RadioHandle radio); void sendMessage(); void updateMessages(); void pushRxMessage(DeviceId device, const RadioRxPacket* packet); };