aboutsummaryrefslogtreecommitdiffstats
path: root/ucs2-afb/ucs_binding.c
diff options
context:
space:
mode:
authortkummermehr <thorsten.kummermehr@k2l.de>2017-07-14 09:48:01 +0200
committerGitHub <noreply@github.com>2017-07-14 09:48:01 +0200
commitdbbd5b4964615a63205fb9433f827f67265541de (patch)
tree1c1318a7532c91532ea1a369e3ae3a74ceaa7f63 /ucs2-afb/ucs_binding.c
parentfe0ce6f9892d29da52a4ed5024ebe9d5964c0171 (diff)
parent2d039f447c2b91ae5e41406238eea3950436c714 (diff)
Merge branch 'master' into UCS_Interface_Cleanup
Diffstat (limited to 'ucs2-afb/ucs_binding.c')
-rw-r--r--ucs2-afb/ucs_binding.c105
1 files changed, 51 insertions, 54 deletions
diff --git a/ucs2-afb/ucs_binding.c b/ucs2-afb/ucs_binding.c
index 18b1aa5..fc8d613 100644
--- a/ucs2-afb/ucs_binding.c
+++ b/ucs2-afb/ucs_binding.c
@@ -21,8 +21,8 @@
#define _GNU_SOURCE
-#define BUFFER_FRAME_COUNT 10 // max frames in buffer
-#define WAIT_TIMER_US 1000000 // default waiting timer 1s
+#define BUFFER_FRAME_COUNT 10 /* max frames in buffer */
+#define WAIT_TIMER_US 1000000 /* default waiting timer 1s */
#include <systemd/sd-event.h>
#include <sys/types.h>
@@ -65,9 +65,9 @@ typedef struct {
static ucsContextT *ucsContextS;
PUBLIC void UcsXml_CB_OnError(const char format[], uint16_t vargsCnt, ...) {
- //DEBUG (afbIface, format, args);
+ /*DEBUG (afbIface, format, args); */
va_list args;
- va_start (args, format);
+ va_start (args, vargsCnt);
vfprintf (stderr, format, args);
va_end(args);
}
@@ -95,10 +95,10 @@ STATIC int onTimerCB (sd_event_source* source,uint64_t timer, void* pTag) {
return 0;
}
-// UCS2 Interface Timer Callback
+/* UCS2 Interface Timer Callback */
PUBLIC void UCSI_CB_OnSetServiceTimer(void *pTag, uint16_t timeout) {
uint64_t usec;
- // set a timer with 250ms accuracy
+ /* set a timer with 250ms accuracy */
sd_event_now(afb_daemon_get_event_loop(afbIface->daemon), CLOCK_BOOTTIME, &usec);
sd_event_add_time(afb_daemon_get_event_loop(afbIface->daemon), NULL, CLOCK_MONOTONIC, usec + (timeout*1000), 250, onTimerCB, pTag);
@@ -124,7 +124,7 @@ void UCSI_CB_OnUserMessage(void *pTag, bool isError, const char format[],
NOTICE (afbIface, outbuf);
}
-// UCSI_Service cannot be call directly within Unicens context, need to reset stack through mainloop
+/** UCSI_Service cannot be called directly within UNICENS context, need to service stack through mainloop */
STATIC int OnServiceRequiredCB (sd_event_source *source, uint64_t usec, void *pTag) {
ucsContextT *ucsContext = (ucsContextT*) pTag;
@@ -133,22 +133,19 @@ STATIC int OnServiceRequiredCB (sd_event_source *source, uint64_t usec, void *pT
return (0);
}
-// UCS Callback fire when ever pTag instance needs to be serviced
+/* UCS Callback fire when ever UNICENS needs to be serviced */
PUBLIC void UCSI_CB_OnServiceRequired(void *pTag) {
- // push an asynchronous request for loopback to call UCSI_Service
+ /* push an asynchronous request for loopback to call UCSI_Service */
sd_event_add_time(afb_daemon_get_event_loop(afbIface->daemon), NULL, CLOCK_MONOTONIC, 0, 0, OnServiceRequiredCB, pTag);
}
-// Callback when ever this instance wants to send a message to INIC.
-// BUGS?? Sample was returning true/false on error when integration layer expect a void [question from Fulup to Thorsten]
+/* Callback when ever this UNICENS wants to send a message to INIC. */
PUBLIC void UCSI_CB_OnTxRequest(void *pTag, const uint8_t *pData, uint32_t len) {
-
ucsContextT *ucsContext = (ucsContextT*) pTag;
CdevData_t *cdevTx = &ucsContext->tx;
uint32_t total = 0;
-
if (NULL == pData || 0 == len) return;
if (O_RDONLY == cdevTx->fileFlags) return;
@@ -161,24 +158,22 @@ PUBLIC void UCSI_CB_OnTxRequest(void *pTag, const uint8_t *pData, uint32_t len)
ssize_t written = write(cdevTx->fileHandle, &pData[total], (len - total));
if (0 >= written)
{
- cdevTx->fileHandle = -1;
- return;
+ /* Silently ignore write error (only occur in non-blocking mode) */
+ break;
}
total += (uint32_t) written;
}
-
- return;
}
/**
- * \brief Callback when Unicens instance has been stopped.
+ * \brief Callback when UNICENS instance has been stopped.
* \note This event can be used to free memory holding the resources
* passed with UCSI_NewConfig
* \note This function must be implemented by the integrator
* \param pTag - Pointer given by the integrator by UCSI_Init
*/
void UCSI_CB_OnStop(void *pTag) {
- NOTICE (afbIface, "Unicens stopped");
+ NOTICE (afbIface, "UNICENS stopped");
}
@@ -205,7 +200,7 @@ bool Cdev_Init(CdevData_t *d, const char *fileName, bool read, bool write)
else if (write)
d->fileFlags = O_WRONLY | O_NONBLOCK;
- // open file to enable event loop
+ /* open file to enable event loop */
d->fileHandle = open(d->fileName, d->fileFlags);
if (d->fileHandle <= 0) goto OnErrorExit;
@@ -224,7 +219,7 @@ static bool InitializeCdevs(ucsContextT *ucsContext)
return true;
}
-// Callback fire when something is avaliable on MOST cdev
+/* Callback fire when something is avaliable on MOST cdev */
int onReadCB (sd_event_source* src, int fileFd, uint32_t revents, void* pTag) {
ucsContextT *ucsContext =( ucsContextT*) pTag;
ssize_t len;
@@ -237,9 +232,9 @@ int onReadCB (sd_event_source* src, int fileFd, uint32_t revents, void* pTag) {
ok= UCSI_ProcessRxData(&ucsContext->ucsiData, pBuffer, (uint16_t)len);
if (!ok) {
DEBUG (afbIface, "Buffer overrun (not handle)");
- // Buffer overrun could replay pBuffer
+ /* Buffer overrun could replay pBuffer */
}
- return(0);
+ return 0;
}
STATIC UcsXmlVal_t* ParseFile(struct afb_req request) {
@@ -261,12 +256,12 @@ STATIC UcsXmlVal_t* ParseFile(struct afb_req request) {
goto OnErrorExit;
}
- // read file into buffer as a \0 terminated string
+ /* read file into buffer as a \0 terminated string */
fstat(fdHandle, &fdStat);
xmlBuffer = (char*)alloca(fdStat.st_size + 1);
readSize = read(fdHandle, xmlBuffer, fdStat.st_size);
close(fdHandle);
- xmlBuffer[readSize] = '\0'; //In any case, terminate it.
+ xmlBuffer[readSize] = '\0'; /* In any case, terminate it. */
if (readSize != fdStat.st_size) {
afb_req_fail_f (request, "fileread-fail", "File to read fullfile '%s' size(%d!=%d)", filename, readSize, fdStat.st_size);
@@ -294,7 +289,7 @@ STATIC int volOnSvcCB (sd_event_source* source,uint64_t timer, void* pTag) {
return 0;
}
-// This callback is fire each time an volume event wait in the queue
+/* This callback is fire each time an volume event wait in the queue */
void volumeCB (uint16_t timeout) {
uint64_t usec;
sd_event_now(afb_daemon_get_event_loop(afbIface->daemon), CLOCK_BOOTTIME, &usec);
@@ -363,10 +358,10 @@ STATIC int volSndCmd (struct afb_req request, struct json_object *commandJ, ucsC
}
- // Fulup what's append when channel or vol are invalid ???
+ /* Fulup what's append when channel or vol are invalid ??? */
err = UCSI_Vol_Set (&ucsContext->ucsiData, numid, (uint8_t) vol);
if (err) {
- // Fulup this might only be a warning (not sure about it)
+ /* Fulup this might only be a warning (not sure about it) */
afb_req_fail_f (request, "vol-refused","command=%s vol was refused by UNICENS", json_object_get_string (volJ));
goto OnErrorExit;
}
@@ -382,7 +377,7 @@ PUBLIC void ucs2SetVol (struct afb_req request) {
struct json_object *queryJ;
int err;
- // check UNICENS is initialised
+ /* check UNICENS is initialised */
if (!ucsContextS) {
afb_req_fail_f (request, "UNICENS-init","Should Load Config before using setvol");
goto OnErrorExit;
@@ -428,40 +423,42 @@ PUBLIC void ucs2Init (struct afb_req request) {
sd_event_source *evtSource;
int err;
- // Read and parse XML file
+ /* Read and parse XML file */
ucsConfig = ParseFile (request);
if (NULL == ucsConfig) goto OnErrorExit;
- // Fulup->Thorsten BUG InitializeCdevs should fail when control does not exit
- if (!InitializeCdevs(&ucsContext)) {
- afb_req_fail_f (request, "devnit-error", "Fail to initialise device [rx=%s tx=%s]", CONTROL_CDEV_RX, CONTROL_CDEV_TX);
- goto OnErrorExit;
- }
+ /* When ucsContextS is set, do not initalize UNICENS, CDEVs or system hooks, just load new XML */
+ if (!ucsContextS)
+ {
+ if (!ucsContextS && !InitializeCdevs(&ucsContext)) {
+ afb_req_fail_f (request, "devnit-error", "Fail to initialise device [rx=%s tx=%s]", CONTROL_CDEV_RX, CONTROL_CDEV_TX);
+ goto OnErrorExit;
+ }
- // Initialise Unicens Config Data Structure
- UCSI_Init(&ucsContext.ucsiData, &ucsContext);
+ /* Initialise UNICENS Config Data Structure */
+ UCSI_Init(&ucsContext.ucsiData, &ucsContext);
- // Initialise Unicens with parsed config
- if (!UCSI_NewConfig(&ucsContext.ucsiData, ucsConfig)) {
- afb_req_fail_f (request, "UNICENS-init", "Fail to initialize Unicens");
- goto OnErrorExit;
- }
+ /* register aplayHandle file fd into binder mainloop */
+ err = sd_event_add_io(afb_daemon_get_event_loop(afbIface->daemon), &evtSource, ucsContext.rx.fileHandle, EPOLLIN, onReadCB, &ucsContext);
+ if (err < 0) {
+ afb_req_fail_f (request, "register-mainloop", "Cannot hook events to mainloop");
+ goto OnErrorExit;
+ }
- // register aplayHandle file fd into binder mainloop
- err = sd_event_add_io(afb_daemon_get_event_loop(afbIface->daemon), &evtSource, ucsContext.rx.fileHandle, EPOLLIN, onReadCB, &ucsContext);
- if (err < 0) {
- afb_req_fail_f (request, "register-mainloop", "Cannot hook events to mainloop");
- goto OnErrorExit;
+ /* init UNICENS Volume Library */
+ ucsContext.channels = UCSI_Vol_Init (&ucsContext.ucsiData, volumeCB);
+ if (!ucsContext.channels) {
+ afb_req_fail_f (request, "register-volume", "Could not enqueue new Unicens config");
+ goto OnErrorExit;
+ }
+ /* save this in a statical variable until ucs2vol move to C */
+ ucsContextS = &ucsContext;
}
-
- // init Unicens Volume Library
- ucsContext.channels = UCSI_Vol_Init (&ucsContext.ucsiData, volumeCB);
- if (!ucsContext.channels) {
- afb_req_fail_f (request, "register-volume", "Could not enqueue new Unicens config");
+ /* Initialise UNICENS with parsed config */
+ if (!UCSI_NewConfig(&ucsContext.ucsiData, ucsConfig)) {
+ afb_req_fail_f (request, "UNICENS-init", "Fail to initialize UNICENS");
goto OnErrorExit;
}
- // save this in a statical variable until ucs2vol move to C
- ucsContextS = &ucsContext;
afb_req_success(request,NULL,"UNICENS-active");