BigW Consortium Gitlab

Unverified Commit e5b44666 by ashsyal Committed by GitHub

Merge pull request #27 from dpfrey/simplified_yellow_actuators

simplify implementation of YellowOnBoardActuators
parents 8077ab3d 2f05e797
...@@ -4,19 +4,14 @@ version: 0.1 ...@@ -4,19 +4,14 @@ version: 0.1
executables: executables:
{ {
actuatorYellow = ( actuatorYellow = ( components/yellowActuators )
components/led/generic
components/led/triRed
components/led/triGreen
components/led/triBlue
)
} }
processes: processes:
{ {
run: run:
{ {
( actuatorYellow ) ( actuatorYellow )
} }
envVars: envVars:
...@@ -26,11 +21,7 @@ processes: ...@@ -26,11 +21,7 @@ processes:
faultAction: stopApp faultAction: stopApp
} }
bindings: bindings:
{ {
actuatorYellow.generic.dhubIO -> dataHub.io actuatorYellow.outputActuator.dhub -> dataHub.io
actuatorYellow.triRed.dhubIO -> dataHub.io
actuatorYellow.triGreen.dhubIO -> dataHub.io
actuatorYellow.triBlue.dhubIO -> dataHub.io
} }
/**
*
* This file provides the implementation of @ref c_led
*
*
* <hr>
*
* Copyright (C) Sierra Wireless Inc.
*/
#include "legato.h"
#include "interfaces.h"
#ifndef ARRAY_SIZE
#define ARRAY_SIZE(array) ((unsigned long) (sizeof (array) / sizeof ((array)[0])))
#endif
#define RES_PATH_GENERIC_LED "generic_led"
#define RES_PATH_GENERIC_VALUE "generic_led/value"
static const char GenericLedPath[] = "/sys/devices/platform/expander.0/generic_led";
typedef struct
{
const char *path;
dhubIO_DataType_t dataType;
const char *units;
dhubIO_BooleanPushHandlerRef_t ref;
}
actuator_DhOut_t;
static actuator_DhOut_t dhubResources[] = {
{RES_PATH_GENERIC_LED, DHUBIO_DATA_TYPE_BOOLEAN, "", NULL },
};
static void actuator_DhOutputHandler
(
double timestamp,
bool value,
void *context
)
{
const char *writeData = value ? "1" : "0";
FILE *ledFile = fopen(GenericLedPath, "r+");
if (ledFile == NULL)
{
LE_ERROR("Open LED device file('%s') failed(%d)", GenericLedPath, errno);
return;
}
LE_DEBUG("Turn %s LED", value ? "on" : "off");
if (fwrite(writeData, sizeof(writeData), 1, ledFile) != 1)
{
LE_ERROR("Write LED device file('%s') failed", GenericLedPath);
}
dhubIO_PushBoolean(RES_PATH_GENERIC_VALUE, DHUBIO_NOW, value);
dhubIO_MarkOptional(RES_PATH_GENERIC_LED);
fclose(ledFile);
}
static le_result_t actuator_DhRegister
(
void
)
{
le_result_t result = LE_OK;
for (int i = 0; i < ARRAY_SIZE(dhubResources); i++)
{
result = dhubIO_CreateOutput(dhubResources[i].path,
dhubResources[i].dataType,
dhubResources[i].units);
if (LE_OK != result)
{
LE_ERROR("Failed to create output resource %s", dhubResources[i].path);
break;
}
LE_ASSERT(LE_OK == dhubIO_CreateInput(RES_PATH_GENERIC_VALUE, DHUBIO_DATA_TYPE_BOOLEAN, ""));
dhubResources[i].ref = dhubIO_AddBooleanPushHandler(dhubResources[i].path, actuator_DhOutputHandler,
NULL );
if (NULL == dhubResources[i].ref)
{
LE_ERROR("Failed to add handler for output resource %s", dhubResources[i].path);
result = LE_FAULT;
break;
}
}
return result;
}
//--------------------------------------------------------------------------------------------------
/**
* SIGTERM handler to cleanly shutdown
*/
//--------------------------------------------------------------------------------------------------
static void actuator_SigTermHandler
(
int pSigNum
)
{
(void)pSigNum;
LE_INFO("Remove LED resource");
dhubIO_DeleteResource(GenericLedPath);
}
//--------------------------------------------------------------------------------------------------
/**
* Main program
*/
//--------------------------------------------------------------------------------------------------
COMPONENT_INIT
{
///< Catch application termination and shutdown cleanly
le_sig_Block(SIGTERM);
le_sig_SetEventHandler(SIGTERM, actuator_SigTermHandler);
LE_ASSERT(LE_OK == actuator_DhRegister());
}
/**
*
* This file provides the implementation of @ref c_led
*
*
* <hr>
*
* Copyright (C) Sierra Wireless Inc.
*/
#include "legato.h"
#include "interfaces.h"
#ifndef ARRAY_SIZE
#define ARRAY_SIZE(array) ((unsigned long) (sizeof (array) / sizeof ((array)[0])))
#endif
#define RES_PATH_TRI_BLUE_LED "tri_led_blue"
#define RES_PATH_BLUE_VALUE "tri_led_blue/value"
static const char TriBlueLedPath[] = "/sys/devices/platform/expander.0/tri_led_blu";
typedef struct
{
const char *path;
dhubIO_DataType_t dataType;
const char *units;
dhubIO_BooleanPushHandlerRef_t ref;
}
actuator_DhOut_t;
static actuator_DhOut_t dhubResources[] = {
{RES_PATH_TRI_BLUE_LED, DHUBIO_DATA_TYPE_BOOLEAN, "", NULL },
};
static void actuator_DhOutputHandler
(
double timestamp,
bool value,
void *context
)
{
const char *writeData = value ? "1" : "0";
FILE *ledFile = fopen(TriBlueLedPath, "r+");
if (ledFile == NULL)
{
LE_ERROR("Open LED device file('%s') failed(%d)", TriBlueLedPath, errno);
return;
}
LE_DEBUG("Turn %s LED", value ? "on" : "off");
if (fwrite(writeData, sizeof(writeData), 1, ledFile) != 1)
{
LE_ERROR("Write LED device file('%s') failed", TriBlueLedPath);
}
dhubIO_PushBoolean(RES_PATH_BLUE_VALUE, DHUBIO_NOW, value);
dhubIO_MarkOptional(RES_PATH_TRI_BLUE_LED);
dhubIO_SetBooleanDefault(RES_PATH_TRI_BLUE_LED,false);
fclose(ledFile);
}
static le_result_t actuator_DhRegister
(
void
)
{
le_result_t result = LE_OK;
for (int i = 0; i < ARRAY_SIZE(dhubResources); i++)
{
result = dhubIO_CreateOutput(dhubResources[i].path,
dhubResources[i].dataType,
dhubResources[i].units);
if (LE_OK != result)
{
LE_ERROR("Failed to create output resource %s", dhubResources[i].path);
break;
}
/* LE_ASSERT(LE_OK == dhubIO_CreateInput(dhubResources[i].value, DHUBIO_DATA_TYPE_BOOLEAN, ""));
dhubResources[i].ref = dhubIO_AddBooleanPushHandler(dhubResources[i].path,
actuator_DhOutputHandler,
(void *) &dhubResources[i].gpio_path);
*/
LE_ASSERT(LE_OK == dhubIO_CreateInput(RES_PATH_BLUE_VALUE, DHUBIO_DATA_TYPE_BOOLEAN, ""));
dhubResources[i].ref = dhubIO_AddBooleanPushHandler(dhubResources[i].path, actuator_DhOutputHandler,
NULL );
if (NULL == dhubResources[i].ref)
{
LE_ERROR("Failed to add handler for output resource %s", dhubResources[i].path);
result = LE_FAULT;
break;
}
}
return result;
}
//--------------------------------------------------------------------------------------------------
/**
* SIGTERM handler to cleanly shutdown
*/
//--------------------------------------------------------------------------------------------------
static void actuator_SigTermHandler
(
int pSigNum
)
{
(void)pSigNum;
LE_INFO("Remove LED resource");
dhubIO_DeleteResource(TriBlueLedPath);
}
//--------------------------------------------------------------------------------------------------
/**
* Main program
*/
//--------------------------------------------------------------------------------------------------
COMPONENT_INIT
{
///< Catch application termination and shutdown cleanly
le_sig_Block(SIGTERM);
le_sig_SetEventHandler(SIGTERM, actuator_SigTermHandler);
LE_ASSERT(LE_OK == actuator_DhRegister());
}
//--------------------------------------------------------------------------------------------------
/**
* Component definition file for the mangOH Yellow on board actuator component.
*/
//--------------------------------------------------------------------------------------------------
cflags:
{
-std=c99
-DMANGOH_BOARD=YELLOW
}
requires:
{
api:
{
dhubIO = io.api
}
file:
{
/sys/devices/platform/expander.0/tri_led_grn /sys/devices/platform/expander.0/tri_led_grn
}
}
sources:
{
tri_led_green.c
}
/**
*
* This file provides the implementation of @ref c_led
*
*
* <hr>
*
* Copyright (C) Sierra Wireless Inc.
*/
#include "legato.h"
#include "interfaces.h"
#ifndef ARRAY_SIZE
#define ARRAY_SIZE(array) ((unsigned long) (sizeof (array) / sizeof ((array)[0])))
#endif
#define RES_PATH_TRI_GREEN_LED "tri_led_green"
#define RES_PATH_GREEN_VALUE "tri_led_green/value"
static const char TriGreenLedPath[] = "/sys/devices/platform/expander.0/tri_led_grn";
typedef struct
{
const char *path;
dhubIO_DataType_t dataType;
const char *units;
dhubIO_BooleanPushHandlerRef_t ref;
}
actuator_DhOut_t;
static actuator_DhOut_t dhubResources[] = {
{RES_PATH_TRI_GREEN_LED, DHUBIO_DATA_TYPE_BOOLEAN, "", NULL },
};
static void actuator_DhOutputHandler
(
double timestamp,
bool value,
void *context
)
{
const char *writeData = value ? "1" : "0";
FILE *ledFile = fopen(TriGreenLedPath, "r+");
if (ledFile == NULL)
{
LE_ERROR("Open LED device file('%s') failed(%d)", TriGreenLedPath, errno);
return;
}
LE_DEBUG("Turn %s LED", value ? "on" : "off");
if (fwrite(writeData, sizeof(writeData), 1, ledFile) != 1)
{
LE_ERROR("Write LED device file('%s') failed", TriGreenLedPath);
}
dhubIO_PushBoolean(RES_PATH_GREEN_VALUE, DHUBIO_NOW, value);
dhubIO_MarkOptional(RES_PATH_TRI_GREEN_LED);
dhubIO_SetBooleanDefault(RES_PATH_TRI_GREEN_LED,false);
fclose(ledFile);
}
static le_result_t actuator_DhRegister
(
void
)
{
le_result_t result = LE_OK;
for (int i = 0; i < ARRAY_SIZE(dhubResources); i++)
{
result = dhubIO_CreateOutput(dhubResources[i].path,
dhubResources[i].dataType,
dhubResources[i].units);
if (LE_OK != result)
{
LE_ERROR("Failed to create output resource %s", dhubResources[i].path);
break;
}
/* LE_ASSERT(LE_OK == dhubIO_CreateInput(dhubResources[i].value, DHUBIO_DATA_TYPE_BOOLEAN, ""));
dhubResources[i].ref = dhubIO_AddBooleanPushHandler(dhubResources[i].path,
actuator_DhOutputHandler,
(void *) &dhubResources[i].gpio_path);
*/
LE_ASSERT(LE_OK == dhubIO_CreateInput(RES_PATH_GREEN_VALUE, DHUBIO_DATA_TYPE_BOOLEAN, ""));
dhubResources[i].ref = dhubIO_AddBooleanPushHandler(dhubResources[i].path, actuator_DhOutputHandler,
NULL );
if (NULL == dhubResources[i].ref)
{
LE_ERROR("Failed to add handler for output resource %s", dhubResources[i].path);
result = LE_FAULT;
break;
}
}
return result;
}
//--------------------------------------------------------------------------------------------------
/**
* SIGTERM handler to cleanly shutdown
*/
//--------------------------------------------------------------------------------------------------
static void actuator_SigTermHandler
(
int pSigNum
)
{
(void)pSigNum;
LE_INFO("Remove LED resource");
dhubIO_DeleteResource(TriGreenLedPath);
}
//--------------------------------------------------------------------------------------------------
/**
* Main program
*/
//--------------------------------------------------------------------------------------------------
COMPONENT_INIT
{
///< Catch application termination and shutdown cleanly
le_sig_Block(SIGTERM);
le_sig_SetEventHandler(SIGTERM, actuator_SigTermHandler);
LE_ASSERT(LE_OK == actuator_DhRegister());
}
//--------------------------------------------------------------------------------------------------
/**
* Component definition file for the mangOH Yellow on board actuator component.
*/
//--------------------------------------------------------------------------------------------------
cflags:
{
-std=c99
-DMANGOH_BOARD=YELLOW
}
requires:
{
api:
{
dhubIO = io.api
}
file:
{
/sys/devices/platform/expander.0/tri_led_red /sys/devices/platform/expander.0/tri_led_red
}
}
sources:
{
tri_led_red.c
}
/**
*
* This file provides the implementation of @ref c_led
*
*
* <hr>
*
* Copyright (C) Sierra Wireless Inc.
*/
#include "legato.h"
#include "interfaces.h"
#ifndef ARRAY_SIZE
#define ARRAY_SIZE(array) ((unsigned long) (sizeof (array) / sizeof ((array)[0])))
#endif
#define RES_PATH_TRI_RED_LED "tri_led_red"
#define RES_PATH_RED_VALUE "tri_led_red/value"
static const char TriRedLedPath[] = "/sys/devices/platform/expander.0/tri_led_red";
typedef struct
{
const char *path;
dhubIO_DataType_t dataType;
const char *units;
dhubIO_BooleanPushHandlerRef_t ref;
}
actuator_DhOut_t;
static actuator_DhOut_t dhubResources[] = {
{RES_PATH_TRI_RED_LED, DHUBIO_DATA_TYPE_BOOLEAN, "", NULL },
};
static void actuator_DhOutputHandler
(
double timestamp,
bool value,
void *context
)
{
const char *writeData = value ? "1" : "0";
FILE *ledFile = fopen(TriRedLedPath, "r+");
if (ledFile == NULL)
{
LE_ERROR("Open LED device file('%s') failed(%d)", TriRedLedPath, errno);
return;
}
LE_DEBUG("Turn %s LED", value ? "on" : "off");
if (fwrite(writeData, sizeof(writeData), 1, ledFile) != 1)
{
LE_ERROR("Write LED device file('%s') failed", TriRedLedPath);
}
dhubIO_PushBoolean(RES_PATH_RED_VALUE, DHUBIO_NOW, value);
dhubIO_MarkOptional(RES_PATH_TRI_RED_LED);
dhubIO_SetBooleanDefault(RES_PATH_TRI_RED_LED,true);
fclose(ledFile);
}
static le_result_t actuator_DhRegister
(
void
)
{
le_result_t result = LE_OK;
for (int i = 0; i < ARRAY_SIZE(dhubResources); i++)
{
result = dhubIO_CreateOutput(dhubResources[i].path,
dhubResources[i].dataType,
dhubResources[i].units);
if (LE_OK != result)
{
LE_ERROR("Failed to create output resource %s", dhubResources[i].path);
break;
}
/* LE_ASSERT(LE_OK == dhubIO_CreateInput(dhubResources[i].value, DHUBIO_DATA_TYPE_BOOLEAN, ""));
dhubResources[i].ref = dhubIO_AddBooleanPushHandler(dhubResources[i].path,
actuator_DhOutputHandler,
(void *) &dhubResources[i].gpio_path);
*/
LE_ASSERT(LE_OK == dhubIO_CreateInput(RES_PATH_RED_VALUE, DHUBIO_DATA_TYPE_BOOLEAN, ""));
dhubResources[i].ref = dhubIO_AddBooleanPushHandler(dhubResources[i].path, actuator_DhOutputHandler,
NULL );
if (NULL == dhubResources[i].ref)
{
LE_ERROR("Failed to add handler for output resource %s", dhubResources[i].path);
result = LE_FAULT;
break;
}
}
return result;
}
//--------------------------------------------------------------------------------------------------
/**
* SIGTERM handler to cleanly shutdown
*/
//--------------------------------------------------------------------------------------------------
static void actuator_SigTermHandler
(
int pSigNum
)
{
(void)pSigNum;
LE_INFO("Remove LED resource");
dhubIO_DeleteResource(TriRedLedPath);
}
//--------------------------------------------------------------------------------------------------
/**
* Main program
*/
//--------------------------------------------------------------------------------------------------
COMPONENT_INIT
{
///< Catch application termination and shutdown cleanly
le_sig_Block(SIGTERM);
le_sig_SetEventHandler(SIGTERM, actuator_SigTermHandler);
LE_ASSERT(LE_OK == actuator_DhRegister());
}
//--------------------------------------------------------------------------------------------------
/**
* Component definition file for the mangOH Yellow on board actuator component.
*/
//--------------------------------------------------------------------------------------------------
cflags: cflags:
{ {
-std=c99 -std=c99
-DMANGOH_BOARD=YELLOW
} }
requires: requires:
{ {
api: api:
{ {
dhub = io.api
dhubIO = io.api
} }
}
file: provides:
{ {
/sys/devices/platform/expander.0/generic_led /sys/devices/platform/expander.0/generic_led headerDir:
} {
${CURDIR}
}
} }
sources: sources:
{ {
generic_led.c outputActuator.c
} }
#include "legato.h"
#include "interfaces.h"
#include "outputActuator.h"
#define DHUB_PATH_LENGTH 256
#define SYSFS_PATH_LENGTH 256
struct OutputActuator
{
char dhubOutputPath[DHUB_PATH_LENGTH];
char sysfsPath[SYSFS_PATH_LENGTH];
dhub_BooleanPushHandlerRef_t pushHandlerRef;
};
static le_result_t WriteStringToFile(const char *path, const char *s)
{
le_result_t res = LE_OK;
const size_t sLen = strlen(s);
FILE *f = fopen(path, "r+");
if (!f)
{
LE_ERROR("Couldn't open %s: %s", path, strerror(errno));
res = LE_FAULT;
goto done;
}
if (fwrite(s, 1, sLen, f) != sLen)
{
LE_ERROR("Write to %s failed", path);
res = LE_IO_ERROR;
goto cleanup;
}
cleanup:
fclose(f);
done:
return res;
}
static void ActuatorPushHandler
(
double timestamp,
bool value,
void *context
)
{
struct OutputActuator *oa = context;
le_result_t res = WriteStringToFile(oa->sysfsPath, value ? "1" : "0");
if (res != LE_OK)
{
return;
}
}
le_result_t RegisterOutputActuator(const char *dhubBasePath, const char *sysfsPath)
{
/*
* TODO: The current design assumes that once an actuator has been registered, it can't be
* deregistered so I make no attempt to hang onto the pointer so that it can be cleaned up
* later.
*/
struct OutputActuator *oa = calloc(sizeof(*oa), 1);
LE_ASSERT(oa);
le_result_t res = LE_OK;
strncpy(oa->sysfsPath, sysfsPath, SYSFS_PATH_LENGTH);
LE_FATAL_IF(oa->sysfsPath[SYSFS_PATH_LENGTH - 1] != '\0', "path too long");
int snprintfRes = snprintf(oa->dhubOutputPath, sizeof(oa->dhubOutputPath), "%s/%s", dhubBasePath, "value");
if (snprintfRes < 0)
{
LE_ERROR("Failed to format output path");
res = LE_FAULT;
goto error_output;
}
else if (snprintfRes >= sizeof(oa->dhubOutputPath))
{
res = LE_OVERFLOW;
goto error_output;
}
const char *noUnits = "";
res = dhub_CreateOutput(oa->dhubOutputPath, DHUB_DATA_TYPE_BOOLEAN, noUnits);
if (res != LE_OK)
{
LE_ERROR("Failed to create DataHub output %s", oa->dhubOutputPath);
goto error_output;
}
dhub_SetBooleanDefault(oa->dhubOutputPath, false);
oa->pushHandlerRef = dhub_AddBooleanPushHandler(oa->dhubOutputPath, ActuatorPushHandler, oa);
return res;
error_output:
free(oa);
return res;
}
COMPONENT_INIT
{
}
#ifndef _OUTPUT_ACTUATOR_H_
#define _OUTPUT_ACTUATOR_H_
LE_SHARED le_result_t RegisterOutputActuator(const char *dhubBasePath, const char *sysfsPath);
#endif // _OUTPUT_ACTUATOR_H_
//--------------------------------------------------------------------------------------------------
/**
* Component definition file for the mangOH Yellow on board actuator component.
*/
//--------------------------------------------------------------------------------------------------
cflags: cflags:
{ {
-std=c99 -std=c99
-DMANGOH_BOARD=YELLOW
} }
requires: requires:
{ {
api: component:
{ {
../outputActuator
dhubIO = io.api
} }
file: file:
{ {
/sys/devices/platform/expander.0/tri_led_blu /sys/devices/platform/expander.0/tri_led_blu /sys/devices/platform/expander.0/generic_led /sys/devices/platform/expander.0/
} /sys/devices/platform/expander.0/tri_led_red /sys/devices/platform/expander.0/
/sys/devices/platform/expander.0/tri_led_grn /sys/devices/platform/expander.0/
/sys/devices/platform/expander.0/tri_led_blu /sys/devices/platform/expander.0/
}
} }
sources: sources:
{ {
tri_led_blu.c yellowActuators.c
} }
#include "legato.h"
#include "interfaces.h"
#include "outputActuator.h"
static const struct
{
const char *sysfsPath;
const char *dhubPath;
} OutputActuators[] =
{
{
.sysfsPath="/sys/devices/platform/expander.0/tri_led_red",
.dhubPath="tri_led_red",
},
{
.sysfsPath="/sys/devices/platform/expander.0/tri_led_grn",
.dhubPath="tri_led_green",
},
{
.sysfsPath="/sys/devices/platform/expander.0/tri_led_blu",
.dhubPath="tri_led_blue",
},
{
.sysfsPath="/sys/devices/platform/expander.0/generic_led",
.dhubPath="generic_led",
},
};
COMPONENT_INIT
{
for (int i = 0; i < NUM_ARRAY_MEMBERS(OutputActuators); i++)
{
le_result_t res = RegisterOutputActuator(
OutputActuators[i].dhubPath, OutputActuators[i].sysfsPath);
LE_FATAL_IF(
res != LE_OK,
"Output actuator registration failed for %s at %s",
OutputActuators[i].sysfsPath,
OutputActuators[i].dhubPath);
}
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment