From b071fc0882750d28036769c56c046fe1d7ae9942 Mon Sep 17 00:00:00 2001 From: Tobias Jahnke Date: Wed, 10 Oct 2018 15:52:57 +0200 Subject: 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 --- MOST_UNICENS/CMakeLists.txt | 2 +- MOST_UNICENS/hal_most_unicens.c | 208 ++----------------------- MOST_UNICENS/ucs2-vol/inc/device_value.h | 7 +- MOST_UNICENS/ucs2-vol/inc/libmostvolume.h | 3 + MOST_UNICENS/ucs2-vol/inc/setup.h | 2 + MOST_UNICENS/ucs2-vol/src/device_container.cpp | 23 ++- MOST_UNICENS/ucs2-vol/src/device_value.cpp | 33 +++- MOST_UNICENS/ucs2-vol/src/libmostvolume.cpp | 2 + MOST_UNICENS/ucs2-vol/src/setup.cpp | 26 ++-- MOST_UNICENS/wrap_unicens.c | 32 ++++ MOST_UNICENS/wrap_unicens.h | 1 + MOST_UNICENS/wrap_volume.c | 3 +- 12 files changed, 124 insertions(+), 218 deletions(-) (limited to 'MOST_UNICENS') 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 /*#include */ 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); -- cgit 1.2.3-korg