Skip to content
Projects
Groups
Snippets
Help
Loading...
Sign in
Toggle navigation
W
White Rabbit Trigger Distribution
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
Wiki
Wiki
image/svg+xml
Discourse
Discourse
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Commits
Issue Boards
Open sidebar
Projects
White Rabbit Trigger Distribution
Commits
e5af8581
Commit
e5af8581
authored
Sep 13, 2019
by
Dimitris Lampridis
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
[sw] add functions to detect MT IDs and rework config tool
parent
49057cee
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
363 additions
and
253 deletions
+363
-253
mock-turtle
dependencies/mock-turtle
+1
-1
libwrtd.c
software/lib/libwrtd.c
+84
-28
libwrtd.h
software/lib/libwrtd.h
+5
-1
PyWrtd.py
software/lib/python/PyWrtd.py
+187
-172
wrtd-config.py
software/tools/wrtd-config.py
+86
-51
No files found.
mock-turtle
@
add8319c
Subproject commit
b07df87ad36d963beb7d7596b3dffa4221d6bd58
Subproject commit
add8319c68770cd2dac9c10842aad8487aeb1717
software/lib/libwrtd.c
View file @
e5af8581
...
...
@@ -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
;
...
...
software/lib/libwrtd.h
View file @
e5af8581
...
...
@@ -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
);
...
...
software/lib/python/PyWrtd.py
View file @
e5af8581
...
...
@@ -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_
rese
t`.
Corresponds to C library :cpp:func:`wrtd_
get_node_coun
t`.
"""
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
software/tools/wrtd-config.py
View file @
e5af8581
...
...
@@ -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
()
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment