#include "odroid/audio.h" #include "odroid/battery.h" #include "odroid/display.h" #include "odroid/input.h" #include "odroid/sdcard.h" #include "macros.h" #include "text.h" #include #include #include #include static const char* LOG_TAG = "Main"; static uint16_t gFramebuffer[LCD_WIDTH * LCD_HEIGHT]; void app_main(void) { Odroid_InitializeInput(); Odroid_InitializeDisplay(); Odroid_InitializeSdcard(); Odroid_InitializeBatteryReader(); Odroid_InitializeAudio(); // Load sprite uint16_t* sprite = (uint16_t*)malloc(64 * 64 * sizeof(uint16_t)); { FILE* spriteFile = fopen("/sdcard/key", "r"); assert(spriteFile); for (int i = 0; i < 64; ++i) { for (int j = 0; j < 64; ++j) { fread(sprite, sizeof(uint16_t), 64 * 64, spriteFile); } } fclose(spriteFile); } // Load sound effect uint16_t* soundBuffer; int soundEffectLength = 1441; { FILE* soundFile = fopen("/sdcard/jump", "r"); assert(soundFile); uint8_t* soundEffect = malloc(soundEffectLength); assert(soundEffect); soundBuffer = malloc(soundEffectLength*2); assert(soundBuffer); fread(soundEffect, soundEffectLength, 1, soundFile); for (int i = 0; i < soundEffectLength; ++i) { // 16 bits required but only MSB is actually sent to the DAC soundBuffer[i] = (soundEffect[i] << 8u); } } ESP_LOGI(LOG_TAG, "Odroid initialization complete - entering main loop"); int x = 0; int y = 0; uint16_t color = 0xffff; int lastState = 0; for (;;) { memset(gFramebuffer, 0, 320 * 240 * 2); Odroid_Input input = Odroid_PollInput(); if (input.left) { x -= 20; } else if (input.right) { x += 20; } if (input.up) { y -= 20; } else if (input.down) { y += 20; } if (input.a) { color = SWAP_ENDIAN_16(RGB565(0xff, 0, 0)); } else if (input.b) { color = SWAP_ENDIAN_16(RGB565(0, 0xff, 0)); } else if (input.start) { color = SWAP_ENDIAN_16(RGB565(0, 0, 0xff)); } else if (input.select) { color = SWAP_ENDIAN_16(RGB565(0xff, 0xff, 0xff)); } int thisState = input.volume; if ((thisState == 1) && (thisState != lastState)) { Odroid_PlayAudio(soundBuffer, soundEffectLength*2); } lastState = thisState; DrawText(gFramebuffer, "The Quick Brown Fox", 19, 0, 5, SWAP_ENDIAN_16(RGB565(0xFF, 0, 0))); DrawText(gFramebuffer, "Jumped Over The:", 16, 0, 6, SWAP_ENDIAN_16(RGB565(0, 0xFF, 0))); DrawText(gFramebuffer, "Lazy Dog?!", 10, 0, 7, SWAP_ENDIAN_16(RGB565(0, 0, 0xFF))); int spriteRow = 0; int spriteCol = 0; for (int row = y; row < y + 64; ++row) { spriteCol = 0; for (int col = x; col < x + 64; ++col) { uint16_t pixelColor = sprite[64 * spriteRow + spriteCol]; if (pixelColor != 0) { gFramebuffer[row * LCD_WIDTH + col] = color; } ++spriteCol; } ++spriteRow; } if (input.menu) { const char* snapFilename = "/sdcard/framebuf"; ESP_LOGI(LOG_TAG, "Writing snapshot to %s", snapFilename); FILE* snapFile = fopen(snapFilename, "wb"); assert(snapFile); fwrite(gFramebuffer, 1, LCD_WIDTH * LCD_HEIGHT * sizeof(gFramebuffer[0]), snapFile); fclose(snapFile); } uint32_t batteryLevel = Odroid_ReadBatteryLevel(); ESP_LOGI(LOG_TAG, "Battery level: %u\n", batteryLevel); if (batteryLevel < 3600) { Odroid_EnableBatteryLight(); } else { Odroid_DisableBatteryLight(); } Odroid_DrawFrame(gFramebuffer); } // Should never get here esp_restart(); }