/**
ESP32s3 adaptation by Tyeth Gundry of Arduino version of
First demo for FT6206 Capactive Touch Screen on Wokwi. Enjoy!
https://wokwi.com/arduino/projects/311598148845830720
*/
/***************************************************
This is our touchscreen painting example for the Adafruit ILI9341
captouch shield
----> http://www.adafruit.com/products/1947
Check out the links above for our tutorials and wiring diagrams
Adafruit invests time and resources providing this open source code,
please support Adafruit and open-source hardware by purchasing
products from Adafruit!
Written by Limor Fried/Ladyada for Adafruit Industries.
MIT license, all text above must be included in any redistribution
****************************************************/
//#include <Adafruit_GFX.h> // Core graphics library
#include <SPI.h> // this is needed for display
#include <Adafruit_ILI9341.h>
#include <Arduino.h> // this is needed for FT6206
#include <Adafruit_FT6206.h>
//#include <SdFat.h> // SD card & FAT filesystem library
//#include <Adafruit_ImageReader.h> // Image-reading functions
//#include "dragon.h"
#include <time.h>
#include "ui.h"
#include "colour_blind.h"
#include "reaction.h"
#include "hear.h"
// The FT6206 uses hardware I2C (SCL/SDA)
Adafruit_FT6206 ctp = Adafruit_FT6206();
//Adafruit_Image img; // An image loaded into RAM
//ImageReturnCode stat; // Status from image-reading functions
// Comment out the next line to load from images.h (TBD) file:
#define USE_SD_CARD
// // The display also uses hardware SPI, plus #9 & #10
// #define TFT_CS 10
// #define TFT_DC 9
#define TFT_DC 9
#define TFT_CS 10
#define SD_CS 4 // SD card select pin
//#define TFT_RST 9 // TFT reset pin
Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC);
//Adafruit_GFX_Button btn[12];
/* create 15 buttons, in classic candybar phone style */
/*char buttonlabels[6][20] = {"Confirm", "Clr", "No Number", "Back", "Next", "Settings"};
uint16_t buttoncolors[6] = {ILI9341_DARKGREEN, ILI9341_DARKGREY, ILI9341_RED,
ILI9341_BLUE,ILI9341_ORANGE, ILI9341_BLUE};
*/
#define BLACK 0x0000
#define WHITE 0xFFFF
int back;
//Adafruit_GFX_Button buttons[6];
//https://github.com/adafruit/Arduin_o_phone/blob/master/arduin_o_phone.ino
uint8_t g_current_screen;
//int oldcolor, currentcolor;
bool welcome_btn_clicked = false;
bool choose_btn_clicked = false;
bool start_btn_clicked = false;
int screen_width = 0;
int screen_height = 0;
APP_BUTTON continue_btn = { BLIND_RESULTS_SCREEN,
CONTINUE_BTN_ID,
CONTINUE_BTN_TEXT_SIZE,
CONTINUE_BTN_FOREGROUND,
CONTINUE_BTN_BACKGROUND,
false,
CONTINUE_BTN_X,
CONTINUE_BTN_Y,
CONTINUE_BTN_W,
CONTINUE_BTN_H,
CONTINUE_BTN_TEXT,
10,
10
};
APP_BUTTON wel_splash_go_btn = { WELCOME_SCREEN,
WELCOME_BTN_ID,
WELCOME_BTN_TEXT_SIZE,
WELCOME_BTN_FOREGROUND,
WELCOME_BTN_BACKGROUND,
false,
WELCOME_BTN_X,
WELCOME_BTN_Y,
WELCOME_BTN_W,
WELCOME_BTN_H,
WELCOME_BTN_TEXT,
13,
10
};
APP_BUTTON choice_hear_btn = { CHOICE_SCREEN,
CHOICE_HEAR_BTN_ID,
CHOICE_HEAR_BTN_TEXT_SIZE,
CHOICE_HEAR_BTN_FOREGROUND,
CHOICE_HEAR_BTN_BACKGROUND,
false,
CHOICE_HEAR_BTN_X,
CHOICE_HEAR_BTN_Y,
CHOICE_HEAR_BTN_W,
CHOICE_HEAR_BTN_H,
CHOICE_HEAR_BTN_TEXT,
13,
10
};
APP_BUTTON choice_cb_btn = { CHOICE_SCREEN,
CHOICE_CB_BTN_ID,
CHOICE_CB_BTN_TEXT_SIZE,
CHOICE_CB_BTN_FOREGROUND,
CHOICE_CB_BTN_BACKGROUND,
false,
CHOICE_CB_BTN_X,
CHOICE_CB_BTN_Y,
CHOICE_CB_BTN_W,
CHOICE_CB_BTN_H,
CHOICE_CB_BTN_TEXT,
13,
10
};
APP_BUTTON choice_rect_btn = { CHOICE_SCREEN,
CHOICE_REACTION_BTN_ID,
CHOICE_REACTION_BTN_TEXT_SIZE,
CHOICE_REACTION_BTN_FOREGROUND,
CHOICE_REACTION_BTN_BACKGROUND,
false,
CHOICE_REACTION_BTN_X,
CHOICE_REACTION_BTN_Y,
CHOICE_REACTION_BTN_W,
CHOICE_REACTION_BTN_H,
CHOICE_REACTION_BTN_TEXT,
13,
10
};
APP_BUTTON cb_main_confirm_btn = { BLIND_TEST_SCREEN,
APP_CB_CONF_BTN_ID,
APP_CB_CONF_BTN_TEXT_SIZE,
APP_CB_CONF_BTN_FOREGROUND,
APP_CB_CONF_BTN_BACKGROUND,
false,
COLOUR_BLIND_CONFIRM_X,
COLOUR_BLIND_BUTTONS_Y,
COLOUR_BLIND_BUTTON_W,
COLOUR_BLIND_BUTTON_H,
COLOUR_BLIND_CONFIRM_BTN_TEXT,
COLOUR_BLIND_BUTTONS_TEXT_CONF_X,
COLOUR_BLIND_BUTTONS_TEXT_Y
};
APP_BUTTON cb_main_clear_btn = { BLIND_TEST_SCREEN,
APP_CB_CLEAR_BTN_ID,
APP_CB_CLEAR_BTN_TEXT_SIZE,
APP_CB_CLEAR_BTN_FOREGROUND,
APP_CB_CLEAR_BTN_BACKGROUND,
false,
COLOUR_BLIND_CLEAR_X,
COLOUR_BLIND_BUTTONS_Y,
COLOUR_BLIND_BUTTON_W,
COLOUR_BLIND_BUTTON_H,
COLOUR_BLIND_CLEAR_BTN_TEXT,
COLOUR_BLIND_BUTTONS_TEXT_CLR_X,
COLOUR_BLIND_BUTTONS_TEXT_Y
};
APP_BUTTON cb_main_no_num_btn = { BLIND_TEST_SCREEN,
APP_CB_NO_NUM_BTN_ID,
APP_CB_NO_NUM_BTN_TEXT_SIZE,
APP_CB_NO_NUM_BTN_FOREGROUND,
APP_CB_NO_NUM_BTN_BACKGROUND,
false,
COLOUR_BLIND_NO_NUMBER_X,
COLOUR_BLIND_BUTTONS_Y,
COLOUR_BLIND_BUTTON_W,
COLOUR_BLIND_BUTTON_H,
COLOUR_BLIND_NO_NUM_BTN_TEXT,
COLOUR_BLIND_BUTTONS_TEXT_NO_X,
COLOUR_BLIND_BUTTONS_TEXT_Y
};
APP_BUTTON rt_main_flash_btn = { REACTION_TEST_SCREEN,
APP_RT_FLASH_BTN_ID,
1,
ILI9341_RED,
ILI9341_BLACK,
false,
0,
0,
NUMBER_SIZE,
NUMBER_SIZE,
"",
0,
0
};
APP_BUTTON hr_main_yes_btn = { HEAR_TEST_SCREEN,
APP_HR_YES_BTN_ID,
APP_HR_YES_BTN_TEXT_SIZE,
APP_HR_YES_BTN_FOREGROUND,
APP_HR_YES_BTN_BACKGROUND,
false,
APP_HR_YES_BTN_X,
APP_HR_YES_BTN_Y,
APP_HR_YES_BTN_W,
APP_HR_YES_BTN_H,
APP_HR_YES_BTN_TEXT,
5,
10
};
APP_BUTTON hr_main_no_btn = { HEAR_TEST_SCREEN,
APP_HR_NO_BTN_ID,
APP_HR_NO_BTN_TEXT_SIZE,
APP_HR_NO_BTN_FOREGROUND,
APP_HR_NO_BTN_BACKGROUND,
false,
APP_HR_NO_BTN_X,
APP_HR_NO_BTN_Y,
APP_HR_NO_BTN_W,
APP_HR_NO_BTN_H,
APP_HR_NO_BTN_TEXT,
7,
10
};
APP_BUTTON hr_main_confirm_btn = { HEAR_TEST_SCREEN,
APP_HR_CONF_BTN_ID,
APP_HR_CONF_BTN_TEXT_SIZE,
APP_HR_CONF_BTN_FOREGROUND,
APP_HR_CONF_BTN_BACKGROUND,
false,
APP_HR_CONF_BTN_X,
APP_HR_CONF_BTN_Y,
APP_HR_CONF_BTN_W,
APP_HR_CONF_BTN_H,
APP_HR_CONF_BTN_TEXT,
5,
10
};
APP_BUTTON hr_main_sound_btn = { HEAR_TEST_SCREEN,
APP_HR_SOUND_BTN_ID,
APP_HR_SOUND_BTN_TEXT_SIZE,
APP_HR_SOUND_BTN_FOREGROUND,
APP_HR_SOUND_BTN_BACKGROUND,
false,
APP_HR_SOUND_BTN_X,
APP_HR_SOUND_BTN_Y,
APP_HR_SOUND_BTN_W,
APP_HR_SOUND_BTN_H,
APP_HR_SOUND_BTN_TEXT,
10,
20
};
//extern APP_BUTTON* app_buttons[];
extern bool number_clicked;
extern bool hear_sound_btn_clicked;
void setup(void) {
//while (!Serial); // used for leonardo debugging
// Seed the random number generator
srand(time(NULL));
pinMode(SPEAKER_PIN, OUTPUT);
Serial.begin(115200);
Serial.println(F("Cap Touch Paint!"));
// Default pins A4/A5 (or SADA/SCL) used as Wire.setPins not supported for Nano
//Wire.setPins(10, 8); // redefine first I2C port to be on pins 10/8
tft.begin();
if (! ctp.begin(40)) { // pass in 'sensitivity' coefficient
Serial.println("Couldn't start FT6206 touchscreen controller");
while (1);
}
Serial.println("Capacitive touchscreen started");
screen_width = tft.width();
screen_height = tft.height();
tft.fillScreen(ILI9341_BLACK);
app_buttons[CONTINUE_BTN_ID] = &continue_btn;
app_buttons[WELCOME_BTN_ID] = &wel_splash_go_btn;
app_buttons[CHOICE_HEAR_BTN_ID] = &choice_hear_btn;
app_buttons[CHOICE_CB_BTN_ID] = &choice_cb_btn;
app_buttons[CHOICE_REACTION_BTN_ID] = &choice_rect_btn;
app_buttons[APP_CB_CONF_BTN_ID] = &cb_main_confirm_btn;
app_buttons[APP_CB_CLEAR_BTN_ID] = &cb_main_clear_btn;
app_buttons[APP_CB_NO_NUM_BTN_ID] = &cb_main_no_num_btn;
app_buttons[APP_RT_FLASH_BTN_ID] = &rt_main_flash_btn;
app_buttons[APP_HR_YES_BTN_ID] = &hr_main_yes_btn;
app_buttons[APP_HR_NO_BTN_ID] = &hr_main_no_btn;
app_buttons[APP_HR_CONF_BTN_ID] = &hr_main_confirm_btn;
app_buttons[APP_HR_SOUND_BTN_ID] = &hr_main_sound_btn;
g_current_screen = BLIND_TEST_SCREEN;
Change_Screen(g_current_screen);
}
void loop_selector(uint8_t no, TS_Point p){
switch(no){
case WELCOME_SCREEN:
welcome_loop(p);
break;
case CHOICE_SCREEN:
choice_loop(p);
break;
case HEAR_INSTR_SCREEN:
instr_start_loop(p);
break;
case BLIND_INSTR_SCREEN:
instr_start_loop(p);
break;
case REACTION_INSTR_SCREEN:
instr_start_loop(p);
break;
case HEAR_TEST_SCREEN:
hear_loop(p);
break;
case BLIND_TEST_SCREEN:
colour_blind_loop(p);
break;
case REACTION_TEST_SCREEN:
reaction_loop(p);
break;
case BLIND_RESULTS_SCREEN:
instr_start_loop(p);
break;
case HEAR_RESULTS_SCREEN:
instr_start_loop(p);
break;
case REACTION_RESULTS_SCREEN:
instr_start_loop(p);
break;
}
}
void loop() {
delay(3);
// Wait for a touch
if (! ctp.touched()) {
reaction_test_runner();
number_clicked = false;
welcome_btn_clicked = false;
choose_btn_clicked = false;
hear_sound_btn_clicked = false;
return;
}
Serial.println("Enter - loop");
/*TS_Point p;
if (ctp.bufferSize()) {
p = ctp.getPoint();
} else {
// this is our way of tracking touch 'release'!
Serial.print(" Release found... ");
p.x = p.y = p.z = -1;
}*/
// Retrieve a point
TS_Point p = ctp.getPoint();
// Print out raw data from screen touch controller
Serial.print("X = "); Serial.print(p.x);
Serial.print("\tY = "); Serial.print(p.y);
Serial.print(" -> ");
// flip it around to match the screen.
p.x = map(p.x, 0, 240, 240, 0);
p.y = map(p.y, 0, 320, 320, 0);
// Print out the remapped (rotated) coordinates
Serial.print("("); Serial.print(p.x);
Serial.print(", "); Serial.print(p.y);
Serial.println(")");
Serial.println(g_current_screen);
loop_selector(g_current_screen, p);
Serial.println("Exit - loop");
}
void welcome_screen() {
/* tft.fillScreen(ILI9341_WHITE);
tft.setTextColor(ILI9341_BLACK, ILI9341_WHITE);
tft.setTextSize(3.5);
tft.setCursor( 30, 100);
tft.println("SenseCheck");
tft.setTextSize(1);
tft.setCursor( 40, 140 );
tft.println("Hearing Loss Colour Blindness");
tft.setCursor( 75, 150 );
tft.println("Reaction Time");
draw_button(tft, WELCOME_BTN_ID, true); */
}
void welcome_loop(TS_Point p) {
/* Serial.println("In welcome loop");
if ( button_pressed(tft,WELCOME_BTN_ID, p) ) {
if ( welcome_btn_clicked == false) {
welcome_btn_clicked = true;
draw_button(tft, WELCOME_BTN_ID, false);
delay(10);
draw_button(tft, WELCOME_BTN_ID, true);
Serial.println("Welcome GO btn clicked");
Change_Screen(CHOICE_SCREEN);
}
} */
}
void choice_screen() {
/* tft.fillScreen(ILI9341_WHITE);
tft.setTextColor(ILI9341_BLACK, ILI9341_WHITE);
tft.setTextSize(2);
tft.setCursor( 10, 40);
tft.println("Please pick one of");
tft.setCursor( 10, 60);
tft.println("the following test");
tft.setCursor( 10, 80);
tft.println(" options ");
draw_button(tft, CHOICE_HEAR_BTN_ID, true);
draw_button(tft, CHOICE_CB_BTN_ID, true);
draw_button(tft, CHOICE_REACTION_BTN_ID, true); */
}
void choice_loop(TS_Point p) {
/*
delay(10);
Serial.print("In choice loop");
if (button_pressed(tft,CHOICE_HEAR_BTN_ID, p)) {
if ( choose_btn_clicked == false) {
choose_btn_clicked = true;
draw_button(tft, CHOICE_HEAR_BTN_ID, false);
delay(10);
draw_button(tft, CHOICE_HEAR_BTN_ID, true);
Serial.println("Hearing btn clicked");
Change_Screen(HEAR_INSTR_SCREEN);
}
}
if (button_pressed(tft,CHOICE_CB_BTN_ID, p)) {
if ( choose_btn_clicked == false) {
choose_btn_clicked = true;
draw_button(tft, CHOICE_CB_BTN_ID, false);
delay(10);
draw_button(tft, CHOICE_CB_BTN_ID, true);
Serial.println("Blindness btn clicked");
Change_Screen(BLIND_INSTR_SCREEN);
}
}
if (button_pressed(tft,CHOICE_REACTION_BTN_ID, p)) {
if ( choose_btn_clicked == false) {
choose_btn_clicked = true;
draw_button(tft, CHOICE_REACTION_BTN_ID, false);
delay(10);
draw_button(tft, CHOICE_REACTION_BTN_ID, true);
Serial.println("Reaction btn clicked");
Change_Screen(REACTION_INSTR_SCREEN);
}
}
*/
}
void instr_start_loop(TS_Point p) {
// Serial.println("Entering instr_start_loop");
/*
if ( button_pressed(tft,CONTINUE_BTN_ID, p)) {
if ( start_btn_clicked == false) {
start_btn_clicked = true;
draw_button(tft, CONTINUE_BTN_ID, false);
delay(10);
draw_button(tft, CONTINUE_BTN_ID, true);
Serial.println("Start btn clicked");
switch(g_current_screen){
case HEAR_INSTR_SCREEN:
Change_Screen(HEAR_TEST_SCREEN);
break;
case BLIND_INSTR_SCREEN:
Change_Screen(BLIND_TEST_SCREEN);
break;
case REACTION_INSTR_SCREEN:
Change_Screen(REACTION_TEST_SCREEN);
break;
default:
Change_Screen(WELCOME_SCREEN);
break;
}
}
}
else
{
start_btn_clicked = false;
} */
//Serial.println("Leaving instr_start_loop");
}
void Change_Screen(uint8_t no){
g_current_screen = no;
switch(no){
/* case WELCOME_SCREEN:
welcome_screen();
break;
case CHOICE_SCREEN:
choice_screen();
break;
case HEAR_INSTR_SCREEN:
hear_instructions_screen();
break;
case BLIND_INSTR_SCREEN:
blind_instructions_screen();
break; */
case REACTION_INSTR_SCREEN:
reaction_instructions_screen();
break;
case HEAR_TEST_SCREEN:
hear_test_screen();
break;
case BLIND_TEST_SCREEN:
colour_blind_test_screen();
break;
case REACTION_TEST_SCREEN:
reaction_test_screen();
break;
case BLIND_RESULTS_SCREEN:
colour_blind_results();
break;
case REACTION_RESULTS_SCREEN:
reaction_results_screen();
break;
case HEAR_RESULTS_SCREEN:
hear_results_screen();
break;
default:
Serial.print("Screen Id ");
Serial.print(no);
Serial.print(" not mapped to a function");
break;
}
}
/*#include <SD.h>
#define cspin 10
File root;
void setup() {
Serial.begin(9600);
Serial.print("Initializing SD card... ");
if (!SD.begin(cspin)) {
Serial.println("Card initialization failed!");
while (true);
}
Serial.println("initialization done.");
Serial.println("Files in the card:");
root = SD.open("/");
printDir(root, 0);
Serial.println("");
File txtfile = SD.open("TEST_P~1.TXT");
if (txtfile) {
Serial.print("txt_file.txt: ");
while (txtfile.available()) {
Serial.write(txtfile.read());
}
txtfile.close();
} else {
Serial.println("error opening txt_file.txt!");
}
}
void loop() {
}
void printDir(File dir, int numTabs) {
while (true) {
File entry = dir.openNextFile();
if (! entry) {
// no more files
break;
}
for (uint8_t i = 0; i < numTabs; i++) {
Serial.print('\t');
}
Serial.print(entry.name());
if (entry.isDirectory()) {
Serial.println("/");
printDir(entry, numTabs + 1);
} else {
// files have sizes, directories do not
Serial.print("\t\t");
Serial.println(entry.size(), DEC);
}
entry.close();
}
}
*/