esp-who/components/lcd/test/lcd_example.cpp

272 lines
10 KiB
C++

/* ILI9341_SPI example
This example code is in the Public Domain (or CC0 licensed, at your option.)
Unless required by applicable law or agreed to in writing, this
software is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
CONDITIONS OF ANY KIND, either express or implied.
*/
/*
Some info about the ILI9341: It has an C/D line, which is connected to a GPIO here. It expects this
line to be low for a command and high for data. We use a pre-transmit callback to control that line
every transaction has as the user-definable argument the needed state of the D/C line and just
before the transaction is sent, the callback will set this line to the correct state.
Note: If not using ESP WROVER KIT, Users must change the pins by setting macro in file spi_ili.c
To change the fonts style include the header of your desired font from the "component/includes" folder
and simply pass the address of its GFXfont to setFont API
*/
/*C Includes*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/*RTOS Includes*/
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "freertos/event_groups.h"
#include "freertos/semphr.h"
/*SPI Includes*/
#include "driver/spi_master.h"
#include "iot_lcd.h"
#include "Adafruit_GFX.h"
#include "image.h"
#include "nvs_flash.h"
#include "esp_wifi.h"
#include "esp_log.h"
#include "esp_system.h"
#include "esp_event_loop.h"
/*Include desired font here*/
#define PROGMEM
#include "FreeSans9pt7b.h"
#include "unity.h"
static CEspLcd* lcd_obj = NULL;
wifi_scan_config_t scan_config = {
.ssid = 0,
.bssid = 0,
.channel = 0,
.show_hidden = true,
.scan_type = WIFI_SCAN_TYPE_ACTIVE,
.scan_time = {
.passive = 0,
},
};
const int CONNECTED_BIT = BIT0;
/* FreeRTOS event group to signal when we are connected & ready to make a request */
static EventGroupHandle_t wifi_event_group;
/*EVT handler for Wifi status*/
extern "C" esp_err_t event_handler(void *ctx, system_event_t *event)
{
switch (event->event_id) {
case SYSTEM_EVENT_STA_START:
esp_wifi_connect();
break;
case SYSTEM_EVENT_STA_GOT_IP:
xEventGroupSetBits(wifi_event_group, CONNECTED_BIT);
break;
case SYSTEM_EVENT_STA_DISCONNECTED:
/* This is a workaround as ESP32 WiFi libs don't currently
auto-reassociate. */
esp_wifi_connect();
xEventGroupClearBits(wifi_event_group, CONNECTED_BIT);
break;
default:
break;
}
return ESP_OK;
}
extern "C" void esp_draw()
{
/*Initilize ESP32 to scan for Access points*/
nvs_flash_init();
tcpip_adapter_init();
wifi_event_group = xEventGroupCreate();
ESP_ERROR_CHECK( esp_event_loop_init(event_handler, NULL) );
wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT();
ESP_ERROR_CHECK( esp_wifi_init(&cfg) );
ESP_ERROR_CHECK( esp_wifi_set_storage(WIFI_STORAGE_RAM) );
ESP_ERROR_CHECK( esp_wifi_set_mode(WIFI_MODE_STA) );
ESP_ERROR_CHECK( esp_wifi_start() );
/*Initialize LCD*/
lcd_conf_t lcd_pins = {
.lcd_model = LCD_MOD_AUTO_DET,
.pin_num_miso = GPIO_NUM_25,
.pin_num_mosi = GPIO_NUM_23,
.pin_num_clk = GPIO_NUM_19,
.pin_num_cs = GPIO_NUM_22,
.pin_num_dc = GPIO_NUM_21,
.pin_num_rst = GPIO_NUM_18,
.pin_num_bckl = GPIO_NUM_5,
.clk_freq = 20 * 1000 * 1000,
.rst_active_level = 0,
.bckl_active_level = 0,
.spi_host = HSPI_HOST,
.init_spi_bus = true,
};
if (lcd_obj == NULL) {
lcd_obj = new CEspLcd(&lcd_pins);
}
printf("lcd id: 0x%08x\n", lcd_obj->id.id);
/*Welcome screen*/
int x = 0, y = 0;
int dim = 6;
uint16_t rand_color;
lcd_obj->setRotation(3);
for (int i = 0; i < dim; i++) {
for (int j = 0; j < 10 - 2 * i; j++) {
rand_color = rand();
lcd_obj->fillRect(x * 32, y * 24, 32, 24, rand_color);
ets_delay_us(20000);
x++;
}
x--;
for (int j = 0; j < 10 - 2 * i; j++) {
rand_color = rand();
lcd_obj->fillRect(x * 32, y * 24, 32, 24, rand_color);
ets_delay_us(20000);
y++;
}
y--;
for (int j = 0; j < 10 - 2 * i - 1; j++) {
rand_color = rand();
lcd_obj->fillRect(x * 32, y * 24, 32, 24, rand_color);
ets_delay_us(20000);
x--;
}
x++;
for (int j = 0; j < 10 - 2 * i - 1; j++) {
rand_color = rand();
lcd_obj->fillRect((x - 1) * 32, y * 24, 32, 24, rand_color);
ets_delay_us(20000);
y--;
}
y++;
}
vTaskDelay(1000 / portTICK_PERIOD_MS);
/*ESPecifications*/
lcd_obj->setRotation(2);
lcd_obj->fillScreen(COLOR_ESP_BKGD);
lcd_obj->setTextSize(1);
lcd_obj->drawBitmap(0, 0, esp_logo, 137, 26);
lcd_obj->setTextColor(COLOR_GREEN, COLOR_ESP_BKGD);
lcd_obj->setFont(&FreeSans9pt7b);
lcd_obj->drawString("CPU", 3, 40);
lcd_obj->setFont(NULL);
lcd_obj->setTextColor(COLOR_YELLOW, COLOR_ESP_BKGD);
lcd_obj->drawString("Xtensa Dual-Core 32-bit LX6 MPU", 3, 50);
lcd_obj->drawString("Max Clock Speed at 240 MHz & 600 DMIPS ", 3, 60);
lcd_obj->drawString("at up to 600 DMIPS", 3, 70);
lcd_obj->drawString("Memory: 520 KiB SRAM", 3, 80);
lcd_obj->setTextColor(COLOR_GREEN, COLOR_ESP_BKGD);
lcd_obj->setFont(&FreeSans9pt7b);
lcd_obj->drawString("Wireless connectivity", 3, 110);
lcd_obj->setFont(NULL);
lcd_obj->setTextColor(COLOR_YELLOW, COLOR_ESP_BKGD);
lcd_obj->drawString("Wi-Fi: 802.11 b/g/n/e/i", 3, 120);
lcd_obj->drawString("Bluetooth: v4.2 BR/EDR and BLE", 3, 130);
lcd_obj->setTextColor(COLOR_GREEN, COLOR_ESP_BKGD);
lcd_obj->setFont(&FreeSans9pt7b);
lcd_obj->drawString("Power Management", 3, 160);
lcd_obj->setFont(NULL);
lcd_obj->setTextColor(COLOR_YELLOW, COLOR_ESP_BKGD);
lcd_obj->drawString("Internal LDO", 3, 170);
lcd_obj->drawString("Individual power domain for RTC", 3, 180);
lcd_obj->drawString("5uA deep sleep current", 3, 190);
lcd_obj->drawString("Wake up from GPIO interrupt" , 3, 200);
lcd_obj->drawString("Wake up from timer, ADC measurements", 3, 210);
lcd_obj->drawString("Wake up from capacitive sensor intr", 3, 220);
lcd_obj->setTextColor(COLOR_GREEN, COLOR_ESP_BKGD);
lcd_obj->setFont(&FreeSans9pt7b);
lcd_obj->drawString("Security", 3, 250);
lcd_obj->setFont(NULL);
lcd_obj->setTextColor(COLOR_YELLOW, COLOR_ESP_BKGD);
lcd_obj->drawString("IEEE 802.11 standard security features", 3, 260);
lcd_obj->drawString("Secure boot & Flash Encryption", 3, 270);
lcd_obj->drawString("Cryptographic Hardware Acceleration", 3, 280);
lcd_obj->drawString("AES, RSA, SHA-2, EEC, RNG", 3, 290);
lcd_obj->drawString("1024-bit OTP", 3, 300);
vTaskDelay(4000 / portTICK_PERIOD_MS);
lcd_obj->fillRect(0, 28, 240, 320, COLOR_ESP_BKGD);
lcd_obj->setTextColor(COLOR_GREEN, COLOR_ESP_BKGD);
lcd_obj->setFont(&FreeSans9pt7b);
lcd_obj->drawString("Peripheral Interfaces", 3, 40);
lcd_obj->setFont(NULL);
lcd_obj->setTextColor(COLOR_YELLOW, COLOR_ESP_BKGD);
lcd_obj->drawString("12-bit DAC, 18 channels", 3, 50);
lcd_obj->drawString("8-bit DAC, 2 channels", 3, 60);
lcd_obj->drawString("SPI, 4 channels", 3, 70);
lcd_obj->drawString("I2S, 4 channels", 3, 80);
lcd_obj->drawString("I2C, 2 channels", 3, 90);
lcd_obj->drawString("UART, 3 channels", 3, 100);
lcd_obj->drawString("SD/SDIO/MMC Host", 3, 110);
lcd_obj->drawString("SDIO/SPI Slave", 3, 120);
lcd_obj->drawString("Ethernet MAC with DMA & IEEE 1588", 3, 130);
lcd_obj->drawString("CAN bus 2.0", 3, 140);
lcd_obj->drawString("IR/RMT (Tx/Rx)", 3, 150);
lcd_obj->drawString("Motor PWM", 3, 160);
lcd_obj->drawString("LED PWM, 16 channels", 3, 170);
lcd_obj->drawString("Ultra Low Power Analog Pre-Amp", 3, 180);
lcd_obj->drawString("Hall Effect Sensor", 3, 190);
lcd_obj->drawString("Capacitive Touch Sense, 10 channels", 3, 200);
lcd_obj->drawString("Temperature Sensor", 3, 210);
vTaskDelay(4000 / portTICK_PERIOD_MS);
lcd_obj->fillScreen(COLOR_ESP_BKGD);
lcd_obj->drawBitmap(0, 0, esp_logo, 137, 26);
lcd_obj->drawRoundRect(0, 0, 240, 320, 3, COLOR_WHITE);
lcd_obj->drawFastHLine(0, 25, 320, COLOR_WHITE);
lcd_obj->setTextColor(COLOR_WHITE, COLOR_ESP_BKGD);
lcd_obj->drawString("Wifi-scan", 180, 10);
lcd_obj->setFont(&FreeSans9pt7b);
lcd_obj->drawString("AP Name", 10, 50);
lcd_obj->drawString("RSSI", 180, 50);
lcd_obj->setFont(NULL);
ESP_ERROR_CHECK(esp_wifi_scan_start(&scan_config, true));
uint16_t ap_num = 20;
wifi_ap_record_t ap_records[20];
ESP_ERROR_CHECK(esp_wifi_scan_get_ap_records(&ap_num, ap_records));
printf("Found %d access points:\n", ap_num);
/*Print 10 of them on the screen*/
for (uint8_t i = 0; i < ap_num; i++) {
lcd_obj->drawNumber(i + 1, 10, 60 + (i * 10));
lcd_obj->setTextColor(COLOR_YELLOW, COLOR_ESP_BKGD);
lcd_obj->drawString((char *) ap_records[i].ssid, 30, 60 + (i * 10));
lcd_obj->setTextColor(COLOR_GREEN, COLOR_ESP_BKGD);
lcd_obj->drawNumber(100 + ap_records[i].rssi, 200, 60 + (i * 10));
}
vTaskDelay(2000 / portTICK_PERIOD_MS);
}
TEST_CASE("LCD cpp test", "[lcd][iot]")
{
esp_draw();
}