From 082bd9694e23f891eddbb2516cee7e5fe0269400 Mon Sep 17 00:00:00 2001 From: Scott Murray Date: Mon, 5 Oct 2020 17:03:30 -0400 Subject: Fix frequency verb invalid frequency behavior The frequency verb was not checking if a frequency corresponds to the frequency band step the binding provides to users, add logic to do so and return an error if the frequency is invalid. While this is a change in behavior, it is believe it should not impact users, as the binding is intended to reflect user facing radio application usage. Additional tweaks: - fix error invalid frequency error message in reply JSON. - add the same band limit checks to the null implementation's frequency setting function that the other implementations do. - fix a couple of issues in README.md; the "rds" verb was missing, and the value key name for the "frequency" event was incorrect. Bug-AGL: SPEC-3620 Signed-off-by: Scott Murray Change-Id: I2adfc10448546264110f6d854f02d677087f1e47 (cherry picked from commit 8958a8a3e98085c60c9cd803395be157e78e3565) --- README.md | 3 ++- binding/radio-binding.c | 28 ++++++++++++++++++++++------ binding/radio_impl_null.c | 4 ++++ 3 files changed, 28 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index 2155649..90184b7 100644 --- a/README.md +++ b/README.md @@ -21,12 +21,13 @@ respective audio stream. | scan_start | start scanning for station | *Request:* {"direction": "forward" or "backward"} | | scan_stop | stop scanning for station | | | stereo_mode | get/set stereo or mono mode | *Request:* {"value": "stereo" or "mono"} | +| rds | get current RDS data | | ## Events ### frequency Event JSON Response -JSON response has a single field **frequency** which is the currently tuned frequency. +JSON response has a single field **value** which is the currently tuned frequency. ### station_found Event JSON Response diff --git a/binding/radio-binding.c b/binding/radio-binding.c index 34eb53e..45e8ecb 100644 --- a/binding/radio-binding.c +++ b/binding/radio-binding.c @@ -90,11 +90,26 @@ static void frequency(afb_req_t request) if(value) { char *p; + radio_band_t band; + uint32_t min_frequency; + uint32_t max_frequency; + uint32_t step; + frequency = (uint32_t) strtoul(value, &p, 10); if(frequency && *p == '\0') { + band = radio_impl_ops->get_band(); + min_frequency = radio_impl_ops->get_min_frequency(band); + max_frequency = radio_impl_ops->get_max_frequency(band); + step = radio_impl_ops->get_frequency_step(band); + if(frequency < min_frequency || + frequency > max_frequency || + (frequency - min_frequency) % step) { + afb_req_reply(request, NULL, "failed", "Invalid frequency"); + return; + } radio_impl_ops->set_frequency(frequency); } else { - afb_req_reply(request, NULL, "failed", "Invalid scan direction"); + afb_req_reply(request, NULL, "failed", "Invalid frequency"); return; } } @@ -104,11 +119,12 @@ static void frequency(afb_req_t request) afb_req_reply(request, ret_json, NULL, NULL); } -/* @brief Get RDS information -* -* @param afb_req_t : an afb request structure -* -*/ +/* + * @brief Get RDS information + * + * @param afb_req_t : an afb request structure + * + */ static void rds(afb_req_t request) { json_object *ret_json; diff --git a/binding/radio_impl_null.c b/binding/radio_impl_null.c index 8c28bca..a90835b 100644 --- a/binding/radio_impl_null.c +++ b/binding/radio_impl_null.c @@ -120,6 +120,10 @@ static uint32_t null_get_frequency(void) static void null_set_frequency(uint32_t frequency) { + if(frequency < known_fm_band_plans[bandplan].min || + frequency > known_fm_band_plans[bandplan].max) + return; + current_frequency = frequency; if(freq_callback) -- cgit 1.2.3-korg