111 lines
2.6 KiB
C++
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);
|
|
};
|