ttwrplus: enable volume control

Replaced KEY_F7 and KEY_F8 with KEY_VOLUP and KEY_VOLDOWN.
Remapped the T-TWR Plus volume up and down keys to those, fixing a bug
in the pmu key detection where the wrong active edge was selected.
Adapt soft volume code for the UV3x0 to control code in the T-TWR Plus
by acting on the AT1846s Rx gain.
For target T-TWR Plus bound long press of KEY_VOLDOWN to macro menu open.
Unbound KNOB_LEFT and KNOB_RIGHT to squelch control and bound
instead KEY_VOLUP and KEY_VOLDOWN.

TG-553
This commit is contained in:
Niccolò Izzo 2023-09-10 13:04:38 +02:00 committed by Silvano Seva
parent 8aa9b0a18f
commit fe027c440c
7 changed files with 87 additions and 53 deletions

View File

@ -29,35 +29,35 @@
*/ */
enum key enum key
{ {
KEY_0 = (1 << 0), /* Keypad digit "0" */ KEY_0 = (1 << 0), /* Keypad digit "0" */
KEY_1 = (1 << 1), /* Keypad digit "1" */ KEY_1 = (1 << 1), /* Keypad digit "1" */
KEY_2 = (1 << 2), /* Keypad digit "2" */ KEY_2 = (1 << 2), /* Keypad digit "2" */
KEY_3 = (1 << 3), /* Keypad digit "3" */ KEY_3 = (1 << 3), /* Keypad digit "3" */
KEY_4 = (1 << 4), /* Keypad digit "4" */ KEY_4 = (1 << 4), /* Keypad digit "4" */
KEY_5 = (1 << 5), /* Keypad digit "5" */ KEY_5 = (1 << 5), /* Keypad digit "5" */
KEY_6 = (1 << 6), /* Keypad digit "6" */ KEY_6 = (1 << 6), /* Keypad digit "6" */
KEY_7 = (1 << 7), /* Keypad digit "7" */ KEY_7 = (1 << 7), /* Keypad digit "7" */
KEY_8 = (1 << 8), /* Keypad digit "8" */ KEY_8 = (1 << 8), /* Keypad digit "8" */
KEY_9 = (1 << 9), /* Keypad digit "9" */ KEY_9 = (1 << 9), /* Keypad digit "9" */
KEY_STAR = (1 << 10), /* Keypad digit "*" */ KEY_STAR = (1 << 10), /* Keypad digit "*" */
KEY_HASH = (1 << 11), /* Keypad digit "#" */ KEY_HASH = (1 << 11), /* Keypad digit "#" */
KEY_ENTER = (1 << 12), /* Keypad green button/enter */ KEY_ENTER = (1 << 12), /* Keypad green button/enter */
KEY_ESC = (1 << 13), /* Keypad red button/esc */ KEY_ESC = (1 << 13), /* Keypad red button/esc */
KEY_UP = (1 << 14), /* Keypad upward arrow */ KEY_UP = (1 << 14), /* Keypad upward arrow */
KEY_DOWN = (1 << 15), /* Keypad downward arrow */ KEY_DOWN = (1 << 15), /* Keypad downward arrow */
KEY_LEFT = (1 << 16), /* Keypad leftward arrow */ KEY_LEFT = (1 << 16), /* Keypad leftward arrow */
KEY_RIGHT = (1 << 17), /* Keypad rightward arrow */ KEY_RIGHT = (1 << 17), /* Keypad rightward arrow */
KEY_MONI = (1 << 18), /* Monitor button */ KEY_MONI = (1 << 18), /* Monitor button */
KEY_F1 = (1 << 19), /* Function button */ KEY_F1 = (1 << 19), /* Function button */
KEY_F2 = (1 << 20), /* Function button (device specific) */ KEY_F2 = (1 << 20), /* Function button (device specific) */
KEY_F3 = (1 << 21), /* Function button (device specific) */ KEY_F3 = (1 << 21), /* Function button (device specific) */
KEY_F4 = (1 << 22), /* Function button (device specific) */ KEY_F4 = (1 << 22), /* Function button (device specific) */
KEY_F5 = (1 << 23), /* Function button (device specific) */ KEY_F5 = (1 << 23), /* Function button (device specific) */
KEY_F6 = (1 << 24), /* Function button (device specific) */ KEY_F6 = (1 << 24), /* Function button (device specific) */
KEY_F7 = (1 << 25), /* Function button (device specific) */ KEY_VOLUP = (1 << 25), /* Volume increase button */
KEY_F8 = (1 << 26), /* Function button (device specific) */ KEY_VOLDOWN = (1 << 26), /* Volume decrease button */
KNOB_LEFT = (1 << 27), /* Knob rotated counter clockwise */ KNOB_LEFT = (1 << 27), /* Knob rotated counter clockwise */
KNOB_RIGHT = (1 << 28), /* Knob rotated clockwise */ KNOB_RIGHT = (1 << 28), /* Knob rotated clockwise */
}; };
/** /**

View File

@ -24,8 +24,10 @@
#include <OpMode_FM.hpp> #include <OpMode_FM.hpp>
#include <rtx.h> #include <rtx.h>
#ifdef PLATFORM_MDUV3x0 #if defined(PLATFORM_MDUV3x0)
#include "../../../drivers/baseband/HR_C6000.h" #include "../../../drivers/baseband/HR_C6000.h"
#elif defined(PLATFORM_TTWRPLUS)
#include "AT1846S.h"
#endif #endif
/** /**
@ -36,7 +38,7 @@
* provide the helper function below to keep the real volume level consistent * provide the helper function below to keep the real volume level consistent
* with the knob position. * with the knob position.
*/ */
#ifdef PLATFORM_MDUV3x0 #if defined(PLATFORM_MDUV3x0) || defined(PLATFORM_TTWRPLUS)
void _setVolume() void _setVolume()
{ {
static uint8_t oldVolume = 0xFF; static uint8_t oldVolume = 0xFF;
@ -45,9 +47,14 @@ void _setVolume()
if(volume == oldVolume) if(volume == oldVolume)
return; return;
#if defined(PLATFORM_MDUV3x0)
// Apply new volume level, map 0 - 255 range into -31 to 31 // Apply new volume level, map 0 - 255 range into -31 to 31
int8_t gain = ((int8_t) (volume / 4)) - 31; int8_t gain = ((int8_t) (volume / 4)) - 31;
HR_C6000::instance().setDacGain(gain); HR_C6000::instance().setDacGain(gain);
#elif defined(PLATFORM_TTWRPLUS)
// AT1846S volume control is 4 bit
AT1846S::instance().setRxAudioGain(volume / 16, volume / 16);
#endif
oldVolume = volume; oldVolume = volume;
} }
@ -86,7 +93,7 @@ void OpMode_FM::update(rtxStatus_t *const status, const bool newCfg)
{ {
(void) newCfg; (void) newCfg;
#ifdef PLATFORM_MDUV3x0 #if defined(PLATFORM_MDUV3x0) || defined(PLATFORM_TTWRPLUS)
// Set output volume by changing the HR_C6000 DAC gain // Set output volume by changing the HR_C6000 DAC gain
_setVolume(); _setVolume();
#endif #endif

View File

@ -991,19 +991,15 @@ static void _ui_fsm_menuMacro(kbd_msg_t msg, bool *sync_rtx)
#endif #endif
} }
#ifdef HAS_ABSOLUTE_KNOB // If the radio has an absolute position knob #if defined(PLATFORM_TTWRPLUS)
if(msg.keys & KNOB_LEFT || msg.keys & KNOB_RIGHT) { if(msg.keys & KEY_VOLDOWN)
state.settings.sqlLevel = platform_getChSelector() - 1; #else
*sync_rtx = true;
vp_announceSquelch(state.settings.sqlLevel, queueFlags);
}
if(msg.keys & KEY_LEFT || msg.keys & KEY_DOWN)
#else // Use left and right buttons or relative position knob
// NOTE: Use up and down for UV380 which has not yet a functional knob
if(msg.keys & KEY_LEFT || msg.keys & KEY_DOWN || msg.keys & KNOB_LEFT) if(msg.keys & KEY_LEFT || msg.keys & KEY_DOWN || msg.keys & KNOB_LEFT)
#endif #endif // PLATFORM_TTWRPLUS
{ {
#ifdef HAS_ABSOLUTE_KNOB // If the radio has an absolute position knob
state.settings.sqlLevel = platform_getChSelector() - 1;
#endif // HAS_ABSOLUTE_KNOB
if(state.settings.sqlLevel > 0) if(state.settings.sqlLevel > 0)
{ {
state.settings.sqlLevel -= 1; state.settings.sqlLevel -= 1;
@ -1012,12 +1008,15 @@ static void _ui_fsm_menuMacro(kbd_msg_t msg, bool *sync_rtx)
} }
} }
#ifdef HAS_ABSOLUTE_KNOB #if defined(PLATFORM_TTWRPLUS)
else if(msg.keys & KEY_RIGHT || msg.keys & KEY_UP) else if(msg.keys & KEY_VOLUP)
#else #else
else if(msg.keys & KEY_RIGHT || msg.keys & KEY_UP || msg.keys & KNOB_RIGHT) else if(msg.keys & KEY_RIGHT || msg.keys & KEY_UP || msg.keys & KNOB_RIGHT)
#endif #endif // PLATFORM_TTWRPLUS
{ {
#ifdef HAS_ABSOLUTE_KNOB
state.settings.sqlLevel = platform_getChSelector() - 1;
#endif
if(state.settings.sqlLevel < 15) if(state.settings.sqlLevel < 15)
{ {
state.settings.sqlLevel += 1; state.settings.sqlLevel += 1;
@ -1288,9 +1287,8 @@ void ui_updateFSM(bool *sync_rtx)
// unless is the MONI key for the MACRO functions // unless is the MONI key for the MACRO functions
if (_ui_exitStandby(now) && !(msg.keys & KEY_MONI)) if (_ui_exitStandby(now) && !(msg.keys & KEY_MONI))
return; return;
// If MONI is pressed, activate MACRO functions // If MONI is pressed, activate MACRO functions
bool moniPressed = (msg.keys & KEY_MONI) ? true : false; bool moniPressed = msg.keys & KEY_MONI;
if(moniPressed || macro_latched) if(moniPressed || macro_latched)
{ {
macro_menu = true; macro_menu = true;
@ -1312,6 +1310,14 @@ void ui_updateFSM(bool *sync_rtx)
{ {
macro_menu = false; macro_menu = false;
} }
#if defined(PLATFORM_TTWRPLUS)
// T-TWR Plus has no KEY_MONI, using KEY_VOLDOWN long press instead
if ((msg.keys & KEY_VOLDOWN) && msg.long_press)
{
macro_menu = true;
macro_latched = true;
}
#endif // PLA%FORM_TTWRPLUS
int priorUIScreen = state.ui_screen; int priorUIScreen = state.ui_screen;
switch(state.ui_screen) switch(state.ui_screen)

View File

@ -29,6 +29,8 @@ static const struct device *const buttons_dev = DEVICE_DT_GET(DT_NODELABEL(butto
static int8_t old_pos = 0; static int8_t old_pos = 0;
static keyboard_t keys = 0; static keyboard_t keys = 0;
// Defined in ttwrplus/platform.c to implement volume control
extern uint8_t volume_level;
static void gpio_keys_cb_handler(struct input_event *evt) static void gpio_keys_cb_handler(struct input_event *evt)
{ {
@ -38,7 +40,9 @@ static void gpio_keys_cb_handler(struct input_event *evt)
switch(evt->code) switch(evt->code)
{ {
case INPUT_KEY_VOLUMEDOWN: case INPUT_KEY_VOLUMEDOWN:
keyCode = KEY_MONI; keyCode = KEY_VOLDOWN;
if(evt->value != 0 && volume_level > 9)
volume_level -= 10;
break; break;
case INPUT_BTN_START: case INPUT_BTN_START:
@ -105,5 +109,19 @@ keyboard_t kbd_getKeys()
old_pos = new_pos; old_pos = new_pos;
} }
/*
* The power key is only connected to the PMU and its state is detected through
* the PMU interrupts.
*/
if (pmu_pwrOnBtnStatus())
{
// Update the volume only once when key is pressed
if (!(keys & KEY_VOLUP) && volume_level < 246)
volume_level += 10;
keys |= KEY_VOLUP;
}
else
keys &= ~KEY_VOLUP;
return keys; return keys;
} }

View File

@ -141,7 +141,7 @@ static keyboard_t keyname2keyboard(char *name)
"KEY_0", "KEY_1", "KEY_2", "KEY_3", "KEY_4", "KEY_5", "KEY_6", "KEY_7", "KEY_0", "KEY_1", "KEY_2", "KEY_3", "KEY_4", "KEY_5", "KEY_6", "KEY_7",
"KEY_8", "KEY_9", "KEY_STAR", "KEY_HASH", "KEY_ENTER", "KEY_ESC", "KEY_8", "KEY_9", "KEY_STAR", "KEY_HASH", "KEY_ENTER", "KEY_ESC",
"KEY_UP","KEY_DOWN", "KEY_LEFT", "KEY_RIGHT", "KEY_MONI", "KEY_F1", "KEY_UP","KEY_DOWN", "KEY_LEFT", "KEY_RIGHT", "KEY_MONI", "KEY_F1",
"KEY_F2", "KEY_F3", "KEY_F4", "KEY_F5", "KEY_F6", "KEY_F7", "KEY_F8", "KEY_F2", "KEY_F3", "KEY_F4", "KEY_F5", "KEY_F6", "KEY_VOLUP", "KEY_VOLDOWN",
"KNOB_LEFT", "KNOB_RIGHT", "KNOB_LEFT", "KNOB_RIGHT",
}; };

View File

@ -34,6 +34,9 @@ static const struct gpio_dt_spec button_ptt = GPIO_DT_SPEC_GET_OR(BUTTON_PTT_NOD
static const struct device *const qdec_dev = DEVICE_DT_GET(DT_ALIAS(qdec0)); static const struct device *const qdec_dev = DEVICE_DT_GET(DT_ALIAS(qdec0));
static const struct device *const led_dev = DEVICE_DT_GET(DT_ALIAS(led0)); static const struct device *const led_dev = DEVICE_DT_GET(DT_ALIAS(led0));
// This is cross-references in keyboard_ttwrplus.c to implement volume control
uint8_t volume_level = 125;
static hwInfo_t hwInfo = static hwInfo_t hwInfo =
{ {
.name = "ttwrplus", .name = "ttwrplus",
@ -118,7 +121,7 @@ uint8_t platform_getMicLevel()
uint8_t platform_getVolumeLevel() uint8_t platform_getVolumeLevel()
{ {
return 0; return volume_level;
} }
int8_t platform_getChSelector() int8_t platform_getChSelector()

View File

@ -345,11 +345,11 @@ void pmu_handleIRQ()
// Power on key rising edge // Power on key rising edge
if((irqStatus & XPOWERS_AXP2101_PKEY_POSITIVE_IRQ) != 0) if((irqStatus & XPOWERS_AXP2101_PKEY_POSITIVE_IRQ) != 0)
pwrOnPressed = true; pwrOnPressed = false;
// Power on key falling edge // Power on key falling edge
if((irqStatus & XPOWERS_AXP2101_PKEY_NEGATIVE_IRQ) != 0) if((irqStatus & XPOWERS_AXP2101_PKEY_NEGATIVE_IRQ) != 0)
pwrOnPressed = false; pwrOnPressed = true;
// Power key long press // Power key long press
if ((irqStatus & XPOWERS_AXP2101_PKEY_LONG_IRQ) != 0) if ((irqStatus & XPOWERS_AXP2101_PKEY_LONG_IRQ) != 0)