Merge branch 'scripts' into extended

This commit is contained in:
Thomas Hooge 2025-08-04 12:57:57 +02:00
commit 5081f3a684
1 changed files with 168 additions and 121 deletions

View File

@ -1,46 +1,55 @@
#!/usr/bin/env python3 #!/usr/bin/env python3
# A tool to generate that part of config.json that deals with pages and fields.
#
#Usage: 1. modify this script (e.g.add a page, change number of fields, etc.)
# 2. Delete all lines from config.json from the curly backet before "name": "page1type" to o the end of the file (as of today, delete from line 917 to the end of the File)
# 3. run ./gen_set.py >> config.json
"""
A tool to generate that part of config.json that deals with pages and fields.
Usage example:
1. Delete all lines from config.json from the curly backet before
"name": "page1type" to the end of the file
2. run ./gen_set.py -d obp60 -p 10 >> config.json
TODO Better handling of default pages
"""
import os
import sys
import getopt
import re
import json import json
# List of all pages and the number of parameters they expect. __version__ = "0.2"
no_of_fields_per_page = {
"Wind": 0,
"XTETrack": 0,
"Battery2": 0,
"Battery": 0,
"BME280": 0,
"Clock": 0,
"Compass" : 0,
"DST810": 0,
"Fluid": 1,
"FourValues2": 4,
"FourValues": 4,
"Generator": 0,
"KeelPosition": 0,
"OneValue": 1,
"RollPitch": 2,
"RudderPosition": 0,
"SixValues" : 6,
"Solar": 0,
"ThreeValues": 3,
"TwoValues": 2,
"Voltage": 0,
"WhitePage": 0,
"WindPlot": 0,
"WindRose": 0,
"WindRoseFlex": 6,
}
# No changes needed beyond this point def detect_pages(filename):
# max number of pages supported by OBP60 # returns a dictionary with page name and the number of gui fields
no_of_pages = 10 pagefiles = []
with open(filename, 'r') as fh:
pattern = r'extern PageDescription\s*register(Page[^;\s]*)'
for line in fh:
if "extern PageDescription" in line:
match = re.search(pattern, line)
if match:
pagefiles.append(match.group(1))
try:
pagefiles.remove('PageSystem')
except ValueError:
pass
pagedata = {}
for pf in pagefiles:
filename = pf + ".cpp"
with open(filename, 'r') as fh:
content = fh.read()
pattern = r'PageDescription\s*?register' + pf + r'\s*\(\s*"([^"]+)".*?\n\s*(\d+)'
match = re.search(pattern, content, re.DOTALL)
if match:
pagedata[match.group(1)] = int(match.group(2))
return pagedata
def get_default_page(pageno):
# Default selection for each page # Default selection for each page
default_pages = [ default_pages = (
"Voltage", "Voltage",
"WindRose", "WindRose",
"OneValue", "OneValue",
@ -50,22 +59,30 @@ default_pages = [
"FourValues2", "FourValues2",
"Clock", "Clock",
"RollPitch", "RollPitch",
"Battery2", "Battery2"
] )
numbers = [ if pageno > len(default_pages):
"one", return "OneValue"
"two", return default_pages[pageno - 1]
"three",
"four", def number_to_text(number):
"five", if number < 0 or number > 99:
"six", raise ValueError("Only numbers from 0 to 99 are allowed.")
"seven", numbers = ("zero", "one", "two", "three", "four", "five", "six", "seven",
"eight", "eight", "nine", "ten", "eleven", "twelve", "thirteen", "fourteen",
"nine", "fifteen", "sixteen", "seventeen", "eighteen", "nineteen")
"ten", tens = ("", "", "twenty", "thirty", "forty", "fifty", "sixty", "seventy",
] "eighty", "ninety")
pages = sorted(no_of_fields_per_page.keys()) if number < 20:
max_no_of_fields_per_page = max(no_of_fields_per_page.values()) return numbers[number]
else:
q, r = divmod(number, 10)
return tens[q] + numbers[r]
def create_json(device, no_of_pages, pagedata):
pages = sorted(pagedata.keys())
max_no_of_fields_per_page = max(pagedata.values())
output = [] output = []
@ -74,11 +91,11 @@ for page_no in range(1, no_of_pages + 1):
"name": f"page{page_no}type", "name": f"page{page_no}type",
"label": "Type", "label": "Type",
"type": "list", "type": "list",
"default": default_pages[page_no - 1], "default": get_default_page(page_no),
"description": f"Type of page for page {page_no}", "description": f"Type of page for page {page_no}",
"list": pages, "list": pages,
"category": f"OBP60 Page {page_no}", "category": f"{device.upper()} Page {page_no}",
"capabilities": {"obp60": "true"}, "capabilities": {device.lower(): "true"},
"condition": [{"visiblePages": vp} for vp in range(page_no, no_of_pages + 1)], "condition": [{"visiblePages": vp} for vp in range(page_no, no_of_pages + 1)],
#"fields": [], #"fields": [],
} }
@ -90,13 +107,13 @@ for page_no in range(1, no_of_pages + 1):
"label": f"Field {field_no}", "label": f"Field {field_no}",
"type": "boatData", "type": "boatData",
"default": "", "default": "",
"description": f"The display for field {numbers[field_no - 1]}", "description": "The display for field {}".format(number_to_text(field_no)),
"category": f"OBP60 Page {page_no}", "category": f"{device.upper()} Page {page_no}",
"capabilities": {"obp60": "true"}, "capabilities": {device.lower(): "true"},
"condition": [ "condition": [
{f"page{page_no}type": page} {f"page{page_no}type": page}
for page in pages for page in pages
if no_of_fields_per_page[page] >= field_no if pagedata[page] >= field_no
], ],
} }
output.append(field_data) output.append(field_data)
@ -116,17 +133,47 @@ for page_no in range(1, no_of_pages + 1):
{"l":"Fuel Gasoline (6)","v":"6"} {"l":"Fuel Gasoline (6)","v":"6"}
], ],
"description": "Fluid type in tank", "description": "Fluid type in tank",
"category": f"OBP60 Page {page_no}", "category": f"{device.upper()} Page {page_no}",
"capabilities": { "capabilities": {
"obp60":"true" device.lower(): "true"
}, },
"condition":[{f"page{page_no}type":"Fluid"}] "condition":[{f"page{page_no}type":"Fluid"}]
} }
output.append(fluid_data) output.append(fluid_data)
json_output = json.dumps(output, indent=4) return json.dumps(output, indent=4)
# print omitting first and last line containing [ ] of JSON array
#print(json_output[1:-1]) def usage():
print("{} v{}".format(os.path.basename(__file__), __version__))
print()
print("Command line options")
print(" -d --device device name to use e.g. obp60")
print(" -p --pages number of pages to create")
print(" -h show this help")
print()
if __name__ == '__main__':
try:
options, remainder = getopt.getopt(sys.argv[1:], 'd:p:', ['device=','--pages='])
except getopt.GetoptError as err:
print(err)
usage()
sys.exit(2)
device = "obp60"
no_of_pages = 10
for opt, arg in options:
if opt in ('-d', '--device'):
device = arg
elif opt in ('-p', '--pages'):
no_of_pages = int(arg)
elif opt == '-h':
usage()
sys.exit(0)
# automatic detect pages and number of fields from sourcecode
pagedata = detect_pages("obp60task.cpp")
json_output = create_json(device, no_of_pages, pagedata)
# print omitting first line containing [ of JSON array # print omitting first line containing [ of JSON array
print(json_output[1:]) print(json_output[1:])
# print(",")