Merge pull request #47 from davidskeck/main
Added rough draft of watch_face script
This commit is contained in:
commit
97da35da26
@ -22,13 +22,15 @@
|
|||||||
* SOFTWARE.
|
* SOFTWARE.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
#include "<#watch_face_name#>_face.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 <#watch_face_name#>_face_setup(movement_settings_t *settings, uint8_t watch_face_index, void ** context_ptr) {
|
||||||
(void) settings;
|
(void) settings;
|
||||||
if (*context_ptr == NULL) {
|
if (*context_ptr == NULL) {
|
||||||
*context_ptr = malloc(sizeof(<#watch_face_name#>_state_t));
|
*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 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.
|
// Do any pin or peripheral setup here; this will be called whenever the watch wakes from deep sleep.
|
||||||
@ -76,7 +78,7 @@ bool <#watch_face_name#>_face_loop(movement_event_t event, movement_settings_t *
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
// return true if the watch can enter standby mode. If you are PWM'ing an LED or buzzing the buzzer nere,
|
// return true if the watch can enter standby mode. If you are PWM'ing an LED or buzzing the buzzer here,
|
||||||
// you should return false since the PWM driver does not operate in standby mode.
|
// you should return false since the PWM driver does not operate in standby mode.
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@ -87,3 +89,4 @@ void <#watch_face_name#>_face_resign(movement_settings_t *settings, void *contex
|
|||||||
|
|
||||||
// handle any cleanup before your watch face goes off-screen.
|
// handle any cleanup before your watch face goes off-screen.
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -46,3 +46,4 @@ void <#watch_face_name#>_face_resign(movement_settings_t *settings, void *contex
|
|||||||
})
|
})
|
||||||
|
|
||||||
#endif // <#WATCH_FACE_NAME#>_FACE_H_
|
#endif // <#WATCH_FACE_NAME#>_FACE_H_
|
||||||
|
|
||||||
|
95
movement/template/watch_face.py
Normal file
95
movement/template/watch_face.py
Normal file
@ -0,0 +1,95 @@
|
|||||||
|
# MIT License
|
||||||
|
#
|
||||||
|
# Copyright (c) 2022 David Keck
|
||||||
|
#
|
||||||
|
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
# of this software and associated documentation files (the "Software"), to deal
|
||||||
|
# in the Software without restriction, including without limitation the rights
|
||||||
|
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
# copies of the Software, and to permit persons to whom the Software is
|
||||||
|
# furnished to do so, subject to the following conditions:
|
||||||
|
#
|
||||||
|
# The above copyright notice and this permission notice shall be included in all
|
||||||
|
# copies or substantial portions of the Software.
|
||||||
|
#
|
||||||
|
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
# SOFTWARE.
|
||||||
|
|
||||||
|
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()
|
||||||
|
|
Loading…
x
Reference in New Issue
Block a user