Move to Native SPI implementations of ILI9341 and STMPE610

This commit is contained in:
Pim van Pelt
2017-12-01 13:57:43 +01:00
parent 5b80d88b86
commit eab5f31a92
36 changed files with 71 additions and 10325 deletions

View File

@ -1,5 +1,5 @@
#include "backlight.h"
#include "stmpe610.h"
#include "mgos_stmpe610.h"
static float backlight_duty;
static float backlight_target_duty;

View File

@ -3,25 +3,16 @@
#include "mgos.h"
#include "mgos_pwm.h"
#include "tft.h"
#include "stmpe610.h"
#include "mongoose-touch.h"
#include "fonts/FreeMonoBold9pt7b.h"
struct screen_t *screen = NULL;
static long map(long x, long in_min, long in_max, long out_min, long out_max) {
return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
}
static void touch_handler(struct mgos_stmpe610_event_data *ed) {
uint16_t x, y;
struct widget_t *widget;
if (!ed) return;
x = map(ed->x, 0, 4095, 0, _width-1);
y = map(ed->y, 0, 4095, 0, _height-1);
LOG(LL_INFO, ("Touch %s at (%d,%d) pressure=%d, length=%d", ed->direction==TOUCH_UP?"UP":"DOWN", x, y, ed->z, ed->length));
LOG(LL_INFO, ("Touch %s at (%d,%d) pressure=%d, length=%d", ed->direction==TOUCH_UP?"UP":"DOWN", ed->x, ed->y, ed->z, ed->length));
// If the backlight is inactive, grab the TOUCH_DOWN and TOUCH_UP events.
// Do nothing on TOUCH_DOWN, but reactivate the backlight by calling
@ -39,7 +30,7 @@ static void touch_handler(struct mgos_stmpe610_event_data *ed) {
backlight_keepalive();
widget = screen_widget_find_by_xy(screen, x, y);
widget = screen_widget_find_by_xy(screen, ed->x, ed->y);
if (ed->direction==TOUCH_DOWN) {
widget_network_recv();
@ -56,10 +47,14 @@ void tft_demo(void)
{
struct widget_t *w;
mgos_ili9341_setRotation(mgos_sys_config_get_tft_orientation());
// mgos_ili9341_setRotation(mgos_sys_config_get_tft_orientation());
mgos_stmpe610_set_rotation(mgos_sys_config_get_tft_orientation());
mgos_ili9341_setGammaCurve(DEFAULT_GAMMA_CURVE);
mgos_ili9341_setFont(DEFAULT_FONT, NULL);
mgos_stmpe610_set_handler(touch_handler);
mgos_stmpe610_set_dimensions(320, 240);
mgos_ili9341_set_font(&FreeMonoBold9pt7b);
mgos_ili9341_set_fgcolor(0,0,0);
mgos_ili9341_fillScreen();
screen = screen_create_from_file("/screen_main.json", widget_default_ev, NULL);
if (!screen) {
@ -101,8 +96,6 @@ enum mgos_app_init_result mgos_app_init(void)
{
backlight_init();
mgos_stmpe610_set_handler(touch_handler);
tft_demo();
return MGOS_APP_INIT_SUCCESS;

View File

@ -1,7 +1,6 @@
#include "mgos.h"
#include "mgos_adc.h"
#include "mgos_config.h"
#include "tft.h"
#include "mongoose-touch.h"
#include "mgos_prometheus_metrics.h"
@ -22,13 +21,13 @@ static int widget_battery_getvoltage() {
static void widget_battery_render(struct widget_t *w, void *ev_data) {
int mvolts;
color_t color;
uint16_t color;
int h;
if (!w)
return;
mgos_ili9341_setclipwin(w->x, w->y, w->x+w->w, w->y+w->h);
mgos_ili9341_set_window(w->x, w->y, w->x+w->w, w->y+w->h);
mvolts=widget_battery_getvoltage();
color=ILI9341_RED;
@ -39,11 +38,11 @@ static void widget_battery_render(struct widget_t *w, void *ev_data) {
if (h<0) h=0;
if (h>12) h=12;
mgos_ili9341_drawFastHLine(5, 2, 3, color);
mgos_ili9341_fillRect(2, 4, 9, 14, color);
mgos_ili9341_set_fgcolor565(color);
mgos_ili9341_drawLine(5, 2, 8, 4);
mgos_ili9341_fillRect(2, 4, 9, 14);
if (h>0)
mgos_ili9341_fillRect(3, 5, 7, h, ILI9341_BLACK);
mgos_ili9341_resetclipwin();
mgos_ili9341_fillRect(3, 5, 7, h);
(void) ev_data;
}

View File

@ -1,16 +1,18 @@
#include "mgos.h"
#include "tft.h"
#include "mongoose-touch.h"
static void widget_default_draw(struct widget_t *w, color_t color) {
static void widget_default_draw(struct widget_t *w, uint16_t color) {
if (!w)
return;
mgos_ili9341_setclipwin(w->x, w->y, w->x+w->w, w->y+w->h);
mgos_ili9341_set_window(w->x, w->y, w->x+w->w, w->y+w->h);
mgos_ili9341_drawRoundRect(0, 0, w->w, w->h, 8, color);
mgos_ili9341_set_fgcolor565(color);
mgos_ili9341_drawRoundRect(0, 0, w->w, w->h, 8);
/*
if (w->img)
mgos_ili9341_png(0, 0, w->img);
*/
}
void widget_default_ev(int ev, struct widget_t *w, void *ev_data) {

View File

@ -2,7 +2,6 @@
#include "mgos_config.h"
#include "mgos_wifi.h"
#include "mgos_net.h"
#include "tft.h"
#include "mongoose-touch.h"
#define WIDGET_NAME_NAME 0
@ -55,11 +54,11 @@ static void widget_name_render(struct widget_t *w, void *ev_data) {
sprintf(namestring, "%-20s",mgos_sys_config_get_app_hostname());
}
mgos_ili9341_setclipwin(w->x, w->y, w->x+w->w, w->y+w->h);
mgos_ili9341_fillRect(0, 0, w->w, w->h, ILI9341_BLACK);
mgos_ili9341_set_fg(&ILI9341_GREEN);
mgos_ili9341_print(namestring, 2, 4);
mgos_ili9341_resetclipwin();
mgos_ili9341_set_window(w->x, w->y, w->x+w->w, w->y+w->h);
mgos_ili9341_set_fgcolor565(ILI9341_BLACK);
mgos_ili9341_fillRect(0, 0, w->w, w->h);
mgos_ili9341_set_fgcolor565(ILI9341_GREEN);
mgos_ili9341_print(2, 4, namestring);
(void) ev_data;
}

View File

@ -1,6 +1,5 @@
#include "mgos.h"
#include "mgos_timers.h"
#include "tft.h"
#include "mongoose-touch.h"
static mgos_timer_id send_timer = 0;
@ -8,15 +7,16 @@ static mgos_timer_id recv_timer = 0;
static struct widget_t *widget_network = NULL;
static void widget_network_render(struct widget_t *w, void *ev_data) {
mgos_ili9341_setclipwin(w->x, w->y, w->x+w->w, w->y+w->h);
mgos_ili9341_set_window(w->x, w->y, w->x+w->w, w->y+w->h);
// Send
mgos_ili9341_fillTriangle(2, 10, 10, 10, 6, 2, send_timer?ILI9341_YELLOW:ILI9341_DARKGREY);
mgos_ili9341_fillRect(5, 10, 3, 8, send_timer?ILI9341_YELLOW:ILI9341_DARKGREY);
mgos_ili9341_set_fgcolor565(send_timer?ILI9341_YELLOW:ILI9341_DARKGREY);
mgos_ili9341_fillTriangle(2, 10, 10, 10, 6, 2);
mgos_ili9341_fillRect(5, 10, 3, 8);
// Recv
mgos_ili9341_fillTriangle(12, 10, 20, 10, 16, 18, recv_timer?ILI9341_YELLOW:ILI9341_DARKGREY);
mgos_ili9341_fillRect(15, 2, 3, 8, recv_timer?ILI9341_YELLOW:ILI9341_DARKGREY);
mgos_ili9341_resetclipwin();
mgos_ili9341_set_fgcolor565(recv_timer?ILI9341_YELLOW:ILI9341_DARKGREY);
mgos_ili9341_fillTriangle(12, 10, 20, 10, 16, 18);
mgos_ili9341_fillRect(15, 2, 3, 8);
(void) ev_data;
}

View File

@ -1,5 +1,4 @@
#include "mgos.h"
#include "tft.h"
#include "mongoose-touch.h"
static void widget_time_render(struct widget_t *w, void *ev_data) {
@ -11,11 +10,10 @@ static void widget_time_render(struct widget_t *w, void *ev_data) {
if (!w)
return;
mgos_ili9341_set_fg(&ILI9341_YELLOW);
sprintf(tmp_buff, " %02d:%02d:%02d", tm_info->tm_hour, tm_info->tm_min, tm_info->tm_sec);
mgos_ili9341_setclipwin(w->x, w->y, w->x+w->w, w->y+w->h);
mgos_ili9341_print(tmp_buff, 2, 4);
mgos_ili9341_resetclipwin();
mgos_ili9341_set_fgcolor565(ILI9341_YELLOW);
sprintf(tmp_buff, " %02d:%02d", tm_info->tm_hour, tm_info->tm_min);
mgos_ili9341_set_window(w->x, w->y, w->x+w->w, w->y+w->h);
mgos_ili9341_print(2, 4, tmp_buff);
(void) ev_data;
}

View File

@ -1,14 +1,13 @@
#include "mgos.h"
#include "tft.h"
#include "mongoose-touch.h"
static void widget_topbar_render(struct widget_t *w, void *ev_data) {
if (!w)
return;
mgos_ili9341_setclipwin(w->x, w->y, w->x+w->w, w->y+w->h);
mgos_ili9341_fillRect(0, 0, w->w, w->h, ILI9341_WHITE);
mgos_ili9341_resetclipwin();
mgos_ili9341_set_window(w->x, w->y, w->x+w->w, w->y+w->h);
mgos_ili9341_set_fgcolor565(ILI9341_WHITE);
mgos_ili9341_fillRect(0, 0, w->w, w->h);
(void) ev_data;
}

View File

@ -1,5 +1,4 @@
#include "mgos.h"
#include "tft.h"
#include "mongoose-touch.h"
#include <esp_wifi.h>
@ -25,22 +24,25 @@ static uint8_t widget_wifi_signal() {
static void widget_wifi_render(struct widget_t *w, void *ev_data) {
uint8_t x, signal;
mgos_ili9341_setclipwin(w->x, w->y, w->x+w->w, w->y+w->h);
mgos_ili9341_set_window(w->x, w->y, w->x+w->w, w->y+w->h);
mgos_ili9341_fillTriangle(2, 18, 18, 18, 18, 2, ILI9341_DARKGREY);
mgos_ili9341_set_fgcolor565(ILI9341_DARKGREY);
mgos_ili9341_fillTriangle(2, 18, 18, 18, 18, 2);
// Map signal strength from [0..100] to [0..16]
signal = widget_wifi_signal();
x = map(signal, 0, 100, 0, 16);
if (x>0)
mgos_ili9341_fillTriangle(2, 18, 2+x, 18, 2+x, 18-x, ILI9341_WHITE);
if (x>0) {
mgos_ili9341_set_fgcolor565(ILI9341_WHITE);
mgos_ili9341_fillTriangle(2, 18, 2+x, 18, 2+x, 18-x);
}
// Draw an X in the corner if we don't have an IP address.
if (mgos_wifi_get_status() != MGOS_WIFI_IP_ACQUIRED) {
mgos_ili9341_drawLine(11, 11, 16, 16, ILI9341_RED);
mgos_ili9341_drawLine(11, 16, 16, 11, ILI9341_RED);
mgos_ili9341_set_fgcolor565(ILI9341_RED);
mgos_ili9341_drawLine(11, 11, 16, 16);
mgos_ili9341_drawLine(11, 16, 16, 11);
}
mgos_ili9341_resetclipwin();
(void) ev_data;
}