|
| 1 | +#!/usr/bin/env python3 |
| 2 | +import argparse |
| 3 | +import pathlib |
| 4 | +import re |
| 5 | +import sys |
| 6 | + |
| 7 | +def main(): |
| 8 | + parser = argparse.ArgumentParser(description="Parse settings.h and create a status printing c++ file") |
| 9 | + parser.add_argument("settings_h_file", type=str, |
| 10 | + help="path to 'settings.h' file to parse") |
| 11 | + parser.add_argument("-o", "--output", type=str, |
| 12 | + help="file to generated write c++ code into", |
| 13 | + default="-") |
| 14 | + args = parser.parse_args() |
| 15 | + |
| 16 | + with open(args.settings_h_file, encoding="utf-8") as f: |
| 17 | + settings = f.read() |
| 18 | + enum_matcher = re.compile(r"enum class ([a-zA-Z]+) : uint8_t \{[ \n]*([^}]*)\}\;") |
| 19 | + enum_matches = enum_matcher.findall(settings) |
| 20 | + |
| 21 | + # get all enums |
| 22 | + def match_to_enum(match): |
| 23 | + enum_name = match[0] |
| 24 | + entries_str = match[1] |
| 25 | + entries = [e.strip() for e in entries_str.split(",")] |
| 26 | + entries_filtered = [e.split("=")[0].strip() if "=" in e else e for e in entries if e] |
| 27 | + return (enum_name, entries_filtered) |
| 28 | + enum_list = [match_to_enum(e) for e in enum_matches] |
| 29 | + enums = {key: entries for key, entries in enum_list} |
| 30 | + print("extracted enums:") |
| 31 | + for e in enums: |
| 32 | + print(" ", e, enums[e]) |
| 33 | + print("") |
| 34 | + #print(enums) |
| 35 | + |
| 36 | + # get all Getters |
| 37 | + m_getters = re.findall(r"([a-zA-Z_0-9<>]+) ([gG]et[a-zA-Z]+)\(\) const", settings) |
| 38 | + print("extracted getter:") |
| 39 | + for m in m_getters: |
| 40 | + print(" ", m) |
| 41 | + print("") |
| 42 | + |
| 43 | + def getter_to_cpp(m_getter, enums): |
| 44 | + getter_ret, getter_call = m_getter |
| 45 | + setting_name = getter_call[3:] |
| 46 | + kwargs = { |
| 47 | + "getter_ret": getter_ret, |
| 48 | + "getter_call": getter_call, |
| 49 | + "setting_name": setting_name, |
| 50 | + } |
| 51 | + out = "" |
| 52 | + |
| 53 | + if getter_ret in enums: |
| 54 | + out += """ |
| 55 | + {{ |
| 56 | + auto {setting_name}_str = [](auto val) {{""".format(**kwargs) |
| 57 | + enum_items = enums[getter_ret] |
| 58 | + for enum_entry in enum_items: |
| 59 | + out += """ |
| 60 | + if (val == Settings::{getter_ret}::{enum_entry}) return "{enum_entry}";""".format(**kwargs, enum_entry=enum_entry) |
| 61 | + out += """ |
| 62 | + return "unknown"; |
| 63 | + }}; |
| 64 | + std::cout << "{setting_name}: " << static_cast<int>(settingsController.{getter_call}()) << " " << {setting_name}_str(settingsController.{getter_call}()) << std::endl; |
| 65 | + }}""".format(**kwargs) |
| 66 | + |
| 67 | + elif setting_name == "ClockFace": |
| 68 | + out += """ |
| 69 | + {{ |
| 70 | + auto clockface = settingsController.GetClockFace(); |
| 71 | + auto clockface_str = [](auto val) {{ |
| 72 | + if (val == 0) return "Digital"; |
| 73 | + if (val == 1) return "Analog"; |
| 74 | + if (val == 2) return "PineTimeStyle"; |
| 75 | + if (val == 3) return "Terminal"; |
| 76 | + return "unknown"; |
| 77 | + }}(clockface); |
| 78 | + std::cout << "ClockFace: " << static_cast<int>(clockface) << " " << clockface_str << std::endl; |
| 79 | + }}""".format(getter_ret=getter_ret, getter_call=getter_call, setting_name=setting_name) |
| 80 | + |
| 81 | + elif setting_name == "ScreenTimeOut": |
| 82 | + out += """ |
| 83 | + {{ |
| 84 | + {getter_ret} val = settingsController.{getter_call}(); |
| 85 | + std::cout << "{setting_name}: " << static_cast<int>(settingsController.{getter_call}()) << " ms" << std::endl; |
| 86 | + }}""".format(getter_ret=getter_ret, getter_call=getter_call, setting_name=setting_name) |
| 87 | + |
| 88 | + elif setting_name == "WakeUpModes": |
| 89 | + out += """ |
| 90 | + {{ |
| 91 | + std::cout << "WakeUpModes: " << std::endl; |
| 92 | + std::cout << "- SingleTap: " << (settingsController.isWakeUpModeOn(Settings::WakeUpMode::SingleTap) ? "ON" : "OFF") << std::endl; |
| 93 | + std::cout << "- DoubleTap: " << (settingsController.isWakeUpModeOn(Settings::WakeUpMode::DoubleTap) ? "ON" : "OFF") << std::endl; |
| 94 | + std::cout << "- RaiseWrist: " << (settingsController.isWakeUpModeOn(Settings::WakeUpMode::RaiseWrist) ? "ON" : "OFF") << std::endl; |
| 95 | + std::cout << "- Shake: " << (settingsController.isWakeUpModeOn(Settings::WakeUpMode::Shake) ? "ON" : "OFF") << std::endl; |
| 96 | + }}""".format(getter_ret=getter_ret, getter_call=getter_call, setting_name=setting_name) |
| 97 | + |
| 98 | + elif setting_name == "Brightness": |
| 99 | + # Brightness levels are stored in components/brightness/BrightnessController.h |
| 100 | + # create special handling |
| 101 | + out += """ |
| 102 | + { |
| 103 | + auto brightness = settingsController.GetBrightness(); |
| 104 | + auto brightness_str = [](auto val) { |
| 105 | + if (val == BrightnessController::Levels::Off) return "Off"; |
| 106 | + if (val == BrightnessController::Levels::Low) return "Low"; |
| 107 | + if (val == BrightnessController::Levels::Medium) return "Medium"; |
| 108 | + if (val == BrightnessController::Levels::High) return "High"; |
| 109 | + return "unknown"; |
| 110 | + }(brightness); |
| 111 | + std::cout << "Brightness: " << static_cast<int>(brightness) << " " << brightness_str << std::endl; |
| 112 | + }""" |
| 113 | + |
| 114 | + elif getter_ret == "bool": |
| 115 | + out += """ |
| 116 | + {{ |
| 117 | + {getter_ret} val = settingsController.{getter_call}(); |
| 118 | + std::cout << "{setting_name}: " << (settingsController.{getter_call}() ? "true" : "false") << std::endl; |
| 119 | + }}""".format(getter_ret=getter_ret, getter_call=getter_call, setting_name=setting_name) |
| 120 | + |
| 121 | + else: # just output non-enum entry |
| 122 | + out += """ |
| 123 | + {{ |
| 124 | + {getter_ret} val = settingsController.{getter_call}(); |
| 125 | + std::cout << "{setting_name}: " << static_cast<int>(settingsController.{getter_call}()) << std::endl; |
| 126 | + }}""".format(getter_ret=getter_ret, getter_call=getter_call, setting_name=setting_name) |
| 127 | + |
| 128 | + return out |
| 129 | + |
| 130 | + list_settings_function = """ |
| 131 | +#include <iostream> |
| 132 | +#include "components/settings/Settings.h" |
| 133 | +void list_settings(const Pinetime::Controllers::Settings &settingsController) { |
| 134 | + using namespace Pinetime::Controllers;""" |
| 135 | + for m in m_getters: |
| 136 | + list_settings_function += getter_to_cpp(m, enums) |
| 137 | + |
| 138 | + list_settings_function += """ |
| 139 | +}""" |
| 140 | + if args.output == "" or args.output == "-": |
| 141 | + print(list_settings_function) |
| 142 | + else: |
| 143 | + with open(args.output, "w", encoding="utf-8") as f: |
| 144 | + f.write(list_settings_function) |
| 145 | + return 0 |
| 146 | + |
| 147 | +if __name__ == '__main__': |
| 148 | + sys.exit(main()) |
0 commit comments