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 @@
* @{
*/
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.
*
* @param[in] resource_name Underlying MockTurtle device ID in
* the form of **MTxxx** or **trtl-xxxx**.
* @param[in] node_id WRTD Node ID
* @param[in] reset Reserved for future use.
* @param[in] options_str Reserved for future use.
* @param[out] wrtd Pointer to WRTD device token.
* @return #wrtd_status
*/
wrtd_status wrtd_init(const char *resource_name,
wrtd_status wrtd_init(uint32_t node_id,
bool reset,
const char *options_str,
wrtd_dev **wrtd)
......@@ -41,35 +120,12 @@ wrtd_status wrtd_init(const char *resource_name,
struct wrtd_config_msg msg;
wrtd_status status;
static int initialized;
/* In case of error... */
*wrtd = NULL;
/* Initialize (only once).*/
if (!initialized) {
initialized = 1;
trtl_init();
}
trtl = trtl_open_by_id(node_id);
/* Resource is MTxxx where xxx is the mock-turtle device id. */
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)
if (trtl == NULL)
return WRTD_ERROR_RESOURCE_UNKNOWN;
wrtd_dev *res;
......
......@@ -242,7 +242,11 @@ typedef enum wrtd_attr {
/* 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,
const char *options_str,
wrtd_dev **wrtd);
......
......@@ -45,11 +45,38 @@ def encode_arguments(func, *args, **kwargs):
args = tuple(encoded)
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():
"""Top-level Python wrapper class for WRTD library.
:param resource_name: Underlying MockTurtle device ID in the form of ``MTxxx`` or\
``trtl-xxxx``. See also :ref:`node_id`.
:param node_id: WRTD Node ID. See also :ref:`node_id`.
"""
......@@ -127,182 +154,181 @@ class PyWrtd():
WRTD_LOG_ENTRY_SIZE = 120
def __init__(self, resource_name):
self.wrtd_lib = CDLL("libwrtd.so")
self.wrtd_lib.wrtd_init.restype = c_int
self.wrtd_lib.wrtd_init.errcheck = self.__errcheck
self.wrtd_lib.wrtd_init.argtypes = [c_char_p, c_bool, c_char_p,
POINTER(POINTER(wrtd_dev))]
self.wrtd_lib.wrtd_close.restype = c_int
self.wrtd_lib.wrtd_close.errcheck = self.__errcheck
self.wrtd_lib.wrtd_close.argtypes = [POINTER(wrtd_dev)]
self.wrtd_lib.wrtd_reset.restype = c_int
self.wrtd_lib.wrtd_reset.errcheck = self.__errcheck
self.wrtd_lib.wrtd_reset.argtypes = [POINTER(wrtd_dev)]
self.wrtd_lib.wrtd_get_error.restype = c_int
# No errcheck on the get_error function, it is used internally
# by self._errcheck and might lead to recursive errors
self.wrtd_lib.wrtd_get_error.argtypes = [POINTER(wrtd_dev),
POINTER(c_int),
c_int32, c_char_p]
self.wrtd_lib.wrtd_error_message.restype = c_int
self.wrtd_lib.wrtd_error_message.errcheck = self.__errcheck
self.wrtd_lib.wrtd_error_message.argtypes = [POINTER(wrtd_dev),
c_uint, c_char_p]
self.wrtd_lib.wrtd_set_attr_bool.restype = c_int
self.wrtd_lib.wrtd_set_attr_bool.errcheck = self.__errcheck
self.wrtd_lib.wrtd_set_attr_bool.argtypes = [POINTER(wrtd_dev),
c_char_p,
c_uint, c_bool]
self.wrtd_lib.wrtd_get_attr_bool.restype = c_int
self.wrtd_lib.wrtd_get_attr_bool.errcheck = self.__errcheck
self.wrtd_lib.wrtd_get_attr_bool.argtypes = [POINTER(wrtd_dev),
c_char_p,
c_uint, POINTER(c_bool)]
self.wrtd_lib.wrtd_set_attr_int32.restype = c_int
self.wrtd_lib.wrtd_set_attr_int32.errcheck = self.__errcheck
self.wrtd_lib.wrtd_set_attr_int32.argtypes = [POINTER(wrtd_dev),
c_char_p,
c_uint, c_int32]
self.wrtd_lib.wrtd_get_attr_int32.restype = c_int
self.wrtd_lib.wrtd_get_attr_int32.errcheck = self.__errcheck
self.wrtd_lib.wrtd_get_attr_int32.argtypes = [POINTER(wrtd_dev),
c_char_p,
c_uint, POINTER(c_int32)]
self.wrtd_lib.wrtd_set_attr_string.restype = c_int
self.wrtd_lib.wrtd_set_attr_string.errcheck = self.__errcheck
self.wrtd_lib.wrtd_set_attr_string.argtypes = [POINTER(wrtd_dev),
c_char_p,
c_uint, c_char_p]
self.wrtd_lib.wrtd_get_attr_string.restype = c_int
self.wrtd_lib.wrtd_get_attr_string.errcheck = self.__errcheck
self.wrtd_lib.wrtd_get_attr_string.argtypes = [POINTER(wrtd_dev),
c_char_p, c_uint,
wrtd_lib = CDLL("libwrtd.so")
wrtd_lib.wrtd_get_node_count.restype = c_int
wrtd_lib.wrtd_get_node_count.errcheck = errcheck_static
wrtd_lib.wrtd_get_node_count.argtypes = [POINTER(c_uint)]
wrtd_lib.wrtd_get_node_id.restype = c_int
wrtd_lib.wrtd_get_node_id.errcheck = errcheck_static
wrtd_lib.wrtd_get_node_id.argtypes = [c_uint, POINTER(c_uint)]
wrtd_lib.wrtd_init.restype = c_int
wrtd_lib.wrtd_init.errcheck = errcheck_static
wrtd_lib.wrtd_init.argtypes = [c_uint, c_bool, c_char_p,
POINTER(POINTER(wrtd_dev))]
wrtd_lib.wrtd_close.restype = c_int
wrtd_lib.wrtd_close.errcheck = errcheck
wrtd_lib.wrtd_close.argtypes = [POINTER(wrtd_dev)]
wrtd_lib.wrtd_reset.restype = c_int
wrtd_lib.wrtd_reset.errcheck = errcheck
wrtd_lib.wrtd_reset.argtypes = [POINTER(wrtd_dev)]
wrtd_lib.wrtd_get_error.restype = c_int
# No errcheck on the get_error function, it is used internally
# by errcheck and might lead to recursive errors
wrtd_lib.wrtd_get_error.argtypes = [POINTER(wrtd_dev),
POINTER(c_int),
c_int32, c_char_p]
wrtd_lib.wrtd_error_message.restype = c_int
# No errcheck on the error_message function, it is used internally
# by errcheck and might lead to recursive errors
wrtd_lib.wrtd_error_message.argtypes = [POINTER(wrtd_dev),
c_uint, c_char_p]
wrtd_lib.wrtd_set_attr_bool.restype = c_int
wrtd_lib.wrtd_set_attr_bool.errcheck = errcheck
wrtd_lib.wrtd_set_attr_bool.argtypes = [POINTER(wrtd_dev),
c_char_p,
c_uint, c_bool]
wrtd_lib.wrtd_get_attr_bool.restype = c_int
wrtd_lib.wrtd_get_attr_bool.errcheck = errcheck
wrtd_lib.wrtd_get_attr_bool.argtypes = [POINTER(wrtd_dev),
c_char_p,
c_uint, POINTER(c_bool)]
wrtd_lib.wrtd_set_attr_int32.restype = c_int
wrtd_lib.wrtd_set_attr_int32.errcheck = errcheck
wrtd_lib.wrtd_set_attr_int32.argtypes = [POINTER(wrtd_dev),
c_char_p,
c_uint, c_int32]
wrtd_lib.wrtd_get_attr_int32.restype = c_int
wrtd_lib.wrtd_get_attr_int32.errcheck = errcheck
wrtd_lib.wrtd_get_attr_int32.argtypes = [POINTER(wrtd_dev),
c_char_p,
c_uint, POINTER(c_int32)]
wrtd_lib.wrtd_set_attr_string.restype = c_int
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]
self.wrtd_lib.wrtd_set_attr_tstamp.restype = c_int
self.wrtd_lib.wrtd_set_attr_tstamp.errcheck = self.__errcheck
self.wrtd_lib.wrtd_set_attr_tstamp.argtypes = [POINTER(wrtd_dev),
c_char_p, c_uint,
POINTER(wrtd_tstamp)]
self.wrtd_lib.wrtd_get_attr_tstamp.restype = c_int
self.wrtd_lib.wrtd_get_attr_tstamp.errcheck = self.__errcheck
self.wrtd_lib.wrtd_get_attr_tstamp.argtypes = [POINTER(wrtd_dev),
c_char_p, c_uint,
POINTER(wrtd_tstamp)]
self.wrtd_lib.wrtd_clear_event_log_entries.restype = c_int
self.wrtd_lib.wrtd_clear_event_log_entries.errcheck = self.__errcheck
self.wrtd_lib.wrtd_clear_event_log_entries.argtypes = [POINTER(wrtd_dev)]
self.wrtd_lib.wrtd_get_next_event_log_entry.restype = c_int
self.wrtd_lib.wrtd_get_next_event_log_entry.errcheck = self.__errcheck
self.wrtd_lib.wrtd_get_next_event_log_entry.argtypes = [POINTER(wrtd_dev),
c_int32, c_char_p]
self.wrtd_lib.wrtd_add_alarm.restype = c_int
self.wrtd_lib.wrtd_add_alarm.errcheck = self.__errcheck
self.wrtd_lib.wrtd_add_alarm.argtypes = [POINTER(wrtd_dev), c_char_p]
self.wrtd_lib.wrtd_disable_all_alarms.restype = c_int
self.wrtd_lib.wrtd_disable_all_alarms.errcheck = self.__errcheck
self.wrtd_lib.wrtd_disable_all_alarms.argtypes = [POINTER(wrtd_dev)]
self.wrtd_lib.wrtd_remove_alarm.restype = c_int
self.wrtd_lib.wrtd_remove_alarm.errcheck = self.__errcheck
self.wrtd_lib.wrtd_remove_alarm.argtypes = [POINTER(wrtd_dev), c_char_p]
self.wrtd_lib.wrtd_remove_all_alarms.restype = c_int
self.wrtd_lib.wrtd_remove_all_alarms.errcheck = self.__errcheck
self.wrtd_lib.wrtd_remove_all_alarms.argtypes = [POINTER(wrtd_dev)]
self.wrtd_lib.wrtd_get_alarm_name.restype = c_int
self.wrtd_lib.wrtd_get_alarm_name.errcheck = self.__errcheck
self.wrtd_lib.wrtd_get_alarm_name.argtypes = [POINTER(wrtd_dev), c_int32,
c_int32, c_char_p]
self.wrtd_lib.wrtd_add_rule.restype = c_int
self.wrtd_lib.wrtd_add_rule.errcheck = self.__errcheck
self.wrtd_lib.wrtd_add_rule.argtypes = [POINTER(wrtd_dev), c_char_p]
self.wrtd_lib.wrtd_disable_all_rules.restype = c_int
self.wrtd_lib.wrtd_disable_all_rules.errcheck = self.__errcheck
self.wrtd_lib.wrtd_disable_all_rules.argtypes = [POINTER(wrtd_dev)]
self.wrtd_lib.wrtd_remove_rule.restype = c_int
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')
wrtd_lib.wrtd_add_alarm.restype = c_int
wrtd_lib.wrtd_add_alarm.errcheck = errcheck
wrtd_lib.wrtd_add_alarm.argtypes = [POINTER(wrtd_dev), c_char_p]
wrtd_lib.wrtd_disable_all_alarms.restype = c_int
wrtd_lib.wrtd_disable_all_alarms.errcheck = errcheck
wrtd_lib.wrtd_disable_all_alarms.argtypes = [POINTER(wrtd_dev)]
wrtd_lib.wrtd_remove_alarm.restype = c_int
wrtd_lib.wrtd_remove_alarm.errcheck = errcheck
wrtd_lib.wrtd_remove_alarm.argtypes = [POINTER(wrtd_dev), c_char_p]
wrtd_lib.wrtd_remove_all_alarms.restype = c_int
wrtd_lib.wrtd_remove_all_alarms.errcheck = errcheck
wrtd_lib.wrtd_remove_all_alarms.argtypes = [POINTER(wrtd_dev)]
wrtd_lib.wrtd_get_alarm_name.restype = c_int
wrtd_lib.wrtd_get_alarm_name.errcheck = errcheck
wrtd_lib.wrtd_get_alarm_name.argtypes = [POINTER(wrtd_dev), c_int32,
c_int32, c_char_p]
wrtd_lib.wrtd_add_rule.restype = c_int
wrtd_lib.wrtd_add_rule.errcheck = errcheck
wrtd_lib.wrtd_add_rule.argtypes = [POINTER(wrtd_dev), c_char_p]
wrtd_lib.wrtd_disable_all_rules.restype = c_int
wrtd_lib.wrtd_disable_all_rules.errcheck = errcheck
wrtd_lib.wrtd_disable_all_rules.argtypes = [POINTER(wrtd_dev)]
wrtd_lib.wrtd_remove_rule.restype = c_int
wrtd_lib.wrtd_remove_rule.errcheck = errcheck
wrtd_lib.wrtd_remove_rule.argtypes = [POINTER(wrtd_dev), c_char_p]
wrtd_lib.wrtd_remove_all_rules.restype = c_int
wrtd_lib.wrtd_remove_all_rules.errcheck = errcheck
wrtd_lib.wrtd_remove_all_rules.argtypes = [POINTER(wrtd_dev)]
wrtd_lib.wrtd_get_rule_name.restype = c_int
wrtd_lib.wrtd_get_rule_name.errcheck = errcheck
wrtd_lib.wrtd_get_rule_name.argtypes = [POINTER(wrtd_dev), c_int32,
c_int32, c_char_p]
wrtd_lib.wrtd_reset_rule_stats.restype = c_int
wrtd_lib.wrtd_reset_rule_stats.errcheck = errcheck
wrtd_lib.wrtd_reset_rule_stats.argtypes = [POINTER(wrtd_dev), c_char_p]
wrtd_lib.wrtd_get_fw_name.restype = c_int
wrtd_lib.wrtd_get_fw_name.errcheck = errcheck
wrtd_lib.wrtd_get_fw_name.argtypes = [POINTER(wrtd_dev), c_int32,
c_int32, c_char_p]
def __init__(self, node_id):
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):
if self.wrtd_p:
self.wrtd_lib.wrtd_close(self.wrtd_p)
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`.
:return: a tuple with the :ref:`Error Code <api_error_codes>` and the error message.
Corresponds to C library :cpp:func:`wrtd_get_node_id`.
"""
buf_size = self.wrtd_lib.wrtd_get_error(self.wrtd_p, None, 0, None)
error_description = create_string_buffer(buf_size)
error_c = c_int()
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')
node_id = c_uint();
PyWrtd.wrtd_lib.wrtd_get_node_id(index, byref(node_id))
return node_id.value;
def error_message(self, err_code):
def reset(self):
"""
Corresponds to C library :cpp:func:`wrtd_error_message`.
:param err_code: error code to convert
:return: error message (string)
Corresponds to C library :cpp:func:`wrtd_reset`.
"""
error_message = create_string_buffer(256)
self.wrtd_lib.wrtd_error_message(self.wrtd_p, err_code,
error_message)
return error_message.value.decode('ascii')
self.wrtd_lib.wrtd_reset(self.wrtd_p)
@encode_arguments
def set_attr_bool(self, rep_cap_id, id, value):
......@@ -553,14 +579,3 @@ class PyWrtd():
self.wrtd_lib.wrtd_get_fw_name(self.wrtd_p, index,
buf_size, name)
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):
int(ret['ns'] / 1e1) % 1000,
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):
print('')
cmd_sys_time(wrtd, args)
......@@ -279,47 +289,70 @@ def time_interval_help():
def main():
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')
parser = argparse.ArgumentParser(description='WRTD Node configuration tool')
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',
dest='command', metavar='<command>',
help='(Use "<command> -h" to get more details)')
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
cmd_parser = subparsers.add_parser('sys-info', help='Show system information')
cmd_parser.add_argument('-v', '--verbose', action='store_true',
help='Show more details')
cmd_parser = subparsers.add_parser('sys-info', help='Show system information',
parents=[devid_parse, verbose_parse])
cmd_parser.set_defaults(func=cmd_sys_info)
# 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)
# 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.set_defaults(func=cmd_set_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)
# list-rules
cmd_parser = subparsers.add_parser('list-rules', help='List all defined Rules')
cmd_parser.add_argument('-v', '--verbose', action='store_true',
help='Show details about each Rule')
cmd_parser = subparsers.add_parser('list-rules', help='List all defined Rules',
parents=[devid_parse, verbose_parse])
cmd_parser.set_defaults(func=cmd_list_rules)
# add-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')
cmd_parser = subparsers.add_parser('add-rule', help='Define a new Rule',
parents=[devid_parse, rname_parse])
cmd_parser.set_defaults(func=cmd_add_rule)
# set-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')
cmd_parser = subparsers.add_parser('set-rule', help='Configure a Rule',
parents=[devid_parse, rname_parse])
cmd_parser.add_argument('-d', '--delay', type=time_interval, default = 0,
help='Set the delay for this Rule. ' + time_interval_help())
cmd_parser.add_argument('source', help='The source Event ID for this Rule.')
......@@ -327,53 +360,53 @@ def main():
cmd_parser.set_defaults(func=cmd_set_rule)
# remove-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')
cmd_parser = subparsers.add_parser('remove-rule', help='Delete a Rule',
parents=[devid_parse, rname_parse])
cmd_parser.set_defaults(func=cmd_remove_rule)
# 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)
# enable-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')
cmd_parser = subparsers.add_parser('enable-rule', help='Enable a Rule',
parents=[devid_parse, rname_parse])
cmd_parser.set_defaults(func=cmd_enable_rule)
# disable-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')
cmd_parser = subparsers.add_parser('disable-rule', help='Disable a Rule',
parents=[devid_parse, rname_parse])
cmd_parser.set_defaults(func=cmd_disable_rule)
# 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)
# rule-info
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')
cmd_parser = subparsers.add_parser('rule-info', help='Display information about a Rule',
parents=[devid_parse, rname_parse])
cmd_parser.set_defaults(func=cmd_rule_info)
# reset-rule-stats
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')
cmd_parser = subparsers.add_parser('reset-rule-stats', help='Reset all statistics of a Rule',
parents=[devid_parse, rname_parse])
cmd_parser.set_defaults(func=cmd_reset_rule_stats)
# list-alarms
cmd_parser = subparsers.add_parser('list-alarms', help='List all defined Alarms')
cmd_parser.add_argument('-v', '--verbose', action='store_true',
help='Show details about each Alarm')
cmd_parser = subparsers.add_parser('list-alarms', help='List all defined Alarms',
parents=[devid_parse, verbose_parse])
cmd_parser.set_defaults(func=cmd_list_alarms)
# add-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')
cmd_parser = subparsers.add_parser('add-alarm', help='Define a new Alarm',
parents=[devid_parse, aname_parse])
cmd_parser.set_defaults(func=cmd_add_alarm)
# set-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')
cmd_parser = subparsers.add_parser('set-alarm', help='Configure an Alarm',
parents=[devid_parse, aname_parse])
cmd_parser.add_argument('-d', '--delay', type=time_interval, required = True,
help='Set the delay for this Alarm wrt now. ' + time_interval_help())
cmd_parser.add_argument('-s', '--setup', type=time_interval, default = 0,
......@@ -387,40 +420,42 @@ def main():
cmd_parser.set_defaults(func=cmd_set_alarm)
# remove-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')
cmd_parser = subparsers.add_parser('remove-alarm', help='Delete an Alarm',
parents=[devid_parse, aname_parse])
cmd_parser.set_defaults(func=cmd_remove_alarm)
# 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)
# enable-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')
cmd_parser = subparsers.add_parser('enable-alarm', help='Enable an Alarm',
parents=[devid_parse, aname_parse])
cmd_parser.set_defaults(func=cmd_enable_alarm)
# disable-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')
cmd_parser = subparsers.add_parser('disable-alarm', help='Disable an Alarm',
parents=[devid_parse, aname_parse])
cmd_parser.set_defaults(func=cmd_disable_alarm)
# 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)
# alarm-info
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')
cmd_parser = subparsers.add_parser('alarm-info', help='Display information about an Alarm',
parents=[devid_parse, aname_parse])
cmd_parser.set_defaults(func=cmd_alarm_info)
args = parser.parse_args()
dev = 'MT' + str(args.dev)
wrtd = PyWrtd(dev)
args.func(wrtd, args)
if (args.devid != None):
wrtd = PyWrtd(args.devid)
args.func(wrtd, args)
else:
args.func(args)
if __name__ == "__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