Skip to content

Commit

Permalink
Support virtual rela-based audio processor
Browse files Browse the repository at this point in the history
  • Loading branch information
WiseLord committed Nov 18, 2023
1 parent 1666a61 commit b8e2b73
Show file tree
Hide file tree
Showing 11 changed files with 178 additions and 2 deletions.
2 changes: 2 additions & 0 deletions project/ampcontrol-f103.files
Expand Up @@ -8,6 +8,8 @@
../src/audio/audio.h
../src/audio/pt232x.c
../src/audio/pt232x.h
../src/audio/relay.c
../src/audio/relay.h
../src/audio/tda731x.c
../src/audio/tda731x.h
../src/audio/tda7418.c
Expand Down
1 change: 1 addition & 0 deletions project/ampcontrol-f103.includes
Expand Up @@ -7,3 +7,4 @@
../src/drivers/STM32_USB_Device_Library/Core/Inc
../src/display/fonts
../src/usb
../src/audio
2 changes: 1 addition & 1 deletion src/Makefile
Expand Up @@ -7,7 +7,7 @@ STM32_MCU = F103CB
DISPLAY = ILI9341
DISPVAR = SPI

APROC_LIST = TDA7439 TDA731X PT232X TDA7418 TDA7719
APROC_LIST = TDA7439 TDA731X PT232X TDA7418 TDA7719 RELAY
TUNER_LIST = RDA580X SI470X TEA5767
FEATURE_LIST = ENABLE_USB

Expand Down
11 changes: 10 additions & 1 deletion src/amp_main.c
Expand Up @@ -1345,9 +1345,12 @@ void ampSyncFromOthers(void)
mpcGetData();
}

void relayReleaseVolume();

void ampSyncToOthers(void)
{
i2cExpGpioKeyRelease();
relayReleaseVolume();

#ifdef _USE_RDS_DEMOD
rdsDemodHandle();
Expand Down Expand Up @@ -1519,7 +1522,13 @@ void ampActionHandle(void)
actionNextAudioSubParam();
}
}
screenSet(SCREEN_AUDIO_PARAM, 5000);
if (aProc->par.ic == AUDIO_IC_RELAY) {
audioSetFlag(AUDIO_FLAG_LOUDNESS, !(aProc->par.flags & AUDIO_FLAG_LOUDNESS));
priv.flag = AUDIO_FLAG_LOUDNESS;
screenSet(SCREEN_AUDIO_FLAG, 3000);
} else {
screenSet(SCREEN_AUDIO_PARAM, 5000);
}
break;

case ACTION_RTC_MODE:
Expand Down
6 changes: 6 additions & 0 deletions src/audio/audio.c
Expand Up @@ -7,6 +7,7 @@
#include "tda7439.h"
#include "tda731x.h"
#include "pt232x.h"
#include "relay.h"
#include "tda7418.h"
#include "tda7719.h"

