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:
parent
8aa9b0a18f
commit
fe027c440c
|
|
@ -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 */
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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",
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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()
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue