1 /*
2 * Copyright (c) 2023 Jamie McCrae
3 * Copyright (c) 2024-2025 Chen Xingyu <hi@xingrz.me>
4 *
5 * SPDX-License-Identifier: Apache-2.0
6 */
7
8 #include <math.h>
9 #include <stdio.h>
10 #include <string.h>
11 #include <zephyr/kernel.h>
12 #include <zephyr/device.h>
13 #include <zephyr/drivers/auxdisplay.h>
14 #include <zephyr/logging/log.h>
15
16 LOG_MODULE_REGISTER(auxdisplay_sample, LOG_LEVEL_DBG);
17
18 #define AUXDISPLAY_NODE DT_NODELABEL(auxdisplay_0)
19 #define AUXDISPLAY_DIGIT_COUNT DT_PROP_LEN(AUXDISPLAY_NODE, digit_gpios)
20
21 static const struct device *const dev = DEVICE_DT_GET(AUXDISPLAY_NODE);
22 static uint8_t data[AUXDISPLAY_DIGIT_COUNT * 2];
23
main(void)24 int main(void)
25 {
26 int rc;
27 int i, len;
28
29 if (!device_is_ready(dev)) {
30 LOG_ERR("Auxdisplay device is not ready.");
31 return -ENODEV;
32 }
33
34 /* Light up all segments */
35 for (i = 0; i < AUXDISPLAY_DIGIT_COUNT; i++) {
36 data[i * 2] = '8';
37 data[i * 2 + 1] = '.';
38 }
39 rc = auxdisplay_write(dev, data, strlen(data));
40 if (rc != 0) {
41 LOG_ERR("Failed to write data: %d", rc);
42 return rc;
43 }
44
45 k_msleep(500);
46
47 /* Blinks it once */
48
49 rc = auxdisplay_display_off(dev);
50 if (rc != 0) {
51 LOG_ERR("Failed to turn display off: %d", rc);
52 return rc;
53 }
54
55 k_msleep(500);
56
57 rc = auxdisplay_display_on(dev);
58 if (rc != 0) {
59 LOG_ERR("Failed to turn display on: %d", rc);
60 return rc;
61 }
62
63 k_msleep(500);
64
65 /* Clear the display */
66
67 rc = auxdisplay_clear(dev);
68 if (rc != 0) {
69 LOG_ERR("Failed to clear display: %d", rc);
70 return rc;
71 }
72
73 k_msleep(500);
74
75 /* Test cursor movement by filling each digit with a number */
76
77 for (i = 0; i < AUXDISPLAY_DIGIT_COUNT; i++) {
78 snprintf(data, sizeof(data), "%d", i);
79 rc = auxdisplay_write(dev, data, strlen(data));
80 if (rc != 0) {
81 LOG_ERR("Failed to write data: %d", rc);
82 return rc;
83 }
84
85 k_msleep(500);
86 }
87
88 k_msleep(500);
89
90 /* Count from 0 up to fill all digits */
91
92 for (i = 0;; i = (i + 1) % (int)pow(10, AUXDISPLAY_DIGIT_COUNT)) {
93 snprintk(data, sizeof(data), "%d", i);
94 len = strlen(data);
95
96 rc = auxdisplay_clear(dev);
97 if (rc != 0) {
98 LOG_ERR("Failed to clear display: %d", rc);
99 return rc;
100 }
101
102 /* Right-align the number */
103 rc = auxdisplay_cursor_position_set(dev, AUXDISPLAY_POSITION_ABSOLUTE,
104 AUXDISPLAY_DIGIT_COUNT - len, 0);
105 if (rc != 0) {
106 LOG_ERR("Failed to set cursor position: %d", rc);
107 return rc;
108 }
109
110 rc = auxdisplay_write(dev, data, len);
111 if (rc != 0) {
112 LOG_ERR("Failed to write data: %d", rc);
113 return rc;
114 }
115
116 k_msleep(100);
117 }
118
119 return 0;
120 }
121