diff --git a/src/main/aciomgr/manager.c b/src/main/aciomgr/manager.c index 3cc022a..c444a19 100644 --- a/src/main/aciomgr/manager.c +++ b/src/main/aciomgr/manager.c @@ -18,6 +18,7 @@ struct aciomgr_port_dispatcher { struct aciodrv_device_ctx *device; char path[MAX_PORT_PATH_LENGTH]; int baud; + bool has_failure; }; static void _aciomgr_setup_port_dispatcher( @@ -41,6 +42,13 @@ static void _aciomgr_setup_port_dispatcher( dispatcher->baud = baud; dispatcher->device = aciodrv_device_open_path(path, baud); + dispatcher->has_failure = false; + + if (dispatcher->device == NULL) { + log_info("Opening ACIO device on %s failed", path); + dispatcher->has_failure = true; + } + dispatcher->references = 0; } @@ -119,9 +127,16 @@ struct aciomgr_port_dispatcher *aciomgr_port_init(const char *path, int baud) _aciomgr_setup_port_dispatcher(entry, path, baud); done: - entry->references++; + if (!entry->has_failure) { + entry->references++; + } + LeaveCriticalSection(&mgr_cs); + if (entry->has_failure) { + return NULL; + } + return entry; } diff --git a/src/main/eamio-icca/Module.mk b/src/main/eamio-icca/Module.mk index 3403aa7..28c388e 100644 --- a/src/main/eamio-icca/Module.mk +++ b/src/main/eamio-icca/Module.mk @@ -4,7 +4,9 @@ dlls += \ libs_eamio-icca := \ aciodrv \ aciomgr \ + cconfig \ util \ src_eamio-icca := \ + config-icc.c \ eamio-icca.c \ diff --git a/src/main/eamio-icca/config-icc.c b/src/main/eamio-icca/config-icc.c new file mode 100644 index 0000000..e840dfd --- /dev/null +++ b/src/main/eamio-icca/config-icc.c @@ -0,0 +1,55 @@ +#include "cconfig/cconfig-util.h" + +#include "eamio-icca/config-icc.h" + +#include "util/log.h" + +#define EAMIO_ICCA_CONFIG_ICC_PORT_KEY "bio2.port" +#define EAMIO_ICCA_CONFIG_ICC_BAUD_KEY "bio2.baud" + +#define EAMIO_ICCA_CONFIG_ICC_DEFAULT_PORT_VALUE "COM1" +#define EAMIO_ICCA_CONFIG_ICC_DEFAULT_BAUD_VALUE 57600 + +void eamio_icca_config_icc_init(struct cconfig *config) +{ + cconfig_util_set_str( + config, + EAMIO_ICCA_CONFIG_ICC_PORT_KEY, + EAMIO_ICCA_CONFIG_ICC_DEFAULT_PORT_VALUE, + "ICCA serial port"); + + cconfig_util_set_int( + config, + EAMIO_ICCA_CONFIG_ICC_BAUD_KEY, + EAMIO_ICCA_CONFIG_ICC_DEFAULT_BAUD_VALUE, + "ICCA bus baudrate (real devices expect 57600)"); +} + +void eamio_icca_config_icc_get( + struct icc_config *config_icc, struct cconfig *config) +{ + if (!cconfig_util_get_str( + config, + EAMIO_ICCA_CONFIG_ICC_PORT_KEY, + config_icc->port, + sizeof(config_icc->port) - 1, + EAMIO_ICCA_CONFIG_ICC_DEFAULT_PORT_VALUE)) { + log_warning( + "Invalid value for key '%s' specified, fallback " + "to default '%s'", + EAMIO_ICCA_CONFIG_ICC_PORT_KEY, + EAMIO_ICCA_CONFIG_ICC_DEFAULT_PORT_VALUE); + } + + if (!cconfig_util_get_int( + config, + EAMIO_ICCA_CONFIG_ICC_BAUD_KEY, + &config_icc->baud, + EAMIO_ICCA_CONFIG_ICC_DEFAULT_BAUD_VALUE)) { + log_warning( + "Invalid value for key '%s' specified, fallback " + "to default '%d'", + EAMIO_ICCA_CONFIG_ICC_BAUD_KEY, + EAMIO_ICCA_CONFIG_ICC_DEFAULT_BAUD_VALUE); + } +} diff --git a/src/main/eamio-icca/config-icc.h b/src/main/eamio-icca/config-icc.h new file mode 100644 index 0000000..c1219a4 --- /dev/null +++ b/src/main/eamio-icca/config-icc.h @@ -0,0 +1,18 @@ +#ifndef EAMIO_ICCA_CONFIG_ICC_H +#define EAMIO_ICCA_CONFIG_ICC_H + +#include + +#include "cconfig/cconfig.h" + +struct icc_config { + char port[64]; + int32_t baud; +}; + +void eamio_icca_config_icc_init(struct cconfig *config); + +void eamio_icca_config_icc_get( + struct icc_config *config_icc, struct cconfig *config); + +#endif diff --git a/src/main/eamio-icca/eamio-icca.c b/src/main/eamio-icca/eamio-icca.c index 0c073f1..37b3e20 100644 --- a/src/main/eamio-icca/eamio-icca.c +++ b/src/main/eamio-icca/eamio-icca.c @@ -13,6 +13,9 @@ #include "bemanitools/eamio.h" +#include "cconfig/cconfig-main.h" +#include "eamio-icca/config-icc.h" + #include "util/log.h" #define NUMBER_OF_EMULATED_READERS 2 @@ -73,7 +76,30 @@ static bool check_if_icca(int node_id) { bool eam_io_init( thread_create_t create, thread_join_t join, thread_destroy_t destroy) { - acio_manager_ctx = aciomgr_port_init("COM1", 57600); + struct cconfig *config; + struct icc_config config_icc; + + config = cconfig_init(); + + eamio_icca_config_icc_init(config); + + if (!cconfig_main_config_init( + config, + "--icc-config", + "eamio-icc.conf", + "--help", + "-h", + "eamio-icca", + CCONFIG_CMD_USAGE_OUT_STDOUT)) { + cconfig_finit(config); + exit(EXIT_FAILURE); + } + + eamio_icca_config_icc_get(&config_icc, config); + + cconfig_finit(config); + + acio_manager_ctx = aciomgr_port_init(config_icc.port, config_icc.baud); if (acio_manager_ctx == NULL) { log_warning("Opening acio device on COM1 failed"); diff --git a/src/main/eamiotest/main.c b/src/main/eamiotest/main.c index 48dd211..9880af4 100644 --- a/src/main/eamiotest/main.c +++ b/src/main/eamiotest/main.c @@ -15,6 +15,8 @@ */ int main(int argc, char **argv) { + log_to_writer(log_writer_stdout, NULL); + eam_io_set_loggers( log_impl_misc, log_impl_info, log_impl_warning, log_impl_fatal);