-
Notifications
You must be signed in to change notification settings - Fork 6
/
display.c
122 lines (93 loc) · 3.23 KB
/
display.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
/*
* Copyright (c) 2018 PHYTEC Messtechnik GmbH
*
* SPDX-License-Identifier: Apache-2.0
*/
#include <zephyr.h>
#include <device.h>
#include <display/cfb.h>
#include <stdio.h>
#include <logging/log.h>
LOG_MODULE_REGISTER(display, 3);
#define DISPLAY_DRIVER DT_INST_0_SOLOMON_SSD1306FB_LABEL
static struct device *dev;
static u16_t rows;
static u8_t ppt;
static u8_t font_width;
static u8_t font_height;
#define SELECTED_FONT_INDEX 4 // perhaps make this a config parameter
/*---------------------------------------------------------------------------*/
/* */
/*---------------------------------------------------------------------------*/
void display_play(void)
{
u8_t x_offset = 0;
u8_t y_offset;
while (1) {
for (int i=0; i < rows; i++) {
y_offset = i * ppt;
switch (i) {
case 0:
cfb_print(dev, " average", x_offset, y_offset);
break;
case 1:
cfb_print(dev, " good", x_offset, y_offset);
break;
case 2:
cfb_print(dev, " better", x_offset, y_offset);
break;
case 3:
cfb_print(dev, " best", x_offset, y_offset);
break;
default:
break;
}
cfb_framebuffer_finalize(dev);
k_sleep(K_MSEC(300));
}
cfb_framebuffer_clear(dev, false);
if (x_offset > 50)
x_offset = 0;
else
x_offset += 5;
}
}
/*---------------------------------------------------------------------------*/
/* */
/*---------------------------------------------------------------------------*/
void display_init(void)
{
dev = device_get_binding(DISPLAY_DRIVER);
if (dev == NULL) {
LOG_ERR("Device not found");
return;
}
if (display_set_pixel_format(dev, PIXEL_FORMAT_MONO10) != 0) {
LOG_ERR("Failed to set required pixel format");
return;
}
LOG_INF("Binding to %s", DISPLAY_DRIVER);
if (cfb_framebuffer_init(dev)) {
LOG_ERR("Framebuffer initialization failed!");
return;
}
cfb_framebuffer_clear(dev, true);
display_blanking_off(dev);
rows = cfb_get_display_parameter(dev, CFB_DISPLAY_ROWS);
ppt = cfb_get_display_parameter(dev, CFB_DISPLAY_PPT);
int num_fonts = cfb_get_numof_fonts(dev);
for (int idx = 0; idx < num_fonts; idx++) {
cfb_get_font_size(dev, idx, &font_width, &font_height);
LOG_INF("Index[%d] font dimensions %2dx%d",
idx, font_width, font_height);
}
cfb_framebuffer_set_font(dev, SELECTED_FONT_INDEX);
LOG_INF("Selected font: index[%d]", SELECTED_FONT_INDEX);
cfb_framebuffer_invert(dev); // white on black
LOG_INF("x_res %d, y_res %d, ppt %d, rows %d, cols %d",
cfb_get_display_parameter(dev, CFB_DISPLAY_WIDTH),
cfb_get_display_parameter(dev, CFB_DISPLAY_HEIGH),
ppt,
rows,
cfb_get_display_parameter(dev, CFB_DISPLAY_COLS));
}