111 lines
2.6 KiB
C++

#pragma once
#include <lvgl.h>
#include <tt_hal_radio.h>
#include <tt_mutex.h>
#include <tt_thread.h>
#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<RadioItem> radios;
RadioHandle selectedRadio = nullptr;
Dequeue<Message*> inMsgQueue;
LinkedList<Message*> 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<TermView*>(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);
};