Compare commits

..

4 Commits

  1. 1
      .gitignore
  2. 2
      CMakeLists.txt
  3. 2
      main/CMakeLists.txt
  4. 40
      main/app_main.c
  5. 70
      main/gui.c
  6. 10
      main/gui.h
  7. 54
      main/hello_world_main.c
  8. 291
      main/knob.c
  9. 7
      main/knob.h
  10. 372
      main/nokia.c
  11. 2
      sdkconfig

1
.gitignore vendored

@ -2,3 +2,4 @@ cmake-build-debug
*.o
build/
.idea/
sdkconfig.old

@ -7,4 +7,4 @@ set(CMAKE_CXX_COMPILER xtensa-esp32-elf-g++)
set(CMAKE_ASM_COMPILER xtensa-esp32-elf-as)
include($ENV{IDF_PATH}/tools/cmake/project.cmake)
project(hello-world)
project(reflower)

@ -1,4 +1,4 @@
set(COMPONENT_SRCS "hello_world_main.c" "nokia.c")
set(COMPONENT_SRCS "app_main.c" "nokia.c" "knob.c" "gui.c")
set(COMPONENT_ADD_INCLUDEDIRS "")
register_component()

@ -0,0 +1,40 @@
/* Hello World 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.
*/
#include <stdio.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "esp_system.h"
#include "esp_spi_flash.h"
#include "nokia.h"
#include "knob.h"
#include "gui.h"
void __attribute__((noreturn)) app_main()
{
printf("Hello world!\n");
gpio_config_t output = {
.pin_bit_mask = (1<<22),
.mode = GPIO_MODE_OUTPUT
};
gpio_config(&output);
gui_init();
knob_init();
bool level = 0;
while (1) {
vTaskDelay(pdMS_TO_TICKS(1000));
gpio_set_level(22, level);
level ^= 1;
}
}

@ -0,0 +1,70 @@
#include "gui.h"
#include "nokia.h"
#include <freertos/FreeRTOS.h>
#include <freertos/task.h>
static void gui_thread(void *arg);
TaskHandle_t hGuiThread = NULL;
void gui_init() {
printf("GUI init\n");
LCD_setup();
LCD_clearDisplay(0);
LCD_setStr("Hello World", 0, 0, 1);
LCD_updateDisplay();
int rv = xTaskCreate(gui_thread, "gui", 4096, NULL, 6, &hGuiThread);
assert (rv == pdPASS);
}
static void __attribute__((noreturn)) gui_thread(void *arg) {
uint32_t pos = 20;
#define NMAX 60
while (1) {
uint32_t value;
xTaskNotifyWait(0, ULONG_MAX, &value, portMAX_DELAY);
printf("Knob event 0x%02x ", value);
if (value & 0b1000) {
printf("PUSH ");
}
if (value & 0b100) {
printf("RELS ");
}
if ((value & 0b11) == 0b11) {
printf("BNCE ");
} else {
if (value & 0b01) {
printf("FWD ");
if (pos == NMAX) {
pos = 0;
}
else {
pos += 1;
}
}
if (value & 0b10) {
printf("BACK ");
if (pos == 0) {
pos = NMAX;
}
else {
pos--;
}
}
}
printf(">");
for (int i=0; i<pos; i++) {
printf(" ");
}
printf("#");
for (int i=pos; i<NMAX; i++) {
printf(" ");
}
printf("<\n");
}
}

@ -0,0 +1,10 @@
#ifndef GUI_H
#define GUI_H
#include <freertos/FreeRTOS.h>
#include <freertos/task.h>
extern TaskHandle_t hGuiThread;
void gui_init();
#endif //GUI_H

@ -1,54 +0,0 @@
/* Hello World 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.
*/
#include <stdio.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "esp_system.h"
#include "esp_spi_flash.h"
#include "nokia.h"
void app_main()
{
printf("Hello world!\n");
/* Print chip information */
esp_chip_info_t chip_info;
esp_chip_info(&chip_info);
printf("This is ESP32 chip with %d CPU cores, WiFi%s%s, ",
chip_info.cores,
(chip_info.features & CHIP_FEATURE_BT) ? "/BT" : "",
(chip_info.features & CHIP_FEATURE_BLE) ? "/BLE" : "");
printf("silicon revision %d, ", chip_info.revision);
printf("%dMB %s flash\n", spi_flash_get_chip_size() / (1024 * 1024),
(chip_info.features & CHIP_FEATURE_EMB_FLASH) ? "embedded" : "external");
LCD_setup();
for (int i = 5; i >= 0; i--) {
printf("Restarting in %d seconds...\n", i);
LCD_clearDisplay(0);
LCD_setStr("Hello World", 0, 0, 1);
LCD_setStr("Driver stolen from Arduino now on ESP32", 0, 10, 1);
LCD_setRect(0,LCD_HEIGHT-12,LCD_WIDTH, LCD_HEIGHT-1, 1, 1);
char buf[25];
sprintf(buf, "Reboot in %d s", i);
LCD_setStr(buf, 4, LCD_HEIGHT - 10, 0);
LCD_updateDisplay();
vTaskDelay(900 / portTICK_PERIOD_MS);
}
printf("Restarting now.\n");
fflush(stdout);
esp_restart();
}

