From 89c99b50e21be3f06ee95c318115d126ac73f09a Mon Sep 17 00:00:00 2001 From: ml Date: Sun, 21 Jun 2026 19:15:19 +0200 Subject: [PATCH] Add screen mirroring, watch input, splash screen, and architecture docs Mirrors the C64 text screen to the Pebble watch (with game-specific umlaut handling), adds a SELECT-triggered key wheel for sending navigation input back to the emulator, shows a splash screen on watch launch, and documents the resulting end-to-end architecture. --- .../C64Engine.kt | 3 + .../MainActivity.kt | 39 ++- .../app/src/main/jni/vice_jni.c | 60 ++++ SchwertUndMagieOnPebbleWatchApp/package.json | 11 +- .../res/app-icon.png | Bin .../resources/splash.png | Bin 0 -> 92424 bytes .../src/c/SchwertUndMagieOnPebbleFrontend.c | 204 +++++++++++--- .../src/pkjs/index.js | 11 +- architecture.md | 259 ++++++++++++++++++ 9 files changed, 545 insertions(+), 42 deletions(-) rename {SchwertUndMagieOnPebbleCompanionApp => SchwertUndMagieOnPebbleWatchApp}/res/app-icon.png (100%) create mode 100644 SchwertUndMagieOnPebbleWatchApp/resources/splash.png create mode 100644 architecture.md diff --git a/SchwertUndMagieOnPebbleCompanionApp/app/src/main/java/de/ladkau/schwertundmagieonpebblecompanionapp/C64Engine.kt b/SchwertUndMagieOnPebbleCompanionApp/app/src/main/java/de/ladkau/schwertundmagieonpebblecompanionapp/C64Engine.kt index 97b5502..bd31e3f 100644 --- a/SchwertUndMagieOnPebbleCompanionApp/app/src/main/java/de/ladkau/schwertundmagieonpebblecompanionapp/C64Engine.kt +++ b/SchwertUndMagieOnPebbleCompanionApp/app/src/main/java/de/ladkau/schwertundmagieonpebblecompanionapp/C64Engine.kt @@ -58,6 +58,9 @@ class C64Engine { /** Monotonically increasing frame counter — incremented once per rendered C64 frame. */ external fun getFrameCount(): Int + /** Current 40x25 C64 text screen as ASCII, rows separated by '\n'. */ + external fun getScreenText(): String + companion object { init { System.loadLibrary("vice_jni") } diff --git a/SchwertUndMagieOnPebbleCompanionApp/app/src/main/java/de/ladkau/schwertundmagieonpebblecompanionapp/MainActivity.kt b/SchwertUndMagieOnPebbleCompanionApp/app/src/main/java/de/ladkau/schwertundmagieonpebblecompanionapp/MainActivity.kt index 4b0c816..8772535 100644 --- a/SchwertUndMagieOnPebbleCompanionApp/app/src/main/java/de/ladkau/schwertundmagieonpebblecompanionapp/MainActivity.kt +++ b/SchwertUndMagieOnPebbleCompanionApp/app/src/main/java/de/ladkau/schwertundmagieonpebblecompanionapp/MainActivity.kt @@ -29,6 +29,7 @@ import androidx.core.view.ViewCompat import androidx.core.view.WindowInsetsCompat import androidx.drawerlayout.widget.DrawerLayout import fi.iki.elonen.NanoHTTPD +import org.json.JSONObject import java.io.File import java.text.SimpleDateFormat import java.util.Date @@ -292,6 +293,33 @@ class MainActivity : AppCompatActivity() { } } + // ---- watch key wheel ------------------------------------------------ + + // Labels sent by the watch's SELECT key wheel (see k_wheel_items in + // SchwertUndMagieOnPebbleFrontend.c) — movement in this game is mostly + // done with number keys, plus RETURN/SPACE to confirm. + private val watchKeyMap: Map> = mapOf( + "1" to listOf(C64Engine.KEY_1), "2" to listOf(C64Engine.KEY_2), + "3" to listOf(C64Engine.KEY_3), "4" to listOf(C64Engine.KEY_4), + "5" to listOf(C64Engine.KEY_5), "6" to listOf(C64Engine.KEY_6), + "7" to listOf(C64Engine.KEY_7), "8" to listOf(C64Engine.KEY_8), + "9" to listOf(C64Engine.KEY_9), "0" to listOf(C64Engine.KEY_0), + "RETURN" to listOf(C64Engine.KEY_RETURN), + "SPACE" to listOf(C64Engine.KEY_SPACE), + ) + + // Pulses a key press+release in response to a watch wheel selection. + // The companion HTTP server calls this off the main thread, so the + // release is posted via mainHandler like the rest of this class's + // cross-thread UI/engine touchpoints. + private fun injectWatchKey(label: String) { + val codes = watchKeyMap[label] ?: return + for (code in codes) engine.injectKey(code, true) + mainHandler.postDelayed({ + for (code in codes) engine.injectKey(code, false) + }, 80) + } + // ---- HTTP server (watch bridge) ----------------------------------------- private fun startHttpServer() { @@ -300,7 +328,9 @@ class MainActivity : AppCompatActivity() { onKey = { cmd -> Log.d(TAG, "Watch key: $cmd") mainHandler.post { appendLog("WATCH: $cmd") } - } + injectWatchKey(cmd) + }, + getScreenText = { engine.getScreenText() } ) try { server?.start() @@ -827,7 +857,8 @@ class CompanionServer( port: Int, private val timeFormat: SimpleDateFormat, private val onTimeFetched: (String) -> Unit, - private val onKey: (String) -> Unit + private val onKey: (String) -> Unit, + private val getScreenText: () -> String ) : NanoHTTPD(port) { override fun serve(session: IHTTPSession): Response { @@ -844,6 +875,10 @@ class CompanionServer( if (cmd.isNotEmpty()) onKey(cmd) newFixedLengthResponse(Response.Status.OK, "text/plain", "ok") } + "/screen" -> { + val body = JSONObject().put("text", getScreenText()).toString() + newFixedLengthResponse(Response.Status.OK, "application/json", body) + } else -> newFixedLengthResponse(Response.Status.NOT_FOUND, "text/plain", "not found") } response.addHeader("Access-Control-Allow-Origin", "*") diff --git a/SchwertUndMagieOnPebbleCompanionApp/app/src/main/jni/vice_jni.c b/SchwertUndMagieOnPebbleCompanionApp/app/src/main/jni/vice_jni.c index dab8ffa..c20b6ca 100644 --- a/SchwertUndMagieOnPebbleCompanionApp/app/src/main/jni/vice_jni.c +++ b/SchwertUndMagieOnPebbleCompanionApp/app/src/main/jni/vice_jni.c @@ -78,6 +78,8 @@ extern int __real_console_init(void); #include "autostart.h" #include "attach.h" #include "interrupt.h" +#include "charset.h" +#include "mem.h" /* Drive LED state. * g_io_frames: bumped by __wrap_serial_trap_receive; keeps LED lit ~100 ms after @@ -808,6 +810,64 @@ JNI_FN(jint, getFrameCount)(JNIEnv *env, jobject obj) { return (jint)g_frame_count; } +/* Schwert und Magie uploads a custom character set that redefines a handful of + * otherwise-unused PETSCII screen codes (punctuation/graphics glyphs nobody + * needs in German text) to draw umlauts instead. VICE's stock charset tables + * know nothing about this game-specific remap, so those codes must be + * special-cased to the correct UTF-8 character before falling back to the + * standard screencode->PETSCII->ASCII conversion. + * Confirmed by observation — a consecutive run in the unshifted symbol row: + * screencode 0x1B (stock '[') -> ä, 0x1C (stock '£') -> ö, 0x1D (stock ']') -> ü, + * 0x1E (stock '↑') -> ß. + * TODO: add the uppercase variants (Ä, Ö, Ü) once their screen codes are + * identified — likely in the shifted/alternate charset bank. */ +static const struct { uint8_t screencode; const char *utf8; } k_char_overrides[] = { + { 0x1B, "\xC3\xA4" }, /* ä */ + { 0x1C, "\xC3\xB6" }, /* ö */ + { 0x1D, "\xC3\xBC" }, /* ü */ + { 0x1E, "\xC3\x9F" }, /* ß */ +}; + +/* Returns the 40x25 C64 text screen as UTF-8, rows separated by '\n'. + * Reads the fixed default screen address $0400 via mem_read_screen — the same + * helper autostart.c uses to check for KERNAL "READY." text — since this game + * never relocates the VIC-II screen pointer. Screen codes are converted to + * PETSCII then ASCII via VICE's own charset tables (after k_char_overrides is + * checked first); unmappable glyphs (the C64's graphics characters) become '.'. */ +JNI_FN(jstring, getScreenText)(JNIEnv *env, jobject obj) { + (void)obj; +#ifdef HAVE_VICE_SRC + /* Worst case every cell is a 2-byte UTF-8 override: 40*25*2 + 25 newlines + NUL. */ + char text[40 * 25 * 2 + 25 + 1]; + int pos = 0; + for (int row = 0; row < 25; row++) { + for (int col = 0; col < 40; col++) { + uint8_t screencode = mem_read_screen((uint16_t)(0x0400 + row * 40 + col)); + const char *override = NULL; + for (size_t i = 0; i < sizeof(k_char_overrides) / sizeof(k_char_overrides[0]); i++) { + if (k_char_overrides[i].screencode == screencode) { + override = k_char_overrides[i].utf8; + break; + } + } + if (override) { + size_t len = strlen(override); + memcpy(text + pos, override, len); + pos += (int)len; + } else { + uint8_t petscii = charset_screencode_to_petcii(screencode); + text[pos++] = (char)charset_p_toascii(petscii, CONVERT_WITHOUT_CTRLCODES); + } + } + text[pos++] = '\n'; + } + text[pos] = '\0'; + return (*env)->NewStringUTF(env, text); +#else + return (*env)->NewStringUTF(env, ""); +#endif +} + /* In thread mode runFrame() is a no-op: VICE drives its own loop. */ JNI_FN(void, runFrame)(JNIEnv *env, jobject obj) { (void)env; (void)obj; diff --git a/SchwertUndMagieOnPebbleWatchApp/package.json b/SchwertUndMagieOnPebbleWatchApp/package.json index 989fc5e..27aab6c 100644 --- a/SchwertUndMagieOnPebbleWatchApp/package.json +++ b/SchwertUndMagieOnPebbleWatchApp/package.json @@ -24,10 +24,17 @@ }, "messageKeys": [ "TIME", - "COMMAND" + "COMMAND", + "SCREEN" ], "resources": { - "media": [] + "media": [ + { + "type": "bitmap", + "name": "IMAGE_SPLASH", + "file": "splash.png" + } + ] } } } diff --git a/SchwertUndMagieOnPebbleCompanionApp/res/app-icon.png b/SchwertUndMagieOnPebbleWatchApp/res/app-icon.png similarity index 100% rename from SchwertUndMagieOnPebbleCompanionApp/res/app-icon.png rename to SchwertUndMagieOnPebbleWatchApp/res/app-icon.png diff --git a/SchwertUndMagieOnPebbleWatchApp/resources/splash.png b/SchwertUndMagieOnPebbleWatchApp/resources/splash.png new file mode 100644 index 0000000000000000000000000000000000000000..337241c486ac9addb028e3d4a41652d17cc560cb GIT binary patch literal 92424 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 z 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 enum { - KEY_TIME = 0, // Inbound: current time string from companion app - KEY_COMMAND = 1 // Outbound: button name sent to companion app + KEY_TIME = 0, // Inbound: current time string from companion app (unused — see KEY_SCREEN) + KEY_COMMAND = 1, // Outbound: button name sent to companion app + KEY_SCREEN = 2 // Inbound: C64 text screen (40x25, ASCII, rows separated by '\n') }; -static Window *s_main_window; -static TextLayer *s_time_layer; -static TextLayer *s_hint_layer; +#define SCREEN_FONT FONT_KEY_GOTHIC_24 -static char s_time_buffer[32] = "Waiting..."; +// Curated navigation-only key set for the SELECT wheel. Movement in this +// game is mostly done with number keys, plus RETURN/SPACE to confirm. +static const char *const k_wheel_items[] = { + "1", "2", "3", "4", "5", "6", "7", "8", "9", "0", "RETURN", "SPACE" +}; +#define WHEEL_ITEM_COUNT ((int)(sizeof(k_wheel_items) / sizeof(k_wheel_items[0]))) + +static Window *s_main_window; +static ScrollLayer *s_scroll_layer; +static TextLayer *s_screen_layer; + +static Window *s_wheel_window; +static TextLayer *s_wheel_label_layer; +static TextLayer *s_wheel_hint_layer; +static int s_wheel_index = 0; + +#define SPLASH_DURATION_MS 1800 + +static Window *s_splash_window; +static BitmapLayer *s_splash_bitmap_layer; +static GBitmap *s_splash_bitmap; + +// Worst case 40*25 cells at 2 UTF-8 bytes each (umlaut overrides) + 25 +// row-separator newlines + NUL, matching the companion app's getScreenText() +// output (see vice_jni.c). +static char s_screen_buffer[2080] = "Waiting for C64 screen..."; static void send_key_to_phone(const char *key_str) { DictionaryIterator *iter; @@ -19,69 +43,183 @@ static void send_key_to_phone(const char *key_str) { app_message_outbox_send(); } +// Resize the text layer and scroll layer's content size to fit s_screen_buffer +// at the current font/width. Must run whenever the buffer's text changes — +// the C64 screen content (and therefore wrapped height) varies frame to frame. +static void update_screen_layout(void) { + GRect bounds = layer_get_bounds(scroll_layer_get_layer(s_scroll_layer)); + GFont font = fonts_get_system_font(SCREEN_FONT); + GRect measure_box = GRect(0, 0, bounds.size.w, 4000); + GSize content_size = graphics_text_layout_get_content_size( + s_screen_buffer, font, measure_box, GTextOverflowModeWordWrap, GTextAlignmentLeft); + // Floor content height at the viewport height so short text doesn't shrink + // the scrollable area below what's visible. + int16_t height = content_size.h > bounds.size.h ? content_size.h : bounds.size.h; + + layer_set_frame(text_layer_get_layer(s_screen_layer), GRect(0, 0, bounds.size.w, height)); + scroll_layer_set_content_size(s_scroll_layer, GSize(bounds.size.w, height)); +} + static void inbox_received_callback(DictionaryIterator *iterator, void *context) { - Tuple *time_tuple = dict_find(iterator, KEY_TIME); - if (time_tuple && time_tuple->type == TUPLE_CSTRING) { - snprintf(s_time_buffer, sizeof(s_time_buffer), "%s", time_tuple->value->cstring); - text_layer_set_text(s_time_layer, s_time_buffer); - layer_mark_dirty(text_layer_get_layer(s_time_layer)); + Tuple *screen_tuple = dict_find(iterator, KEY_SCREEN); + if (screen_tuple && screen_tuple->type == TUPLE_CSTRING) { + snprintf(s_screen_buffer, sizeof(s_screen_buffer), "%s", screen_tuple->value->cstring); + text_layer_set_text(s_screen_layer, s_screen_buffer); + update_screen_layout(); + layer_mark_dirty(text_layer_get_layer(s_screen_layer)); } } -static void up_click_handler(ClickRecognizerRef recognizer, void *context) { - send_key_to_phone("UP"); +static void update_wheel_label(void) { + text_layer_set_text(s_wheel_label_layer, k_wheel_items[s_wheel_index]); } -static void down_click_handler(ClickRecognizerRef recognizer, void *context) { - send_key_to_phone("DOWN"); +static void wheel_up_click_handler(ClickRecognizerRef recognizer, void *context) { + s_wheel_index = (s_wheel_index - 1 + WHEEL_ITEM_COUNT) % WHEEL_ITEM_COUNT; + update_wheel_label(); +} + +static void wheel_down_click_handler(ClickRecognizerRef recognizer, void *context) { + s_wheel_index = (s_wheel_index + 1) % WHEEL_ITEM_COUNT; + update_wheel_label(); +} + +// Sends the highlighted item and pops back to the screen mirror. The BACK +// button is left unsubscribed so its default behavior (pop the window) acts +// as "cancel" for free. +static void wheel_select_click_handler(ClickRecognizerRef recognizer, void *context) { + send_key_to_phone(k_wheel_items[s_wheel_index]); + window_stack_pop(true); +} + +static void wheel_click_config_provider(void *context) { + window_single_click_subscribe(BUTTON_ID_UP, wheel_up_click_handler); + window_single_click_subscribe(BUTTON_ID_DOWN, wheel_down_click_handler); + window_single_click_subscribe(BUTTON_ID_SELECT, wheel_select_click_handler); +} + +static void wheel_window_load(Window *window) { + Layer *window_layer = window_get_root_layer(window); + GRect bounds = layer_get_bounds(window_layer); + + s_wheel_label_layer = text_layer_create(GRect(0, bounds.size.h / 2 - 24, bounds.size.w, 48)); + text_layer_set_font(s_wheel_label_layer, fonts_get_system_font(FONT_KEY_BITHAM_30_BLACK)); + text_layer_set_text_alignment(s_wheel_label_layer, GTextAlignmentCenter); + update_wheel_label(); + layer_add_child(window_layer, text_layer_get_layer(s_wheel_label_layer)); + + s_wheel_hint_layer = text_layer_create(GRect(0, bounds.size.h - 30, bounds.size.w, 30)); + text_layer_set_font(s_wheel_hint_layer, fonts_get_system_font(FONT_KEY_GOTHIC_14)); + text_layer_set_text_alignment(s_wheel_hint_layer, GTextAlignmentCenter); + text_layer_set_text(s_wheel_hint_layer, "UP/DOWN spin - SELECT send"); + layer_add_child(window_layer, text_layer_get_layer(s_wheel_hint_layer)); +} + +static void wheel_window_unload(Window *window) { + text_layer_destroy(s_wheel_label_layer); + text_layer_destroy(s_wheel_hint_layer); } static void select_click_handler(ClickRecognizerRef recognizer, void *context) { - send_key_to_phone("SELECT"); + window_stack_push(s_wheel_window, true); } -static void click_config_provider(void *context) { - window_single_click_subscribe(BUTTON_ID_UP, up_click_handler); - window_single_click_subscribe(BUTTON_ID_DOWN, down_click_handler); +// Passed to scroll_layer_set_callbacks(): the ScrollLayer's own click config +// provider calls this after wiring UP/DOWN to scroll, so we only need to add +// SELECT here — UP/DOWN stay dedicated to panning the text view. +static void scroll_click_config_provider(void *context) { window_single_click_subscribe(BUTTON_ID_SELECT, select_click_handler); } +static void splash_window_load(Window *window) { + Layer *window_layer = window_get_root_layer(window); + GRect bounds = layer_get_bounds(window_layer); + + s_splash_bitmap = gbitmap_create_with_resource(RESOURCE_ID_IMAGE_SPLASH); + s_splash_bitmap_layer = bitmap_layer_create(bounds); + bitmap_layer_set_bitmap(s_splash_bitmap_layer, s_splash_bitmap); + // Source image is roughly square and smaller than every target screen, so + // center it without stretching rather than filling/distorting the frame. + bitmap_layer_set_alignment(s_splash_bitmap_layer, GAlignCenter); + bitmap_layer_set_background_color(s_splash_bitmap_layer, GColorBlack); + layer_add_child(window_layer, bitmap_layer_get_layer(s_splash_bitmap_layer)); +} + +static void splash_window_unload(Window *window) { + bitmap_layer_destroy(s_splash_bitmap_layer); + gbitmap_destroy(s_splash_bitmap); +} + +// main_window is pushed underneath splash_window at startup (see init()), so +// popping splash here just reveals it — the stack is never empty, which +// matters because removing the last window on the stack kills the app. +static void splash_timeout_handler(void *data) { + window_stack_remove(s_splash_window, true); +} + static void main_window_load(Window *window) { Layer *window_layer = window_get_root_layer(window); GRect bounds = layer_get_bounds(window_layer); - s_time_layer = text_layer_create(GRect(0, 55, bounds.size.w, 50)); - text_layer_set_text(s_time_layer, s_time_buffer); - text_layer_set_font(s_time_layer, fonts_get_system_font(FONT_KEY_BITHAM_30_BLACK)); - text_layer_set_text_alignment(s_time_layer, GTextAlignmentCenter); - layer_add_child(window_layer, text_layer_get_layer(s_time_layer)); + s_scroll_layer = scroll_layer_create(bounds); + scroll_layer_set_click_config_onto_window(s_scroll_layer, window); + scroll_layer_set_callbacks(s_scroll_layer, (ScrollLayerCallbacks) { + .click_config_provider = scroll_click_config_provider + }); - s_hint_layer = text_layer_create(GRect(0, 130, bounds.size.w, 30)); - text_layer_set_text(s_hint_layer, "UP / DN / SEL"); - text_layer_set_font(s_hint_layer, fonts_get_system_font(FONT_KEY_GOTHIC_14)); - text_layer_set_text_alignment(s_hint_layer, GTextAlignmentCenter); - layer_add_child(window_layer, text_layer_get_layer(s_hint_layer)); + // The 40-column C64 grid is not preserved — the companion app's text + // already has '\n' per row, but at this font size lines reflow + // (word-wrap) rather than line up like the original screen. + s_screen_layer = text_layer_create(GRect(0, 0, bounds.size.w, bounds.size.h)); + text_layer_set_text(s_screen_layer, s_screen_buffer); + text_layer_set_font(s_screen_layer, fonts_get_system_font(SCREEN_FONT)); + text_layer_set_text_alignment(s_screen_layer, GTextAlignmentLeft); + scroll_layer_add_child(s_scroll_layer, text_layer_get_layer(s_screen_layer)); + + update_screen_layout(); + layer_add_child(window_layer, scroll_layer_get_layer(s_scroll_layer)); } static void main_window_unload(Window *window) { - text_layer_destroy(s_time_layer); - text_layer_destroy(s_hint_layer); + text_layer_destroy(s_screen_layer); + scroll_layer_destroy(s_scroll_layer); } static void init(void) { s_main_window = window_create(); - window_set_click_config_provider(s_main_window, click_config_provider); window_set_window_handlers(s_main_window, (WindowHandlers) { .load = main_window_load, .unload = main_window_unload }); window_stack_push(s_main_window, true); + s_wheel_window = window_create(); + window_set_click_config_provider(s_wheel_window, wheel_click_config_provider); + window_set_window_handlers(s_wheel_window, (WindowHandlers) { + .load = wheel_window_load, + .unload = wheel_window_unload + }); + + s_splash_window = window_create(); + window_set_window_handlers(s_splash_window, (WindowHandlers) { + .load = splash_window_load, + .unload = splash_window_unload + }); + // Pushed on top of the already-present main_window, not in place of an + // empty stack — see the note on splash_timeout_handler below. + window_stack_push(s_splash_window, true); + app_timer_register(SPLASH_DURATION_MS, splash_timeout_handler, NULL); + app_message_register_inbox_received(inbox_received_callback); - app_message_open(128, 64); + // Inbox must hold the full 40x25 screen text (up to ~2080 bytes with UTF-8 + // umlaut overrides) plus dictionary overhead; outbox only ever carries a + // short button-name string. + app_message_open(2200, 64); } static void deinit(void) { + window_destroy(s_splash_window); + window_destroy(s_wheel_window); window_destroy(s_main_window); } diff --git a/SchwertUndMagieOnPebbleWatchApp/src/pkjs/index.js b/SchwertUndMagieOnPebbleWatchApp/src/pkjs/index.js index b8c1b1f..d72df1f 100644 --- a/SchwertUndMagieOnPebbleWatchApp/src/pkjs/index.js +++ b/SchwertUndMagieOnPebbleWatchApp/src/pkjs/index.js @@ -2,6 +2,7 @@ var SERVER = 'http://127.0.0.1:8888'; var KEY_TIME = 0; var KEY_COMMAND = 1; +var KEY_SCREEN = 2; function httpGet(url) { var xhr = new XMLHttpRequest(); @@ -12,15 +13,15 @@ function httpGet(url) { xhr.send(); } -function sendTimeToWatch() { +function sendScreenToWatch() { var xhr = new XMLHttpRequest(); - xhr.open('GET', SERVER + '/time', true); + xhr.open('GET', SERVER + '/screen', true); xhr.onload = function() { if (xhr.status === 200) { try { var data = JSON.parse(xhr.responseText); var msg = {}; - msg[KEY_TIME] = data.time; + msg[KEY_SCREEN] = data.text; Pebble.sendAppMessage( msg, function() {}, @@ -32,13 +33,13 @@ function sendTimeToWatch() { } }; xhr.onerror = function() { - console.log('[SuM] GET /time failed - is the companion app running?'); + console.log('[SuM] GET /screen failed - is the companion app running?'); }; xhr.send(); } Pebble.addEventListener('ready', function() { - setInterval(sendTimeToWatch, 1000); + setInterval(sendScreenToWatch, 1000); }); Pebble.addEventListener('appmessage', function(e) { diff --git a/architecture.md b/architecture.md new file mode 100644 index 0000000..917e20d --- /dev/null +++ b/architecture.md @@ -0,0 +1,259 @@ +# Architecture + +This document describes the current runtime architecture of the two apps in this +repo: the **Pebble watch app** and the **Android companion app**. For build/install +commands, see `CLAUDE.md`. + +## 1. System overview + +Three processes cooperate across two devices. **Core for Pebble** is a separate +app on the phone (not part of this repo) that bridges Bluetooth AppMessage traffic +to a JS runtime; our companion app talks to it only via loopback HTTP. + +```mermaid +graph LR + subgraph Watch["Pebble Time 2 (watch)"] + WatchC["Watch app (C)
splash / main / wheel windows"] + end + + subgraph Phone["Android phone"] + CFP["Core for Pebble
(PebbleKit JS runtime, separate app)"] + + subgraph Companion["Companion app process"] + HTTP["NanoHTTPD server :8888"] + UI["MainActivity / UI
C64DisplayView, C64KeyboardView"] + JNI["JNI bridge
vice_jni.c"] + VICE["VICE C64 core
(own pthread)"] + end + end + + WatchC <-->|Bluetooth AppMessage| CFP + CFP <-->|HTTP loopback 127.0.0.1:8888| HTTP + HTTP --> UI + UI --> JNI + JNI <--> VICE +``` + +## 2. Pebble watch app + +`SchwertUndMagieOnPebbleWatchApp/src/c/SchwertUndMagieOnPebbleFrontend.c` is a +single-file C watchapp built around three `Window`s on a shared stack, plus +`src/pkjs/index.js` running inside Core for Pebble. + +```mermaid +stateDiagram-v2 + [*] --> Splash + Splash --> Main: 1800ms timer\n(window_stack_remove splash) + Main --> Wheel: SELECT\n(push wheel) + Wheel --> Main: SELECT (send + pop)\nor BACK (cancel, pop) +``` + +- **Splash** — `BitmapLayer` showing `resources/splash.png`, centered, black + backdrop. Pushed *on top of* the already-pushed Main window at startup (not + in place of an empty stack — removing the last window on the stack kills the + app), then removed by an `AppTimer` after 1.8s. +- **Main** — a `ScrollLayer` wrapping a `TextLayer` that mirrors the C64 text + screen. UP/DOWN are claimed entirely by the ScrollLayer's built-in click + config (pan only); SELECT is added via `scroll_layer_set_callbacks()`'s + `click_config_provider` hook and opens the wheel. Content height is + recomputed via `graphics_text_layout_get_content_size()` every time new + screen text arrives, since wrapped height varies frame to frame. +- **Wheel** — a single large `TextLayer` cycling through a curated, + navigation-only key set: `1`–`9`, `0`, `RETURN`, `SPACE` (movement in this + game is mostly done with number keys). UP/DOWN rotate the index, SELECT + sends the highlighted label and pops back to Main, BACK cancels for free + (default window-pop behavior, left unsubscribed). + +### AppMessage protocol + +| Key | Value | Direction | Payload | +|---|---|---|---| +| `TIME` | 0 | — | Unused (legacy; originally the clock, replaced by `SCREEN`) | +| `COMMAND` | 1 | watch → phone | Wheel item label: one of `1`..`9`, `0`, `RETURN`, `SPACE` | +| `SCREEN` | 2 | phone → watch | UTF-8 C64 screen text, 40×25 cells, `\n` per row | + +Numeric keys are hardcoded identically in the C app and `index.js` — symbolic +key resolution from `package.json`'s `messageKeys` is unreliable with Core for +Pebble. The watch's AppMessage inbox is opened at 2200 bytes to fit the +worst-case screen payload (40×25 cells × up to 2 UTF-8 bytes for umlaut +overrides, + 25 newlines). + +## 3. Android companion app + +```mermaid +graph TD + Main["Main/UI thread
Choreographer vsync loop, touch events"] + Vice["VICE thread
main_program() → maincpu_mainloop()"] + Http["NanoHTTPD worker thread(s)
one per request"] + StdoutT["stdout reader thread"] + StderrT["stderr reader thread"] + Audio["OpenSL ES callback thread"] + + Main -->|"captureFrame(): reads g_framebuf"| Vice + Main -->|"injectKey(): writes keyboard matrix"| Vice + Http -->|"onKey → injectWatchKey → injectKey"| Vice + Http -->|"getScreenText(): reads C64 RAM"| Vice + Vice -->|"writes g_framebuf, drains pending queues"| Main + Vice -->|stdout/stderr pipes| StdoutT + Vice -->|stdout/stderr pipes| StderrT + Vice -->|sound ring buffer| Audio +``` + +- **Main/UI thread** — `MainActivity`'s `Choreographer.postFrameCallback` loop + drives rendering: on every hardware vsync it calls `display.captureFrame(engine)` + (copies VICE's 320×200 ARGB framebuffer into a Bitmap) and `invalidate()`. + VICE itself runs continuously and asynchronously in its own thread, decoupled + from this vsync sampling. Touch input (`C64KeyboardView`, disk drawer + buttons) and NanoHTTPD callbacks (marshaled via `mainHandler`) also run here. +- **VICE thread** (`vice_thread` in `vice_jni.c`) — runs `main_program()` → + `maincpu_mainloop()`, VICE's own CPU/VICII loop. `video_canvas_refresh()` is + our hook into this loop, called once per rendered region: it drains + mutex-guarded pending-operation queues (disk autostart/attach, hard reset, + snapshot save/load) written from the UI or HTTP threads, then renders into + `g_framebuf`. +- **NanoHTTPD worker thread(s)** — `CompanionServer` (in `MainActivity.kt`) + serves `/time`, `/key?cmd=`, `/screen` to Core for Pebble's JS. `onKey` and + `getScreenText` call directly into the JNI layer from this thread (see + §5 on tolerated races). +- **stdout/stderr reader threads** — pipe VICE's redirected stdout/stderr to + Logcat under tag `ViceJNI`, prefixed `VICE: `. +- **OpenSL ES callback thread** — pulls PCM samples from a ring buffer filled + by VICE's registered `android` sound driver. + +### Key source files + +| File | Role | +|---|---| +| `MainActivity.kt` | UI, Choreographer render loop, NanoHTTPD server, disk drawer, watch key wheel → `injectKey` mapping | +| `C64Engine.kt` | JNI external-function declarations + C64 keyboard matrix constants | +| `C64DisplayView.kt` | Double-buffered View blitting the 320×200 ARGB framebuffer | +| `C64KeyboardView.kt` | On-screen virtual C64 keyboard (multi-touch, sticky shift) | +| `vice_jni.c` | VICE integration: thread management, video/sound drivers, pending-op queues, snapshot CPU-trap dispatch, `getScreenText()` | + +## 4. Data flows + +### 4.1 Screen mirror (VICE → watch) + +```mermaid +sequenceDiagram + participant VICE as VICE thread + participant JNI as vice_jni.c + participant HTTP as NanoHTTPD /screen + participant JS as PebbleKit JS + participant Watch as Watch app (KEY_SCREEN) + + loop every 1s + JS->>HTTP: GET /screen + HTTP->>JNI: getScreenText() + JNI->>VICE: mem_read_screen($0400..$07E7) + JNI-->>HTTP: UTF-8 text (40x25, \n per row) + HTTP-->>JS: {"text": "..."} + JS->>Watch: AppMessage KEY_SCREEN + Watch->>Watch: update ScrollLayer/TextLayer + end +``` + +`getScreenText()` reads C64 screen RAM at the fixed default address `$0400` +(same assumption `autostart.c` makes when checking for KERNAL "READY." text — +this game never relocates the VIC-II screen pointer) and converts each +screencode → PETSCII → ASCII via VICE's own `charset.c` tables. The game +uploads a **custom character set** that redefines a consecutive run of +otherwise-unused screencodes to draw German umlauts; a small override table in +`getScreenText()` catches these and emits proper UTF-8 before falling through +to the standard conversion: + +| Screencode | Stock glyph | Overridden to | +|---|---|---| +| `0x1B` | `[` | ä | +| `0x1C` | `£` | ö | +| `0x1D` | `]` | ü | +| `0x1E` | `↑` | ß | + +### 4.2 On-screen keyboard input (phone touch → VICE) + +```mermaid +sequenceDiagram + participant User + participant KB as C64KeyboardView + participant Main as MainActivity + participant JNI as vice_jni.c + participant VICE as VICE keyboard matrix + + User->>KB: touch down/up on key + KB->>Main: onKeyEvent(key, pressed) + Main->>JNI: engine.injectKey(code, pressed) (per code, for composites) + JNI->>VICE: keyboard_set_keyarr(row, col, pressed) +``` + +Composite keys (e.g. ↑ = LSHIFT + CUR_UD) carry a list of codes; all are +pressed/released together. + +### 4.3 Watch key wheel input (watch → VICE) + +```mermaid +sequenceDiagram + participant Watch + participant JS as PebbleKit JS + participant HTTP as NanoHTTPD /key + participant Main as MainActivity + participant JNI as vice_jni.c + + Watch->>Watch: SELECT opens wheel; UP/DOWN rotate; SELECT confirms + Watch->>JS: AppMessage KEY_COMMAND = "