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