@ -0,0 +1,291 @@
#include <driver/gpio.h>
#include <freertos/FreeRTOS.h>
#include <freertos/task.h>
#include "knob.h"
#include "gui.h"
const int pushPin = 5;
const int wheelPin1 = 18;
const int wheelPin2 = 23;
#define DEBOUNCE_WHEEL_MS 6
#define DEBOUNCE_BTN_MS 20
static void handle_pushbtn(void *arg);
static void handle_wheel(void *arg);
void knob_init() {
printf("Knob init\n");
// gpio_config_t cfgWheel = {
// .pin_bit_mask = (1 << wheelPin1) /*| (1 << wheelPin2)*/,
// .mode = GPIO_MODE_INPUT,
// .pull_up_en = 1,
// .intr_type = GPIO_INTR_NEGEDGE, // neg means active
// };
// gpio_config(&cfgWheel);
gpio_config_t cfgPush = {
.pin_bit_mask = (1 << pushPin) | (1 << wheelPin1),
.mode = GPIO_MODE_INPUT,
.pull_up_en = 1,
.intr_type = GPIO_INTR_ANYEDGE, // neg means active
};
gpio_config(&cfgPush);
cfgPush.intr_type = GPIO_INTR_DISABLE;
cfgPush.pin_bit_mask = (1 << wheelPin2);
gpio_config(&cfgPush);
gpio_install_isr_service(0);
gpio_intr_enable(pushPin);
gpio_intr_enable(wheelPin1);
// gpio_intr_enable(wheelPin2);
gpio_isr_handler_add(pushPin, handle_pushbtn, (void *)0);
gpio_isr_handler_add(wheelPin1, handle_wheel, (void *)0);
//gpio_isr_handler_add(wheelPin2, handle_wheel, (void *)1);
}
#if 0
enum state {
S_11 = 0,
S_FWD_1_01 = 1,
S_FWD_2_00 = 2,
S_FWD_3_10 = 3,
S_BCK_1_10 = 4,
S_BCK_2_00 = 5,
S_BCK_3_01 = 6,
S_ILLEGAL = 7,
};
#define SW_FWD 0b10000000
#define SW_BCK 0b01000000
static enum state wheelState = S_11;
const uint8_t switch_table[28] = {
/* -- S_11 -- */
S_ILLEGAL, /* 00 ILLEGAL */
S_FWD_1_01, /* 01 ADVANCE */
S_BCK_1_10, /* 10 BACK */
S_11, /* 11 */
/* -- S_FWD_1_01 -- */
S_FWD_2_00, /* 00 ADVANCE */
S_FWD_1_01, /* 01 */
S_FWD_3_10, /* 10 ILLEGAL */
S_11, /* 11 ABORT */
/* -- S_FWD_2_00 -- */
S_FWD_2_00, /* 00 */
S_FWD_1_01, /* 01 ABORT */
S_FWD_3_10, /* 10 ADVANCE */
S_ILLEGAL, /* 11 ILLEGAL */
/* -- S_FWD_3_10 -- */
S_FWD_2_00, /* 00 ABORT */
S_FWD_1_01, /* 01 ILLEGAL */
S_FWD_3_10, /* 10 */
SW_FWD | S_11, /* 11 ADVANCE */
/* -- S_BCK_1_10 -- */
S_BCK_2_00, /* 00 ADVANCE */
S_BCK_3_01, /* 01 ILLEGAL */
S_BCK_1_10, /* 10 */
S_11, /* 11 ABORT */
/* -- S_BCK_2_00 -- */
S_BCK_2_00, /* 00 */
S_BCK_3_01, /* 01 */
S_BCK_1_10, /* 10 ABORT */
S_ILLEGAL, /* 11 */
/* -- S_BCK_3_01 -- */
S_BCK_2_00, /* 00 */
S_BCK_3_01, /* 01 */
S_BCK_1_10, /* 10 */
SW_BCK | S_11, /* 11 */
};
static uint8_t OldEnc = 0b00;
#endif
static void handle_wheel(void *arg) {
static uint32_t negedge_time = 0;
int dir = 0;
const uint32_t inputs = gpio_input_get();
const bool a = 0 != (inputs & (1 << wheelPin1)); // neg = active
const bool b = 0 != (inputs & (1 << wheelPin2));
const uint32_t time = xTaskGetTickCount();
if (!a) {
// negedge
negedge_time = time;
} else {
// posedge
if (time - negedge_time > pdMS_TO_TICKS(DEBOUNCE_WHEEL_MS)) {
if (b) {
dir = -1;
} else {
dir = 1;
}
} else {
// reset the timer
negedge_time = time;
}
}
#if 0
const uint32_t inputs = gpio_input_get();
bool a = 0 == (inputs & (1 << wheelPin1)); // neg = active
bool b = 0 == (inputs & (1 << wheelPin2));
#define ENCODER_POS1 1
#define ENCODER_POS2 2
#define ENCODER_POS3 3
#define ENCODER_POS0 0
uint8_t NewEnc = a | (b<<1);
if (NewEnc ^ OldEnc) { // Encoder value changed???
switch(NewEnc) {
case ENCODER_POS1 : // 01
if (OldEnc == ENCODER_POS0) // 00
dir--;
else
dir++;
break;
case ENCODER_POS3 : // 11
if (OldEnc == ENCODER_POS1) // 01
dir--;
else
dir++;
break;
case ENCODER_POS2 : // 10
if (OldEnc == ENCODER_POS3) // 11
dir--;
else
dir++;
break;
case ENCODER_POS0 : // 00
if (OldEnc == ENCODER_POS2) // 10
dir--;
else
dir++;
break;
};
OldEnc = NewEnc;
}; // end if encoder value changed.
#endif
#if 0
// Omron version
int which = (int)arg;
const uint32_t inputs = gpio_input_get();
bool a = 0 == (inputs & (1 << wheelPin1)); // neg = active
bool b = 0 == (inputs & (1 << wheelPin2));
if (which == 0) { // itr from A
if (a) {
if (b) {
dir = -1;
}
else {
dir = 1;
}
}
}
else { // itr from B
if (b) {
if (a) {
dir = 1;
}
else {
dir = -1;
}
}
}
#endif
#if 0
// Naive version
int which = arg;
const uint32_t inputs = gpio_input_get();
bool a = 0 == (inputs & (1 << wheelPin1)); // neg = active
bool b = 0 == (inputs & (1 << wheelPin2));
if (which == 0) { // itr from A
if (b) {
dir = -1;
} /*else {
dir = 1;
}*/
}
else { // itr from B
if (a) {
dir = 1;
} /*else {
dir = -1;
}*/
}
#endif
#if 0
// More complex version
const uint32_t inputs = gpio_input_get();
const uint8_t ab =
(((inputs >> wheelPin2) & 1) << 1) |
((inputs >> wheelPin1) & 1);
if (wheelState == S_ILLEGAL) {
if (ab != 0b11) {
return;
}
}
uint8_t next = switch_table[wheelState*4 + ab];
if (next & SW_FWD) dir = 1;
if (next & SW_BCK) dir = -1;
next &= ~(SW_FWD | SW_BCK);
wheelState = next;
#endif
if (dir != 0) {
BaseType_t higherWoken = 0;
xTaskNotifyFromISR(hGuiThread, dir == 1 ? 0b10 : 0b01, eSetBits, &higherWoken);
if (higherWoken) portYIELD_FROM_ISR();
}
}
static void handle_pushbtn(void *arg) {
static uint32_t negedge_time = 0;
const uint32_t inputs = gpio_input_get();
BaseType_t higherWoken = 0;
bool pushed = (inputs & (1 << pushPin)) == 0;
const uint32_t time = xTaskGetTickCount();
if (pushed) {
negedge_time = time;
} else {
if (time - negedge_time > pdMS_TO_TICKS(DEBOUNCE_BTN_MS)) {
xTaskNotifyFromISR(hGuiThread, pushed ? 0b1000 : 0b0100, eSetBits, &higherWoken);
if (higherWoken) portYIELD_FROM_ISR();
}
}
}

