main.c 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276
  1. #include "u8g2.h"
  2. #include <stdio.h>
  3. #define LUT_ARRAY_LEN 20
  4. #define LUT_WAVE_CNT 4
  5. /*
  6. level
  7. 0: neutral, middle
  8. 1: upper line
  9. 2: lower line
  10. */
  11. uint8_t lut_level[LUT_WAVE_CNT][LUT_ARRAY_LEN];
  12. uint8_t lut_time[LUT_ARRAY_LEN];
  13. #define LUT_DY 3
  14. uint8_t lut_time_to_width[16] =
  15. {
  16. 2, // 0
  17. 2, // 1
  18. 2, // 2
  19. 2, // 3
  20. 3, // 4
  21. 3, // 5
  22. 3, // 6
  23. 3, // 7
  24. 4, // 8
  25. 4, // 9
  26. 4, // 10
  27. 4, // 11
  28. 5, // 12
  29. 5, // 13
  30. 5, // 14
  31. 5, // 15
  32. };
  33. u8g2_uint_t get_dx(uint8_t i)
  34. {
  35. //return 5;
  36. return lut_time_to_width[lut_time[i]];
  37. }
  38. void read_lut(const uint8_t *lut)
  39. {
  40. uint8_t i;
  41. for ( i = 0; i < LUT_ARRAY_LEN; i++ )
  42. {
  43. lut_level[0][i] = lut[i] & 3;
  44. lut_level[1][i] = (lut[i]>>2) & 3;
  45. lut_level[2][i] = (lut[i]>>4) & 3;
  46. lut_level[3][i] = (lut[i]>>6) & 3;
  47. }
  48. for ( i = 0; i < LUT_ARRAY_LEN/2; i++ )
  49. {
  50. lut_time[i*2 + 0] = lut[LUT_ARRAY_LEN+i] & 15;
  51. lut_time[i*2 + 1] = (lut[LUT_ARRAY_LEN+i]>>4) & 15;
  52. }
  53. }
  54. void draw_lut_wave(u8g2_t *u8g2, uint8_t w, uint8_t cx, u8g2_uint_t y)
  55. {
  56. uint8_t i;
  57. u8g2_uint_t x1, y1;
  58. u8g2_uint_t x2, y2;
  59. x1 = 18;
  60. y1 = y;
  61. u8g2_DrawGlyph(u8g2, 2,y+2, (w&2)?'1':'0');
  62. u8g2_DrawGlyph(u8g2, 8,y+2, (w&1)?'1':'0');
  63. for( i = 0; i < LUT_ARRAY_LEN; i++ )
  64. {
  65. x2 = x1 + get_dx(i);
  66. y2 = y;
  67. if ( lut_level[w][i] == 1)
  68. y2 -= LUT_DY-1;
  69. else if ( lut_level[w][i] == 2 )
  70. y2 += LUT_DY-1;
  71. if ( y1 != y2 )
  72. u8g2_DrawLine(u8g2, x1, y1, x1, y2);
  73. u8g2_DrawHLine(u8g2, x1, y2, x2-x1+1);
  74. if ( i == cx )
  75. {
  76. u8g2_DrawHLine(u8g2, x1, y-LUT_DY-1, x2-x1+1);
  77. u8g2_DrawHLine(u8g2, x1, y+LUT_DY+1, x2-x1+1);
  78. }
  79. x1 = x2;
  80. y1 = y2;
  81. }
  82. }
  83. void draw_all_lut(u8g2_t *u8g2, uint8_t cx, uint8_t cy)
  84. {
  85. uint8_t i;
  86. uint16_t total;
  87. u8g2_uint_t x, y;
  88. u8g2_uint_t xs = 1;
  89. y = LUT_DY +1;
  90. for( i = 0; i < LUT_WAVE_CNT; i++ )
  91. {
  92. if ( i == cy )
  93. draw_lut_wave(u8g2, i, cx, y);
  94. else
  95. draw_lut_wave(u8g2, i, 255, y); // 255: no cursor
  96. y += (LUT_DY+2)*2;
  97. }
  98. total = 0;
  99. for( i = 0; i < LUT_ARRAY_LEN; i++ )
  100. total += lut_time[i];
  101. y+=1;
  102. if ( cy == LUT_WAVE_CNT )
  103. {
  104. u8g2_SetDrawColor(u8g2, 0);
  105. }
  106. else
  107. {
  108. u8g2_SetDrawColor(u8g2, 1);
  109. }
  110. x = u8g2_DrawStr(u8g2, xs, y, " TP[");
  111. x += u8g2_DrawStr(u8g2, x, y, u8x8_u8toa( cx, 2));
  112. x += u8g2_DrawStr(u8g2, x, y, "]=");
  113. x += u8g2_DrawStr(u8g2, x, y, u8x8_u8toa( lut_time[cx], 2));
  114. x += u8g2_DrawStr(u8g2, x, y, " ");
  115. x += u8g2_DrawStr(u8g2, x, y, " total=");
  116. x += u8g2_DrawStr(u8g2, x, y, u8x8_u16toa( total, 3));
  117. x += u8g2_DrawStr(u8g2, x, y, " ");
  118. y+=8;
  119. if ( cy == LUT_WAVE_CNT+1 )
  120. {
  121. u8g2_SetDrawColor(u8g2, 0);
  122. }
  123. else
  124. {
  125. u8g2_SetDrawColor(u8g2, 1);
  126. }
  127. x = u8g2_DrawStr(u8g2, xs, y, " Test ");
  128. y+=8;
  129. if ( cy == LUT_WAVE_CNT+2 )
  130. {
  131. u8g2_SetDrawColor(u8g2, 0);
  132. }
  133. else
  134. {
  135. u8g2_SetDrawColor(u8g2, 1);
  136. }
  137. x = u8g2_DrawStr(u8g2, xs, y, " Print ");
  138. u8g2_SetDrawColor(u8g2, 1);
  139. }
  140. void init_lut(void)
  141. {
  142. uint8_t i, j;
  143. for( i = 0; i < LUT_ARRAY_LEN; i++ )
  144. {
  145. for( j = 0; j < LUT_WAVE_CNT; j++ )
  146. lut_level[j][i] = 0;
  147. lut_time[i] = 0;
  148. }
  149. }
  150. uint8_t edit_lut(u8g2_t *u8g2)
  151. {
  152. uint8_t event;
  153. uint8_t cx, cy;
  154. u8g2_SetFont(u8g2, u8g2_font_5x7_mr);
  155. u8g2_SetFontMode(u8g2, 0);
  156. u8g2_SetFontDirection(u8g2, 0);
  157. cx = 0;
  158. cy = 0;
  159. for(;;)
  160. {
  161. u8g2_FirstPage(u8g2);
  162. do
  163. {
  164. draw_all_lut(u8g2, cx, cy);
  165. } while( u8g2_NextPage(u8g2) );
  166. for(;;)
  167. {
  168. event = u8x8_GetMenuEvent(u8g2_GetU8x8(u8g2));
  169. if ( event == U8X8_MSG_GPIO_MENU_SELECT )
  170. {
  171. if ( cx < LUT_ARRAY_LEN && cy < LUT_WAVE_CNT )
  172. {
  173. lut_level[cy][cx]++;
  174. if ( lut_level[cy][cx] >= 3 )
  175. lut_level[cy][cx] = 0;
  176. }
  177. else
  178. {
  179. if ( cy == LUT_WAVE_CNT )
  180. {
  181. lut_time[cx]++;
  182. if ( lut_time[cx] >= 16 )
  183. lut_time[cx] = 0;
  184. }
  185. }
  186. break;
  187. }
  188. else if ( event == U8X8_MSG_GPIO_MENU_HOME )
  189. return 0;
  190. else if ( event == U8X8_MSG_GPIO_MENU_NEXT )
  191. {
  192. cx++;
  193. if ( cx >= LUT_ARRAY_LEN )
  194. cx = 0;
  195. break;
  196. }
  197. else if ( event == U8X8_MSG_GPIO_MENU_DOWN )
  198. {
  199. cy++;
  200. if ( cy >= LUT_WAVE_CNT+3 )
  201. cy = 0;
  202. break;
  203. }
  204. else if ( event == U8X8_MSG_GPIO_MENU_PREV )
  205. {
  206. if ( cx == 0 )
  207. cx = LUT_ARRAY_LEN;
  208. cx--;
  209. break;
  210. }
  211. else if ( event == U8X8_MSG_GPIO_MENU_UP )
  212. {
  213. if ( cy == 0 )
  214. cy = LUT_WAVE_CNT+3;
  215. cy--;
  216. break;
  217. }
  218. }
  219. }
  220. return 0;
  221. }
  222. u8g2_t u8g2;
  223. const uint8_t LUTDefault_full[31] =
  224. {
  225. 0x50, 0xAA, 0x55, 0xAA, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00,
  226. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  227. 0xFF, 0xFF, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
  228. };
  229. int main(void)
  230. {
  231. u8g2_SetupBuffer_SDL_128x64_4(&u8g2, &u8g2_cb_r0);
  232. u8x8_InitDisplay(u8g2_GetU8x8(&u8g2));
  233. u8x8_SetPowerSave(u8g2_GetU8x8(&u8g2), 0);
  234. init_lut();
  235. read_lut(LUTDefault_full);
  236. edit_lut(&u8g2);
  237. return 0;
  238. }