2ea9c96e47
facilitate creating a large menu. Compiles, but hasn't been tested.
273 lines
5.8 KiB
C++
273 lines
5.8 KiB
C++
//======================================================================
|
|
// menu.h
|
|
//======================================================================
|
|
|
|
#ifndef __menu_h__
|
|
#define __menu_h__
|
|
|
|
#include <vector>
|
|
#include <initializer_list>
|
|
#include "rig.h"
|
|
#include "tx_audio_proc.h"
|
|
|
|
extern SpeechCompressor speechCompressor; // This should be somewhere else.
|
|
|
|
// 16 characters on display
|
|
const int MAX_TEXT_LEN = 16;
|
|
const char MENU_SELECTED_CHAR = '>';
|
|
|
|
const char blankLine[17] = " ";
|
|
|
|
class MenuItem {
|
|
public:
|
|
virtual ~MenuItem() {}
|
|
//virtual const char* text() = 0;
|
|
virtual void update() = 0;
|
|
virtual MenuItem* select() = 0;
|
|
virtual MenuItem* altSelect() = 0;
|
|
virtual MenuItem* exit() = 0;
|
|
virtual MenuItem* prev() = 0;
|
|
virtual MenuItem* next() = 0;
|
|
};
|
|
|
|
//======================================================================
|
|
// ListMenu
|
|
//======================================================================
|
|
|
|
const int MAX_LISTMENU_TEXT_LEN = 15;
|
|
|
|
class ListMenu : public MenuItem {
|
|
public:
|
|
ListMenu(const char* text, std::initializer_list<const MenuItem*> items):
|
|
_length(items.size()), _current(0), _dirty(true)
|
|
{
|
|
char temp[MAX_LISTMENU_TEXT_LEN];
|
|
strncpy(temp, text, MAX_LISTMENU_TEXT_LEN);
|
|
temp[MAX_LISTMENU_TEXT_LEN] = '\0';
|
|
|
|
_items = new MenuItem*[_length];
|
|
|
|
int count = 0;
|
|
for (auto element : items) {
|
|
_items[count] = element;
|
|
count++;
|
|
}
|
|
|
|
sprintf(_text, "%c%s", MENU_SELECTED_CHAR, temp);
|
|
}
|
|
|
|
virtual ~ListMenu() {
|
|
delete [] _items;
|
|
}
|
|
|
|
virtual void update()
|
|
{
|
|
if (_dirty) {
|
|
sendIOPMenuDisplay(_text);
|
|
_dirty = false;
|
|
}
|
|
}
|
|
|
|
virtual MenuItem* select()
|
|
{
|
|
_dirty = true;
|
|
return _items[_current];
|
|
}
|
|
|
|
virtual MenuItem* altSelect()
|
|
{
|
|
_dirty = true;
|
|
return this;
|
|
}
|
|
|
|
virtual MenuItem* exit()
|
|
{
|
|
_dirty = true;
|
|
return NULL;
|
|
}
|
|
|
|
virtual MenuItem* prev()
|
|
{
|
|
if (--_current < 0) {
|
|
_current += _length;
|
|
}
|
|
_dirty = true;
|
|
return this;
|
|
}
|
|
|
|
virtual MenuItem* next()
|
|
{
|
|
_current = ++_current % _length;
|
|
_dirty = true;
|
|
return this;
|
|
}
|
|
|
|
private:
|
|
bool _dirty;
|
|
MenuItem** _items;
|
|
int _length;
|
|
int _current;
|
|
char _text[MAX_LISTMENU_TEXT_LEN+1];
|
|
};
|
|
|
|
//======================================================================
|
|
|
|
const char modeID[] = {'s', 'S', 'c', 'C', 'd', 'D', 't', 'T'};
|
|
const char* const filterID[NUM_RIG_MODES][NUM_RX_FILTERS] = {
|
|
{"2.8", "2.4", "1.8"}, // LSB
|
|
{"2.8", "2.4", "1.8"}, // USB
|
|
{"1.0", "500", "250"}, // CWL
|
|
{"1.0", "500", "250"}, // CWU
|
|
{"2.8", "2.4", "500"}, // DGL
|
|
{"2.8", "2.4", "500"}, // DGU
|
|
{"2.8", "2.4", "1.8"}, // TTL
|
|
{"2.8", "2.4", "1.8"}, // TTU
|
|
};
|
|
|
|
class TopMenu : public MenuItem {
|
|
public:
|
|
TopMenu(Rig& rig): _rig(rig), _dirty(false), _visible(false), _adjust_tx(false), _comp_on(false) {
|
|
strcpy(_text0, "R: T: ");
|
|
strcpy(_text1, "0123456789ABCDEF");
|
|
}
|
|
|
|
/* virtual const char* text() {
|
|
sprintf(_buffer, "%1c-%1c%6s%1c6s", modeID[rig.modeNum],
|
|
return _buffer;
|
|
}*/
|
|
|
|
virtual void update() {
|
|
sprintf(_text0, "%1cR:%3s %1cT:%3s ",
|
|
_adjust_tx ? ' ' : MENU_SELECTED_CHAR,
|
|
filterID[_rig.modeNum()][_rig.filterNum()],
|
|
_adjust_tx ? MENU_SELECTED_CHAR : ' ',
|
|
_rig.isSSBMode() && _comp_on ? "CMP" : " ");
|
|
if ((strcmp(_text0, _text1) != 0) || _dirty) {
|
|
if (_visible) {
|
|
sendIOPMenuDisplay(_text0);
|
|
USBDEBUG("updating menu:");
|
|
USBDEBUG(_text0);
|
|
} else {
|
|
sendIOPMenuInactive();
|
|
USBDEBUG("deactivating menu");
|
|
}
|
|
_dirty = false;
|
|
strncpy(_text1, _text0, MAX_TEXT_LEN);
|
|
}
|
|
}
|
|
|
|
virtual MenuItem* select() {
|
|
if (!_visible) {
|
|
_visible = true;
|
|
} else {
|
|
_adjust_tx = !_adjust_tx;
|
|
}
|
|
_dirty = true;
|
|
return this;
|
|
}
|
|
|
|
virtual MenuItem* altSelect() {
|
|
if (_visible) {
|
|
_visible = false;
|
|
_dirty = true;
|
|
}
|
|
return this;
|
|
}
|
|
|
|
virtual MenuItem* exit() {
|
|
if (_visible) {
|
|
_visible = false;
|
|
_dirty = true;
|
|
}
|
|
return this;
|
|
}
|
|
|
|
virtual MenuItem* prev() {
|
|
if (_visible) {
|
|
if (_adjust_tx) {
|
|
if (_rig.isSSBMode()) {
|
|
_comp_on = !_comp_on;
|
|
if (_comp_on)
|
|
speechCompressor.enable();
|
|
else
|
|
speechCompressor.disable();
|
|
}
|
|
} else {
|
|
_rig.switchRxFilter(true);
|
|
}
|
|
_dirty = true;
|
|
}
|
|
return this;
|
|
}
|
|
|
|
virtual MenuItem* next() {
|
|
if (_visible) {
|
|
if (_adjust_tx) {
|
|
if (_rig.isSSBMode()) {
|
|
_comp_on = !_comp_on;
|
|
if (_comp_on)
|
|
speechCompressor.enable();
|
|
else
|
|
speechCompressor.disable();
|
|
}
|
|
} else {
|
|
_rig.switchRxFilter();
|
|
}
|
|
_dirty = true;
|
|
}
|
|
return this;
|
|
}
|
|
|
|
private:
|
|
Rig& _rig;
|
|
bool _dirty;
|
|
bool _visible;
|
|
bool _adjust_tx;
|
|
bool _comp_on;
|
|
char _text0[MAX_TEXT_LEN+1];
|
|
char _text1[MAX_TEXT_LEN+1];
|
|
};
|
|
|
|
/*
|
|
public class MenuItem {
|
|
public:
|
|
MenuItem(bool active = true, int timeout = 0): _active(active), _timeout(timeout), _elapsed(0) {}
|
|
void update() {
|
|
if ((_timeout > 0) && (_elapsed > _timeout)) {
|
|
_active = false;
|
|
}
|
|
}
|
|
inline void activate() { _active = true; _elapsed = 0; }
|
|
inline void deactivate() { _active = false; }
|
|
virtual MenuItem* accept();
|
|
virtual MenuItem* reject();
|
|
virtual MenuItem* next();
|
|
virtual MenuItem* prev();
|
|
|
|
private:
|
|
bool _active;
|
|
int _timeout;
|
|
elapsedMillis _elapsed;
|
|
};
|
|
|
|
public class SSBMenu {
|
|
public:
|
|
private:
|
|
};
|
|
|
|
public class DigiMenu {
|
|
public:
|
|
private:
|
|
}
|
|
|
|
public class CWMenu {
|
|
public:
|
|
private:
|
|
};
|
|
*/
|
|
#endif
|
|
|
|
//======================================================================
|
|
// EOF
|
|
//======================================================================
|