From 713d2c0cfd4a1138b10b6e781e22ed80aa351cac Mon Sep 17 00:00:00 2001 From: Adolfo Reyna Date: Mon, 12 Jan 2026 22:36:57 -0500 Subject: [PATCH] using the console input since the window is lagged on mac --- Makefile | 2 +- app | Bin 84008 -> 46624 bytes main.cpp | 229 ++++++++++++++++++++++++++++++++++++++++--------------- 3 files changed, 170 insertions(+), 61 deletions(-) diff --git a/Makefile b/Makefile index 70ac9ab..21d05ee 100644 --- a/Makefile +++ b/Makefile @@ -7,7 +7,7 @@ CXXFLAGS = -std=c++11 -Wall # Paths for Homebrew on macOS (Silicon/M1/M2/M3) ifeq ($(OS), Darwin) - SFML_DIR = $(shell brew --prefix sfml) + SFML_DIR = $(shell brew --prefix sfml@2) INCLUDES = -I$(SFML_DIR)/include LIBS = -L$(SFML_DIR)/lib -lsfml-graphics -lsfml-window -lsfml-system else diff --git a/app b/app index 6485b87ba0da14e59a6a6996b5e3bead506375aa..5ae3212870010ac34f9de525a3726f5297fb7b44 100755 GIT binary patch literal 46624 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 literal 84008 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 diff --git a/main.cpp b/main.cpp index f4cc685..3ff510f 100644 --- a/main.cpp +++ b/main.cpp @@ -2,6 +2,9 @@ #include #include #include +#include +#include +#include #include "./fonts/acme_5_outlines_font.h" const int V_WIDTH = 400; @@ -10,36 +13,55 @@ uint8_t bit_buffer[V_WIDTH * V_HEIGHT / 8]; // --- 1-BIT DRAWING PRIMITIVES --- -void set_pixel(int x, int y, bool on) { - if (x < 0 || x >= V_WIDTH || y < 0 || y >= V_HEIGHT) return; +void set_pixel(int x, int y, bool on) +{ + if (x < 0 || x >= V_WIDTH || y < 0 || y >= V_HEIGHT) + return; int bit_pos = y * V_WIDTH + x; - if (on) bit_buffer[bit_pos / 8] |= (1 << (7 - (bit_pos % 8))); - else bit_buffer[bit_pos / 8] &= ~(1 << (7 - (bit_pos % 8))); + if (on) + bit_buffer[bit_pos / 8] |= (1 << (7 - (bit_pos % 8))); + else + bit_buffer[bit_pos / 8] &= ~(1 << (7 - (bit_pos % 8))); } -void draw_line(int x0, int y0, int x1, int y1, bool on) { +void draw_line(int x0, int y0, int x1, int y1, bool on) +{ int dx = abs(x1 - x0), sx = x0 < x1 ? 1 : -1; int dy = -abs(y1 - y0), sy = y0 < y1 ? 1 : -1; int err = dx + dy, e2; - while (true) { + while (true) + { set_pixel(x0, y0, on); - if (x0 == x1 && y0 == y1) break; + if (x0 == x1 && y0 == y1) + break; e2 = 2 * err; - if (e2 >= dy) { err += dy; x0 += sx; } - if (e2 <= dx) { err += dx; y0 += sy; } + if (e2 >= dy) + { + err += dy; + x0 += sx; + } + if (e2 <= dx) + { + err += dx; + y0 += sy; + } } } // Minimal 8x8 Bitmap Font (Example for 'A' and 'B') -void draw_char(int x, int y, char c) { +void draw_char(int x, int y, char c) +{ static const uint8_t font[2][8] = { {0x18, 0x3C, 0x66, 0x66, 0x7E, 0x66, 0x66, 0x00}, // A {0x7C, 0x66, 0x66, 0x7C, 0x66, 0x66, 0x7C, 0x00} // B }; - int idx = (c == 'A') ? 0 : 1; - for (int row = 0; row < 8; row++) { - for (int col = 0; col < 8; col++) { - if (font[idx][row] & (1 << (7 - col))) set_pixel(x + col, y + row, true); + int idx = (c == 'A') ? 0 : 1; + for (int row = 0; row < 8; row++) + { + for (int col = 0; col < 8; col++) + { + if (font[idx][row] & (1 << (7 - col))) + set_pixel(x + col, y + row, true); } } } @@ -50,18 +72,23 @@ void draw_char(int x, int y, char c) { * @param y Start y position * @param c The character to draw */ -void draw_char_vcol(int x, int y, char c) { +void draw_char_vcol(int x, int y, char c) +{ // The font table starts at space (ASCII 32) - if (c < 32 || c > 127) return; + if (c < 32 || c > 127) + return; int font_idx = c - 32; - for (int col = 0; col < 6; col++) { + for (int col = 0; col < 6; col++) + { unsigned char column_byte = font[font_idx][col]; - - for (int row = 0; row < 8; row++) { + + for (int row = 0; row < 8; row++) + { // Check if the bit for this row is set // Most of these 1-bit fonts use bit 0 as the top pixel - if (column_byte & (1 << row)) { + if (column_byte & (1 << row)) + { set_pixel(x + col, y + row, true); } } @@ -72,8 +99,10 @@ void draw_char_vcol(int x, int y, char c) { * Draws a full string of text * @param spacing pixels between characters (usually 1 or 2) */ -void draw_string(int x, int y, const std::string& text, int spacing = 1) { - for (size_t i = 0; i < text.length(); i++) { +void draw_string(int x, int y, const std::string &text, int spacing = 1) +{ + for (size_t i = 0; i < text.length(); i++) + { draw_char_vcol(x + (i * (6 + spacing)), y, text[i]); } } @@ -82,22 +111,30 @@ void draw_string(int x, int y, const std::string& text, int spacing = 1) { * Draws a scaled character using the 6x8 vertical column format * @param scale Integer multiplier (1 = 1x, 2 = 2x, etc.) */ -void draw_char_scaled(int x, int y, char c, int scale) { - if (c < 32 || c > 127) return; - if (scale < 1) scale = 1; // Safety check - +void draw_char_scaled(int x, int y, char c, int scale) +{ + if (c < 32 || c > 127) + return; + if (scale < 1) + scale = 1; // Safety check + int font_idx = c - 32; - for (int col = 0; col < 6; col++) { + for (int col = 0; col < 6; col++) + { unsigned char column_byte = font[font_idx][col]; - - for (int row = 0; row < 8; row++) { - if (column_byte & (1 << row)) { + + for (int row = 0; row < 8; row++) + { + if (column_byte & (1 << row)) + { // Draw a square of size [scale x scale] - for (int sy = 0; sy < scale; sy++) { - for (int sx = 0; sx < scale; sx++) { - set_pixel(x + (col * scale) + sx, - y + (row * scale) + sy, + for (int sy = 0; sy < scale; sy++) + { + for (int sx = 0; sx < scale; sx++) + { + set_pixel(x + (col * scale) + sx, + y + (row * scale) + sy, true); } } @@ -109,65 +146,133 @@ void draw_char_scaled(int x, int y, char c, int scale) { /** * Draws a scaled string */ -void draw_string_scaled(int x, int y, const std::string& text, int scale, int spacing = 1) { - for (size_t i = 0; i < text.length(); i++) { +void draw_string_scaled(int x, int y, const char* text, int scale, int spacing = 1) +{ + int i = 0; + while(text[i] != '\0') + { // We multiply the character width (6) and spacing by the scale int next_x = x + (i * (6 + spacing) * scale); draw_char_scaled(next_x, y, text[i], scale); + i++; } } -int main() { - sf::RenderWindow window(sf::VideoMode(800, 600), "0.5Hz Update Emulator"); - +char command_buffer[256]; +int command_buffer_index = 0; + +int main() +{ + // Save original terminal settings + struct termios old_tio, new_tio; + tcgetattr(STDIN_FILENO, &old_tio); + new_tio = old_tio; + new_tio.c_lflag &= (~ICANON & ~ECHO); // Disable canonical mode and echo + tcsetattr(STDIN_FILENO, TCSANOW, &new_tio); + + sf::RenderWindow window(sf::VideoMode(400, 300), "0.5Hz Update Emulator"); + std::vector display_pixels(V_WIDTH * V_HEIGHT * 4); sf::Texture texture; texture.create(V_WIDTH, V_HEIGHT); texture.setSmooth(false); // Keeps the 1-bit pixels sharp and blocky sf::Sprite sprite(texture); - sprite.setScale(2.f, 2.f); - + sprite.setScale(1.f, 1.f); sf::Clock clock; bool toggle = false; - while (window.isOpen()) { + int counter = 0; + + while (window.isOpen()) + { sf::Event event; - while (window.pollEvent(event)) { - if (event.type == sf::Event::Closed) window.close(); + while (window.pollEvent(event)) + { + if (event.type == sf::Event::Closed) + window.close(); } - while (window.pollEvent(event)) { - if (event.type == sf::Event::Closed) - window.close(); + // Check for console input with timeout + fd_set readfds; + FD_ZERO(&readfds); + FD_SET(STDIN_FILENO, &readfds); + struct timeval tv; + tv.tv_sec = 0; + tv.tv_usec = 10000; // 10ms timeout + int retval = select(STDIN_FILENO + 1, &readfds, NULL, NULL, &tv); + if (retval > 0) + { + char c = getchar(); + //printf("Key Pressed: %c\n", c); + if (c == '\n' || c == '\r') + { + printf("Command entered: %s\n", command_buffer); + command_buffer_index = 0; + command_buffer[0] = '\0'; + } + else if (c == '\b' || c == 127) // Backspace + { + if (command_buffer_index > 0) + { + command_buffer_index--; + command_buffer[command_buffer_index] = '\0'; + } + } + else if (c >= 32 && c <= 126) // Printable characters + { + if (command_buffer_index < sizeof(command_buffer) - 1) + { + command_buffer[command_buffer_index++] = c; + command_buffer[command_buffer_index] = '\0'; + } + } - // Check for a single key press - if (event.type == sf::Event::KeyPressed) { - if (event.key.code == sf::Keyboard::Space) { - // This happens only ONCE when you hit Space - toggle = !toggle; + // Update display immediately after input + // Clear buffer + for (int i = 0; i < sizeof(bit_buffer); i++) + bit_buffer[i] = 0; + + // Draw content + draw_string_scaled(10, 10, "Hello World!", 3); + draw_string_scaled(10, 270, command_buffer, 1); + + // Bridge: 1-bit to RGBA + for (int i = 0; i < V_WIDTH * V_HEIGHT; ++i) + { + bool is_on = (bit_buffer[i / 8] >> (7 - (i % 8))) & 1; + int base = i * 4; + sf::Uint8 color = is_on ? 0xFF : 0x00; + display_pixels[base] = display_pixels[base + 1] = display_pixels[base + 2] = color; + display_pixels[base + 3] = 255; + } + texture.update(display_pixels.data()); } - } -} // --- TIMING LOGIC: Update twice per second (500ms) --- - if (clock.getElapsedTime().asMilliseconds() >= 500) { + if (clock.getElapsedTime().asMilliseconds() >= 1000) + { + //printf("Updating display %d...\n", counter++); clock.restart(); toggle = !toggle; // Change something every half second // Clear buffer - for (int i = 0; i < sizeof(bit_buffer); i++) bit_buffer[i] = 0; + for (int i = 0; i < sizeof(bit_buffer); i++) + bit_buffer[i] = 0; // Draw content - //draw_line(10, 10, 390, 290, true); + // draw_line(10, 10, 390, 290, true); draw_string_scaled(10, 10, "Hello World!", 3); - + + draw_string_scaled(10, 270, command_buffer, 1); + // Bridge: 1-bit to RGBA - for (int i = 0; i < V_WIDTH * V_HEIGHT; ++i) { + for (int i = 0; i < V_WIDTH * V_HEIGHT; ++i) + { bool is_on = (bit_buffer[i / 8] >> (7 - (i % 8))) & 1; int base = i * 4; sf::Uint8 color = is_on ? 0xFF : 0x00; - display_pixels[base] = display_pixels[base+1] = display_pixels[base+2] = color; + display_pixels[base] = display_pixels[base + 1] = display_pixels[base + 2] = color; display_pixels[base + 3] = 255; } texture.update(display_pixels.data()); @@ -176,6 +281,10 @@ int main() { window.clear(); window.draw(sprite); window.display(); + } + + // Restore original terminal settings + tcsetattr(STDIN_FILENO, TCSANOW, &old_tio); return 0; } \ No newline at end of file