Commit 9ffb64dd authored by Dimitris Lampridis's avatar Dimitris Lampridis Committed by Dimitris Lampridis

sw: update Python wrapper to the latest C lib API

parent be058b2b
...@@ -28,13 +28,14 @@ ...@@ -28,13 +28,14 @@
`include "wrtd_rep_cap.svh" `include "wrtd_rep_cap.svh"
class WrtdAlarm extends WrtdRepCap; class WrtdAlarm extends WrtdRepCap;
protected WrtdTstamp setup_time;
protected wrtd_event ev; protected wrtd_event ev;
protected int repeat_count; protected int repeat_count;
protected uint32_t period_ns; protected uint32_t period_ns;
function new ( string name = "" ); function new ( string name = "" );
super.new ( name ); super.new ( name );
this.setup_time = new();
this.ev.ts = new(); this.ev.ts = new();
this.ev.id = new(); this.ev.id = new();
clear(); clear();
...@@ -42,6 +43,7 @@ class WrtdAlarm extends WrtdRepCap; ...@@ -42,6 +43,7 @@ class WrtdAlarm extends WrtdRepCap;
function void clear ( ); function void clear ( );
super.clear(); super.clear();
this.setup_time.zero();
this.ev.ts.zero(); this.ev.ts.zero();
this.ev.id.clear(); this.ev.id.clear();
this.ev.seq = 0; this.ev.seq = 0;
...@@ -52,24 +54,26 @@ class WrtdAlarm extends WrtdRepCap; ...@@ -52,24 +54,26 @@ class WrtdAlarm extends WrtdRepCap;
function wrtd_data data_pack ( ); function wrtd_data data_pack ( );
wrtd_data ret = new[`WRTD_ALRM_WORD_SIZE]; wrtd_data ret = new[`WRTD_ALRM_WORD_SIZE];
ret[0:2] = this.ev.ts.data_pack(); ret[0:2] = this.setup_time.data_pack();
ret[3:6] = this.ev.id.data_pack(); ret[3:5] = this.ev.ts.data_pack();
ret[7] = this.ev.seq; ret[6:9] = this.ev.id.data_pack();
ret[8] = this.ev.flags; ret[10] = this.ev.seq;
ret[9] = this.enabled; ret[11] = this.ev.flags;
ret[10] = this.repeat_count; ret[12] = this.enabled;
ret[11] = this.period_ns; ret[13] = this.repeat_count;
ret[14] = this.period_ns;
return ret; return ret;
endfunction // data_pack endfunction // data_pack
function void data_unpack ( wrtd_data data ); function void data_unpack ( wrtd_data data );
this.ev.ts.data_unpack ( data[0:2] ); this.setup_time.data_unpack ( data[0:2] );
this.ev.id.data_unpack ( data[3:6] ); this.ev.ts.data_unpack ( data[3:5] );
this.ev.seq = data[7]; this.ev.id.data_unpack ( data[6:9] );
this.ev.flags = data[8]; this.ev.seq = data[10];
this.enabled = data[9]; this.ev.flags = data[11];
this.repeat_count = data[10]; this.enabled = data[12];
this.period_ns = data[11]; this.repeat_count = data[13];
this.period_ns = data[14];
endfunction // data_unpack endfunction // data_unpack
endclass //WrtdAlarm endclass //WrtdAlarm
......
...@@ -38,7 +38,7 @@ ...@@ -38,7 +38,7 @@
`define WRTD_CFG_MSG_WORD_SIZE 5 `define WRTD_CFG_MSG_WORD_SIZE 5
`define WRTD_ROOT_WORD_SIZE 12 `define WRTD_ROOT_WORD_SIZE 12
`define WRTD_RULE_WORD_SIZE 43 `define WRTD_RULE_WORD_SIZE 43
`define WRTD_ALRM_WORD_SIZE 12 `define WRTD_ALRM_WORD_SIZE 15
`define WRTD_DEST_CPU_LOCAL 'hfe `define WRTD_DEST_CPU_LOCAL 'hfe
`define WRTD_DEST_CH_NET 'hff `define WRTD_DEST_CH_NET 'hff
......
...@@ -591,7 +591,7 @@ static void wrtd_alarms(void) ...@@ -591,7 +591,7 @@ static void wrtd_alarms(void)
if (!al->enabled) if (!al->enabled)
continue; continue;
if (ts_cmp(&al->event.ts, &now) > 0) if (ts_cmp(&al->setup_time, &now) > 0)
continue; continue;
wrtd_log(WRTD_LOG_MSG_EV_GENERATED, WRTD_LOG_GENERATED_ALARM, wrtd_log(WRTD_LOG_MSG_EV_GENERATED, WRTD_LOG_GENERATED_ALARM,
...@@ -613,6 +613,7 @@ static void wrtd_alarms(void) ...@@ -613,6 +613,7 @@ static void wrtd_alarms(void)
al->enabled = 0; al->enabled = 0;
continue; continue;
} }
ts_add2_ns(&al->setup_time, al->period_ns);
ts_add2_ns(&al->event.ts, al->period_ns); ts_add2_ns(&al->event.ts, al->period_ns);
} }
} }
......
...@@ -116,6 +116,9 @@ struct wrtd_rule { ...@@ -116,6 +116,9 @@ struct wrtd_rule {
}; };
struct wrtd_alarm { struct wrtd_alarm {
/* Time when to generate the event. */
struct wrtd_tstamp setup_time;
/* Next time and id. */ /* Next time and id. */
struct wrtd_event event; struct wrtd_event event;
......
This diff is collapsed.
-include Makefile.specific
all:
clean:
install:
python setup.py install
.PHONY: all clean install
This diff is collapsed.
"""
@package docstring
@copyright: Copyright (c) 2019 CERN (home.cern)
SPDX-License-Identifier: LGPL-3.0-or-later
"""
#!/usr/bin/env python
from distutils.core import setup
setup(name='PyWrtd',
version='1.0',
description='Python wrapper for WRTD',
author='Milosz Malczak',
author_email='milosz.malczak@cern.ch',
maintainer="Dimitris Lampridis",
maintainer_email="dimitris.lampridis@cern.ch",
url='http://www.ohwr.org/projects/wrtd',
packages=['PyWrtd'],
license='LGPLv3',
)
...@@ -72,6 +72,42 @@ enum wrtd_status wrtd_attr_get_alarm_period(struct wrtd_dev *wrtd, ...@@ -72,6 +72,42 @@ enum wrtd_status wrtd_attr_get_alarm_period(struct wrtd_dev *wrtd,
return WRTD_SUCCESS; return WRTD_SUCCESS;
} }
enum wrtd_status wrtd_attr_set_alarm_setup_time(struct wrtd_dev *wrtd,
const char *rep_cap_id,
const struct wrtd_tstamp *value)
{
enum wrtd_status status;
unsigned int idx;
status = wrtd_find_alarm(wrtd, rep_cap_id, &idx, __func__);
WRTD_RETURN_IF_ERROR(status);
status = wrtd_alarm_check_disabled(wrtd, idx, __func__);
WRTD_RETURN_IF_ERROR(status);
wrtd->alarms[idx].alarm.setup_time = *value;
status = wrtd_write_alarm(wrtd, idx, __func__);
WRTD_RETURN_IF_ERROR(status);
return WRTD_SUCCESS;
}
enum wrtd_status wrtd_attr_get_alarm_setup_time(struct wrtd_dev *wrtd,
const char *rep_cap_id,
struct wrtd_tstamp *value)
{
enum wrtd_status status;
unsigned int idx;
status = wrtd_find_alarm(wrtd, rep_cap_id, &idx, __func__);
WRTD_RETURN_IF_ERROR(status);
*value = wrtd->alarms[idx].alarm.setup_time;
return WRTD_SUCCESS;
}
enum wrtd_status wrtd_attr_set_alarm_time(struct wrtd_dev *wrtd, enum wrtd_status wrtd_attr_set_alarm_time(struct wrtd_dev *wrtd,
const char *rep_cap_id, const char *rep_cap_id,
const struct wrtd_tstamp *value) const struct wrtd_tstamp *value)
......
...@@ -172,6 +172,12 @@ enum wrtd_status wrtd_attr_set_alarm_period(struct wrtd_dev *wrtd, ...@@ -172,6 +172,12 @@ enum wrtd_status wrtd_attr_set_alarm_period(struct wrtd_dev *wrtd,
enum wrtd_status wrtd_attr_get_alarm_period(struct wrtd_dev *wrtd, enum wrtd_status wrtd_attr_get_alarm_period(struct wrtd_dev *wrtd,
const char *rep_cap_id, const char *rep_cap_id,
struct wrtd_tstamp *value); struct wrtd_tstamp *value);
enum wrtd_status wrtd_attr_set_alarm_setup_time(struct wrtd_dev *wrtd,
const char *rep_cap_id,
const struct wrtd_tstamp *value);
enum wrtd_status wrtd_attr_get_alarm_setup_time(struct wrtd_dev *wrtd,
const char *rep_cap_id,
struct wrtd_tstamp *value);
enum wrtd_status wrtd_attr_set_alarm_time(struct wrtd_dev *wrtd, enum wrtd_status wrtd_attr_set_alarm_time(struct wrtd_dev *wrtd,
const char *rep_cap_id, const char *rep_cap_id,
const struct wrtd_tstamp *value); const struct wrtd_tstamp *value);
......
...@@ -188,7 +188,7 @@ wrtd_status wrtd_get_error(wrtd_dev *wrtd, ...@@ -188,7 +188,7 @@ wrtd_status wrtd_get_error(wrtd_dev *wrtd,
WRTD_RETURN_IF_ERROR(status); WRTD_RETURN_IF_ERROR(status);
int required_buffer_size = int required_buffer_size =
strlen(error_message) + strlen(wrtd->error_msg) + 1; strlen(error_message) + strlen(wrtd->error_msg) + 2;
/* If buffer_size is zero, just report on necessary /* If buffer_size is zero, just report on necessary
buffer size. According to IVI-3.2, section 3.1.2.1. */ buffer size. According to IVI-3.2, section 3.1.2.1. */
...@@ -744,6 +744,9 @@ wrtd_status wrtd_set_attr_tstamp(wrtd_dev *wrtd, ...@@ -744,6 +744,9 @@ wrtd_status wrtd_set_attr_tstamp(wrtd_dev *wrtd,
case WRTD_ATTR_ALARM_TIME: case WRTD_ATTR_ALARM_TIME:
return wrtd_attr_set_alarm_time return wrtd_attr_set_alarm_time
(wrtd, rep_cap_id, value); (wrtd, rep_cap_id, value);
case WRTD_ATTR_ALARM_SETUP_TIME:
return wrtd_attr_set_alarm_setup_time
(wrtd, rep_cap_id, value);
case WRTD_ATTR_ALARM_PERIOD: case WRTD_ATTR_ALARM_PERIOD:
return wrtd_attr_set_alarm_period return wrtd_attr_set_alarm_period
(wrtd, rep_cap_id, value); (wrtd, rep_cap_id, value);
...@@ -816,6 +819,9 @@ wrtd_status wrtd_get_attr_tstamp(wrtd_dev *wrtd, ...@@ -816,6 +819,9 @@ wrtd_status wrtd_get_attr_tstamp(wrtd_dev *wrtd,
case WRTD_ATTR_ALARM_TIME: case WRTD_ATTR_ALARM_TIME:
return wrtd_attr_get_alarm_time return wrtd_attr_get_alarm_time
(wrtd, rep_cap_id, value); (wrtd, rep_cap_id, value);
case WRTD_ATTR_ALARM_SETUP_TIME:
return wrtd_attr_get_alarm_setup_time
(wrtd, rep_cap_id, value);
case WRTD_ATTR_ALARM_PERIOD: case WRTD_ATTR_ALARM_PERIOD:
return wrtd_attr_get_alarm_period return wrtd_attr_get_alarm_period
(wrtd, rep_cap_id, value); (wrtd, rep_cap_id, value);
......
...@@ -132,14 +132,18 @@ typedef enum wrtd_attr { ...@@ -132,14 +132,18 @@ typedef enum wrtd_attr {
WRTD_ATTR_ALARM_COUNT = __WRTD_ATTR_BASE + 0x10, WRTD_ATTR_ALARM_COUNT = __WRTD_ATTR_BASE + 0x10,
/** `RW` `bool` `local` Enable/disable an Alarm. */ /** `RW` `bool` `local` Enable/disable an Alarm. */
WRTD_ATTR_ALARM_ENABLED = __WRTD_ATTR_BASE + 0x11, WRTD_ATTR_ALARM_ENABLED = __WRTD_ATTR_BASE + 0x11,
/** `RW` `tstamp` `local` Specifies at what time to send an Alarm event. This is
typically set to a moment earlier than #WRTD_ATTR_ALARM_TIME, to allow for
the event to reach its destination(s) before the #WRTD_ATTR_ALARM_TIME moment. */
WRTD_ATTR_ALARM_SETUP_TIME = __WRTD_ATTR_BASE + 0x12,
/** `RW` `tstamp` `local` Specifies at what time to trigger an Alarm. */ /** `RW` `tstamp` `local` Specifies at what time to trigger an Alarm. */
WRTD_ATTR_ALARM_TIME = __WRTD_ATTR_BASE + 0x12, WRTD_ATTR_ALARM_TIME = __WRTD_ATTR_BASE + 0x13,
/** `RW` `tstamp` `local` Specifies the Alarm period. 0 means no repetitions. */ /** `RW` `tstamp` `local` Specifies the Alarm period. 0 means no repetitions. */
WRTD_ATTR_ALARM_PERIOD = __WRTD_ATTR_BASE + 0x13, WRTD_ATTR_ALARM_PERIOD = __WRTD_ATTR_BASE + 0x14,
/** `RW` `int32` `local` Specifies the number of times an Alarm will occur at the /** `RW` `int32` `local` Specifies the number of times an Alarm will occur at the
period specified by #WRTD_ATTR_ALARM_PERIOD, before becoming automatically disabled. period specified by #WRTD_ATTR_ALARM_PERIOD, before becoming automatically disabled.
0 means infinite repetitions. When read, it returns the remaining repetitions. */ 0 means infinite repetitions. When read, it returns the remaining repetitions. */
WRTD_ATTR_ALARM_REPEAT_COUNT = __WRTD_ATTR_BASE + 0x14, WRTD_ATTR_ALARM_REPEAT_COUNT = __WRTD_ATTR_BASE + 0x15,
/** `RO` `int32` `global` Number of defined Rules. */ /** `RO` `int32` `global` Number of defined Rules. */
WRTD_ATTR_RULE_COUNT = __WRTD_ATTR_BASE + 0x20, WRTD_ATTR_RULE_COUNT = __WRTD_ATTR_BASE + 0x20,
...@@ -225,7 +229,7 @@ typedef enum wrtd_attr { ...@@ -225,7 +229,7 @@ typedef enum wrtd_attr {
#define WRTD_GLOBAL_REP_CAP_ID "WGRCI" #define WRTD_GLOBAL_REP_CAP_ID "WGRCI"
/** Size (in characters, including null termination) of an event log enty. */ /** Size (in characters, including null termination) of an event log enty. */
#define WRTD_LOG_ENTRY_SIZE 116 #define WRTD_LOG_ENTRY_SIZE 120
/* ------------------------------------------------------------------- */ /* ------------------------------------------------------------------- */
/* Function prototypes for the official WRTD API. Documented in wrtd.c */ /* Function prototypes for the official WRTD API. Documented in wrtd.c */
......
import argparse
import re
from PyWrtd import *
def cmd_sys_time(wrtd, args):
print(wrtd.get_attr_string(wrtd.WRTD_GLOBAL_REP_CAP_ID,
wrtd.WRTD_ATTR_SYS_TIME))
def cmd_set_log(wrtd, args):
print(args)
def cmd_clear_log(wrtd, args):
print(args)
def cmd_list_rules(wrtd, args):
print(args)
def cmd_add_rule(wrtd, args):
print(args)
def cmd_set_rule(wrtd, args):
print(args)
def cmd_remove_rule(wrtd, args):
print(args)
def cmd_remove_all_rules(wrtd, args):
print(args)
def cmd_enable_rule(wrtd, args):
print(args)
def cmd_disable_rule(wrtd, args):
print(args)
def cmd_disable_all_rules(wrtd, args):
print(args)
def cmd_rule_info(wrtd, args):
print(args)
def cmd_reset_rule_stats(wrtd, args):
print(args)
def cmd_list_alarms(wrtd, args):
print(args)
def cmd_add_alarm(wrtd, args):
print(args)
def cmd_set_alarm(wrtd, args):
print(args)
def cmd_remove_alarm(wrtd, args):
print(args)
def cmd_remove_all_alarms(wrtd, args):
print(args)
def cmd_enable_alarm(wrtd, args):
print(args)
def cmd_disable_alarm(wrtd, args):
print(args)
def cmd_disable_all_alarms(wrtd, args):
print(args)
def cmd_alarm_info(wrtd, args):
print(args)
def time_interval(string):
m = re.match('\A([0-9]+)([pnums]?)\Z', string)
if m == None:
msg = "%r is not a valid time interval specification" % string
raise argparse.ArgumentTypeError(msg)
mult = {
'p': 1e1,
'n': 1e3,
'u': 1e6,
'm': 1e9,
's': 1e12,
}
return int(m.group(1)) * int(mult[m.group(2)])
def time_interval_help():
return """Default unit is ps, but an 'n','u','m' or 's' can be appended \
to the value to set it to nano, micro, milli or full seconds"""
def main():
parser = argparse.ArgumentParser(description='WRTD node configuration tool')
parser.add_argument('-D', '--dev-id', dest='dev', required=True, type=int,
help='MockTurtle device ID (integer) to open')
subparsers = parser.add_subparsers(title='Available commands',
dest='command', metavar='<command>',
help='(Use "<command> -h" to get more details)')
subparsers.required = True;
# sys-time
cmd_parser = subparsers.add_parser('sys-time', help='Show current system time')
cmd_parser.set_defaults(func=cmd_sys_time)
# set-log
cmd_parser = subparsers.add_parser('set-log', help='Enable/Disable logging')
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.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.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.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.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.')
cmd_parser.add_argument('destination', help='The destination Event ID for this Rule.')
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.set_defaults(func=cmd_remove_rule)
# remove-all-rules
cmd_parser = subparsers.add_parser('remove-all-rules', help='Delete all Rules')
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.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.set_defaults(func=cmd_disable_rule)
# disable-all-rules
cmd_parser = subparsers.add_parser('disable-all-rules', help='Disable all Rules')
cmd_parser.set_defaults(func=cmd_remove_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.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.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.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.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.add_argument('-d', '--delay', type=time_interval, default = 0,
help='Set the delay for this Alarm. ' + time_interval_help())
cmd_parser.add_argument('-s', '--setup', type=time_interval, default = 0,
help='Set the setup time for this Alarm. ' + time_interval_help())
cmd_parser.add_argument('-p', '--period', type=time_interval, default = 0,
help='Set the period for this Alarm. ' + time_interval_help())
cmd_parser.add_argument('-c', '--count', type=int, default = 0,
help='Set the repeat count for this Alarm')
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.set_defaults(func=cmd_remove_alarm)
# remove-all-alarms
cmd_parser = subparsers.add_parser('remove-all-alarms', help='Delete all Alarms')
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.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.set_defaults(func=cmd_disable_alarm)
# disable-all-alarms
cmd_parser = subparsers.add_parser('disable-all-alarms', help='Disable all Alarms')
cmd_parser.set_defaults(func=cmd_remove_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.set_defaults(func=cmd_alarm_info)
args = parser.parse_args()
dev = 'MT' + str(args.dev)
wrtd = PyWrtd(dev)
args.func(wrtd, 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