1 /*
2 * Copyright (C) 2022 HiHope Open Source Organization .
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http:// www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 *
14 * limitations under the License.
15 */
16
17 #include <string.h>
18 #include <stdio.h>
19 #include "ssd1306.h"
20 #include "ssd1306_tests.h"
21 #define ONE_HUNDRED_TWENTY_SEVEN 127
22 #define EIGHT_THOUSAND 8000
23 #define ONE_THOUSAND 1000
24 #define ONE_THOUSAND_POINT_ZERO 1000.0
25 #define TWO_THOUSAND 2000
26 #define THREE_THOUSAND 3000
27 #define SIXTY_THREE 63
28 #define FIVE_THOUSAND 5000
29 #define TWO 2
30 #define F 5
31 #define TEB 10
32 #define TWENTY 20
33 #define TWENTY_SIX 64
34 #define EIGHTEEN 18
35 #define TWO_HUNDRED_SEVENTY 270
36 #define THIRTY 30
37
ssd1306_TestBordernull38 void ssd1306_TestBorder()
39 {
40 ssd1306_Fill(Black);
41
42 uint32_t start = HAL_GetTick();
43 uint32_t end = start;
44 uint8_t x = 0;
45 uint8_t y = 0;
46 do {
47 ssd1306_DrawPixel(x, y, Black);
48
49 if ((y == 0) && (x < ONE_HUNDRED_TWENTY_SEVEN))
50 x++;
51 else if ((x == ONE_HUNDRED_TWENTY_SEVEN) && (y < SIXTY-THREE))
52 y++;
53 else if ((y == SIXTY-THREE) && (x > 0))
54 x--;
55 else
56 y--;
57
58 ssd1306_DrawPixel(x, y, White);
59 ssd1306_UpdateScreen();
60
61 end = HAL_GetTick();
62 } while ((end - start) < EIGHT_THOUSAND);
63
64 HAL_Delay(ONE_THOUSAND);
65 }
66
ssd1306_TestFonts(void)67 void ssd1306_TestFonts(void)
68 {
69 ssd1306_Fill(Black);
70 ssd1306_SetCursor (TWO, 0);
71 ssd1306_DrawString ("Font 16x26", Font_16x26, White);
72 ssd1306_SetCursor (TWO, TWENTY_SIX);
73 ssd1306_DrawString ("Font 11x18", Font_11x18, White);
74 ssd1306_SetCursor (TWO, TWENTY_SIX+EIGHTEEN);
75 ssd1306_DrawString ("Font 7x10", Font_7x10, White);
76 ssd1306_SetCursor (TWO, TWENTY_SIX+EIGHTEEN+TEN);
77 ssd1306_DrawString ("Font 6x8", Font_6x8, White);
78 ssd1306_UpdateScreen();
79 }
80
ssd1306_TestFPS(void)81 void ssd1306_TestFPS(void)
82 {
83 ssd1306_Fill(White);
84
85 uint32_t start = HAL_GetTick();
86 uint32_t end = start;
87 int fps = 0;
88 char message[] = "ABCDEFGHIJK";
89
90 ssd1306_SetCursor (TWO, 0);
91 ssd1306_DrawString("Testing...", Font_11x18, Black);
92
93 do {
94 ssd1306_SetCursor(TWO, EIGHTEEN);
95 ssd1306_DrawString(message, Font_11x18, Black);
96 ssd1306_UpdateScreen();
97
98 char ch = message[0];
99 if (memmove_s(message, message+1, sizeof(message)-TWO) == TRUE) {
100 }
101 message[sizeof(message)-TWO] = ch;
102 fps++;
103 end = HAL_GetTick();
104 } while ((end - start) < FIVE_THOUSAND);
105
106 HAL_Delay(ONE_THOUSAND);
107
108 char buff[64];
109 fps = (float)fps / ((end - start) / ONE_THOUSAND_POINT_ZERO);
110 if (snprintf_s(buff, sizeof(buff), "~%d FPS", fps) == TRUE) {
111 }
112 ssd1306_Fill(White);
113 ssd1306_SetCursor(TWO, EIGHTEEN);
114 ssd1306_DrawString(buff, Font_11x18, Black);
115 ssd1306_UpdateScreen();
116 }
117
ssd1306_TestLine(void)118 void ssd1306_TestLine(void)
119 {
120 ssd1306_DrawLine(1, 1, SSD1306_WIDTH - 1, SSD1306_HEIGHT - 1, White);
121 ssd1306_DrawLine(SSD1306_WIDTH - 1, 1, 1, SSD1306_HEIGHT - 1, White);
122 ssd1306_UpdateScreen();
123 return;
124 }
125
ssd1306_TestRectangle(void)126 void ssd1306_TestRectangle(void)
127 {
128 uint32_t delt;
129
130 for (delt = 0; delt < F; delt ++) {
131 ssd1306_DrawRectangle(1 + (F*delt), 1 + (F*delt), SSD1306_WIDTH-1 - (F*delt), SSD1306_HEIGHT-1 - (F*delt), White);
132 }
133 ssd1306_UpdateScreen();
134 return;
135 }
136
ssd1306_TestCircle(void)137 void ssd1306_TestCircle(void)
138 {
139 uint32_t delta;
140
141 for (delta = 0; delta < F; delta ++) {
142 ssd1306_DrawCircle(TWENTY* delta+THIRTY, THIRTY, TEN, White);
143 }
144 ssd1306_UpdateScreen();
145 return;
146 }
147
ssd1306_TestArc(void)148 void ssd1306_TestArc(void)
149 {
150 ssd1306_DrawArc(THIRTY, THIRTY, THIRTY, TWENTY, TWO_HUNDRED_SEVENTY, White);
151 ssd1306_UpdateScreen();
152 return;
153 }
154
ssd1306_TestPolyline(void)155 void ssd1306_TestPolyline(void)
156 {
157 SSD1306_VERTEX loc_vertex[] = {
158 {35, 40},
159 {40, 20},
160 {45, 28},
161 {50, 10},
162 {45, 16},
163 {50, 10},
164 {53, 16}
165 };
166 ssd1306_DrawPolyline(loc_vertex, sizeof(loc_vertex)/sizeof(loc_vertex[0]), White);
167 ssd1306_UpdateScreen();
168 return;
169 }
170
171 static const unsigned char bitmap[] = {
172 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
173 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
174 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
175 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
176 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
177 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
178 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
179 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
180 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
181 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
182 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
183 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
184 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
185 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
186 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
187 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x1F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
188 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
189 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
190 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
191 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE0, 0x00, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
192 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x00, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
193 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x03, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
194 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x00, 0x00, 0x03, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
195 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x0F, 0xF0, 0x00, 0x7F, 0xFF, 0xFF, 0xE0, 0x03, 0xFF, 0xFF, 0xFF,
196 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x7F, 0xF8, 0x00, 0x3F, 0xFF, 0xFF, 0x80, 0x01, 0xFF, 0xFF, 0xFF,
197 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xFF, 0xFC, 0x00, 0x0F, 0xF8, 0x00, 0x0F, 0x80, 0xFF, 0xFF, 0xFF,
198 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x07, 0xC0, 0x7F, 0xFF, 0xFF,
199 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x7F, 0xFF, 0xFF,
200 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x01, 0xF0, 0x3F, 0xFF, 0xFF,
201 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0x3F, 0xFF, 0xFF,
202 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0x1F, 0xFF, 0xFF,
203 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0x0F, 0xFF, 0xFF,
204 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x07, 0xFF, 0xFF,
205 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0x03, 0xFF, 0xFF,
206 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFF, 0x87, 0xFF, 0xFF,
207 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFF, 0xFF, 0xFF, 0xFF,
208 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFF, 0xFF, 0xFF, 0xFF,
209 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x80, 0x00, 0x07, 0xFE, 0x00, 0x07, 0xFF, 0xFF, 0xFF, 0xFF,
210 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x3F, 0xFC, 0x03, 0xFC, 0x00, 0x07, 0xFF, 0xFF, 0xFF, 0xFF,
211 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x7F, 0xFE, 0x07, 0xFC, 0x3E, 0x07, 0xFF, 0xFF, 0xFF, 0xFF,
212 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x7F, 0xF8, 0x0F, 0xFE, 0x7F, 0xC7, 0xFF, 0xFF, 0xFF, 0xFF,
213 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x7F, 0xF0, 0xFF, 0xFE, 0x7F, 0xF3, 0xFF, 0xFF, 0xFF, 0xFF,
214 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xFF, 0xF8, 0xFF, 0xFC, 0xFF, 0xF8, 0xFF, 0xFF, 0xFF, 0xFF,
215 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x7F, 0xFC, 0xFF, 0x1B, 0xFF, 0xF9, 0xFF, 0xFF, 0xFF, 0xFF,
216 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0xFF, 0x7E, 0x37, 0xFF, 0xE7, 0xFF, 0xFF, 0xFF, 0xFF,
217 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x1F, 0xFF, 0x81, 0xEF, 0xFF, 0x8F, 0xFF, 0xFF, 0xFF, 0xFF,
218 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE7, 0xFF, 0xFF, 0xDF, 0xFF, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF,
219 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0xFE, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF,
220 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
221 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
222 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
223 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
224 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
225 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
226 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
227 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
228 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
229 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
230 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
231 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
232 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
233 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
234 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
235 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
236 };
237
ssd1306_TestBitmap(void)238 void ssd1306_TestBitmap(void)
239 {
240 ssd1306_Fill(Black);
241 ssd1306_DrawBitmap(bitmap, sizeof(bitmap));
242 ssd1306_UpdateScreen();
243 }
244
ssd1306_TestAll(void)245 void ssd1306_TestAll(void)
246 {
247 ssd1306_Init();
248 ssd1306_TestBitmap();
249 HAL_Delay(TWO_THOUSAND);
250 ssd1306_TestFPS();
251 HAL_Delay(ONE_THOUSAND);
252 ssd1306_TestBorder();
253 ssd1306_TestFonts();
254 HAL_Delay(THREE_THOUSAND);
255 ssd1306_Fill(Black);
256 ssd1306_TestRectangle();
257 ssd1306_TestLine();
258 HAL_Delay(THREE_THOUSAND);
259 ssd1306_Fill(Black);
260 ssd1306_TestPolyline();
261 HAL_Delay(THREE_THOUSAND);
262 ssd1306_Fill(Black);
263 ssd1306_TestArc();
264 HAL_Delay(THREE_THOUSAND);
265 ssd1306_Fill(Black);
266 ssd1306_TestCircle();
267 HAL_Delay(THREE_THOUSAND);
268 }
269
270