diff options
-rw-r--r-- | README.md | 8 | ||||
-rw-r--r-- | binding/binding.c | 3 | ||||
-rw-r--r-- | binding/microphone/microphone.c | 125 | ||||
-rw-r--r-- | binding/microphone/microphone.h | 3 | ||||
-rw-r--r-- | htdocs/ucs-controller.html | 14 |
5 files changed, 142 insertions, 11 deletions
@@ -11,15 +11,19 @@ The name of the provided API is `unicens-controller`. |-----------------------------|-----------------------------------------------|-------------------------------------------------------------------| | slimamp_master_volume_set | Set master volume of the slim amplifer. | *Request:* { "value": 0 }<br>Valid range for `value`: 0..100 | | amplifier_master_volume_set | Set master volume of the Fiberdyne amplifer. | *Request:* { "value": 0 }<br>Valid range for `value`: 0..100 | +| microphone_is_available | Check if the microphone present in network. | *Request:* {}<br>*Response*: { "available": true } | | microphone_mode_set | Set LED mode of microphone. | See section *Verb microphone_mode_set* | -| microphone_doa_get | Get the direction of audio. | *Request:* {}<br>*Response*: { "value": 45 }<br>Valid range for `value`: 0..359 | +| microphone_doa_get | Get the direction of audio. | *Request:* {}<br>*Response*: { "value": 45 }<br>Valid range for `value`: 0..359 | +| microphone_doa_set | Sets the direction of audio (LED). | *Request:* { "value": 45 }<br>Valid range for `value`: 0..359 | +| microphone_static_color_set | Sets color of 'static' LED Mode. | *Request:* { "red": 0, "green": 0, "blue": 255 }<br>Valid range for each color: 0..255 | + ### Verb microphone_mode_set You can set an LED signaling mode with the following parameters. | Name | Description | |---------------|---------------------------------------------------------------------------------------| -| value | none, doa, thinking, speaking, error, waking, ending, cylon, rainbow, wheel | +| value | none, doa, thinking, speaking, error, waking, ending, static, cylon, rainbow, wheel | ## Events None. diff --git a/binding/binding.c b/binding/binding.c index 1d19fdb..7034e82 100644 --- a/binding/binding.c +++ b/binding/binding.c @@ -70,6 +70,9 @@ static const afb_verb_t verbs[] = { {.verb = "amplifier_master_volume_set", .session = AFB_SESSION_NONE, .callback = amplifier_master_vol_set_api, .auth = NULL}, {.verb = "microphone_mode_set", .session = AFB_SESSION_NONE, .callback = microphone_mode_set_api, .auth = NULL}, {.verb = "microphone_doa_get", .session = AFB_SESSION_NONE, .callback = microphone_doa_get_api, .auth = NULL}, + {.verb = "microphone_doa_set", .session = AFB_SESSION_NONE, .callback = microphone_led_dir_set_api, .auth = NULL}, + {.verb = "microphone_static_color_set", .session = AFB_SESSION_NONE, .callback = microphone_static_ledcolor_set_api, .auth = NULL}, + {.verb = "microphone_is_available", .session = AFB_SESSION_NONE, .callback = microphone_is_available_api, .auth = NULL}, {NULL} }; diff --git a/binding/microphone/microphone.c b/binding/microphone/microphone.c index 344fbd7..d6d22a7 100644 --- a/binding/microphone/microphone.c +++ b/binding/microphone/microphone.c @@ -25,6 +25,9 @@ #include "wrap-unicens.h" #include "microphone.h" +#define HB(value) ((uint8_t)((uint16_t)(value) >> 8)) +#define LB(value) ((uint8_t)((uint16_t)(value) & (uint16_t)0xFFU)) + /***************************************************************************** * types */ @@ -38,10 +41,11 @@ enum microphone_mode MICROPHONE_MODE_ERROR = 4, MICROPHONE_MODE_WAKING = 5, MICROPHONE_MODE_ENDING = 6, - MICROPHONE_MODE_CYLON = 7, - MICROPHONE_MODE_RAINBOW = 8, - MICROPHONE_MODE_WHEEL = 9, - MICROPHONE_MODE_UNKNOWN = 10 + MICROPHONE_MODE_STATIC = 7, + MICROPHONE_MODE_CYLON = 8, + MICROPHONE_MODE_RAINBOW = 9, + MICROPHONE_MODE_WHEEL = 10, + MICROPHONE_MODE_UNKNOWN = 11 }; /***************************************************************************** @@ -57,12 +61,14 @@ static void microphone_doa_status(uint16_t data_sz, uint8_t *data_ptr); */ #define NODE_ID ((uint16_t)0x520U) -#define MSG_ID_MODE 0x1001U -#define MSG_ID_DOA 0x1003U +#define MSG_ID_MODE 0x1001U /* set LED mode */ +#define MSG_ID_LED_DIR 0x1002U /* set LED direction*/ +#define MSG_ID_DOA 0x1003U /* get audio direction */ +#define MSG_ID_LED_COL 0x1006U /* set static LED color */ #define MSG_OP_SET 0x00U #define MSG_OP_GET 0x01U -#define MSG_MAX_PAYLOAD_SZ 2U +#define MSG_MAX_PAYLOAD_SZ 10U static uint8_t _tx_payload[MSG_MAX_PAYLOAD_SZ]; static bool _available = false; static bool _doa_running = false; @@ -74,7 +80,7 @@ static afb_req_t _req_doa_get = NULL; extern void microphone_availablility_changed(uint16_t node_id, bool available) { if (node_id == NODE_ID) { - AFB_API_DEBUG(afbBindingRoot, "%s: amplifier new availability=%d", __func__, available); + AFB_API_DEBUG(afbBindingRoot, "%s: microphone new availability=%d", __func__, available); _available = available; _doa_running = false; } @@ -106,7 +112,7 @@ static int microphone_mode_set(enum microphone_mode mode) { if (mode < MICROPHONE_MODE_UNKNOWN) { _tx_payload[0] = MSG_OP_SET; _tx_payload[1] = (uint8_t)mode; - wrap_ucs_sendmessage_sync(NODE_ID, MSG_ID_MODE, _tx_payload, MSG_MAX_PAYLOAD_SZ); + wrap_ucs_sendmessage_sync(NODE_ID, MSG_ID_MODE, _tx_payload, 2U); } else { AFB_API_NOTICE(afbBindingRoot, "%s: given mode is unknown", __func__); @@ -151,6 +157,37 @@ static void microphone_doa_status(uint16_t data_sz, uint8_t *data_ptr) { } } +static int microphone_led_direction_set(uint16_t direction) { + AFB_API_NOTICE(afbBindingRoot, "microphone_led_direction_set executed"); + if (_available == false) { + AFB_API_NOTICE(afbBindingRoot, "%s: node is not available", __func__); + return -1; + } + + _tx_payload[0] = MSG_OP_SET; + _tx_payload[1] = HB(direction); + _tx_payload[2] = LB(direction); + wrap_ucs_sendmessage_sync(NODE_ID, MSG_ID_LED_DIR, _tx_payload, 3U); + + return 0; +} + +static int microphone_static_ledcolor_set(uint8_t red, uint8_t green, uint8_t blue) { + AFB_API_NOTICE(afbBindingRoot, "microphone_static_led_color_set executed"); + if (_available == false) { + AFB_API_NOTICE(afbBindingRoot, "%s: node is not available", __func__); + return -1; + } + + _tx_payload[0] = MSG_OP_SET; + _tx_payload[1] = red; + _tx_payload[2] = green; + _tx_payload[3] = blue; + wrap_ucs_sendmessage_sync(NODE_ID, MSG_ID_LED_COL, _tx_payload, 4U); + + return 0; +} + /***************************************************************************** * JSON API */ @@ -186,6 +223,9 @@ extern void microphone_mode_set_api(afb_req_t request) { else if (strcmp(str_mode, "ending") == 0) { mic_mode = MICROPHONE_MODE_ENDING; } + else if (strcmp(str_mode, "static") == 0) { + mic_mode = MICROPHONE_MODE_STATIC; + } else if (strcmp(str_mode, "cylon") == 0) { mic_mode = MICROPHONE_MODE_CYLON; } @@ -220,3 +260,70 @@ extern void microphone_doa_get_api(afb_req_t request) { _req_doa_get = afb_req_addref(request); } } + +extern void microphone_led_dir_set_api(afb_req_t request) { + int direction = 0; + struct json_object* j_obj = afb_req_json(request); + + AFB_API_NOTICE(afbBindingRoot, "UNICENS-CONTROLLER: %s:%s", __func__, json_object_get_string(j_obj)); + + if (wrap_json_unpack(j_obj, "{s:i}", "value", &direction) == 0) { + AFB_API_NOTICE(afbBindingRoot, "UNICENS-CONTROLLER: decoded value=%d", direction); + + if ((direction >= 0) && (direction < 360)) { + if (microphone_led_direction_set((uint16_t)direction) == 0) { + afb_req_success(request, NULL, NULL); + } + else { + afb_req_fail(request, "Call failed. Microphone not available?", NULL); + } + } + else { + afb_req_fail(request, "Argument 'value' not in range 0...359.", NULL); + } + } + else { + afb_req_fail(request, "Missing argument 'value'", NULL); + } +} + +extern void microphone_static_ledcolor_set_api(afb_req_t request) { + int red, green, blue = 0; + struct json_object* j_obj = afb_req_json(request); + + AFB_API_NOTICE(afbBindingRoot, "UNICENS-CONTROLLER: %s:%s", __func__, json_object_get_string(j_obj)); + + if (wrap_json_unpack(j_obj, "{s:i, s:i, s:i}", "red", &red, "green", &green, "blue", &blue) == 0) { + AFB_API_NOTICE(afbBindingRoot, "UNICENS-CONTROLLER: decoded rgb=%d,%d,%d", red, green, blue); + + if ( (red >= 0) && (red <= 0xFF) && (green >= 0) && (green <= 0xFF) && (blue >= 0) && (blue <= 0xFF)) { + if (microphone_static_ledcolor_set((uint8_t)red, (uint8_t)green, (uint8_t)blue) == 0) { + afb_req_success(request, NULL, NULL); + } + else { + afb_req_fail(request, "Call failed. Microphone not available?", NULL); + } + } + else { + afb_req_fail(request, "Argument 'value' not in range 0..255.", NULL); + } + } + else { + afb_req_fail(request, "Error while parsing arguments.", NULL); + } +} + +extern void microphone_is_available_api(afb_req_t request) { + struct json_object* j_obj = afb_req_json(request); + struct json_object* j_resp = json_object_new_object(); + + AFB_API_NOTICE(afbBindingRoot, "UNICENS-CONTROLLER: %s:%s", __func__, json_object_get_string(j_obj)); + + if (j_resp != NULL) { + wrap_json_pack(&j_resp, "{s:b}", "available", (int)_available); + afb_req_reply(request, j_resp, NULL, "response successful"); + } + else { + afb_req_fail(request, "Cannot allocate response object.", NULL); + } +} diff --git a/binding/microphone/microphone.h b/binding/microphone/microphone.h index 27ee4ea..bc9e7a9 100644 --- a/binding/microphone/microphone.h +++ b/binding/microphone/microphone.h @@ -26,3 +26,6 @@ extern void microphone_message_received(uint16_t node, uint16_t msg_id, uint16_t /* JSON API */ extern void microphone_mode_set_api(afb_req_t request); extern void microphone_doa_get_api(afb_req_t request); +extern void microphone_led_dir_set_api(afb_req_t request); +extern void microphone_static_ledcolor_set_api(afb_req_t request); +extern void microphone_is_available_api(afb_req_t request); diff --git a/htdocs/ucs-controller.html b/htdocs/ucs-controller.html index 0de6c57..a7a116a 100644 --- a/htdocs/ucs-controller.html +++ b/htdocs/ucs-controller.html @@ -92,17 +92,31 @@ limitations under the License. <li><button onclick="callbinder('unicens-controller','microphone_mode_set', {'value': 'error'})">Error</button></li> <li><button onclick="callbinder('unicens-controller','microphone_mode_set', {'value': 'waking'})">Waking</button></li> <li><button onclick="callbinder('unicens-controller','microphone_mode_set', {'value': 'ending'})">Ending</button></li> + <li><button onclick="callbinder('unicens-controller','microphone_mode_set', {'value': 'static'})">Static</button></li> <li><button onclick="callbinder('unicens-controller','microphone_mode_set', {'value': 'cylon'})">Cylon</button></li> <li><button onclick="callbinder('unicens-controller','microphone_mode_set', {'value': 'rainbow'})">Rainbow</button></li> <li><button onclick="callbinder('unicens-controller','microphone_mode_set', {'value': 'wheel'})">Wheel</button></li> <li><button onclick="callbinder('unicens-controller','microphone_mode_set', {'value': 'unknown'})">Unknown</button></li> </ol> </div> + <h3>General</h3> + <div> + <ol> + <li><button onclick="callbinder('unicens-controller','microphone_is_available', {})">Is Available?</button></li> + <li><button onclick="callbinder('unicens-controller','microphone_static_color_set', {'red':255,'green':0,'blue':0})">Set Static Mode Color: Red</button></li> + <li><button onclick="callbinder('unicens-controller','microphone_static_color_set', {'red':0,'green':255,'blue':0})">Set Static Mode Color: Green</button></li> + <li><button onclick="callbinder('unicens-controller','microphone_static_color_set', {'red':0,'green':0,'blue':255})">Set Static Mode Color: Blue</button></li> + </ol> + </div> <h3>DOA</h3> <div> <ol> <li><button onclick="callbinder('unicens-controller','microphone_doa_get', {})">Get direction of audio (DOA)</button></li> + <li><button onclick="callbinder('unicens-controller','microphone_doa_set', {'value': 0})">Set direction of audio 0 (DOA/LED)</button></li> + <li><button onclick="callbinder('unicens-controller','microphone_doa_set', {'value': 90})">Set direction of audio 90 (DOA/LED)</button></li> + <li><button onclick="callbinder('unicens-controller','microphone_doa_set', {'value': 180})">Set direction of audio 180 (DOA/LED)</button></li> + <li><button onclick="callbinder('unicens-controller','microphone_doa_set', {'value': 270})">Set direction of audio 270 (DOA/LED)</button></li> </ol> </div> |