summaryrefslogtreecommitdiffstats
path: root/radio-binding.c
diff options
context:
space:
mode:
Diffstat (limited to 'radio-binding.c')
-rw-r--r--radio-binding.c493
1 files changed, 0 insertions, 493 deletions
diff --git a/radio-binding.c b/radio-binding.c
deleted file mode 100644
index 12ed966..0000000
--- a/radio-binding.c
+++ /dev/null
@@ -1,493 +0,0 @@
-/*
- * Copyright (C) 2017 Konsulko Group
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#define _GNU_SOURCE
-
-#include <stdlib.h>
-#include <string.h>
-#include <stdint.h>
-#include <unistd.h>
-#include <sys/types.h>
-
-#include <json-c/json.h>
-#include <afb/afb-binding.h>
-#include <afb/afb-service-itf.h>
-
-#include "radio_impl.h"
-
-static const struct afb_binding_interface *interface;
-
-static struct afb_event freq_event;
-static struct afb_event scan_event;
-
-static void freq_callback(uint32_t frequency, void *data)
-{
- json_object *jresp = json_object_new_object();
- json_object *value = json_object_new_int((int) frequency);
-
- json_object_object_add(jresp, "value", value);
- afb_event_push(freq_event, json_object_get(jresp));
-}
-
-static void scan_callback(uint32_t frequency, void *data)
-{
- json_object *jresp = json_object_new_object();
- json_object *value = json_object_new_int((int) frequency);
-
- json_object_object_add(jresp, "value", value);
- afb_event_push(scan_event, json_object_get(jresp));
-}
-
-/*
- * Binding verb handlers
- */
-
-/*
- * @brief Get (and optionally set) frequency
- *
- * @param struct afb_req : an afb request structure
- *
- */
-static void frequency(struct afb_req request)
-{
- json_object *ret_json;
- const char *value = afb_req_value(request, "value");
- uint32_t frequency;
-
- if(value) {
- char *p;
- frequency = strtoul(value, &p, 10);
- if(frequency && *p == '\0') {
- radio_impl_set_frequency(frequency);
- } else {
- afb_req_fail(request, "failed", "Invalid scan direction");
- return;
- }
- }
- ret_json = json_object_new_object();
- frequency = radio_impl_get_frequency();
- json_object_object_add(ret_json, "frequency", json_object_new_int((int32_t) frequency));
- afb_req_success(request, ret_json, NULL);
-}
-
-/*
- * @brief Get (and optionally set) frequency band
- *
- * @param struct afb_req : an afb request structure
- *
- */
-static void band(struct afb_req request)
-{
- json_object *ret_json;
- const char *value = afb_req_value(request, "value");
- int valid = 0;
- radio_band_t band;
- char band_name[4];
-
- if(value) {
- if(!strcasecmp(value, "AM")) {
- band = BAND_AM;
- valid = 1;
- } else if(!strcasecmp(value, "FM")) {
- band = BAND_FM;
- valid = 1;
- } else {
- char *p;
- band = strtoul(value, &p, 10);
- if(p != value && *p == '\0') {
- switch(band) {
- case BAND_AM:
- case BAND_FM:
- valid = 1;
- break;
- default:
- break;
- }
- }
- }
- if(valid) {
- radio_impl_set_band(band);
- } else {
- afb_req_fail(request, "failed", "Invalid band");
- return;
- }
- }
- ret_json = json_object_new_object();
- band = radio_impl_get_band();
- sprintf(band_name, "%s", band == BAND_AM ? "AM" : "FM");
- json_object_object_add(ret_json, "band", json_object_new_string(band_name));
- afb_req_success(request, ret_json, NULL);
-}
-
-/*
- * @brief Check if band is supported
- *
- * @param struct afb_req : an afb request structure
- *
- */
-static void band_supported(struct afb_req request)
-{
- json_object *ret_json;
- const char *value = afb_req_value(request, "band");
- int valid = 0;
- radio_band_t band;
-
- if(value) {
- if(!strcasecmp(value, "AM")) {
- band = BAND_AM;
- valid = 1;
- } else if(!strcasecmp(value, "FM")) {
- band = BAND_FM;
- valid = 1;
- } else {
- char *p;
- band = strtoul(value, &p, 10);
- if(p != value && *p == '\0') {
- switch(band) {
- case BAND_AM:
- case BAND_FM:
- valid = 1;
- break;
- default:
- break;
- }
- }
- }
- }
- if(!valid) {
- afb_req_fail(request, "failed", "Invalid band");
- return;
- }
- ret_json = json_object_new_object();
- json_object_object_add(ret_json,
- "supported",
- json_object_new_int(radio_impl_band_supported(band)));
- afb_req_success(request, ret_json, NULL);
-}
-
-/*
- * @brief Get frequency range for a band
- *
- * @param struct afb_req : an afb request structure
- *
- */
-static void frequency_range(struct afb_req request)
-{
- json_object *ret_json;
- const char *value = afb_req_value(request, "band");
- int valid = 0;
- radio_band_t band;
- uint32_t min_frequency;
- uint32_t max_frequency;
-
- if(value) {
- if(!strcasecmp(value, "AM")) {
- band = BAND_AM;
- valid = 1;
- } else if(!strcasecmp(value, "FM")) {
- band = BAND_FM;
- valid = 1;
- } else {
- char *p;
- band = strtoul(value, &p, 10);
- if(p != value && *p == '\0') {
- switch(band) {
- case BAND_AM:
- case BAND_FM:
- valid = 1;
- break;
- default:
- break;
- }
- }
- }
- }
- if(!valid) {
- afb_req_fail(request, "failed", "Invalid band");
- return;
- }
- ret_json = json_object_new_object();
- min_frequency = radio_impl_get_min_frequency(band);
- max_frequency = radio_impl_get_max_frequency(band);
- json_object_object_add(ret_json, "min", json_object_new_int((int32_t) min_frequency));
- json_object_object_add(ret_json, "max", json_object_new_int((int32_t) max_frequency));
- afb_req_success(request, ret_json, NULL);
-}
-
-/*
- * @brief Get frequency step size (Hz) for a band
- *
- * @param struct afb_req : an afb request structure
- *
- */
-static void frequency_step(struct afb_req request)
-{
- json_object *ret_json;
- const char *value = afb_req_value(request, "band");
- int valid = 0;
- radio_band_t band;
- uint32_t step;
-
- if(value) {
- if(!strcasecmp(value, "AM")) {
- band = BAND_AM;
- valid = 1;
- } else if(!strcasecmp(value, "FM")) {
- band = BAND_FM;
- valid = 1;
- } else {
- char *p;
- band = strtoul(value, &p, 10);
- if(p != value && *p == '\0') {
- switch(band) {
- case BAND_AM:
- case BAND_FM:
- valid = 1;
- break;
- default:
- break;
- }
- }
- }
- }
- if(!valid) {
- afb_req_fail(request, "failed", "Invalid band");
- return;
- }
- ret_json = json_object_new_object();
- step = radio_impl_get_frequency_step(band);
- json_object_object_add(ret_json, "step", json_object_new_int((int32_t) step));
- afb_req_success(request, ret_json, NULL);
-}
-
-/*
- * @brief Start radio playback
- *
- * @param struct afb_req : an afb request structure
- *
- */
-static void start(struct afb_req request)
-{
- radio_impl_start();
- afb_req_success(request, NULL, NULL);
-}
-
-/*
- * @brief Stop radio playback
- *
- * @param struct afb_req : an afb request structure
- *
- */
-static void stop(struct afb_req request)
-{
- radio_impl_stop();
- afb_req_success(request, NULL, NULL);
-}
-
-/*
- * @brief Scan for a station in the specified direction
- *
- * @param struct afb_req : an afb request structure
- *
- */
-static void scan_start(struct afb_req request)
-{
- json_object *ret_json;
- const char *value = afb_req_value(request, "direction");
- int valid = 0;
- radio_scan_direction_t direction;
-
- if(value) {
- if(!strcasecmp(value, "forward")) {
- direction = SCAN_FORWARD;
- valid = 1;
- } else if(!strcasecmp(value, "backward")) {
- direction = SCAN_BACKWARD;
- valid = 1;
- } else {
- char *p;
- direction = strtoul(value, &p, 10);
- if(p != value && *p == '\0') {
- switch(direction) {
- case SCAN_FORWARD:
- case SCAN_BACKWARD:
- valid = 1;
- break;
- default:
- break;
- }
- }
- }
- }
- if(!valid) {
- afb_req_fail(request, "failed", "Invalid direction");
- return;
- }
- radio_impl_scan_start(direction, scan_callback, NULL);
- afb_req_success(request, ret_json, NULL);
-}
-
-/*
- * @brief Stop station scan
- *
- * @param struct afb_req : an afb request structure
- *
- */
-static void scan_stop(struct afb_req request)
-{
- radio_impl_scan_stop();
- afb_req_success(request, NULL, NULL);
-}
-
-/*
- * @brief Get (and optionally set) stereo mode
- *
- * @param struct afb_req : an afb request structure
- *
- */
-static void stereo_mode(struct afb_req request)
-{
- json_object *ret_json;
- const char *value = afb_req_value(request, "value");
- int valid = 0;
- radio_stereo_mode_t mode;
- char mode_name[4];
-
- if(value) {
- if(!strcasecmp(value, "mono")) {
- mode = MONO;
- valid = 1;
- } else if(!strcasecmp(value, "stereo")) {
- mode = STEREO;
- valid = 1;
- } else {
- char *p;
- mode = strtoul(value, &p, 10);
- if(p != value && *p == '\0') {
- switch(mode) {
- case MONO:
- case STEREO:
- valid = 1;
- break;
- default:
- break;
- }
- }
- }
- if(valid) {
- radio_impl_set_stereo_mode(mode);
- } else {
- afb_req_fail(request, "failed", "Invalid mode");
- return;
- }
- }
- ret_json = json_object_new_object();
- mode = radio_impl_get_stereo_mode();
- sprintf(mode_name, "%s", mode == MONO ? "mono" : "stereo");
- json_object_object_add(ret_json, "mode", json_object_new_string(mode_name));
- afb_req_success(request, ret_json, NULL);
-}
-
-/*
- * @brief Subscribe for an event
- *
- * @param struct afb_req : an afb request structure
- *
- */
-static void subscribe(struct afb_req request)
-{
- const char *value = afb_req_value(request, "value");
- if(value) {
- if(!strcasecmp(value, "frequency")) {
- afb_req_subscribe(request, freq_event);
- } else if(!strcasecmp(value, "station_found")) {
- afb_req_subscribe(request, scan_event);
- } else {
- afb_req_fail(request, "failed", "Invalid event");
- return;
- }
- }
- afb_req_success(request, NULL, NULL);
-}
-
-/*
- * @brief Unsubscribe for an event
- *
- * @param struct afb_req : an afb request structure
- *
- */
-static void unsubscribe(struct afb_req request)
-{
- const char *value = afb_req_value(request, "value");
- if(value) {
- if(!strcasecmp(value, "frequency")) {
- afb_req_unsubscribe(request, freq_event);
- } else if(!strcasecmp(value, "station_found")) {
- afb_req_unsubscribe(request, scan_event);
- } else {
- afb_req_fail(request, "failed", "Invalid event");
- return;
- }
- }
- afb_req_success(request, NULL, NULL);
-}
-
-static const struct afb_verb_desc_v1 verbs[]= {
- { "frequency", AFB_SESSION_CHECK, frequency, "Get/Set frequency" },
- { "band", AFB_SESSION_CHECK, band, "Get/Set band" },
- { "band_supported", AFB_SESSION_CHECK, band_supported, "Check band support" },
- { "frequency_range", AFB_SESSION_CHECK, frequency_range, "Get frequency range" },
- { "frequency_step", AFB_SESSION_CHECK, frequency_step, "Get frequency step" },
- { "start", AFB_SESSION_CHECK, start, "Start radio playback" },
- { "stop", AFB_SESSION_CHECK, stop, "Stop radio playback" },
- { "scan_start", AFB_SESSION_CHECK, scan_start, "Start station scan" },
- { "scan_stop", AFB_SESSION_CHECK, scan_stop, "Stop station scan" },
- { "stereo_mode", AFB_SESSION_CHECK, stereo_mode, "Get/Set stereo_mode" },
- { "subscribe", AFB_SESSION_CHECK, subscribe, "Subscribe for an event" },
- { "unsubscribe", AFB_SESSION_CHECK, unsubscribe, "Unsubscribe for an event" },
- { NULL }
-};
-
-static const struct afb_binding binding_desc = {
- .type = AFB_BINDING_VERSION_1,
- .v1 = {
- .info = "radio service",
- .prefix = "radio",
- .verbs = verbs
- }
-};
-
-const struct afb_binding *afbBindingV1Register (const struct afb_binding_interface *itf)
-{
- interface = itf;
-
- return &binding_desc;
-}
-
-int afbBindingV1ServiceInit(struct afb_service service)
-{
- int rc;
-
- freq_event = afb_daemon_make_event(interface->daemon, "frequency");
- scan_event = afb_daemon_make_event(interface->daemon, "station_found");
-
- rc = radio_impl_init();
- if(rc == 0) {
- radio_impl_set_frequency_callback(freq_callback, NULL);
- }
-
- return rc;
-}