summaryrefslogtreecommitdiffstats
path: root/ucs2-afb/ucs_binding.c
diff options
context:
space:
mode:
Diffstat (limited to 'ucs2-afb/ucs_binding.c')
-rw-r--r--ucs2-afb/ucs_binding.c34
1 files changed, 23 insertions, 11 deletions
diff --git a/ucs2-afb/ucs_binding.c b/ucs2-afb/ucs_binding.c
index e7a940b..b8a1ba8 100644
--- a/ucs2-afb/ucs_binding.c
+++ b/ucs2-afb/ucs_binding.c
@@ -61,6 +61,7 @@ typedef struct {
CdevData_t rx;
CdevData_t tx;
UCSI_Data_t ucsiData;
+ UcsXmlVal_t* ucsConfig;
} ucsContextT;
typedef struct {
@@ -68,7 +69,7 @@ typedef struct {
} EventData_t;
-static ucsContextT *ucsContextS;
+static ucsContextT *ucsContextS = NULL;
static EventData_t *eventData = NULL;
PUBLIC void UcsXml_CB_OnError(const char format[], uint16_t vargsCnt, ...) {
@@ -111,6 +112,7 @@ STATIC int onTimerCB (sd_event_source* source,uint64_t timer, void* pTag) {
void UCSI_CB_OnNetworkState(void *pTag, bool isAvailable, uint16_t packetBandwidth, uint8_t amountOfNodes)
{
+ AFB_NOTICE ("Network is available=%d, bw=%d, nodeCnt=%d", isAvailable, packetBandwidth, amountOfNodes);
}
/* UCS2 Interface Timer Callback */
@@ -138,8 +140,7 @@ void UCSI_CB_OnUserMessage(void *pTag, bool isError, const char format[],
va_start(argptr, vargsCnt);
vsprintf(outbuf, format, argptr);
va_end(argptr);
- if (isError)
- AFB_NOTICE ("%s",outbuf);
+ AFB_NOTICE ("%s",outbuf);
}
/** UCSI_Service cannot be called directly within UNICENS context, need to service stack through mainloop */
@@ -183,6 +184,14 @@ PUBLIC void UCSI_CB_OnTxRequest(void *pTag, const uint8_t *pData, uint32_t len)
}
}
+/** UcsXml_FreeVal be called directly within UNICENS context, need to service stack through mainloop */
+STATIC int OnStopCB (sd_event_source *source, uint64_t usec, void *pTag) {
+ if (NULL != ucsContextS && NULL != ucsContextS->ucsConfig) {
+ UcsXml_FreeVal(ucsContextS->ucsConfig);
+ ucsContextS->ucsConfig = NULL;
+ }
+}
+
/**
* \brief Callback when UNICENS instance has been stopped.
* \note This event can be used to free memory holding the resources
@@ -191,8 +200,9 @@ PUBLIC void UCSI_CB_OnTxRequest(void *pTag, const uint8_t *pData, uint32_t len)
* \param pTag - Pointer given by the integrator by UCSI_Init
*/
void UCSI_CB_OnStop(void *pTag) {
- AFB_NOTICE ("UNICENS stopped");
-
+ AFB_NOTICE ("UNICENS stopped");
+ /* push an asynchronous request for loopback to call UcsXml_FreeVal */
+ sd_event_add_time(afb_daemon_get_event_loop(), NULL, CLOCK_MONOTONIC, 0, 0, OnStopCB, pTag);
}
/** This callback will be raised, when ever an applicative message on the control channel arrived */
@@ -205,10 +215,12 @@ void UCSI_CB_OnAmsMessageReceived(void *pTag)
void UCSI_CB_OnRouteResult(void *pTag, uint16_t routeId, bool isActive, uint16_t connectionLabel)
{
+ AFB_NOTICE ("Route 0x%X is active=%d, connection label=0x%X", routeId, isActive, connectionLabel);
}
void UCSI_CB_OnGpioStateChange(void *pTag, uint16_t nodeAddress, uint8_t gpioPinId, bool isHighState)
{
+ AFB_NOTICE ("GPIO state of node 0x%X changed, pin=%d isHigh=%d", nodeAddress, gpioPinId, isHighState);
}
PUBLIC void UCSI_CB_OnMgrReport(void *pTag, Ucs_MgrReport_t code, uint16_t nodeAddress, Ucs_Rm_Node_t *pNode){
@@ -320,7 +332,7 @@ STATIC UcsXmlVal_t* ParseFile(const char *filename) {
ssize_t readSize;
int fdHandle ;
struct stat fdStat;
- UcsXmlVal_t* ucsConfig;
+ UcsXmlVal_t *ucsConfig = NULL;
fdHandle = open(filename, O_RDONLY);
if (fdHandle <= 0) {
@@ -345,6 +357,7 @@ STATIC UcsXmlVal_t* ParseFile(const char *filename) {
AFB_ERROR("File XML invalid: '%s'", filename);
goto OnErrorExit;
}
+ AFB_NOTICE ("Parsing result: %d Nodes, %d Scripts, Ethernet Bandwith %d bytes = %.2f MBit/s", ucsConfig->nodSize, ucsConfig->routesSize, ucsConfig->packetBw, (48 * 8 * ucsConfig->packetBw / 1000.0));
return (ucsConfig);
@@ -353,15 +366,14 @@ STATIC UcsXmlVal_t* ParseFile(const char *filename) {
}
PUBLIC int StartConfiguration(const char *filename) {
- static UcsXmlVal_t *ucsConfig;
- static ucsContextT ucsContext;
+ static ucsContextT ucsContext = { 0 };
sd_event_source *evtSource;
int err;
/* Read and parse XML file */
- ucsConfig = ParseFile(filename);
- if (NULL == ucsConfig) {
+ ucsContext.ucsConfig = ParseFile(filename);
+ if (NULL == ucsContext.ucsConfig) {
AFB_ERROR ("Cannot access or load file: '%s'", filename);
goto OnErrorExit;
}
@@ -388,7 +400,7 @@ PUBLIC int StartConfiguration(const char *filename) {
ucsContextS = &ucsContext;
}
/* Initialise UNICENS with parsed config */
- if (!UCSI_NewConfig(&ucsContext.ucsiData, ucsConfig)) {
+ if (!UCSI_NewConfig(&ucsContext.ucsiData, ucsContext.ucsConfig)) {
AFB_ERROR ("Fail to initialize UNICENS");
goto OnErrorExit;
}