Expand Down Expand Up @@ -88,6 +89,11 @@ void audioReadSettings(AudioIC ic)
case AUDIO_IC_TDA7719:
aProc.api = tda7719GetApi();
break;
#endif
#ifdef _RELAY
case AUDIO_IC_RELAY:
aProc.api = relayGetApi();
break;
#endif
case AUDIO_IC_TEST:
aProc.api = &audioTestApi;
Expand Down
1 change: 1 addition & 0 deletions src/audio/audiodefs.h
Expand Up @@ -18,6 +18,7 @@ extern "C" {
AUDIO_IC(TDA7418) \
AUDIO_IC(TDA7440) \
AUDIO_IC(TDA7719) \
AUDIO_IC(RELAY) \
AUDIO_IC(TEST) \

#define GENERATE_AUDIO_IC(IC) AUDIO_IC_ ## IC,
Expand Down
109 changes: 109 additions & 0 deletions src/audio/relay.c
@@ -0,0 +1,109 @@
#include "relay.h"

#include "audio.h"
#include "pins.h"
#include "swtimers.h"

#define RELAY_IN_CNT 4

static const AudioGrid gridVolume = {NULL, -1, 1, (int8_t)(2.00)}; // -1..1dB with 2dB step

static AudioParam *aPar;

static const AudioApi relayApi = {
.init = relayInit,
.getInCnt = relayGetInCnt,

.setTune = relaySetTune,
.setInput = relaySetInput,

.setLoudness = relaySetLoudness,
};

const AudioApi *relayGetApi()
{
return &relayApi;
}

void relayInit(AudioParam *param)
{
aPar = param;
aPar->grid[AUDIO_TUNE_VOLUME] = &gridVolume;

OUT(VOL_UP);
OUT(VOL_DN);
OUT(LOUDNESS);

OUT(IN_0);
OUT(IN_1);
OUT(IN_2);
OUT(IN_3);
}

int8_t relayGetInCnt(void)
{
return RELAY_IN_CNT;
}

void relaySetTune(AudioTune tune, int8_t value)
{
if (tune == AUDIO_TUNE_VOLUME) {
if (value > 0) {
swTimSet(SW_TIM_VOLUME_KEY, 200);
SET(VOL_UP);
CLR(VOL_DN);
} else if (value < 0) {
swTimSet(SW_TIM_VOLUME_KEY, 200);
SET(VOL_DN);
CLR(VOL_UP);
}
}
}

void relayReleaseVolume()
{
if (swTimGet(SW_TIM_VOLUME_KEY) == 0) {
CLR(VOL_UP);
CLR(VOL_DN);
swTimSet(SW_TIM_VOLUME_KEY, SW_TIM_OFF);
}
}

static void clearInputs()
{
CLR(IN_0);
CLR(IN_1);
CLR(IN_2);
CLR(IN_3);
}

void relaySetInput(int8_t value)
{
clearInputs();

switch (value) {
case 0:
SET(IN_0);
break;
case 1:
SET(IN_1);
break;
case 2:
SET(IN_2);
break;
case 3:
SET(IN_3);
break;
default:
break;
}
}

void relaySetLoudness(bool value)
{
if (value) {
SET(LOUDNESS);
} else {
CLR(LOUDNESS);
}
}
24 changes: 24 additions & 0 deletions src/audio/relay.h
@@ -0,0 +1,24 @@
#ifndef RELAY_H
#define RELAY_H

#ifdef __cplusplus
extern "C" {
#endif

#include "audiodefs.h"

const AudioApi *relayGetApi(void);

void relayInit(AudioParam *param);
int8_t relayGetInCnt(void);

void relaySetTune(AudioTune tune, int8_t value);
void relaySetInput(int8_t value);

void relaySetLoudness(bool value);

#ifdef __cplusplus
}
#endif

#endif // RELAY_H
7 changes: 7 additions & 0 deletions src/gui/canvas.c
Expand Up @@ -727,8 +727,15 @@ void canvasShowTune(bool clear, AudioTune tune)
snprintf(bufValue, sizeof(bufValue), "%3d", showValue);
}

if (aProc->par.ic == AUDIO_IC_RELAY) {
glcdSetFontColor(canvas.pal->bg);
}

int16_t strLen = glcdWriteString(bufValue);

if (aProc->par.ic == AUDIO_IC_RELAY) {
glcdSetFontColor(canvas.pal->bg);
}

// Bar
StripedBar bar = {value, min, max};
Expand Down
16 changes: 16 additions & 0 deletions src/pins.h
Expand Up @@ -36,6 +36,22 @@ extern "C" {
#define USB_DP_Port GPIOA
#define USB_DP_Pin LL_GPIO_PIN_12

#define VOL_UP_Port GPIOA
#define VOL_UP_Pin LL_GPIO_PIN_13
#define VOL_DN_Port GPIOA
#define VOL_DN_Pin LL_GPIO_PIN_14
#define LOUDNESS_Port GPIOA
#define LOUDNESS_Pin LL_GPIO_PIN_15

#define IN_0_Port GPIOA
#define IN_0_Pin LL_GPIO_PIN_4
#define IN_1_Port GPIOA
#define IN_1_Pin LL_GPIO_PIN_5
#define IN_2_Port GPIOA
#define IN_2_Pin LL_GPIO_PIN_6
#define IN_3_Port GPIOA
#define IN_3_Pin LL_GPIO_PIN_7

void pinsInit(void);

void pinsHwResetI2c(void);
Expand Down
1 change: 1 addition & 0 deletions src/swtimers.h
Expand Up @@ -29,6 +29,7 @@ enum {
SW_TIM_MPD_POWEROFF,
SW_TIM_DIGIT_INPUT,
SW_TIM_SCROLL,
SW_TIM_VOLUME_KEY,

SW_TIM_DEC_END,

Expand Down

0 comments on commit b8e2b73

Please sign in to comment.