summaryrefslogtreecommitdiffstats
path: root/MOST_UNICENS
diff options
context:
space:
mode:
authorTobias Jahnke <tobias.jahnke@microchip.com>2018-10-10 15:52:57 +0200
committerTobias Jahnke <tobias.jahnke@microchip.com>2018-10-10 15:52:57 +0200
commitb071fc0882750d28036769c56c046fe1d7ae9942 (patch)
treed33a0968eb237c4975bc879087cadff57082dd10 /MOST_UNICENS
parent6d4cbab774c0fa632ccdf4add35b87d0828ac765 (diff)
4a-hal-unicens: add Fiberdyne Master Volume
Bug-AGL: SPEC-1758 As preparation before introducing UNICENS 4a plugin: - Init volume library at first - Add fiberdyne master volume - Introduce commands sent by control messages - Removes outdated controls - Known issue: turn ALSA volume above "93" to hear some sound Change-Id: I591c6b109a51c9da602ad08514b67c2ec573e09c Signed-off-by: Tobias Jahnke <tobias.jahnke@microchip.com>
Diffstat (limited to 'MOST_UNICENS')
-rw-r--r--MOST_UNICENS/CMakeLists.txt2
-rw-r--r--MOST_UNICENS/hal_most_unicens.c208
-rw-r--r--MOST_UNICENS/ucs2-vol/inc/device_value.h7
-rw-r--r--MOST_UNICENS/ucs2-vol/inc/libmostvolume.h3
-rw-r--r--MOST_UNICENS/ucs2-vol/inc/setup.h2
-rw-r--r--MOST_UNICENS/ucs2-vol/src/device_container.cpp23
-rw-r--r--MOST_UNICENS/ucs2-vol/src/device_value.cpp33
-rw-r--r--MOST_UNICENS/ucs2-vol/src/libmostvolume.cpp2
-rw-r--r--MOST_UNICENS/ucs2-vol/src/setup.cpp26
-rw-r--r--MOST_UNICENS/wrap_unicens.c32
-rw-r--r--MOST_UNICENS/wrap_unicens.h1
-rw-r--r--MOST_UNICENS/wrap_volume.c3
12 files changed, 124 insertions, 218 deletions
diff --git a/MOST_UNICENS/CMakeLists.txt b/MOST_UNICENS/CMakeLists.txt
index 23bf75f..5107cac 100644
--- a/MOST_UNICENS/CMakeLists.txt
+++ b/MOST_UNICENS/CMakeLists.txt
@@ -35,7 +35,7 @@ PROJECT_TARGET_ADD(hal-most-unicens)
# Library dependencies (include updates automatically)
TARGET_LINK_LIBRARIES(${TARGET_NAME}
hal-utilities-4a
- afb-utilities
+ afb-helpers
ucs2-volume
${link_libraries}
)
diff --git a/MOST_UNICENS/hal_most_unicens.c b/MOST_UNICENS/hal_most_unicens.c
index d31082c..d106d6e 100644
--- a/MOST_UNICENS/hal_most_unicens.c
+++ b/MOST_UNICENS/hal_most_unicens.c
@@ -31,101 +31,6 @@
#define PCM_Volume_Navigation 1001
#define PCM_Volume_Emergency 1002
-/* Default Values for MasterVolume Ramping */
-STATIC halVolRampT volRampMaster= {
- .mode = RAMP_VOL_NORMAL,
- .slave = Master_Playback_Volume,
- .delay = 100*1000, // ramping delay in us
- .stepDown=1,
- .stepUp =1,
-};
-
-/* Soft Volume Ramping Value can be customize by Audio Role and hardware card */
-STATIC halVolRampT volRampEmergency= {
- .slave = Emergency_Playback_Volume,
- .delay = 50*1000, // ramping delay in us
- .stepDown= 2,
- .stepUp = 10,
-};
-
-STATIC halVolRampT volRampWarning= {
- .slave = Warning_Playback_Volume,
- .delay = 50*1000, // ramping delay in us
- .stepDown= 2,
- .stepUp = 10,
-};
-
-STATIC halVolRampT volRampCustomHigh= {
- .slave = CustomHigh_Playback_Volume,
- .delay = 50*1000, // ramping delay in us
- .stepDown= 2,
- .stepUp = 4,
-};
-
-STATIC halVolRampT volRampPhone= {
- .slave = Phone_Playback_Volume,
- .delay = 50*1000, // ramping delay in us
- .stepDown= 2,
- .stepUp = 4,
-};
-
-STATIC halVolRampT volRampNavigation= {
- .slave = Navigation_Playback_Volume,
- .delay = 50*1000, // ramping delay in us
- .stepDown= 2,
- .stepUp = 4,
-};
-
-STATIC halVolRampT volRampCustomMedium= {
- .slave = CustomMedium_Playback_Volume,
- .delay = 50*1000, // ramping delay in us
- .stepDown= 2,
- .stepUp = 4,
-};
-
-STATIC halVolRampT volRampVideo= {
- .slave = Video_Playback_Volume,
- .delay = 50*1000, // ramping delay in us
- .stepDown= 2,
- .stepUp = 4,
-};
-
-STATIC halVolRampT volRampStreaming= {
- .slave = Streaming_Playback_Volume,
- .delay = 50*1000, // ramping delay in us
- .stepDown= 2,
- .stepUp = 4,
-};
-
-STATIC halVolRampT volRampMultimedia= {
- .slave = Multimedia_Playback_Volume,
- .delay = 50*1000, // ramping delay in us
- .stepDown= 2,
- .stepUp = 4,
-};
-
-STATIC halVolRampT volRampRadio= {
- .slave = Radio_Playback_Volume,
- .delay = 50*1000, // ramping delay in us
- .stepDown= 2,
- .stepUp = 4,
-};
-
-STATIC halVolRampT volRampCustomLow= {
- .slave = CustomLow_Playback_Volume,
- .delay = 50*1000, // ramping delay in us
- .stepDown= 2,
- .stepUp = 4,
-};
-
-STATIC halVolRampT volRampFallback= {
- .slave = Fallback_Playback_Volume,
- .delay = 50*1000, // ramping delay in us
- .stepDown= 2,
- .stepUp = 4,
-};
-
-
static int master_volume = 80;
static json_bool master_switch;
static int pcm_volume[PCM_MAX_CHANNELS] = {100,100,100,100,100,100};
@@ -238,93 +143,14 @@ STATIC alsaHalMapT alsaHalMap[]= {
{ .tag=Master_Playback_Volume, .cb={.callback=unicens_master_vol_cb, .handle=&master_volume}, .info="Sets master playback volume",
.ctl={.numid=CTL_AUTO, .type=SND_CTL_ELEM_TYPE_INTEGER, .count=1, .minval=0, .maxval=100, .step=1, .value=80, .name="Master Playback Volume"}
},
+#if 0
/*{ .tag=Master_OnOff_Switch, .cb={.callback=unicens_master_switch_cb, .handle=&master_switch}, .info="Sets master playback switch",
.ctl={.numid=CTL_AUTO, .type=SND_CTL_ELEM_TYPE_BOOLEAN, .count=1, .minval=0, .maxval=1, .step=1, .value=1, .name="Master Playback Switch"}
},*/
{ .tag=PCM_Playback_Volume, .cb={.callback=unicens_pcm_vol_cb, .handle=&pcm_volume}, .info="Sets PCM playback volume",
.ctl={.numid=CTL_AUTO, .type=SND_CTL_ELEM_TYPE_INTEGER, .count=6, .minval=0, .maxval=100, .step=1, .value=100, .name="PCM Playback Volume"}
},
-
- // Sound card does not have hardware volume ramping
- { .tag=Master_Playback_Ramp, .cb={.callback=volumeRamp, .handle=&volRampMaster}, .info="RampUp Master Volume",
- .ctl={.numid=CTL_AUTO, .type=SND_CTL_ELEM_TYPE_INTEGER, .name="Master_Ramp", .count=1, .minval=0, .maxval=100, .step=1, .value=80 }
- },
-
- // Implement Rampup Volume for Virtual Channels (0-100)
- { .tag=Emergency_Playback_Ramp, .cb={.callback=volumeRamp, .handle=&volRampEmergency}, .info="RampUp Emergency Volume",
- .ctl={.numid=CTL_AUTO, .type=SND_CTL_ELEM_TYPE_INTEGER,.name="Emergency_Ramp", .minval=0, .maxval=100, .step=1, .value=80 }
- },
- { .tag=Warning_Playback_Ramp, .cb={.callback=volumeRamp, .handle=&volRampWarning}, .info="RampUp Warning Volume",
- .ctl={.numid=CTL_AUTO, .type=SND_CTL_ELEM_TYPE_INTEGER,.name="Warning_Ramp", .minval=0, .maxval=100, .step=1, .value=80 }
- },
- { .tag=CustomHigh_Playback_Ramp, .cb={.callback=volumeRamp, .handle=&volRampCustomHigh}, .info="RampUp CustomHigh Volume",
- .ctl={.numid=CTL_AUTO, .type=SND_CTL_ELEM_TYPE_INTEGER,.name="CustomHigh_Ramp", .minval=0, .maxval=100, .step=1, .value=80 }
- },
- { .tag=Phone_Playback_Ramp, .cb={.callback=volumeRamp, .handle=&volRampPhone}, .info="RampUp Phone Volume",
- .ctl={.numid=CTL_AUTO, .type=SND_CTL_ELEM_TYPE_INTEGER,.name="Phone_Ramp", .minval=0, .maxval=100, .step=1, .value=80 }
- },
- { .tag=Navigation_Playback_Ramp, .cb={.callback=volumeRamp, .handle=&volRampNavigation}, .info="RampUp Navigation Volume",
- .ctl={.numid=CTL_AUTO, .type=SND_CTL_ELEM_TYPE_INTEGER,.name="Navigation_Ramp", .minval=0, .maxval=100, .step=1, .value=80 }
- },
- { .tag=CustomMedium_Playback_Ramp, .cb={.callback=volumeRamp, .handle=&volRampCustomMedium}, .info="RampUp CustomMedium Volume",
- .ctl={.numid=CTL_AUTO, .type=SND_CTL_ELEM_TYPE_INTEGER,.name="CustomMedium_Ramp", .minval=0, .maxval=100, .step=1, .value=80 }
- },
- { .tag=Video_Playback_Ramp, .cb={.callback=volumeRamp, .handle=&volRampVideo}, .info="RampUp Video Volume",
- .ctl={.numid=CTL_AUTO, .type=SND_CTL_ELEM_TYPE_INTEGER,.name="Video_Ramp", .minval=0, .maxval=100, .step=1, .value=80 }
- },
- { .tag=Streaming_Playback_Ramp, .cb={.callback=volumeRamp, .handle=&volRampStreaming}, .info="RampUp Streaming Volume",
- .ctl={.numid=CTL_AUTO, .type=SND_CTL_ELEM_TYPE_INTEGER,.name="Streaming_Ramp", .minval=0, .maxval=100, .step=1, .value=80 }
- },
- { .tag=Multimedia_Playback_Ramp, .cb={.callback=volumeRamp, .handle=&volRampMultimedia}, .info="RampUp Multimedia Volume",
- .ctl={.numid=CTL_AUTO, .type=SND_CTL_ELEM_TYPE_INTEGER,.name="Multimedia_Ramp", .minval=0, .maxval=100, .step=1, .value=80 }
- },
- { .tag=Radio_Playback_Ramp, .cb={.callback=volumeRamp, .handle=&volRampRadio}, .info="RampUp Radio Volume",
- .ctl={.numid=CTL_AUTO, .type=SND_CTL_ELEM_TYPE_INTEGER,.name="Radio_Ramp", .minval=0, .maxval=100, .step=1, .value=80 }
- },
- { .tag=CustomLow_Playback_Ramp, .cb={.callback=volumeRamp, .handle=&volRampCustomLow}, .info="RampUp CustomLow Volume",
- .ctl={.numid=CTL_AUTO, .type=SND_CTL_ELEM_TYPE_INTEGER,.name="CustomLow_Ramp", .minval=0, .maxval=100, .step=1, .value=80 }
- },
- { .tag=Fallback_Playback_Ramp, .cb={.callback=volumeRamp, .handle=&volRampFallback}, .info="RampUp Fallback Volume",
- .ctl={.numid=CTL_AUTO, .type=SND_CTL_ELEM_TYPE_INTEGER,.name="Fallback_Ramp", .minval=0, .maxval=100, .step=1, .value=80 }
- },
-
- // Bind with existing ones created by ALSA configuration (and linked to softvol) [0-255]
- { .tag=Emergency_Playback_Volume ,
- .ctl={.name="Emergency_Volume",.numid=CTL_AUTO, .type=SND_CTL_ELEM_TYPE_INTEGER,.count=2, .maxval=255, .value=204 }
- },
- { .tag=Warning_Playback_Volume ,
- .ctl={.name="Warning_Volume",.numid=CTL_AUTO, .type=SND_CTL_ELEM_TYPE_INTEGER,.count=2, .maxval=255, .value=204 }
- },
- { .tag=CustomHigh_Playback_Volume ,
- .ctl={.name="CustomHigh_Volume",.numid=CTL_AUTO, .type=SND_CTL_ELEM_TYPE_INTEGER,.count=2, .maxval=255, .value=204 }
- },
- { .tag=Phone_Playback_Volume ,
- .ctl={.name="Phone_Volume",.numid=CTL_AUTO, .type=SND_CTL_ELEM_TYPE_INTEGER,.count=2, .maxval=255, .value=204 }
- },
- { .tag=Navigation_Playback_Volume ,
- .ctl={.name="Navigation_Volume",.numid=CTL_AUTO, .type=SND_CTL_ELEM_TYPE_INTEGER,.count=2, .maxval=255, .value=204 }
- },
- { .tag=CustomMedium_Playback_Volume ,
- .ctl={.name="CustomMedium_Volume",.numid=CTL_AUTO, .type=SND_CTL_ELEM_TYPE_INTEGER,.count=2, .maxval=255, .value=204 }
- },
- { .tag=Video_Playback_Volume ,
- .ctl={.name="Video_Volume",.numid=CTL_AUTO, .type=SND_CTL_ELEM_TYPE_INTEGER,.count=2, .maxval=255, .value=204 }
- },
- { .tag=Streaming_Playback_Volume ,
- .ctl={.name="Streaming_Volume",.numid=CTL_AUTO, .type=SND_CTL_ELEM_TYPE_INTEGER,.count=2, .maxval=255, .value=204 }
- },
- { .tag=Multimedia_Playback_Volume ,
- .ctl={.name="Multimedia_Volume",.numid=CTL_AUTO, .type=SND_CTL_ELEM_TYPE_INTEGER,.count=2, .maxval=255, .value=204 }
- },
- { .tag=Radio_Playback_Volume ,
- .ctl={.name="Radio_Volume",.numid=CTL_AUTO, .type=SND_CTL_ELEM_TYPE_INTEGER,.count=2, .maxval=255, .value=204 }
- },
- { .tag=CustomLow_Playback_Volume ,
- .ctl={.name="CustomLow_Volume",.numid=CTL_AUTO, .type=SND_CTL_ELEM_TYPE_INTEGER,.count=2, .maxval=255, .value=204 }
- },
- { .tag=Fallback_Playback_Volume ,
- .ctl={.name="Fallback_Volume",.numid=CTL_AUTO, .type=SND_CTL_ELEM_TYPE_INTEGER,.count=2, .maxval=255, .value=204 }
- },
+#endif
{ .tag=EndHalCrlTag} /* marker for end of the array */
} ;
@@ -341,6 +167,21 @@ STATIC int unicens_service_init() {
int err = 0;
AFB_NOTICE("Initializing HAL-MOST-UNICENS-BINDING");
+ err = wrap_volume_init();
+ if (err) {
+ AFB_ERROR("Failed to initialize wrapper for volume library");
+ goto OnErrorExit;
+ }
+
+ /* Step 1: Set output volume to pre-defined level */
+ /* in order to avoid muted volume to be persistent after boot. */
+ wrap_volume_master(80);
+ wrap_volume_pcm(pcm_volume, PCM_MAX_CHANNELS/*array size*/);
+
+ /* Step 2: risk to have influence on mixer controls init */
+ /* request of initial card values */
+ /* unicens_request_card_values(ALSA_DEVICE_ID); */
+
err = halServiceInit(afbBindingV2.api, &alsaHalSndCard);
if (err) {
AFB_ERROR("Cannot initialize ALSA soundcard.");
@@ -359,21 +200,6 @@ STATIC int unicens_service_init() {
goto OnErrorExit;
}
- err = wrap_volume_init();
- if (err) {
- AFB_ERROR("Failed to initialize wrapper for volume library");
- goto OnErrorExit;
- }
-
- /* Step 1: Set output volume to pre-defined level */
- /* in order to avoid muted volume to be persistent after boot. */
- wrap_volume_master(80);
- wrap_volume_pcm(pcm_volume, PCM_MAX_CHANNELS/*array size*/);
-
- /* Step 2: risk to have influence on mixer controls init */
- /* request of initial card values */
- /* unicens_request_card_values(ALSA_DEVICE_ID); */
-
OnErrorExit:
AFB_NOTICE("Initializing HAL-MOST-UNICENS-BINDING done..");
return err;
diff --git a/MOST_UNICENS/ucs2-vol/inc/device_value.h b/MOST_UNICENS/ucs2-vol/inc/device_value.h
index bc8f142..c2fe0b1 100644
--- a/MOST_UNICENS/ucs2-vol/inc/device_value.h
+++ b/MOST_UNICENS/ucs2-vol/inc/device_value.h
@@ -53,13 +53,14 @@ struct STxMessage {
enum DeviceValueType {
DEVICE_VAL_MASTER = 0,
DEVICE_VAL_LEFT = 1,
- DEVICE_VAL_RIGHT = 2
+ DEVICE_VAL_RIGHT = 2,
+ DEVICE_VAL_FIBERDYNE_MASTER = 3
};
class CDeviceValue {
public:
- CDeviceValue(uint16_t address, DeviceValueType type, uint16_t key);
+ CDeviceValue(uint16_t address, DeviceValueType type, uint16_t key, bool is_i2c);
virtual ~CDeviceValue();
uint16_t GetKey(){return _key;}
@@ -72,6 +73,7 @@ public:
bool FireUpdateMessage(lib_most_volume_writei2c_cb_t writei2c_fptr,
lib_most_volume_writei2c_result_cb_t result_fptr,
void *result_user_ptr);// fires message & updates actual value
+ bool FireControlMessage(lib_most_volume_sendmessage_cb_t sendmsg_fptr);
void SetAvailable(bool active){this->_is_available = active; _actual_value = 0x01u;}
bool IsAvailable() {return this->_is_available;}
@@ -84,6 +86,7 @@ private:
bool _is_available; // related node is available
bool _is_busy; // do not update while busy
+ bool _is_i2c;
DeviceValueType _type; // determines the remote i2c command
uint16_t _key; // lookup key
uint16_t _address; // target node/group address
diff --git a/MOST_UNICENS/ucs2-vol/inc/libmostvolume.h b/MOST_UNICENS/ucs2-vol/inc/libmostvolume.h
index 1147993..5335754 100644
--- a/MOST_UNICENS/ucs2-vol/inc/libmostvolume.h
+++ b/MOST_UNICENS/ucs2-vol/inc/libmostvolume.h
@@ -63,9 +63,12 @@ typedef int (*lib_most_volume_writei2c_cb_t)(uint16_t node, uint8_t *data_ptr, u
lib_most_volume_writei2c_result_cb_t result_fptr,
void *result_user_ptr);
+typedef int (*lib_most_volume_sendmessage_cb_t)(uint16_t node, uint16_t msgid, uint8_t *data_ptr, uint8_t data_sz);
+
typedef struct lib_most_volume_init_ {
lib_most_volume_service_cb_t service_cb;
lib_most_volume_writei2c_cb_t writei2c_cb;
+ lib_most_volume_sendmessage_cb_t sendmsg_cb;
} lib_most_volume_init_t;
diff --git a/MOST_UNICENS/ucs2-vol/inc/setup.h b/MOST_UNICENS/ucs2-vol/inc/setup.h
index e7cda01..3be8bf4 100644
--- a/MOST_UNICENS/ucs2-vol/inc/setup.h
+++ b/MOST_UNICENS/ucs2-vol/inc/setup.h
@@ -51,6 +51,8 @@ private:
CDeviceValue _volume_amp_272_m;
CDeviceValue _volume_amp_272_l;
CDeviceValue _volume_amp_272_r;
+
+ CDeviceValue _volume_amp_510_m;
CDeviceContainer _value_container;
lib_most_volume_init_t init_data;
diff --git a/MOST_UNICENS/ucs2-vol/src/device_container.cpp b/MOST_UNICENS/ucs2-vol/src/device_container.cpp
index f8b1961..3448a23 100644
--- a/MOST_UNICENS/ucs2-vol/src/device_container.cpp
+++ b/MOST_UNICENS/ucs2-vol/src/device_container.cpp
@@ -119,18 +119,25 @@ void CDeviceContainer::Update()
if (_values_pptr[_idx_processing]->RequiresUpdate())
{
- if (_values_pptr[_idx_processing]->FireUpdateMessage(this->_init_ptr->writei2c_cb,
- &OnI2cResult,
- this))
+ if (_values_pptr[_idx_processing]->GetType() == DEVICE_VAL_FIBERDYNE_MASTER)
{
- this->_tx_busy = true;
- error = false;
- break;
+ _values_pptr[_idx_processing]->FireControlMessage(this->_init_ptr->sendmsg_cb);
}
else
{
- error = true;
- break;
+ if (_values_pptr[_idx_processing]->FireUpdateMessage(this->_init_ptr->writei2c_cb,
+ &OnI2cResult,
+ this))
+ {
+ this->_tx_busy = true;
+ error = false;
+ break;
+ }
+ else
+ {
+ error = true;
+ break;
+ }
}
}
}
diff --git a/MOST_UNICENS/ucs2-vol/src/device_value.cpp b/MOST_UNICENS/ucs2-vol/src/device_value.cpp
index 7103192..22b8dfb 100644
--- a/MOST_UNICENS/ucs2-vol/src/device_value.cpp
+++ b/MOST_UNICENS/ucs2-vol/src/device_value.cpp
@@ -32,11 +32,12 @@
#define CONTROL_CH_1 0x08U
#define CONTROL_CH_2 0x09U
-CDeviceValue::CDeviceValue(uint16_t address, DeviceValueType type, uint16_t key)
+CDeviceValue::CDeviceValue(uint16_t address, DeviceValueType type, uint16_t key, bool is_i2c)
{
this->_is_available = false;
this->_is_busy = false;
this->_address = address;
+ this->_is_i2c = is_i2c;
this->_target_value = 0x01u;
this->_actual_value = 0x01u;
@@ -49,7 +50,11 @@ CDeviceValue::CDeviceValue(uint16_t address, DeviceValueType type, uint16_t key)
_tx_payload[0] = CONTROL_MASTER;// 7: master, 8: channel 1, 9: Channel 2
_tx_payload[1] = MUTE_VALUE_HB; //HB:Volume
_tx_payload[2] = MUTE_VALUE_LB; //LB:Volume
- _tx_payload_sz = 3u;
+
+ if (type == DEVICE_VAL_FIBERDYNE_MASTER)
+ _tx_payload_sz = 2u;
+ else
+ _tx_payload_sz = 3u;
}
CDeviceValue::~CDeviceValue()
@@ -60,6 +65,14 @@ void CDeviceValue::ApplyMostValue(uint8_t value, DeviceValueType type, uint8_t t
{
uint16_t tmp = MUTE_VALUE;
+ if (type == DEVICE_VAL_FIBERDYNE_MASTER)
+ {
+ tx_payload[0] = 0x00U;
+ tx_payload[1] = value;
+
+ return;
+ }
+
switch (type)
{
case DEVICE_VAL_LEFT:
@@ -75,7 +88,7 @@ void CDeviceValue::ApplyMostValue(uint8_t value, DeviceValueType type, uint8_t t
tx_payload[0] = CONTROL_CH_2;
break;
default:
- /*std::cerr << "CDeviceValue::ApplyMostValue() error matching incorrect" << std::endl;*/
+ /*std::cerr << "CDeviceValue::ApplyMostValue() error matching incorrect" << std::endl;*/
case DEVICE_VAL_MASTER:
tmp = (uint16_t)(0x100U + 0x2FFU - (0x2FFU * ((int32_t)value) / (0xFFU)));
tx_payload[0] = CONTROL_MASTER;
@@ -97,6 +110,20 @@ bool CDeviceValue::RequiresUpdate()
return false;
}
+bool CDeviceValue::FireControlMessage(lib_most_volume_sendmessage_cb_t sendmsg_fptr)
+{
+ ApplyMostValue(this->_target_value, _type, _tx_payload);
+
+ if (this->_is_available && !this->_is_busy)
+ {
+ sendmsg_fptr(this->_address, 0x100U, _tx_payload, _tx_payload_sz);
+
+ this->_actual_value = this->_target_value;
+ }
+
+ return true;
+}
+
bool CDeviceValue::FireUpdateMessage(lib_most_volume_writei2c_cb_t writei2c_fptr,
lib_most_volume_writei2c_result_cb_t result_fptr,
void *result_user_ptr)
diff --git a/MOST_UNICENS/ucs2-vol/src/libmostvolume.cpp b/MOST_UNICENS/ucs2-vol/src/libmostvolume.cpp
index 5eea3fd..35f769f 100644
--- a/MOST_UNICENS/ucs2-vol/src/libmostvolume.cpp
+++ b/MOST_UNICENS/ucs2-vol/src/libmostvolume.cpp
@@ -23,6 +23,7 @@
#include "libmostvolume.h"
#include "setup.h"
+#include <afb/afb-binding.h>
/*#include <iostream>*/
static bool _running = false;
@@ -61,6 +62,7 @@ extern "C" uint8_t lib_most_volume_set(enum lib_most_volume_channel_t channel, u
{
uint8_t success = 1U;
/*std::cerr << "lib_most_volume_set(): channel=" << channel << ", volume=" << (int)volume << std::endl;*/
+ AFB_NOTICE("lib_most_volume_set");
if (_running)
{
diff --git a/MOST_UNICENS/ucs2-vol/src/setup.cpp b/MOST_UNICENS/ucs2-vol/src/setup.cpp
index dd6675b..ad841ab 100644
--- a/MOST_UNICENS/ucs2-vol/src/setup.cpp
+++ b/MOST_UNICENS/ucs2-vol/src/setup.cpp
@@ -43,18 +43,19 @@ void CSetup::Release() {
}
CSetup::CSetup()
- : _volume_amp_270_m(0x270U, DEVICE_VAL_MASTER, LIB_MOST_VOLUME_MASTER),
- _volume_amp_270_l(0x270U, DEVICE_VAL_LEFT, LIB_MOST_VOLUME_CH_FRONT_LEFT),
- _volume_amp_270_r(0x270U, DEVICE_VAL_RIGHT, LIB_MOST_VOLUME_CH_FRONT_RIGHT),
- _volume_amp_271_m(0x271U, DEVICE_VAL_MASTER, LIB_MOST_VOLUME_MASTER),
- _volume_amp_271_l(0x271U, DEVICE_VAL_LEFT, LIB_MOST_VOLUME_CH_REAR_LEFT),
- _volume_amp_271_r(0x271U, DEVICE_VAL_RIGHT, LIB_MOST_VOLUME_CH_REAR_RIGHT),
- _volume_amp_272_m(0x272U, DEVICE_VAL_MASTER, LIB_MOST_VOLUME_MASTER),
- _volume_amp_272_l(0x272U, DEVICE_VAL_LEFT, LIB_MOST_VOLUME_CH_CENTER),
- _volume_amp_272_r(0x272U, DEVICE_VAL_RIGHT, LIB_MOST_VOLUME_CH_SUB),
+ : _volume_amp_270_m(0x270U, DEVICE_VAL_MASTER, LIB_MOST_VOLUME_MASTER, true),
+ _volume_amp_270_l(0x270U, DEVICE_VAL_LEFT, LIB_MOST_VOLUME_CH_FRONT_LEFT, true),
+ _volume_amp_270_r(0x270U, DEVICE_VAL_RIGHT, LIB_MOST_VOLUME_CH_FRONT_RIGHT, true),
+ _volume_amp_271_m(0x271U, DEVICE_VAL_MASTER, LIB_MOST_VOLUME_MASTER, true),
+ _volume_amp_271_l(0x271U, DEVICE_VAL_LEFT, LIB_MOST_VOLUME_CH_REAR_LEFT, true),
+ _volume_amp_271_r(0x271U, DEVICE_VAL_RIGHT, LIB_MOST_VOLUME_CH_REAR_RIGHT, true),
+ _volume_amp_272_m(0x272U, DEVICE_VAL_MASTER, LIB_MOST_VOLUME_MASTER, true),
+ _volume_amp_272_l(0x272U, DEVICE_VAL_LEFT, LIB_MOST_VOLUME_CH_CENTER, true),
+ _volume_amp_272_r(0x272U, DEVICE_VAL_RIGHT, LIB_MOST_VOLUME_CH_SUB, true),
+ _volume_amp_510_m(0x510U, DEVICE_VAL_FIBERDYNE_MASTER, LIB_MOST_VOLUME_MASTER, false),
_value_container()
{
- static CDeviceValue* value_list[9] = { &_volume_amp_270_m,
+ static CDeviceValue* value_list[10] = { &_volume_amp_270_m,
&_volume_amp_270_l,
&_volume_amp_270_r,
&_volume_amp_271_m,
@@ -62,9 +63,10 @@ CSetup::CSetup()
&_volume_amp_271_r,
&_volume_amp_272_m,
&_volume_amp_272_l,
- &_volume_amp_272_r};
+ &_volume_amp_272_r,
+ &_volume_amp_510_m};
- _value_container.RegisterValues(value_list, 9U);
+ _value_container.RegisterValues(value_list, 10U);
}
CSetup::~CSetup()
diff --git a/MOST_UNICENS/wrap_unicens.c b/MOST_UNICENS/wrap_unicens.c
index 095a2fe..4b75780 100644
--- a/MOST_UNICENS/wrap_unicens.c
+++ b/MOST_UNICENS/wrap_unicens.c
@@ -334,3 +334,35 @@ OnErrorExit:
json_object_put(j_query);
return err;
}
+
+extern int wrap_ucs_sendmessage(uint16_t src_addr, uint16_t msg_id, uint8_t *data_ptr, uint8_t data_sz) {
+
+ json_object *j_query, *j_response = NULL;
+ int err;
+ int node = (int)src_addr;
+ int msgid = (int)msg_id;
+ size_t data_size = (size_t)data_sz;
+
+ /* skip data attribute if possible, wrap_json_unpack may fail to deal with
+ * an empty Base64 string */
+ if (data_size > 0)
+ wrap_json_pack(&j_query, "{s:i, s:i, s:Y}", "node", node, "msgid", msgid, "data", data_ptr, data_size);
+ else
+ wrap_json_pack(&j_query, "{s:i, s:i}", "node", node, "msgid", msgid);
+
+ err = afb_service_call_sync("UNICENS", "sendmessage", j_query, &j_response);
+
+ if (err) {
+ AFB_ERROR("Failed to call wrap_ucs_sendmessage");
+ goto OnErrorExit;
+ }
+ else {
+ AFB_INFO("Called wrap_ucs_sendmessage, res=%s", json_object_to_json_string(j_response));
+ json_object_put(j_response);
+ }
+
+ j_query = NULL;
+
+OnErrorExit:
+ return err;
+}
diff --git a/MOST_UNICENS/wrap_unicens.h b/MOST_UNICENS/wrap_unicens.h
index c28d13a..734ea5d 100644
--- a/MOST_UNICENS/wrap_unicens.h
+++ b/MOST_UNICENS/wrap_unicens.h
@@ -32,3 +32,4 @@ extern int wrap_ucs_subscribe_sync();
extern int wrap_ucs_getconfig_sync(const char *config_path, char **file_found);
extern int wrap_ucs_initialize_sync(const char* file_name);
extern int wrap_ucs_i2cwrite_sync(uint16_t node, uint8_t *data_ptr, uint8_t data_sz);
+extern int wrap_ucs_sendmessage(uint16_t src_addr, uint16_t msg_id, uint8_t *data_ptr, uint8_t data_sz);
diff --git a/MOST_UNICENS/wrap_volume.c b/MOST_UNICENS/wrap_volume.c
index 5bc1e84..9f9ceff 100644
--- a/MOST_UNICENS/wrap_volume.c
+++ b/MOST_UNICENS/wrap_volume.c
@@ -73,7 +73,8 @@ extern int wrap_volume_init(void) {
lib_most_volume_init_t mv_init;
mv_init.writei2c_cb = &wrap_ucs_i2cwrite;
- mv_init.service_cb = wrap_volume_service_cb;
+ mv_init.service_cb = &wrap_volume_service_cb;
+ mv_init.sendmsg_cb = &wrap_ucs_sendmessage;
ret = lib_most_volume_init(&mv_init);