]> git.earman.xyz Git - sensor-watch.git/commitdiff
Added rough draft of watch_face script to generate custom watch faces from template...
authorDavid Keck <davidskeck@fastmail.com>
Wed, 26 Jan 2022 23:59:48 +0000 (18:59 -0500)
committerDavid Keck <davidskeck@fastmail.com>
Wed, 26 Jan 2022 23:59:48 +0000 (18:59 -0500)
movement/template/template.c
movement/template/watch_face.py [new file with mode: 0644]

index 3f60be97790c3de6e63b039f91e0fec8d96682bb..34c6dbf53b857d4404af779f199dba557b0c831c 100644 (file)
  * SOFTWARE.
  */
 
+#include <stdlib.h>
+#include <string.h>
 #include "<#watch_face_name#>_face.h"
 
 void <#watch_face_name#>_face_setup(movement_settings_t *settings, uint8_t watch_face_index, void ** context_ptr) {
     (void) settings;
     if (*context_ptr == NULL) {
         *context_ptr = malloc(sizeof(<#watch_face_name#>_state_t));
-        memset(*context_ptr, 0, sizeof(<#watch_face_name#>));
+        memset(*context_ptr, 0, sizeof(<#watch_face_name#>_state_t));
         // Do any one-time tasks in here; the inside of this conditional happens only at boot.
     }
     // Do any pin or peripheral setup here; this will be called whenever the watch wakes from deep sleep.
diff --git a/movement/template/watch_face.py b/movement/template/watch_face.py
new file mode 100644 (file)
index 0000000..673e1f1
--- /dev/null
@@ -0,0 +1,73 @@
+import os
+import re
+import argparse
+
+
+MAKEFILE_INDICATOR = "# New watch faces go above this line.\n"
+INCLUDE_INDICATOR = "// New includes go above this line.\n"
+
+
+def replace_placeholders(contents, args):
+    modified_contents = contents.replace("<#WATCH_FACE_NAME#>", args.watch_face_name.upper())
+    modified_contents = modified_contents.replace("<#watch_face_name#>", args.watch_face_name)
+    if args.author_name:
+        modified_contents = modified_contents.replace("<#author_name#>", " ".join(args.author_name))
+    if args.year:
+        modified_contents = modified_contents.replace("<#year#>", args.year)
+
+    return modified_contents
+
+
+def write_output_file(args, file_type, output_dir):
+    with open(f"template.{file_type}", 'r') as file_template:
+        file_contents = file_template.read()
+    modified_template = replace_placeholders(file_contents, args)
+    file_path = f"{output_dir}{args.watch_face_name}_face.{file_type}"
+    if not os.path.exists(file_path):
+        with open(file_path, 'w') as output_file:
+            output_file.write(modified_template)
+    else:
+        print(f"Generation failed: the watch face \"{args.watch_face_name}\" already exists at {file_path}. Unable to generate new files. Exiting...")
+        exit(0)
+
+
+def write_include_file(file_path, file_type, indicator_line, line_to_insert):
+    with open(file_path, 'r+') as include_file:
+        include_contents = include_file.readlines()
+        if line_to_insert in include_contents:
+            print(f"Generation failed: {file_path} already has an entry for {line_to_insert.strip()}. Unable to generate new files. Exiting...")
+            exit(0)
+        new_face_index = include_contents.index(indicator_line)
+        include_contents.insert(new_face_index, line_to_insert)
+        include_file.seek(0)
+        include_file.writelines(include_contents)
+
+def main():
+    parser = argparse.ArgumentParser(description="Create a new watch face.")
+    parser.add_argument("watch_face_type", metavar="face_type", type=str, choices=["complication", "clock"], help="The type of watch face to create, either \"complication\" or \"clock\"")
+    parser.add_argument("watch_face_name", metavar="face_name", type=str, help="The name of the watch face")
+    parser.add_argument("--author_name", metavar="author_name", type=str, nargs='*', help="The name of the author")
+    parser.add_argument("--year", metavar="year", type=str, help="The copyright year")
+
+    args = parser.parse_args()
+    
+    name_valid = re.fullmatch(r'[a-zA-Z_][a-zA-Z0-9_]*', args.watch_face_name)
+    if name_valid == None:
+        print(f"Generation failed: {args.watch_face_name} is not a valid C variable name. Exiting...")
+        exit(0)
+    
+    line_to_insert = f"#include \"{args.watch_face_name}_face.h\"\n"
+    write_include_file(f"..{os.sep}movement_faces.h", "h", INCLUDE_INDICATOR, line_to_insert)
+   
+    line_to_insert = f"  ..{os.sep}watch_faces{os.sep}{args.watch_face_type}{os.sep}{args.watch_face_name}_face.c \\\n"
+    write_include_file(f"..{os.sep}make{os.sep}Makefile", "c", MAKEFILE_INDICATOR, line_to_insert)
+    
+    output_dir = f"..{os.sep}watch_faces{os.sep}{args.watch_face_type}{os.sep}"
+    write_output_file(args, "h", output_dir)
+    write_output_file(args, "c", output_dir)
+
+
+if __name__ == "__main__":
+    main()
+