@ -0,0 +1,7 @@
#ifndef KNOB_H
#define KNOB_H
void knob_init();
#endif //KNOB_H

@ -18,6 +18,8 @@ static const int sclkPin = 13; // SCLK - Serial clock, pin 7 on LCD.
#define LCD_COMMAND 0
#define LCD_DATA 1
#define DEFAULT_CONTRAST 48
static spi_device_handle_t hSPI;
/* Font table:
@ -28,197 +30,102 @@ per character. */
static const uint8_t ASCII[][5] = {
// First 32 characters (0x00-0x19) are ignored. These are
// non-displayable, control characters.
{0x00, 0x00, 0x00, 0x00, 0x00} // 0x20
,
{0x00, 0x00, 0x5f, 0x00, 0x00} // 0x21 !
,
{0x00, 0x07, 0x00, 0x07, 0x00} // 0x22 "
,
{0x14, 0x7f, 0x14, 0x7f, 0x14} // 0x23 #
,
{0x24, 0x2a, 0x7f, 0x2a, 0x12} // 0x24 $
,
{0x23, 0x13, 0x08, 0x64, 0x62} // 0x25 %
,
{0x36, 0x49, 0x55, 0x22, 0x50} // 0x26 &
,
{0x00, 0x05, 0x03, 0x00, 0x00} // 0x27 '
,
{0x00, 0x1c, 0x22, 0x41, 0x00} // 0x28 (
,
{0x00, 0x41, 0x22, 0x1c, 0x00} // 0x29 )
,
{0x14, 0x08, 0x3e, 0x08, 0x14} // 0x2a *
,
{0x08, 0x08, 0x3e, 0x08, 0x08} // 0x2b +
,
{0x00, 0x50, 0x30, 0x00, 0x00} // 0x2c ,
,
{0x08, 0x08, 0x08, 0x08, 0x08} // 0x2d -
,
{0x00, 0x60, 0x60, 0x00, 0x00} // 0x2e .
,
{0x20, 0x10, 0x08, 0x04, 0x02} // 0x2f /
,
{0x3e, 0x51, 0x49, 0x45, 0x3e} // 0x30 0
,
{0x00, 0x42, 0x7f, 0x40, 0x00} // 0x31 1
,
{0x42, 0x61, 0x51, 0x49, 0x46} // 0x32 2
,
{0x21, 0x41, 0x45, 0x4b, 0x31} // 0x33 3
,
{0x18, 0x14, 0x12, 0x7f, 0x10} // 0x34 4
,
{0x27, 0x45, 0x45, 0x45, 0x39} // 0x35 5
,
{0x3c, 0x4a, 0x49, 0x49, 0x30} // 0x36 6
,
{0x01, 0x71, 0x09, 0x05, 0x03} // 0x37 7
,
{0x36, 0x49, 0x49, 0x49, 0x36} // 0x38 8
,
{0x06, 0x49, 0x49, 0x29, 0x1e} // 0x39 9
,
{0x00, 0x36, 0x36, 0x00, 0x00} // 0x3a :
,
{0x00, 0x56, 0x36, 0x00, 0x00} // 0x3b ;
,
{0x08, 0x14, 0x22, 0x41, 0x00} // 0x3c <
,
{0x14, 0x14, 0x14, 0x14, 0x14} // 0x3d =
,
{0x00, 0x41, 0x22, 0x14, 0x08} // 0x3e >
,
{0x02, 0x01, 0x51, 0x09, 0x06} // 0x3f ?
,
{0x32, 0x49, 0x79, 0x41, 0x3e} // 0x40 @
,
{0x7e, 0x11, 0x11, 0x11, 0x7e} // 0x41 A
,
{0x7f, 0x49, 0x49, 0x49, 0x36} // 0x42 B
,
{0x3e, 0x41, 0x41, 0x41, 0x22} // 0x43 C
,
{0x7f, 0x41, 0x41, 0x22, 0x1c} // 0x44 D
,
{0x7f, 0x49, 0x49, 0x49, 0x41} // 0x45 E
,
{0x7f, 0x09, 0x09, 0x09, 0x01} // 0x46 F
,
{0x3e, 0x41, 0x49, 0x49, 0x7a} // 0x47 G
,
{0x7f, 0x08, 0x08, 0x08, 0x7f} // 0x48 H
,
{0x00, 0x41, 0x7f, 0x41, 0x00} // 0x49 I
,
{0x20, 0x40, 0x41, 0x3f, 0x01} // 0x4a J
,
{0x7f, 0x08, 0x14, 0x22, 0x41} // 0x4b K
,
{0x7f, 0x40, 0x40, 0x40, 0x40} // 0x4c L
,
{0x7f, 0x02, 0x0c, 0x02, 0x7f} // 0x4d M
,
{0x7f, 0x04, 0x08, 0x10, 0x7f} // 0x4e N
,
{0x3e, 0x41, 0x41, 0x41, 0x3e} // 0x4f O
,
{0x7f, 0x09, 0x09, 0x09, 0x06} // 0x50 P
,
{0x3e, 0x41, 0x51, 0x21, 0x5e} // 0x51 Q
,
{0x7f, 0x09, 0x19, 0x29, 0x46} // 0x52 R
,
{0x46, 0x49, 0x49, 0x49, 0x31} // 0x53 S
,
{0x01, 0x01, 0x7f, 0x01, 0x01} // 0x54 T
,
{0x3f, 0x40, 0x40, 0x40, 0x3f} // 0x55 U
,
{0x1f, 0x20, 0x40, 0x20, 0x1f} // 0x56 V
,
{0x3f, 0x40, 0x38, 0x40, 0x3f} // 0x57 W
,
{0x63, 0x14, 0x08, 0x14, 0x63} // 0x58 X
,
{0x07, 0x08, 0x70, 0x08, 0x07} // 0x59 Y
,
{0x61, 0x51, 0x49, 0x45, 0x43} // 0x5a Z
,
{0x00, 0x7f, 0x41, 0x41, 0x00} // 0x5b [
,
{0x02, 0x04, 0x08, 0x10, 0x20} // 0x5c \ (keep this to escape the backslash)
,
{0x00, 0x41, 0x41, 0x7f, 0x00} // 0x5d ]
,
{0x04, 0x02, 0x01, 0x02, 0x04} // 0x5e ^
,
{0x40, 0x40, 0x40, 0x40, 0x40} // 0x5f _
,
{0x00, 0x01, 0x02, 0x04, 0x00} // 0x60 `
,
{0x20, 0x54, 0x54, 0x54, 0x78} // 0x61 a
,
{0x7f, 0x48, 0x44, 0x44, 0x38} // 0x62 b
,
{0x38, 0x44, 0x44, 0x44, 0x20} // 0x63 c
,
{0x38, 0x44, 0x44, 0x48, 0x7f} // 0x64 d
,
{0x38, 0x54, 0x54, 0x54, 0x18} // 0x65 e
,
{0x08, 0x7e, 0x09, 0x01, 0x02} // 0x66 f
,
{0x0c, 0x52, 0x52, 0x52, 0x3e} // 0x67 g
,
{0x7f, 0x08, 0x04, 0x04, 0x78} // 0x68 h
,
{0x00, 0x44, 0x7d, 0x40, 0x00} // 0x69 i
,
{0x20, 0x40, 0x44, 0x3d, 0x00} // 0x6a j
,
{0x7f, 0x10, 0x28, 0x44, 0x00} // 0x6b k
,
{0x00, 0x41, 0x7f, 0x40, 0x00} // 0x6c l
,
{0x7c, 0x04, 0x18, 0x04, 0x78} // 0x6d m
,
{0x7c, 0x08, 0x04, 0x04, 0x78} // 0x6e n
,
{0x38, 0x44, 0x44, 0x44, 0x38} // 0x6f o
,
{0x7c, 0x14, 0x14, 0x14, 0x08} // 0x70 p
,
{0x08, 0x14, 0x14, 0x18, 0x7c} // 0x71 q
,
{0x7c, 0x08, 0x04, 0x04, 0x08} // 0x72 r
,
{0x48, 0x54, 0x54, 0x54, 0x20} // 0x73 s
,
{0x04, 0x3f, 0x44, 0x40, 0x20} // 0x74 t
,
{0x3c, 0x40, 0x40, 0x20, 0x7c} // 0x75 u
,
{0x1c, 0x20, 0x40, 0x20, 0x1c} // 0x76 v
,
{0x3c, 0x40, 0x30, 0x40, 0x3c} // 0x77 w
,
{0x44, 0x28, 0x10, 0x28, 0x44} // 0x78 x
,
{0x0c, 0x50, 0x50, 0x50, 0x3c} // 0x79 y
,
{0x44, 0x64, 0x54, 0x4c, 0x44} // 0x7a z
,
{0x00, 0x08, 0x36, 0x41, 0x00} // 0x7b {
,
{0x00, 0x00, 0x7f, 0x00, 0x00} // 0x7c |
,
{0x00, 0x41, 0x36, 0x08, 0x00} // 0x7d }
,
{0x10, 0x08, 0x08, 0x10, 0x08} // 0x7e ~
,
{0x78, 0x46, 0x41, 0x46, 0x78} // 0x7f DEL
{0x00, 0x00, 0x00, 0x00, 0x00}, // 0x20
{0x00, 0x00, 0x5f, 0x00, 0x00}, // 0x21 !
{0x00, 0x07, 0x00, 0x07, 0x00}, // 0x22 "
{0x14, 0x7f, 0x14, 0x7f, 0x14}, // 0x23 #
{0x24, 0x2a, 0x7f, 0x2a, 0x12}, // 0x24 $
{0x23, 0x13, 0x08, 0x64, 0x62}, // 0x25 %
{0x36, 0x49, 0x55, 0x22, 0x50}, // 0x26 &
{0x00, 0x05, 0x03, 0x00, 0x00}, // 0x27 '
{0x00, 0x1c, 0x22, 0x41, 0x00}, // 0x28 (
{0x00, 0x41, 0x22, 0x1c, 0x00}, // 0x29 )
{0x14, 0x08, 0x3e, 0x08, 0x14}, // 0x2a *
{0x08, 0x08, 0x3e, 0x08, 0x08}, // 0x2b +
{0x00, 0x50, 0x30, 0x00, 0x00}, // 0x2c ,
{0x08, 0x08, 0x08, 0x08, 0x08}, // 0x2d -
{0x00, 0x60, 0x60, 0x00, 0x00}, // 0x2e .
{0x20, 0x10, 0x08, 0x04, 0x02}, // 0x2f /
{0x3e, 0x51, 0x49, 0x45, 0x3e}, // 0x30 0
{0x00, 0x42, 0x7f, 0x40, 0x00}, // 0x31 1
{0x42, 0x61, 0x51, 0x49, 0x46}, // 0x32 2
{0x21, 0x41, 0x45, 0x4b, 0x31}, // 0x33 3
{0x18, 0x14, 0x12, 0x7f, 0x10}, // 0x34 4
{0x27, 0x45, 0x45, 0x45, 0x39}, // 0x35 5
{0x3c, 0x4a, 0x49, 0x49, 0x30}, // 0x36 6
{0x01, 0x71, 0x09, 0x05, 0x03}, // 0x37 7
{0x36, 0x49, 0x49, 0x49, 0x36}, // 0x38 8
{0x06, 0x49, 0x49, 0x29, 0x1e}, // 0x39 9
{0x00, 0x36, 0x36, 0x00, 0x00}, // 0x3a :
{0x00, 0x56, 0x36, 0x00, 0x00}, // 0x3b ;
{0x08, 0x14, 0x22, 0x41, 0x00}, // 0x3c <
{0x14, 0x14, 0x14, 0x14, 0x14}, // 0x3d =
{0x00, 0x41, 0x22, 0x14, 0x08}, // 0x3e >
{0x02, 0x01, 0x51, 0x09, 0x06}, // 0x3f ?
{0x32, 0x49, 0x79, 0x41, 0x3e}, // 0x40 @
{0x7e, 0x11, 0x11, 0x11, 0x7e}, // 0x41 A
{0x7f, 0x49, 0x49, 0x49, 0x36}, // 0x42 B
{0x3e, 0x41, 0x41, 0x41, 0x22}, // 0x43 C
{0x7f, 0x41, 0x41, 0x22, 0x1c}, // 0x44 D
{0x7f, 0x49, 0x49, 0x49, 0x41}, // 0x45 E
{0x7f, 0x09, 0x09, 0x09, 0x01}, // 0x46 F
{0x3e, 0x41, 0x49, 0x49, 0x7a}, // 0x47 G
{0x7f, 0x08, 0x08, 0x08, 0x7f}, // 0x48 H
{0x00, 0x41, 0x7f, 0x41, 0x00}, // 0x49 I
{0x20, 0x40, 0x41, 0x3f, 0x01}, // 0x4a J
{0x7f, 0x08, 0x14, 0x22, 0x41}, // 0x4b K
{0x7f, 0x40, 0x40, 0x40, 0x40}, // 0x4c L
{0x7f, 0x02, 0x0c, 0x02, 0x7f}, // 0x4d M
{0x7f, 0x04, 0x08, 0x10, 0x7f}, // 0x4e N
{0x3e, 0x41, 0x41, 0x41, 0x3e}, // 0x4f O
{0x7f, 0x09, 0x09, 0x09, 0x06}, // 0x50 P
{0x3e, 0x41, 0x51, 0x21, 0x5e}, // 0x51 Q
{0x7f, 0x09, 0x19, 0x29, 0x46}, // 0x52 R
{0x46, 0x49, 0x49, 0x49, 0x31}, // 0x53 S
{0x01, 0x01, 0x7f, 0x01, 0x01}, // 0x54 T
{0x3f, 0x40, 0x40, 0x40, 0x3f}, // 0x55 U
{0x1f, 0x20, 0x40, 0x20, 0x1f}, // 0x56 V
{0x3f, 0x40, 0x38, 0x40, 0x3f}, // 0x57 W
{0x63, 0x14, 0x08, 0x14, 0x63}, // 0x58 X
{0x07, 0x08, 0x70, 0x08, 0x07}, // 0x59 Y
{0x61, 0x51, 0x49, 0x45, 0x43}, // 0x5a Z
{0x00, 0x7f, 0x41, 0x41, 0x00}, // 0x5b [
{0x02, 0x04, 0x08, 0x10, 0x20}, // 0x5c \ (keep this to escape the backslash)
{0x00, 0x41, 0x41, 0x7f, 0x00}, // 0x5d ]
{0x04, 0x02, 0x01, 0x02, 0x04}, // 0x5e ^
{0x40, 0x40, 0x40, 0x40, 0x40}, // 0x5f _
{0x00, 0x01, 0x02, 0x04, 0x00}, // 0x60 `
{0x20, 0x54, 0x54, 0x54, 0x78}, // 0x61 a
{0x7f, 0x48, 0x44, 0x44, 0x38}, // 0x62 b
{0x38, 0x44, 0x44, 0x44, 0x20}, // 0x63 c
{0x38, 0x44, 0x44, 0x48, 0x7f}, // 0x64 d
{0x38, 0x54, 0x54, 0x54, 0x18}, // 0x65 e
{0x08, 0x7e, 0x09, 0x01, 0x02}, // 0x66 f
{0x0c, 0x52, 0x52, 0x52, 0x3e}, // 0x67 g
{0x7f, 0x08, 0x04, 0x04, 0x78}, // 0x68 h
{0x00, 0x44, 0x7d, 0x40, 0x00}, // 0x69 i
{0x20, 0x40, 0x44, 0x3d, 0x00}, // 0x6a j
{0x7f, 0x10, 0x28, 0x44, 0x00}, // 0x6b k
{0x00, 0x41, 0x7f, 0x40, 0x00}, // 0x6c l
{0x7c, 0x04, 0x18, 0x04, 0x78}, // 0x6d m
{0x7c, 0x08, 0x04, 0x04, 0x78}, // 0x6e n
{0x38, 0x44, 0x44, 0x44, 0x38}, // 0x6f o
{0x7c, 0x14, 0x14, 0x14, 0x08}, // 0x70 p
{0x08, 0x14, 0x14, 0x18, 0x7c}, // 0x71 q
{0x7c, 0x08, 0x04, 0x04, 0x08}, // 0x72 r
{0x48, 0x54, 0x54, 0x54, 0x20}, // 0x73 s
{0x04, 0x3f, 0x44, 0x40, 0x20}, // 0x74 t
{0x3c, 0x40, 0x40, 0x20, 0x7c}, // 0x75 u
{0x1c, 0x20, 0x40, 0x20, 0x1c}, // 0x76 v
{0x3c, 0x40, 0x30, 0x40, 0x3c}, // 0x77 w
{0x44, 0x28, 0x10, 0x28, 0x44}, // 0x78 x
{0x0c, 0x50, 0x50, 0x50, 0x3c}, // 0x79 y
{0x44, 0x64, 0x54, 0x4c, 0x44}, // 0x7a z
{0x00, 0x08, 0x36, 0x41, 0x00}, // 0x7b {
{0x00, 0x00, 0x7f, 0x00, 0x00}, // 0x7c |
{0x00, 0x41, 0x36, 0x08, 0x00}, // 0x7d }
{0x10, 0x08, 0x08, 0x10, 0x08}, // 0x7e ~
{0x78, 0x46, 0x41, 0x46, 0x78}, // 0x7f DEL
};
/* The displayMap variable stores a buffer representation of the
@ -235,50 +142,7 @@ to the PCD8544.
Because the PCD8544 won't let us write individual pixels at a
time, this is how we can make targeted changes to the display. */
static uint8_t displayMap[LCD_WIDTH * LCD_HEIGHT / 8] = {
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // (0,0)->(11,7) ~ These 12 bytes cover an 8x12 block in the left corner of the display
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // (12,0)->(23,7)
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, // (24,0)->(35,7)
0xF0, 0xF8, 0xFC, 0xFC, 0xFE, 0xFE, 0xFE, 0xFE, 0x1E, 0x0E, 0x02, 0x00, // (36,0)->(47,7)
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // (48,0)->(59,7)
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // (60,0)->(71,7)
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // (72,0)->(83,7)
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // (0,8)->(11,15)
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // (12,8)->(23,15)
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, // (24,8)->(35,15)
0x0F, 0x1F, 0x3F, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xFC, 0xF8, // (36,8)->(47,15)
0xF8, 0xF0, 0xF8, 0xFE, 0xFE, 0xFC, 0xF8, 0xE0, 0x00, 0x00, 0x00, 0x00, // (48,8)->(59,15)
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // (60,8)->(71,15)
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // (72,8)->(83,15)
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // (0,16)->(11,23)
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // (12,16)->(23,23)
0x00, 0x00, 0xF8, 0xFC, 0xFE, 0xFE, 0xFF, 0xFF, 0xF3, 0xE0, 0xE0, 0xC0, // (24,16)->(35,23)
0xC0, 0xC0, 0xE0, 0xE0, 0xF1, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, // (36,16)->(47,23)
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3E, 0x00, 0x00, 0x00, // (48,16)->(59,23)
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // (60,16)->(71,23)
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // (72,16)->(83,23)
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // (0,24)->(11,31)
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // (12,24)->(23,31)
0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, // (24,24)->(35,31)
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, // (36,24)->(47,31)
0xFF, 0xFF, 0xFF, 0x7F, 0x3F, 0x1F, 0x07, 0x01, 0x00, 0x00, 0x00, 0x00, // (48,24)->(59,31)
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // (60,24)->(71,31)
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // (72,24)->(83,31)
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // (0,32)->(11,39)
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // (12,32)->(23,39)
0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0x3F, 0x1F, // (24,32)->(35,39)
0x0F, 0x0F, 0x0F, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x03, 0x03, // (36,32)->(47,39)
0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // (48,32)->(59,39)
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // (60,32)->(71,39)
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // (72,32)->(83,39)
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // (0,40)->(11,47)
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // (12,40)->(23,47)
0x00, 0x00, 0x3F, 0x1F, 0x0F, 0x07, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, // (24,40)->(35,47)
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // (36,40)->(47,47)
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // (48,40)->(59,47)
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // (60,40)->(71,47)
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // (72,40)->(83,47) !!! The bottom right pixel!
};
static uint8_t displayMap[LCD_WIDTH * LCD_HEIGHT / 8];
// There are two memory banks in the LCD, data/RAM and commands.
// This function sets the DC pin high or low depending, and then
@ -583,6 +447,9 @@ void lcd_spi_pre_transfer_callback(spi_transaction_t *t)
//This sends the magical commands to the PCD8544
void LCD_setup(void)
{
// clear the display array
LCD_clearDisplay(0);
gpio_config_t output = {
.pin_bit_mask = (1<<scePin) | (1<<rstPin) | (1<<dcPin) | (1<<sdinPin) | (1<<sclkPin),
.mode = GPIO_MODE_OUTPUT
@ -617,23 +484,26 @@ void LCD_setup(void)
ESP_ERROR_CHECK(ret);
spi_device_acquire_bus(hSPI, portMAX_DELAY);
//Reset the LCD to a known state
gpio_set_level(rstPin, 0);
gpio_set_level(rstPin, 1);
const uint8_t magic[6] = {
0x21, // Tell LCD extended commands follow
0x80 + 40, // Set LCD Vop (Contrast)
0x04, // Set Temp coefficent
0x14, // LCD bias mode 1:48 (try 0x13)
//We must send 0x20 before modifying the display control mode
0x20, // Clear extended option
0x0C, // Set display control, normal mode.
};
LCD_SendBytes(LCD_COMMAND, &magic[0], 6);
{
//Reset the LCD to a known state
gpio_set_level(rstPin, 0);
gpio_set_level(rstPin, 1);
const uint8_t magic[6] = {
0x21, // Tell LCD extended commands follow
0x80 + DEFAULT_CONTRAST, // Set LCD Vop (Contrast)
0x04, // Set Temp coefficent
0x14, // LCD bias mode 1:48 (try 0x13)
//We must send 0x20 before modifying the display control mode
0x20, // Clear extended option
0x0C, // Set display control, normal mode.
};
LCD_SendBytes(LCD_COMMAND, &magic[0], 6);
}
spi_device_release_bus(hSPI);
// show the blank screen (display is in indefined state after boot)
LCD_updateDisplay();
}

@ -281,7 +281,7 @@ CONFIG_MB_TIMER_INDEX=0
CONFIG_FREERTOS_NO_AFFINITY=0x7FFFFFFF
CONFIG_FREERTOS_CORETIMER_0=y
# CONFIG_FREERTOS_CORETIMER_1 is not set
CONFIG_FREERTOS_HZ=100
CONFIG_FREERTOS_HZ=1000
CONFIG_FREERTOS_ASSERT_ON_UNTESTED_FUNCTION=y
# CONFIG_FREERTOS_CHECK_STACKOVERFLOW_NONE is not set
# CONFIG_FREERTOS_CHECK_STACKOVERFLOW_PTRVAL is not set

Loading…
Cancel
Save