Commit e5af8581 authored by Dimitris Lampridis's avatar Dimitris Lampridis

[sw] add functions to detect MT IDs and rework config tool

parent 49057cee
Subproject commit b07df87ad36d963beb7d7596b3dffa4221d6bd58 Subproject commit add8319c68770cd2dac9c10842aad8487aeb1717
...@@ -20,17 +20,96 @@ ...@@ -20,17 +20,96 @@
* @{ * @{
*/ */
wrtd_status wrtd_get_node_count(uint32_t *count)
{
int i;
uint32_t dev_count = 0;
struct trtl_dev *trtl;
const struct trtl_config_rom *cfgrom;
char **dev_list = trtl_list();
if (!dev_list)
return WRTD_ERROR_INTERNAL;
for (i = 0; dev_list[i]; i++) {
trtl = trtl_open(dev_list[i]);
if (trtl == NULL) {
trtl_list_free(dev_list);
return WRTD_ERROR_RESOURCE_UNKNOWN;
}
cfgrom = trtl_config_get(trtl);
/* WRTD = 0x57525444 */
if (cfgrom->app_id == 0x57525444)
dev_count++;
trtl_close(trtl);
}
trtl_list_free(dev_list);
*count = dev_count;
return WRTD_SUCCESS;
}
wrtd_status wrtd_get_node_id(uint32_t index, uint32_t *node_id)
{
int i;
uint32_t dev_count = 0;
struct trtl_dev *trtl;
const struct trtl_config_rom *cfgrom;
char **dev_list = trtl_list();
if (!dev_list)
return WRTD_ERROR_INTERNAL;
*node_id = 0;
for (i = 0; dev_list[i]; i++) {
trtl = trtl_open(dev_list[i]);
if (trtl == NULL) {
trtl_list_free(dev_list);
return WRTD_ERROR_RESOURCE_UNKNOWN;
}
cfgrom = trtl_config_get(trtl);
/* WRTD = 0x57525444 */
if (cfgrom->app_id == 0x57525444)
dev_count++;
if (dev_count == index) {
char *eptr;
/* expecting string in the form of "trtl-xxxx, where
xxxx is a hex integer */
*node_id = strtoul(dev_list[i]+5, &eptr, 16);
if (*eptr != 0) {
trtl_list_free(dev_list);
trtl_close(trtl);
return WRTD_ERROR_INTERNAL;
}
}
trtl_close(trtl);
}
trtl_list_free(dev_list);
if (*node_id == 0)
return WRTD_ERROR_RESOURCE_UNKNOWN;
return WRTD_SUCCESS;
}
/** /**
* Initialize the WRTD Node and obtain the WRTD device token. * Initialize the WRTD Node and obtain the WRTD device token.
* *
* @param[in] resource_name Underlying MockTurtle device ID in * @param[in] node_id WRTD Node ID
* the form of **MTxxx** or **trtl-xxxx**.
* @param[in] reset Reserved for future use. * @param[in] reset Reserved for future use.
* @param[in] options_str Reserved for future use. * @param[in] options_str Reserved for future use.
* @param[out] wrtd Pointer to WRTD device token. * @param[out] wrtd Pointer to WRTD device token.
* @return #wrtd_status * @return #wrtd_status
*/ */
wrtd_status wrtd_init(const char *resource_name, wrtd_status wrtd_init(uint32_t node_id,
bool reset, bool reset,
const char *options_str, const char *options_str,
wrtd_dev **wrtd) wrtd_dev **wrtd)
...@@ -41,35 +120,12 @@ wrtd_status wrtd_init(const char *resource_name, ...@@ -41,35 +120,12 @@ wrtd_status wrtd_init(const char *resource_name,
struct wrtd_config_msg msg; struct wrtd_config_msg msg;
wrtd_status status; wrtd_status status;
static int initialized;
/* In case of error... */ /* In case of error... */
*wrtd = NULL; *wrtd = NULL;
/* Initialize (only once).*/ trtl = trtl_open_by_id(node_id);
if (!initialized) {
initialized = 1;
trtl_init();
}
/* Resource is MTxxx where xxx is the mock-turtle device id. */ if (trtl == NULL)
if (resource_name[0] == 'M' && resource_name[1] == 'T') {
unsigned long dev_id;
char *eptr;
dev_id = strtoul(resource_name + 2, &eptr, 0);
if (*eptr != 0) {
/* Invalid characters. */
return WRTD_ERROR_RESOURCE_UNKNOWN;
}
trtl = trtl_open_by_id(dev_id);
}
else if (strncmp(resource_name, "trtl-", 5) == 0) {
trtl = trtl_open(resource_name);
}
else {
return WRTD_ERROR_RESOURCE_UNKNOWN;
}
if (trtl == NULL)
return WRTD_ERROR_RESOURCE_UNKNOWN; return WRTD_ERROR_RESOURCE_UNKNOWN;
wrtd_dev *res; wrtd_dev *res;
......
...@@ -242,7 +242,11 @@ typedef enum wrtd_attr { ...@@ -242,7 +242,11 @@ typedef enum wrtd_attr {
/* Initialisation */ /* Initialisation */
wrtd_status wrtd_init(const char *resource_name, wrtd_status wrtd_get_node_count(uint32_t *count);
wrtd_status wrtd_get_node_id(uint32_t index, uint32_t *node_id);
wrtd_status wrtd_init(uint32_t node_id,
bool reset, bool reset,
const char *options_str, const char *options_str,
wrtd_dev **wrtd); wrtd_dev **wrtd);
......
...@@ -45,11 +45,38 @@ def encode_arguments(func, *args, **kwargs): ...@@ -45,11 +45,38 @@ def encode_arguments(func, *args, **kwargs):
args = tuple(encoded) args = tuple(encoded)
return func(*args, **kwargs) return func(*args, **kwargs)
def errcheck(ret, func, args):
"""Generic error checker for WRTD functions (with a dev token as first argument)"""
if ret < PyWrtd.WRTD_SUCCESS:
wrtd_p = args[0]
if wrtd_p:
buf_size = PyWrtd.wrtd_lib.wrtd_get_error(wrtd_p, None, 0, None)
error_description = create_string_buffer(buf_size)
PyWrtd.wrtd_lib.wrtd_get_error(wrtd_p, None,
buf_size, error_description)
msg = error_description.value.decode('ascii')
else:
error_message = create_string_buffer(256)
PyWrtd.wrtd_lib.wrtd_error_message(None, ret, error_message)
msg = error_message.value.decode('ascii')
raise OSError(ret, msg)
else:
return ret
def errcheck_static(ret, func, args):
"""Generic error checker for static WRTD functions (without a dev token)"""
if ret < PyWrtd.WRTD_SUCCESS:
error_message = create_string_buffer(256)
PyWrtd.wrtd_lib.wrtd_error_message(None, ret, error_message)
msg = error_message.value.decode('ascii')
raise OSError(ret, msg)
else:
return ret
class PyWrtd(): class PyWrtd():
"""Top-level Python wrapper class for WRTD library. """Top-level Python wrapper class for WRTD library.
:param resource_name: Underlying MockTurtle device ID in the form of ``MTxxx`` or\ :param node_id: WRTD Node ID. See also :ref:`node_id`.
``trtl-xxxx``. See also :ref:`node_id`.
""" """
...@@ -127,182 +154,181 @@ class PyWrtd(): ...@@ -127,182 +154,181 @@ class PyWrtd():
WRTD_LOG_ENTRY_SIZE = 120 WRTD_LOG_ENTRY_SIZE = 120
def __init__(self, resource_name): wrtd_lib = CDLL("libwrtd.so")
self.wrtd_lib = CDLL("libwrtd.so")
wrtd_lib.wrtd_get_node_count.restype = c_int
self.wrtd_lib.wrtd_init.restype = c_int wrtd_lib.wrtd_get_node_count.errcheck = errcheck_static
self.wrtd_lib.wrtd_init.errcheck = self.__errcheck wrtd_lib.wrtd_get_node_count.argtypes = [POINTER(c_uint)]
self.wrtd_lib.wrtd_init.argtypes = [c_char_p, c_bool, c_char_p,
POINTER(POINTER(wrtd_dev))] wrtd_lib.wrtd_get_node_id.restype = c_int
wrtd_lib.wrtd_get_node_id.errcheck = errcheck_static
self.wrtd_lib.wrtd_close.restype = c_int wrtd_lib.wrtd_get_node_id.argtypes = [c_uint, POINTER(c_uint)]
self.wrtd_lib.wrtd_close.errcheck = self.__errcheck
self.wrtd_lib.wrtd_close.argtypes = [POINTER(wrtd_dev)] wrtd_lib.wrtd_init.restype = c_int
wrtd_lib.wrtd_init.errcheck = errcheck_static
self.wrtd_lib.wrtd_reset.restype = c_int wrtd_lib.wrtd_init.argtypes = [c_uint, c_bool, c_char_p,
self.wrtd_lib.wrtd_reset.errcheck = self.__errcheck POINTER(POINTER(wrtd_dev))]
self.wrtd_lib.wrtd_reset.argtypes = [POINTER(wrtd_dev)]
wrtd_lib.wrtd_close.restype = c_int
self.wrtd_lib.wrtd_get_error.restype = c_int wrtd_lib.wrtd_close.errcheck = errcheck
# No errcheck on the get_error function, it is used internally wrtd_lib.wrtd_close.argtypes = [POINTER(wrtd_dev)]
# by self._errcheck and might lead to recursive errors
self.wrtd_lib.wrtd_get_error.argtypes = [POINTER(wrtd_dev), wrtd_lib.wrtd_reset.restype = c_int
POINTER(c_int), wrtd_lib.wrtd_reset.errcheck = errcheck
c_int32, c_char_p] wrtd_lib.wrtd_reset.argtypes = [POINTER(wrtd_dev)]
self.wrtd_lib.wrtd_error_message.restype = c_int wrtd_lib.wrtd_get_error.restype = c_int
self.wrtd_lib.wrtd_error_message.errcheck = self.__errcheck # No errcheck on the get_error function, it is used internally
self.wrtd_lib.wrtd_error_message.argtypes = [POINTER(wrtd_dev), # by errcheck and might lead to recursive errors
c_uint, c_char_p] wrtd_lib.wrtd_get_error.argtypes = [POINTER(wrtd_dev),
POINTER(c_int),
self.wrtd_lib.wrtd_set_attr_bool.restype = c_int c_int32, c_char_p]
self.wrtd_lib.wrtd_set_attr_bool.errcheck = self.__errcheck
self.wrtd_lib.wrtd_set_attr_bool.argtypes = [POINTER(wrtd_dev), wrtd_lib.wrtd_error_message.restype = c_int
c_char_p, # No errcheck on the error_message function, it is used internally
c_uint, c_bool] # by errcheck and might lead to recursive errors
wrtd_lib.wrtd_error_message.argtypes = [POINTER(wrtd_dev),
self.wrtd_lib.wrtd_get_attr_bool.restype = c_int c_uint, c_char_p]
self.wrtd_lib.wrtd_get_attr_bool.errcheck = self.__errcheck
self.wrtd_lib.wrtd_get_attr_bool.argtypes = [POINTER(wrtd_dev), wrtd_lib.wrtd_set_attr_bool.restype = c_int
c_char_p, wrtd_lib.wrtd_set_attr_bool.errcheck = errcheck
c_uint, POINTER(c_bool)] wrtd_lib.wrtd_set_attr_bool.argtypes = [POINTER(wrtd_dev),
c_char_p,
self.wrtd_lib.wrtd_set_attr_int32.restype = c_int c_uint, c_bool]
self.wrtd_lib.wrtd_set_attr_int32.errcheck = self.__errcheck
self.wrtd_lib.wrtd_set_attr_int32.argtypes = [POINTER(wrtd_dev), wrtd_lib.wrtd_get_attr_bool.restype = c_int
c_char_p, wrtd_lib.wrtd_get_attr_bool.errcheck = errcheck
c_uint, c_int32] wrtd_lib.wrtd_get_attr_bool.argtypes = [POINTER(wrtd_dev),
c_char_p,
self.wrtd_lib.wrtd_get_attr_int32.restype = c_int c_uint, POINTER(c_bool)]
self.wrtd_lib.wrtd_get_attr_int32.errcheck = self.__errcheck
self.wrtd_lib.wrtd_get_attr_int32.argtypes = [POINTER(wrtd_dev), wrtd_lib.wrtd_set_attr_int32.restype = c_int
c_char_p, wrtd_lib.wrtd_set_attr_int32.errcheck = errcheck
c_uint, POINTER(c_int32)] wrtd_lib.wrtd_set_attr_int32.argtypes = [POINTER(wrtd_dev),
c_char_p,
self.wrtd_lib.wrtd_set_attr_string.restype = c_int c_uint, c_int32]
self.wrtd_lib.wrtd_set_attr_string.errcheck = self.__errcheck
self.wrtd_lib.wrtd_set_attr_string.argtypes = [POINTER(wrtd_dev), wrtd_lib.wrtd_get_attr_int32.restype = c_int
c_char_p, wrtd_lib.wrtd_get_attr_int32.errcheck = errcheck
c_uint, c_char_p] wrtd_lib.wrtd_get_attr_int32.argtypes = [POINTER(wrtd_dev),
c_char_p,
self.wrtd_lib.wrtd_get_attr_string.restype = c_int c_uint, POINTER(c_int32)]
self.wrtd_lib.wrtd_get_attr_string.errcheck = self.__errcheck
self.wrtd_lib.wrtd_get_attr_string.argtypes = [POINTER(wrtd_dev), wrtd_lib.wrtd_set_attr_string.restype = c_int
c_char_p, c_uint, wrtd_lib.wrtd_set_attr_string.errcheck = errcheck
wrtd_lib.wrtd_set_attr_string.argtypes = [POINTER(wrtd_dev),
c_char_p,
c_uint, c_char_p]
wrtd_lib.wrtd_get_attr_string.restype = c_int
wrtd_lib.wrtd_get_attr_string.errcheck = errcheck
wrtd_lib.wrtd_get_attr_string.argtypes = [POINTER(wrtd_dev),
c_char_p, c_uint,
c_int32, c_char_p]
wrtd_lib.wrtd_set_attr_tstamp.restype = c_int
wrtd_lib.wrtd_set_attr_tstamp.errcheck = errcheck
wrtd_lib.wrtd_set_attr_tstamp.argtypes = [POINTER(wrtd_dev),
c_char_p, c_uint,
POINTER(wrtd_tstamp)]
wrtd_lib.wrtd_get_attr_tstamp.restype = c_int
wrtd_lib.wrtd_get_attr_tstamp.errcheck = errcheck
wrtd_lib.wrtd_get_attr_tstamp.argtypes = [POINTER(wrtd_dev),
c_char_p, c_uint,
POINTER(wrtd_tstamp)]
wrtd_lib.wrtd_clear_event_log_entries.restype = c_int
wrtd_lib.wrtd_clear_event_log_entries.errcheck = errcheck
wrtd_lib.wrtd_clear_event_log_entries.argtypes = [POINTER(wrtd_dev)]
wrtd_lib.wrtd_get_next_event_log_entry.restype = c_int
wrtd_lib.wrtd_get_next_event_log_entry.errcheck = errcheck
wrtd_lib.wrtd_get_next_event_log_entry.argtypes = [POINTER(wrtd_dev),
c_int32, c_char_p] c_int32, c_char_p]
self.wrtd_lib.wrtd_set_attr_tstamp.restype = c_int wrtd_lib.wrtd_add_alarm.restype = c_int
self.wrtd_lib.wrtd_set_attr_tstamp.errcheck = self.__errcheck wrtd_lib.wrtd_add_alarm.errcheck = errcheck
self.wrtd_lib.wrtd_set_attr_tstamp.argtypes = [POINTER(wrtd_dev), wrtd_lib.wrtd_add_alarm.argtypes = [POINTER(wrtd_dev), c_char_p]
c_char_p, c_uint,
POINTER(wrtd_tstamp)] wrtd_lib.wrtd_disable_all_alarms.restype = c_int
wrtd_lib.wrtd_disable_all_alarms.errcheck = errcheck
self.wrtd_lib.wrtd_get_attr_tstamp.restype = c_int wrtd_lib.wrtd_disable_all_alarms.argtypes = [POINTER(wrtd_dev)]
self.wrtd_lib.wrtd_get_attr_tstamp.errcheck = self.__errcheck
self.wrtd_lib.wrtd_get_attr_tstamp.argtypes = [POINTER(wrtd_dev), wrtd_lib.wrtd_remove_alarm.restype = c_int
c_char_p, c_uint, wrtd_lib.wrtd_remove_alarm.errcheck = errcheck
POINTER(wrtd_tstamp)] wrtd_lib.wrtd_remove_alarm.argtypes = [POINTER(wrtd_dev), c_char_p]
self.wrtd_lib.wrtd_clear_event_log_entries.restype = c_int wrtd_lib.wrtd_remove_all_alarms.restype = c_int
self.wrtd_lib.wrtd_clear_event_log_entries.errcheck = self.__errcheck wrtd_lib.wrtd_remove_all_alarms.errcheck = errcheck
self.wrtd_lib.wrtd_clear_event_log_entries.argtypes = [POINTER(wrtd_dev)] wrtd_lib.wrtd_remove_all_alarms.argtypes = [POINTER(wrtd_dev)]
self.wrtd_lib.wrtd_get_next_event_log_entry.restype = c_int wrtd_lib.wrtd_get_alarm_name.restype = c_int
self.wrtd_lib.wrtd_get_next_event_log_entry.errcheck = self.__errcheck wrtd_lib.wrtd_get_alarm_name.errcheck = errcheck
self.wrtd_lib.wrtd_get_next_event_log_entry.argtypes = [POINTER(wrtd_dev), wrtd_lib.wrtd_get_alarm_name.argtypes = [POINTER(wrtd_dev), c_int32,
c_int32, c_char_p] c_int32, c_char_p]
self.wrtd_lib.wrtd_add_alarm.restype = c_int wrtd_lib.wrtd_add_rule.restype = c_int
self.wrtd_lib.wrtd_add_alarm.errcheck = self.__errcheck wrtd_lib.wrtd_add_rule.errcheck = errcheck
self.wrtd_lib.wrtd_add_alarm.argtypes = [POINTER(wrtd_dev), c_char_p] wrtd_lib.wrtd_add_rule.argtypes = [POINTER(wrtd_dev), c_char_p]
self.wrtd_lib.wrtd_disable_all_alarms.restype = c_int wrtd_lib.wrtd_disable_all_rules.restype = c_int
self.wrtd_lib.wrtd_disable_all_alarms.errcheck = self.__errcheck wrtd_lib.wrtd_disable_all_rules.errcheck = errcheck
self.wrtd_lib.wrtd_disable_all_alarms.argtypes = [POINTER(wrtd_dev)] wrtd_lib.wrtd_disable_all_rules.argtypes = [POINTER(wrtd_dev)]
self.wrtd_lib.wrtd_remove_alarm.restype = c_int wrtd_lib.wrtd_remove_rule.restype = c_int
self.wrtd_lib.wrtd_remove_alarm.errcheck = self.__errcheck wrtd_lib.wrtd_remove_rule.errcheck = errcheck
self.wrtd_lib.wrtd_remove_alarm.argtypes = [POINTER(wrtd_dev), c_char_p] wrtd_lib.wrtd_remove_rule.argtypes = [POINTER(wrtd_dev), c_char_p]
self.wrtd_lib.wrtd_remove_all_alarms.restype = c_int wrtd_lib.wrtd_remove_all_rules.restype = c_int
self.wrtd_lib.wrtd_remove_all_alarms.errcheck = self.__errcheck wrtd_lib.wrtd_remove_all_rules.errcheck = errcheck
self.wrtd_lib.wrtd_remove_all_alarms.argtypes = [POINTER(wrtd_dev)] wrtd_lib.wrtd_remove_all_rules.argtypes = [POINTER(wrtd_dev)]
self.wrtd_lib.wrtd_get_alarm_name.restype = c_int wrtd_lib.wrtd_get_rule_name.restype = c_int
self.wrtd_lib.wrtd_get_alarm_name.errcheck = self.__errcheck wrtd_lib.wrtd_get_rule_name.errcheck = errcheck
self.wrtd_lib.wrtd_get_alarm_name.argtypes = [POINTER(wrtd_dev), c_int32, wrtd_lib.wrtd_get_rule_name.argtypes = [POINTER(wrtd_dev), c_int32,
c_int32, c_char_p] c_int32, c_char_p]
self.wrtd_lib.wrtd_add_rule.restype = c_int wrtd_lib.wrtd_reset_rule_stats.restype = c_int
self.wrtd_lib.wrtd_add_rule.errcheck = self.__errcheck wrtd_lib.wrtd_reset_rule_stats.errcheck = errcheck
self.wrtd_lib.wrtd_add_rule.argtypes = [POINTER(wrtd_dev), c_char_p] wrtd_lib.wrtd_reset_rule_stats.argtypes = [POINTER(wrtd_dev), c_char_p]
self.wrtd_lib.wrtd_disable_all_rules.restype = c_int wrtd_lib.wrtd_get_fw_name.restype = c_int
self.wrtd_lib.wrtd_disable_all_rules.errcheck = self.__errcheck wrtd_lib.wrtd_get_fw_name.errcheck = errcheck
self.wrtd_lib.wrtd_disable_all_rules.argtypes = [POINTER(wrtd_dev)] wrtd_lib.wrtd_get_fw_name.argtypes = [POINTER(wrtd_dev), c_int32,
c_int32, c_char_p]
self.wrtd_lib.wrtd_remove_rule.restype = c_int def __init__(self, node_id):
self.wrtd_lib.wrtd_remove_rule.errcheck = self.__errcheck
self.wrtd_lib.wrtd_remove_rule.argtypes = [POINTER(wrtd_dev), c_char_p]
self.wrtd_lib.wrtd_remove_all_rules.restype = c_int
self.wrtd_lib.wrtd_remove_all_rules.errcheck = self.__errcheck
self.wrtd_lib.wrtd_remove_all_rules.argtypes = [POINTER(wrtd_dev)]
self.wrtd_lib.wrtd_get_rule_name.restype = c_int
self.wrtd_lib.wrtd_get_rule_name.errcheck = self.__errcheck
self.wrtd_lib.wrtd_get_rule_name.argtypes = [POINTER(wrtd_dev), c_int32,
c_int32, c_char_p]
self.wrtd_lib.wrtd_reset_rule_stats.restype = c_int
self.wrtd_lib.wrtd_reset_rule_stats.errcheck = self.__errcheck
self.wrtd_lib.wrtd_reset_rule_stats.argtypes = [POINTER(wrtd_dev), c_char_p]
self.wrtd_lib.wrtd_get_fw_name.restype = c_int
self.wrtd_lib.wrtd_get_fw_name.errcheck = self.__errcheck
self.wrtd_lib.wrtd_get_fw_name.argtypes = [POINTER(wrtd_dev), c_int32,
c_int32, c_char_p]
self.resource_name = resource_name.encode('utf-8')
self.wrtd_p = POINTER(wrtd_dev)() self.wrtd_p = POINTER(wrtd_dev)()
ret = self.wrtd_lib.wrtd_init(self.resource_name, 0, None, byref(self.wrtd_p)) ret = self.wrtd_lib.wrtd_init(node_id, 0, None, byref(self.wrtd_p))
def __del__(self): def __del__(self):
if self.wrtd_p: if self.wrtd_p:
self.wrtd_lib.wrtd_close(self.wrtd_p) self.wrtd_lib.wrtd_close(self.wrtd_p)
self.wrtd_p = 0 self.wrtd_p = 0
def reset(self): @staticmethod
def get_node_count():
""" """
Corresponds to C library :cpp:func:`wrtd_reset`. Corresponds to C library :cpp:func:`wrtd_get_node_count`.
""" """
self.wrtd_lib.wrtd_reset(self.wrtd_p) count = c_uint();
PyWrtd.wrtd_lib.wrtd_get_node_count(byref(count))
return count.value;
def get_error(self): @staticmethod
def get_node_id(index):
""" """
Corresponds to C library :cpp:func:`wrtd_get_error`. Corresponds to C library :cpp:func:`wrtd_get_node_id`.
:return: a tuple with the :ref:`Error Code <api_error_codes>` and the error message.
""" """
buf_size = self.wrtd_lib.wrtd_get_error(self.wrtd_p, None, 0, None) node_id = c_uint();
error_description = create_string_buffer(buf_size) PyWrtd.wrtd_lib.wrtd_get_node_id(index, byref(node_id))
error_c = c_int() return node_id.value;
self.wrtd_lib.wrtd_get_error(self.wrtd_p, byref(error_c),
buf_size, error_description)
return error_c.value, error_description.value.decode('ascii')
def error_message(self, err_code): def reset(self):
""" """
Corresponds to C library :cpp:func:`wrtd_error_message`. Corresponds to C library :cpp:func:`wrtd_reset`.
:param err_code: error code to convert
:return: error message (string)
""" """
error_message = create_string_buffer(256) self.wrtd_lib.wrtd_reset(self.wrtd_p)
self.wrtd_lib.wrtd_error_message(self.wrtd_p, err_code,
error_message)
return error_message.value.decode('ascii')
@encode_arguments @encode_arguments
def set_attr_bool(self, rep_cap_id, id, value): def set_attr_bool(self, rep_cap_id, id, value):
...@@ -553,14 +579,3 @@ class PyWrtd(): ...@@ -553,14 +579,3 @@ class PyWrtd():
self.wrtd_lib.wrtd_get_fw_name(self.wrtd_p, index, self.wrtd_lib.wrtd_get_fw_name(self.wrtd_p, index,
buf_size, name) buf_size, name)
return name.value.decode('ascii') return name.value.decode('ascii')
def __errcheck(self, ret, func, args):
"""Generic error checker for WRTD functions"""
if ret < self.WRTD_SUCCESS:
if self.wrtd_p:
code, msg = self.get_error()
else:
code, msg = ret, self.error_message(ret)
raise OSError(ret, 'Error {0}: {1}'.format(hex(code% (1 << 32)), msg))
else:
return ret
...@@ -36,6 +36,16 @@ def __tstamp_to_str(tstamp): ...@@ -36,6 +36,16 @@ def __tstamp_to_str(tstamp):
int(ret['ns'] / 1e1) % 1000, int(ret['ns'] / 1e1) % 1000,
ret['frac'] >> (32 - 9)) ret['frac'] >> (32 - 9))
def cmd_list_nodes(args):
for i in range((PyWrtd.get_node_count())):
node_id = PyWrtd.get_node_id(i+1)
print('-> WRTD Node detected with ID: {0}'.format(node_id))
if args.verbose:
wrtd = PyWrtd(node_id)
args.verbose = False
cmd_sys_info(wrtd, args)
args.verbose = True
def cmd_sys_info(wrtd, args): def cmd_sys_info(wrtd, args):
print('') print('')
cmd_sys_time(wrtd, args) cmd_sys_time(wrtd, args)
...@@ -279,47 +289,70 @@ def time_interval_help(): ...@@ -279,47 +289,70 @@ def time_interval_help():
def main(): def main():
parser = argparse.ArgumentParser(description='WRTD node configuration tool') parser = argparse.ArgumentParser(description='WRTD Node configuration tool')
parser.add_argument('-D', '--dev-id', dest='dev', required=True, type=lambda x: int(x,0),
help='MockTurtle device ID (integer) to open') devid_parse = argparse.ArgumentParser(add_help=False)
devid_parse.add_argument('devid', type=lambda x: int(x,0),
metavar='<NODE_ID>',
help='The ID of the WRTD Node (int, can be hex with "0x" prefix)')
verbose_parse = argparse.ArgumentParser(add_help=False)
verbose_parse.add_argument('-v', '--verbose', action='store_true',
help='Show more details')
rname_parse = argparse.ArgumentParser(add_help=False)
rname_parse.add_argument('name', metavar='<RULE_ID>',
help='The ID of the Rule (string up to 15 characters)')
aname_parse = argparse.ArgumentParser(add_help=False)
aname_parse.add_argument('name', metavar='<ALARM_ID>',
help='The ID of the Alarm (string up to 15 characters)')
subparsers = parser.add_subparsers(title='Available commands', subparsers = parser.add_subparsers(title='Available commands',
dest='command', metavar='<command>', dest='command', metavar='<command>',
help='(Use "<command> -h" to get more details)') help='(Use "<command> -h" to get more details)')
subparsers.required = True; subparsers.required = True;
# list-nodes
cmd_parser = subparsers.add_parser('list-nodes',
help='List the IDs of all detected WRTD Nodes',
parents=[verbose_parse])
cmd_parser.set_defaults(func=cmd_list_nodes, devid=None)
# sys-info # sys-info
cmd_parser = subparsers.add_parser('sys-info', help='Show system information') cmd_parser = subparsers.add_parser('sys-info', help='Show system information',
cmd_parser.add_argument('-v', '--verbose', action='store_true', parents=[devid_parse, verbose_parse])
help='Show more details')
cmd_parser.set_defaults(func=cmd_sys_info) cmd_parser.set_defaults(func=cmd_sys_info)
# sys-time # sys-time
cmd_parser = subparsers.add_parser('sys-time', help='Show current system time') cmd_parser = subparsers.add_parser('sys-time', help='Show current system time',
parents=[devid_parse])
cmd_parser.set_defaults(func=cmd_sys_time) cmd_parser.set_defaults(func=cmd_sys_time)
# set-log # set-log
cmd_parser = subparsers.add_parser('set-log', help='Enable/Disable logging') cmd_parser = subparsers.add_parser('set-log', help='Enable/Disable logging',
parents=[devid_parse])
cmd_parser.add_argument('log', choices=['on', 'off'], help='Enable/Disable logging') cmd_parser.add_argument('log', choices=['on', 'off'], help='Enable/Disable logging')
cmd_parser.set_defaults(func=cmd_set_log) cmd_parser.set_defaults(func=cmd_set_log)
# clear-log # clear-log
cmd_parser = subparsers.add_parser('clear-log', help='Clear pending log entries') cmd_parser = subparsers.add_parser('clear-log', help='Clear pending log entries',
parents=[devid_parse])
cmd_parser.set_defaults(func=cmd_clear_log) cmd_parser.set_defaults(func=cmd_clear_log)
# list-rules # list-rules
cmd_parser = subparsers.add_parser('list-rules', help='List all defined Rules') cmd_parser = subparsers.add_parser('list-rules', help='List all defined Rules',
cmd_parser.add_argument('-v', '--verbose', action='store_true', parents=[devid_parse, verbose_parse])
help='Show details about each Rule')
cmd_parser.set_defaults(func=cmd_list_rules) cmd_parser.set_defaults(func=cmd_list_rules)
# add-rule # add-rule
cmd_parser = subparsers.add_parser('add-rule', help='Define a new Rule') cmd_parser = subparsers.add_parser('add-rule', help='Define a new Rule',
cmd_parser.add_argument('name', help='The name of the new Rule') parents=[devid_parse, rname_parse])
cmd_parser.set_defaults(func=cmd_add_rule) cmd_parser.set_defaults(func=cmd_add_rule)
# set-rule # set-rule
cmd_parser = subparsers.add_parser('set-rule', help='Configure a Rule') cmd_parser = subparsers.add_parser('set-rule', help='Configure a Rule',
cmd_parser.add_argument('name', help='The name of the Rule to configure') parents=[devid_parse, rname_parse])
cmd_parser.add_argument('-d', '--delay', type=time_interval, default = 0, cmd_parser.add_argument('-d', '--delay', type=time_interval, default = 0,
help='Set the delay for this Rule. ' + time_interval_help()) help='Set the delay for this Rule. ' + time_interval_help())
cmd_parser.add_argument('source', help='The source Event ID for this Rule.') cmd_parser.add_argument('source', help='The source Event ID for this Rule.')
...@@ -327,53 +360,53 @@ def main(): ...@@ -327,53 +360,53 @@ def main():
cmd_parser.set_defaults(func=cmd_set_rule) cmd_parser.set_defaults(func=cmd_set_rule)
# remove-rule # remove-rule
cmd_parser = subparsers.add_parser('remove-rule', help='Delete a Rule') cmd_parser = subparsers.add_parser('remove-rule', help='Delete a Rule',
cmd_parser.add_argument('name', help='The name of the Rule to delete') parents=[devid_parse, rname_parse])
cmd_parser.set_defaults(func=cmd_remove_rule) cmd_parser.set_defaults(func=cmd_remove_rule)
# remove-all-rules # remove-all-rules
cmd_parser = subparsers.add_parser('remove-all-rules', help='Delete all Rules') cmd_parser = subparsers.add_parser('remove-all-rules', help='Delete all Rules',
parents=[devid_parse])
cmd_parser.set_defaults(func=cmd_remove_all_rules) cmd_parser.set_defaults(func=cmd_remove_all_rules)
# enable-rule # enable-rule
cmd_parser = subparsers.add_parser('enable-rule', help='Enable a Rule') cmd_parser = subparsers.add_parser('enable-rule', help='Enable a Rule',
cmd_parser.add_argument('name', help='The name of the Rule to enable') parents=[devid_parse, rname_parse])
cmd_parser.set_defaults(func=cmd_enable_rule) cmd_parser.set_defaults(func=cmd_enable_rule)
# disable-rule # disable-rule
cmd_parser = subparsers.add_parser('disable-rule', help='Disable a Rule') cmd_parser = subparsers.add_parser('disable-rule', help='Disable a Rule',
cmd_parser.add_argument('name', help='The name of the Rule to disable') parents=[devid_parse, rname_parse])
cmd_parser.set_defaults(func=cmd_disable_rule) cmd_parser.set_defaults(func=cmd_disable_rule)
# disable-all-rules # disable-all-rules
cmd_parser = subparsers.add_parser('disable-all-rules', help='Disable all Rules') cmd_parser = subparsers.add_parser('disable-all-rules', help='Disable all Rules',
parents=[devid_parse])
cmd_parser.set_defaults(func=cmd_disable_all_rules) cmd_parser.set_defaults(func=cmd_disable_all_rules)
# rule-info # rule-info
cmd_parser = subparsers.add_parser('rule-info', help='Display information about a Rule') cmd_parser = subparsers.add_parser('rule-info', help='Display information about a Rule',
cmd_parser.add_argument('name', help='The name of the Rule to display its information') parents=[devid_parse, rname_parse])
cmd_parser.set_defaults(func=cmd_rule_info) cmd_parser.set_defaults(func=cmd_rule_info)
# reset-rule-stats # reset-rule-stats
cmd_parser = subparsers.add_parser('reset-rule-stats', help='Reset all statistics of a Rule') cmd_parser = subparsers.add_parser('reset-rule-stats', help='Reset all statistics of a Rule',
cmd_parser.add_argument('name', help='The name of the Rule to reset its statistics') parents=[devid_parse, rname_parse])
cmd_parser.set_defaults(func=cmd_reset_rule_stats) cmd_parser.set_defaults(func=cmd_reset_rule_stats)
# list-alarms # list-alarms
cmd_parser = subparsers.add_parser('list-alarms', help='List all defined Alarms') cmd_parser = subparsers.add_parser('list-alarms', help='List all defined Alarms',
cmd_parser.add_argument('-v', '--verbose', action='store_true', parents=[devid_parse, verbose_parse])
help='Show details about each Alarm')
cmd_parser.set_defaults(func=cmd_list_alarms) cmd_parser.set_defaults(func=cmd_list_alarms)
# add-alarm # add-alarm
cmd_parser = subparsers.add_parser('add-alarm', help='Define a new Alarm') cmd_parser = subparsers.add_parser('add-alarm', help='Define a new Alarm',
cmd_parser.add_argument('name', help='The name of the new Alarm') parents=[devid_parse, aname_parse])
cmd_parser.set_defaults(func=cmd_add_alarm) cmd_parser.set_defaults(func=cmd_add_alarm)
# set-alarm # set-alarm
cmd_parser = subparsers.add_parser('set-alarm', help='Configure an Alarm') cmd_parser = subparsers.add_parser('set-alarm', help='Configure an Alarm',
cmd_parser.add_argument('name', help='The name of the Alarm to configure') parents=[devid_parse, aname_parse])
cmd_parser.add_argument('-d', '--delay', type=time_interval, required = True, cmd_parser.add_argument('-d', '--delay', type=time_interval, required = True,
help='Set the delay for this Alarm wrt now. ' + time_interval_help()) help='Set the delay for this Alarm wrt now. ' + time_interval_help())
cmd_parser.add_argument('-s', '--setup', type=time_interval, default = 0, cmd_parser.add_argument('-s', '--setup', type=time_interval, default = 0,
...@@ -387,40 +420,42 @@ def main(): ...@@ -387,40 +420,42 @@ def main():
cmd_parser.set_defaults(func=cmd_set_alarm) cmd_parser.set_defaults(func=cmd_set_alarm)
# remove-alarm # remove-alarm
cmd_parser = subparsers.add_parser('remove-alarm', help='Delete an Alarm') cmd_parser = subparsers.add_parser('remove-alarm', help='Delete an Alarm',
cmd_parser.add_argument('name', help='The name of the Alarm to delete') parents=[devid_parse, aname_parse])
cmd_parser.set_defaults(func=cmd_remove_alarm) cmd_parser.set_defaults(func=cmd_remove_alarm)
# remove-all-alarms # remove-all-alarms
cmd_parser = subparsers.add_parser('remove-all-alarms', help='Delete all Alarms') cmd_parser = subparsers.add_parser('remove-all-alarms', help='Delete all Alarms',
parents=[devid_parse])
cmd_parser.set_defaults(func=cmd_remove_all_alarms) cmd_parser.set_defaults(func=cmd_remove_all_alarms)
# enable-alarm # enable-alarm
cmd_parser = subparsers.add_parser('enable-alarm', help='Enable an Alarm') cmd_parser = subparsers.add_parser('enable-alarm', help='Enable an Alarm',
cmd_parser.add_argument('name', help='The name of the Alarm to enable') parents=[devid_parse, aname_parse])
cmd_parser.set_defaults(func=cmd_enable_alarm) cmd_parser.set_defaults(func=cmd_enable_alarm)
# disable-alarm # disable-alarm
cmd_parser = subparsers.add_parser('disable-alarm', help='Disable an Alarm') cmd_parser = subparsers.add_parser('disable-alarm', help='Disable an Alarm',
cmd_parser.add_argument('name', help='The name of the Alarm to disable') parents=[devid_parse, aname_parse])
cmd_parser.set_defaults(func=cmd_disable_alarm) cmd_parser.set_defaults(func=cmd_disable_alarm)
# disable-all-alarms # disable-all-alarms
cmd_parser = subparsers.add_parser('disable-all-alarms', help='Disable all Alarms') cmd_parser = subparsers.add_parser('disable-all-alarms', help='Disable all Alarms',
parents=[devid_parse])
cmd_parser.set_defaults(func=cmd_disable_all_alarms) cmd_parser.set_defaults(func=cmd_disable_all_alarms)
# alarm-info # alarm-info
cmd_parser = subparsers.add_parser('alarm-info', help='Display information about an Alarm') cmd_parser = subparsers.add_parser('alarm-info', help='Display information about an Alarm',
cmd_parser.add_argument('name', help='The name of the Alarm to display its information') parents=[devid_parse, aname_parse])
cmd_parser.set_defaults(func=cmd_alarm_info) cmd_parser.set_defaults(func=cmd_alarm_info)
args = parser.parse_args() args = parser.parse_args()
dev = 'MT' + str(args.dev) if (args.devid != None):
wrtd = PyWrtd(args.devid)
wrtd = PyWrtd(dev) args.func(wrtd, args)
else:
args.func(wrtd, args) args.func(args)
if __name__ == "__main__": if __name__ == "__main__":
main() main()
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