Radio plugin: make partially compatible with new API
authorManuel Bachmann <manuel.bachmann@iot.bzh>
Wed, 6 Apr 2016 16:02:43 +0000 (18:02 +0200)
committerManuel Bachmann <manuel.bachmann@iot.bzh>
Wed, 6 Apr 2016 16:02:43 +0000 (18:02 +0200)
Signed-off-by: Manuel Bachmann <manuel.bachmann@iot.bzh>
plugins/radio/radio-api.c
plugins/radio/radio-api.h
plugins/radio/radio-rtlsdr.c
plugins/radio/radio-rtlsdr.h

index c6e4b90..b64d083 100644 (file)
  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
  */
 
+#define _GNU_SOURCE
+#include <strings.h>
+
 #include "radio-api.h"
+#include "radio-rtlsdr.h"
+
+#include "afb-plugin.h"
+#include "afb-req-itf.h"
 
 /* ********************************************************
 
@@ -60,7 +67,7 @@ STATIC radioCtxHandleT* initRadioCtx () {
 
     ctx = malloc (sizeof(radioCtxHandleT));
     ctx->radio = NULL;
-    ctx->idx = -1;
+    //ctx->idx = -1;
     ctx->mode = FM;
     ctx->freq = 100.0;
     ctx->mute = 0;
@@ -71,7 +78,7 @@ STATIC radioCtxHandleT* initRadioCtx () {
 
 /* reserve a radio device for requesting client, power it on */
 STATIC AFB_error reserveRadio (pluginHandleT *handle, radioCtxHandleT *ctx) {
-    int idx;
+    unsigned int idx;
 
     /* loop on all devices, find an unused one */
     for (idx = 0; idx < _radio_dev_count(); idx++) {
@@ -112,7 +119,7 @@ STATIC AFB_error releaseRadio (pluginHandleT *handle, radioCtxHandleT *ctx) {
 
     /* clean client context */
     ctx->radio = NULL;
-    ctx->idx = -1;
+    //ctx->idx = -1;
 
     return AFB_SUCCESS;
 }
@@ -127,24 +134,24 @@ STATIC void freeRadio (void *context) {
 
 /* ------ PUBLIC PLUGIN FUNCTIONS --------- */
 
-STATIC json_object* init (AFB_request *request) {        /* AFB_SESSION_CHECK */
+STATIC void init (struct afb_req request) {        /* AFB_SESSION_CHECK */
 
     json_object *jresp;
 
     /* create a private client context */
-    if (!request->context)
-        request->context = initRadioCtx();
+    if (!request.context)
+        request.context = initRadioCtx();
 
     jresp = json_object_new_object();
     json_object_object_add(jresp, "info", json_object_new_string ("Radio initialized"));
-    return jresp;
+    afb_req_success (request, jresp, "Radio - Initialized");
 }
 
-STATIC json_object* power (AFB_request *request) {       /* AFB_SESSION_CHECK */
+STATIC void power (struct afb_req request) {       /* AFB_SESSION_CHECK */
 
     pluginHandleT *handle = the_radio;
-    radioCtxHandleT *ctx = (radioCtxHandleT*)request->context;
-    const char *value = getQueryValue (request, "value");
+    radioCtxHandleT *ctx = (radioCtxHandleT*)request.context;
+    const char *value = afb_req_argument (request, "value");
     json_object *jresp;
 
     /* no "?value=" parameter : return current state */
@@ -159,8 +166,9 @@ STATIC json_object* power (AFB_request *request) {       /* AFB_SESSION_CHECK */
     else if ( atoi(value) == 1 || !strcasecmp(value, "true") ) {
         if (!ctx->radio) {
             if (reserveRadio (handle, ctx) == AFB_FAIL) {
-                request->errcode = MHD_HTTP_SERVICE_UNAVAILABLE;
-                return (jsonNewMessage (AFB_FAIL, "No more radio devices available"));
+                //request->errcode = MHD_HTTP_SERVICE_UNAVAILABLE;
+                afb_req_fail (request, "failed", "No more radio devices available");
+               return;
             }
         }
         jresp = json_object_new_object();
@@ -171,8 +179,9 @@ STATIC json_object* power (AFB_request *request) {       /* AFB_SESSION_CHECK */
     else if ( atoi(value) == 0 || !strcasecmp(value, "false") ) {
         if (ctx->radio) {
             if (releaseRadio (handle, ctx) == AFB_FAIL) {
-                request->errcode = MHD_HTTP_SERVICE_UNAVAILABLE;
-                return (jsonNewMessage (AFB_FAIL, "Unable to release radio device"));
+                //request->errcode = MHD_HTTP_SERVICE_UNAVAILABLE;
+                afb_req_fail (request, "failed", "Unable to release radio device");
+               return;
             }
         }
         jresp = json_object_new_object();
@@ -181,13 +190,13 @@ STATIC json_object* power (AFB_request *request) {       /* AFB_SESSION_CHECK */
     else
         jresp = NULL;
 
-    return jresp;
+    afb_req_success (request, jresp, "Radio - Power set");
 }
 
-STATIC json_object* mode (AFB_request *request) {        /* AFB_SESSION_CHECK */
+STATIC void mode (struct afb_req request) {        /* AFB_SESSION_CHECK */
 
-    radioCtxHandleT *ctx = (radioCtxHandleT*)request->context;
-    const char *value = getQueryValue (request, "value");
+    radioCtxHandleT *ctx = (radioCtxHandleT*)request.context;
+    const char *value = afb_req_argument (request, "value");
     json_object *jresp = json_object_new_object();
 
     /* no "?value=" parameter : return current state */
@@ -210,14 +219,14 @@ STATIC json_object* mode (AFB_request *request) {        /* AFB_SESSION_CHECK */
         _radio_set_mode (ctx->idx, ctx->mode);
         json_object_object_add (jresp, "mode", json_object_new_string ("FM"));
     }
-    
-    return jresp;
+
+    afb_req_success (request, jresp, "Radio - Mode set");
 }
 
-STATIC json_object* freq (AFB_request *request) {        /* AFB_SESSION_CHECK */
+STATIC void freq (struct afb_req request) {        /* AFB_SESSION_CHECK */
 
-    radioCtxHandleT *ctx = (radioCtxHandleT*)request->context;
-    const char *value = getQueryValue (request, "value");
+    radioCtxHandleT *ctx = (radioCtxHandleT*)request.context;
+    const char *value = afb_req_argument (request, "value");
     json_object *jresp = json_object_new_object();
     double freq;
     char freq_str[256];
@@ -237,16 +246,16 @@ STATIC json_object* freq (AFB_request *request) {        /* AFB_SESSION_CHECK */
         snprintf (freq_str, sizeof(freq_str), "%f", ctx->freq);
         json_object_object_add (jresp, "freq", json_object_new_string (freq_str));
     }
-    
-    return jresp;
+
+    afb_req_success (request, jresp, "Radio - Frequency Set");
 }
 
-STATIC json_object* mute (AFB_request *request) {        /* AFB_SESSION_CHECK */
+STATIC void mute (struct afb_req request) {        /* AFB_SESSION_CHECK */
 
-    radioCtxHandleT *ctx = (radioCtxHandleT*)request->context;
-    const char *value = getQueryValue (request, "value");
+    radioCtxHandleT *ctx = (radioCtxHandleT*)request.context;
+    const char *value = afb_req_argument (request, "value");
     json_object *jresp = json_object_new_object();
-    char *mute_str;
+    //char *mute_str;
 
     /* no "?value=" parameter : return current state */
     if (!value || !ctx->radio) {
@@ -268,14 +277,14 @@ STATIC json_object* mute (AFB_request *request) {        /* AFB_SESSION_CHECK */
         _radio_set_mute (ctx->idx, ctx->mute);
         json_object_object_add (jresp, "mute", json_object_new_string ("off"));
     }
-    
-    return jresp;
+
+    afb_req_success (request, jresp, "Radio - Mute set"); 
 }
 
-STATIC json_object* play (AFB_request *request) {        /* AFB_SESSION_CHECK */
+STATIC void play (struct afb_req request) {        /* AFB_SESSION_CHECK */
 
-    radioCtxHandleT *ctx = (radioCtxHandleT*)request->context;
-    const char *value = getQueryValue (request, "value");
+    radioCtxHandleT *ctx = (radioCtxHandleT*)request.context;
+    const char *value = afb_req_argument (request, "value");
     json_object *jresp = json_object_new_object();
     
     /* no "?value=" parameter : return current state */
@@ -301,34 +310,30 @@ STATIC json_object* play (AFB_request *request) {        /* AFB_SESSION_CHECK */
         json_object_object_add (jresp, "play", json_object_new_string ("off"));
     }
 
-    return jresp;
+    afb_req_success (request, jresp, "Radio - Play succeeded");
 }
 
-STATIC json_object* ping (AFB_request *request) {         /* AFB_SESSION_NONE */
-    return jsonNewMessage(AFB_SUCCESS, "Ping Binder Daemon - Radio API");
+STATIC void ping (struct afb_req request) {         /* AFB_SESSION_NONE */
+    afb_req_success (request, NULL, "Radio - Ping succeeded");
 }
 
 
-STATIC AFB_restapi pluginApis[]= {
-  {"init"   , AFB_SESSION_CHECK,  (AFB_apiCB)init       , "Radio API - init"},
-  {"power"  , AFB_SESSION_CHECK,  (AFB_apiCB)power      , "Radio API - power"},
-  {"mode"   , AFB_SESSION_CHECK,  (AFB_apiCB)mode       , "Radio API - mode"},
-  {"freq"   , AFB_SESSION_CHECK,  (AFB_apiCB)freq       , "Radio API - freq"},
-  {"mute"   , AFB_SESSION_CHECK,  (AFB_apiCB)mute       , "Radio API - mute"},
-  {"play"   , AFB_SESSION_CHECK,  (AFB_apiCB)play       , "Radio API - play"},
-  {"ping"   , AFB_SESSION_NONE,   (AFB_apiCB)ping       , "Radio API - ping"},
+STATIC const struct AFB_restapi pluginApis[]= {
+  {"init"   , AFB_SESSION_CHECK,  init       , "Radio API - init"},
+  {"power"  , AFB_SESSION_CHECK,  power      , "Radio API - power"},
+  {"mode"   , AFB_SESSION_CHECK,  mode       , "Radio API - mode"},
+  {"freq"   , AFB_SESSION_CHECK,  freq       , "Radio API - freq"},
+  {"mute"   , AFB_SESSION_CHECK,  mute       , "Radio API - mute"},
+  {"play"   , AFB_SESSION_CHECK,  play       , "Radio API - play"},
+  {"ping"   , AFB_SESSION_NONE,   ping       , "Radio API - ping"},
   {NULL}
 };
 
-PUBLIC AFB_plugin* pluginRegister () {
-    AFB_plugin *plugin = malloc (sizeof(AFB_plugin));
-    plugin->type  = AFB_PLUGIN_JSON;
-    plugin->info  = "Application Framework Binder - Radio plugin";
-    plugin->prefix  = "radio";
-    plugin->apis  = pluginApis;
-
-    plugin->freeCtxCB = (AFB_freeCtxCB)freeRadio;
-
-    the_radio = initRadioPlugin();
-    return plugin;
+STATIC const struct AFB_plugin plug_desc = {
+    .type  = AFB_PLUGIN_JSON,
+    .info  = "Application Framework Binder - Radio plugin",
+    .prefix  = "radio",
+    .apis  = pluginApis,
+    //plugin->freeCtxCB = (AFB_freeCtxCB)freeRadio;
+    //the_radio = initRadioPlugin();
 };
index 4ea41b1..f126fc0 100644 (file)
 #ifndef RADIO_API_H
 #define RADIO_API_H
 
-#include "radio-rtlsdr.h"
-
 /* -------------- PLUGIN DEFINITIONS ----------------- */
 
 #define MAX_RADIO 10
+typedef enum { FM, AM } Mode;
 
 /* structure holding one radio device with current usage status */
 typedef struct {
@@ -35,13 +34,13 @@ typedef struct {
 /* global plugin handle, should store everything we may need */
 typedef struct {
   radioDevT *radios[MAX_RADIO];  // pointer to existing radio
-  int devCount;
+  unsigned int devCount;
 } pluginHandleT;
 
 /* private client context [will be destroyed when client leaves] */
 typedef struct {
     radioDevT *radio;         /* pointer to client radio            */
-    int idx;                  /* radio index within global array    */
+    unsigned int idx;         /* radio index within global array    */
     Mode mode;                /* radio mode: AM/FM                  */
     float freq;               /* radio frequency (Mhz)              */
     unsigned char mute;       /* radio muted: 0(false)/1(true)      */
index b99cf9b..7d7e498 100644 (file)
  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
  */
 
+#include <stdio.h>
+#include <string.h>
+
 #include "radio-api.h"
+#include "radio-rtlsdr.h"
 
 /* ------------- RADIO RTLSDR IMPLEMENTATION ---------------- */
 
index b0c22de..056828b 100644 (file)
 #include <pthread.h>
 #include <rtl-sdr.h>
 
+#include "radio-api.h"
 #include "local-def.h"
 
 #define pthread_signal(n, m) pthread_mutex_lock(m); pthread_cond_signal(n); pthread_mutex_unlock(m)
 #define pthread_wait(n, m) pthread_mutex_lock(m); pthread_cond_wait(n, m); pthread_mutex_unlock(m)
 #define BUF_LEN 16*16384
 
-typedef enum { FM, AM } Mode;
 typedef struct dongle_ctx dongle_ctx;
 typedef struct demod_ctx demod_ctx;
 typedef struct output_ctx output_ctx;
@@ -84,6 +84,14 @@ struct dev_ctx {
 PUBLIC unsigned int _radio_dev_count (void);
 PUBLIC const char* _radio_dev_name (unsigned int);
 
+PUBLIC unsigned char _radio_on (unsigned int, radioCtxHandleT *);
+PUBLIC void _radio_off (unsigned int);
+PUBLIC void _radio_stop (unsigned int);
+PUBLIC void _radio_play (unsigned int);
+PUBLIC void _radio_set_mode (unsigned int, Mode);
+PUBLIC void _radio_set_freq (unsigned int, double);
+PUBLIC void _radio_set_mute (unsigned int, unsigned char);
+
 STATIC void* _dongle_thread_fn (void *);
 STATIC void* _demod_thread_fn (void *);
 STATIC void* _output_thread_fn (void *);