2021-11-05 18:25:50 +00:00
|
|
|
import re
|
|
|
|
import sys
|
|
|
|
|
|
|
|
lv_module_file = "lv_gpio_enum.h"
|
|
|
|
|
|
|
|
out_prefix = "../../tasmota/berry/include/"
|
|
|
|
|
|
|
|
be_gpio_defines = "be_gpio_defines.h"
|
|
|
|
|
|
|
|
lv_module = []
|
|
|
|
|
|
|
|
def try_int(s):
|
|
|
|
try:
|
|
|
|
v = int(s)
|
|
|
|
return v
|
|
|
|
except ValueError:
|
|
|
|
return None
|
|
|
|
|
|
|
|
# parse module file containing numerical constants
|
|
|
|
with open(lv_module_file) as f:
|
|
|
|
for l_raw in f:
|
|
|
|
l_raw = l_raw.strip(" \t\n\r") # remove leading or trailing spaces
|
|
|
|
if l_raw.startswith("//"):
|
|
|
|
lv_module.append( [ None, l_raw ] ) # if key in None then add comment line
|
2024-04-24 18:53:01 +01:00
|
|
|
l_raw = re.sub(r'//.*$', '', l_raw) # remove trailing comments
|
|
|
|
l_raw = re.sub(r'\s+', '', l_raw) # remove all spaces
|
|
|
|
l_raw = re.sub(r',.*$', '', l_raw) # remove comma and anything after it
|
2021-11-05 18:25:50 +00:00
|
|
|
if (len(l_raw) == 0): continue
|
|
|
|
|
|
|
|
k_v = l_raw.split("=")
|
|
|
|
if len(k_v) > 2:
|
|
|
|
print(f"Error: cannot match {l_raw}")
|
|
|
|
continue
|
|
|
|
# extract the key name
|
|
|
|
k = k_v[0]
|
|
|
|
if k.startswith("_"):
|
|
|
|
continue # skip any label starting with '_'
|
2024-04-24 18:53:01 +01:00
|
|
|
k = re.sub(r'^LV_', '', k) # remove remove any LV_ prefix
|
2021-11-05 18:25:50 +00:00
|
|
|
v = None
|
|
|
|
if len(k_v) == 2: # value is included
|
|
|
|
v = k_v[1]
|
|
|
|
if k is None or v is None: continue # we skip if key is void or value is void
|
|
|
|
|
|
|
|
if not k.isidentifier():
|
|
|
|
print(f"Error: {k} is not an identifier")
|
|
|
|
continue
|
|
|
|
|
|
|
|
lv_module.append( [k, v] ) # keep as string or None
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
sys.stdout = open(out_prefix + be_gpio_defines, 'w')
|
|
|
|
print("/********************************************************************")
|
|
|
|
print(" * Generated code, don't edit")
|
2024-04-24 18:53:01 +01:00
|
|
|
print(" * ")
|
|
|
|
print(" * The keys in the array belox must be in lexicographic order")
|
|
|
|
print(" * ")
|
|
|
|
print(" * Generated by: `python3 gpio_convert.py`")
|
2021-11-05 18:25:50 +00:00
|
|
|
print(" *******************************************************************/")
|
|
|
|
|
|
|
|
print("""
|
2021-12-17 18:41:36 +00:00
|
|
|
const be_const_member_t lv_gpio_constants[] = {
|
2021-11-05 18:25:50 +00:00
|
|
|
""")
|
|
|
|
|
|
|
|
lv_module2 = {}
|
|
|
|
for k_v in lv_module:
|
|
|
|
(k,v) = k_v
|
|
|
|
if k is not None:
|
|
|
|
lv_module2[k] = v
|
|
|
|
|
|
|
|
# print the enums, symbols and functions
|
|
|
|
# Ex: { "ALIGN_BOTTOM_LEFT", LV_ALIGN_BOTTOM_LEFT },
|
|
|
|
#
|
|
|
|
# Encoding:
|
|
|
|
# 1. `COLOR_WHITE=0xFFFFFF` enum with explicit value
|
|
|
|
# 2. `LV_EVENT_ALL` enum with implicit value with same name resolved by C compiler
|
|
|
|
# 3. `$SYMBOL_OK="\xef\x80\x8c"` if starts with `$` then it's a string
|
|
|
|
# 4. `&seg7_font=lv0_load_seg7_font` if starts with `&` then it's a native function
|
|
|
|
#
|
|
|
|
# We need to sort ignoring the first char if it's not a letter
|
|
|
|
for k in sorted(lv_module2):
|
|
|
|
v = lv_module2[k]
|
|
|
|
# check the type of the value
|
|
|
|
# if first char is '"' then it's a string and prefix with '$'
|
|
|
|
# if first char is '&' then it's a function and prefix with '&'
|
|
|
|
# if no value, then it's an enum, prefix with `LV_`
|
|
|
|
# otherwise it's an int, leave if unchanged
|
|
|
|
if v is not None:
|
|
|
|
v_prefix = ""
|
|
|
|
if v[0] == '"': v_prefix = "$"
|
|
|
|
if v[0] == '&': v_prefix = "&"
|
|
|
|
print(f" {{ \"{v_prefix}{k}\", (int32_t) {v} }},")
|
|
|
|
else:
|
|
|
|
print(f" {{ \"{k}\", {k} }},")
|
|
|
|
|
|
|
|
print("""
|
|
|
|
};
|
|
|
|
|
|
|
|
const size_t lv_gpio_constants_size = sizeof(lv_gpio_constants)/sizeof(lv_gpio_constants[0]);
|
|
|
|
""")
|
|
|
|
|
|
|
|
print("/********************************************************************/")
|
|
|
|
sys.stdout.close()
|
|
|
|
|