aboutsummaryrefslogtreecommitdiffstats
path: root/binding
diff options
context:
space:
mode:
authorScott Murray <scott.murray@konsulko.com>2020-10-05 17:03:30 -0400
committerScott Murray <scott.murray@konsulko.com>2020-10-06 15:06:59 -0400
commit8958a8a3e98085c60c9cd803395be157e78e3565 (patch)
treeee39f007112c4b6fc08db737554989bed4f28c3a /binding
parentf00649ae4ab49f6f8faa26e7fdaae43615e3eb96 (diff)
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 <scott.murray@konsulko.com> Change-Id: I2adfc10448546264110f6d854f02d677087f1e47
Diffstat (limited to 'binding')
-rw-r--r--binding/radio-binding.c28
-rw-r--r--binding/radio_impl_null.c4
2 files changed, 26 insertions, 6 deletions
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)