/* * Copyright (c) 2015 Intel Corporation * * SPDX-License-Identifier: Apache-2.0 */ #include #include #include #include #include /** * @file Display a counter through I2C and Grove LCD. */ /* sleep time in msec */ #define SLEEPTIME 100 uint8_t clamp_rgb(int val) { if (val > 255) { return 255; } else if (val < 0) { return 0; } else { return val; } } int main(void) { const struct device *const glcd = DEVICE_DT_GET(DT_NODELABEL(glcd)); char str[20]; int rgb[] = { 0x0, 0x0, 0x0 }; uint8_t rgb_chg[3]; const uint8_t rgb_step = 16U; uint8_t set_config; int i, j, m; int cnt; if (!device_is_ready(glcd)) { printk("Grove LCD: Device not ready.\n"); return 0; } /* Now configure the LCD the way we want it */ set_config = GLCD_FS_ROWS_2 | GLCD_FS_DOT_SIZE_LITTLE | GLCD_FS_8BIT_MODE; glcd_function_set(glcd, set_config); set_config = GLCD_DS_DISPLAY_ON | GLCD_DS_CURSOR_ON | GLCD_DS_BLINK_ON; glcd_display_state_set(glcd, set_config); /* Setup variables /*/ for (i = 0; i < sizeof(str); i++) { str[i] = '\0'; } /* Starting counting */ cnt = 0; while (1) { glcd_cursor_pos_set(glcd, 0, 0); /* RGB values are from 0 - 511. * First half means incrementally brighter. * Second half is opposite (i.e. goes darker). */ /* Update the RGB values for backlight */ m = (rgb[2] > 255) ? (512 - rgb[2]) : (rgb[2]); rgb_chg[2] = clamp_rgb(m); m = (rgb[1] > 255) ? (512 - rgb[1]) : (rgb[1]); rgb_chg[1] = clamp_rgb(m); m = (rgb[0] > 255) ? (512 - rgb[0]) : (rgb[0]); rgb_chg[0] = clamp_rgb(m); glcd_color_set(glcd, rgb_chg[0], rgb_chg[1], rgb_chg[2]); /* Display the counter * * well... sprintf() might be easier, * but this is more fun. */ m = cnt; i = 1000000000; j = 0; while (i > 0) { str[j] = '0' + (m / i); m = m % i; i = i / 10; j++; } cnt++; glcd_print(glcd, str, j); /* Rotate RGB values */ rgb[2] += rgb_step; if (rgb[2] > 511) { rgb[2] = 0; rgb[1] += rgb_step; } if (rgb[1] > 511) { rgb[1] = 0; rgb[0] += rgb_step; } if (rgb[0] > 511) { rgb[0] = 0; } /* wait a while */ k_msleep(SLEEPTIME); } return 0; }