No Description
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

main.c 6.4KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236
  1. #include "odroid/audio.h"
  2. #include "odroid/battery.h"
  3. #include "odroid/display.h"
  4. #include "odroid/input.h"
  5. #include "odroid/sdcard.h"
  6. #include "macros.h"
  7. #include "text.h"
  8. #include <esp_log.h>
  9. #include <freertos/FreeRTOS.h>
  10. #include <freertos/task.h>
  11. #include <string.h>
  12. static const char* LOG_TAG = "Main";
  13. static uint16_t gFramebuffer[LCD_WIDTH * LCD_HEIGHT];
  14. static const uint16_t palette[4] =
  15. {
  16. 0xFFFF,
  17. 0x55AD,
  18. 0xAA52,
  19. 0x0000,
  20. };
  21. static const uint8_t tiles[][16*16] =
  22. {
  23. // White
  24. {
  25. 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
  26. 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
  27. 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
  28. 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
  29. 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
  30. 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
  31. 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
  32. 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
  33. 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
  34. 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
  35. 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
  36. 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
  37. 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
  38. 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
  39. 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
  40. 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
  41. },
  42. // Light Grey
  43. {
  44. 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
  45. 0,0,1,1,1,1,1,1,1,1,1,1,1,1,0,0,
  46. 0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,
  47. 0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,
  48. 0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,
  49. 0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,
  50. 0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,
  51. 0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,
  52. 0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,
  53. 0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,
  54. 0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,
  55. 0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,
  56. 0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,
  57. 0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,
  58. 0,0,1,1,1,1,1,1,1,1,1,1,1,1,0,0,
  59. 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
  60. },
  61. // Dark Grey
  62. {
  63. 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
  64. 0,0,2,2,2,2,2,2,2,2,2,2,2,2,0,0,
  65. 0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,
  66. 0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,
  67. 0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,
  68. 0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,
  69. 0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,
  70. 0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,
  71. 0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,
  72. 0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,
  73. 0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,
  74. 0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,
  75. 0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,
  76. 0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,
  77. 0,0,2,2,2,2,2,2,2,2,2,2,2,2,0,0,
  78. 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
  79. },
  80. // Black
  81. {
  82. 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
  83. 0,0,3,3,3,3,3,3,3,3,3,3,3,3,0,0,
  84. 0,3,3,3,3,3,3,3,3,3,3,3,3,3,3,0,
  85. 0,3,3,3,3,3,3,3,3,3,3,3,3,3,3,0,
  86. 0,3,3,3,3,3,3,3,3,3,3,3,3,3,3,0,
  87. 0,3,3,3,3,3,3,3,3,3,3,3,3,3,3,0,
  88. 0,3,3,3,3,3,3,3,3,3,3,3,3,3,3,0,
  89. 0,3,3,3,3,3,3,3,3,3,3,3,3,3,3,0,
  90. 0,3,3,3,3,3,3,3,3,3,3,3,3,3,3,0,
  91. 0,3,3,3,3,3,3,3,3,3,3,3,3,3,3,0,
  92. 0,3,3,3,3,3,3,3,3,3,3,3,3,3,3,0,
  93. 0,3,3,3,3,3,3,3,3,3,3,3,3,3,3,0,
  94. 0,3,3,3,3,3,3,3,3,3,3,3,3,3,3,0,
  95. 0,3,3,3,3,3,3,3,3,3,3,3,3,3,3,0,
  96. 0,0,3,3,3,3,3,3,3,3,3,3,3,3,0,0,
  97. 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
  98. },
  99. };
  100. static int tileBuffer[15][40] =
  101. {
  102. {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  103. {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  104. {0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  105. {0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0},
  106. {0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0},
  107. {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0},
  108. {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0},
  109. {0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0},
  110. {0, 0, 0, 0, 0, 0, 0, 3, 3, 0, 0, 0, 0, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0},
  111. {0, 0, 3, 0, 0, 0, 3, 3, 3, 0, 0, 0, 3, 3, 3, 3, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0},
  112. {2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2},
  113. {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
  114. {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
  115. {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
  116. {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
  117. };
  118. void DrawTile(int index, int x, int y)
  119. {
  120. int startX = x * 16;
  121. int startY = y * 16;
  122. for (int row = 0; row < 16; ++row)
  123. {
  124. for (int col = 0; col < 16; ++col)
  125. {
  126. uint8_t paletteIndex = tiles[index][row * 16 + col];
  127. int screenY = startY + row;
  128. int screenX = startX + col;
  129. uint16_t color = palette[paletteIndex];
  130. gFramebuffer[screenY * LCD_WIDTH + screenX] = color;
  131. }
  132. }
  133. }
  134. void app_main(void)
  135. {
  136. Odroid_InitializeInput();
  137. Odroid_InitializeDisplay();
  138. Odroid_InitializeSdcard();
  139. Odroid_InitializeBatteryReader();
  140. Odroid_InitializeAudio();
  141. ESP_LOGI(LOG_TAG, "Odroid initialization complete - entering main loop");
  142. uint8_t frameIndex = 0;
  143. char snapFilename[20];
  144. int xLeft = 0;
  145. for (;;)
  146. {
  147. memset(gFramebuffer, 0xff, 320*240*2);
  148. Odroid_Input input = Odroid_PollInput();
  149. if (input.left)
  150. {
  151. xLeft -= 1;
  152. if (xLeft < 0)
  153. {
  154. xLeft = 39;
  155. }
  156. }
  157. else if (input.right)
  158. {
  159. xLeft += 1;
  160. if (xLeft > 39)
  161. {
  162. xLeft = 0;
  163. }
  164. }
  165. for (int tileY = 0; tileY < 15; ++tileY)
  166. {
  167. for (int tileX = xLeft; tileX < xLeft + 20; ++tileX)
  168. {
  169. int tile = tileX % 40;
  170. int tileIndex = tileBuffer[tileY][tile];
  171. DrawTile(tileIndex, tileX - xLeft, tileY);
  172. }
  173. }
  174. char string[5];
  175. snprintf(string, 5, "%02d", xLeft);
  176. DrawText(gFramebuffer, string, 2, 0, 0, palette[3]);
  177. int tileRight = (xLeft + 20) % 40;
  178. snprintf(string, 5, "%02d", tileRight);
  179. DrawText(gFramebuffer, string, 2, 18, 0, palette[3]);
  180. if (input.menu)
  181. {
  182. snprintf(snapFilename, 20, "/sdcard/frame%02d", frameIndex);
  183. ESP_LOGI(LOG_TAG, "Writing snapshot to %s", snapFilename);
  184. FILE* snapFile = fopen(snapFilename, "wb");
  185. assert(snapFile);
  186. fwrite(gFramebuffer, 1, LCD_WIDTH * LCD_HEIGHT * sizeof(gFramebuffer[0]), snapFile);
  187. fclose(snapFile);
  188. ++frameIndex;
  189. }
  190. Odroid_DrawFrame(gFramebuffer);
  191. }
  192. // Should never get here
  193. esp_restart();
  194. }