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