initial commit
This commit is contained in:
commit
ba56de6d2e
|
@ -0,0 +1 @@
|
|||
.pio
|
|
@ -0,0 +1,39 @@
|
|||
|
||||
This directory is intended for project header files.
|
||||
|
||||
A header file is a file containing C declarations and macro definitions
|
||||
to be shared between several project source files. You request the use of a
|
||||
header file in your project source file (C, C++, etc) located in `src` folder
|
||||
by including it, with the C preprocessing directive `#include'.
|
||||
|
||||
```src/main.c
|
||||
|
||||
#include "header.h"
|
||||
|
||||
int main (void)
|
||||
{
|
||||
...
|
||||
}
|
||||
```
|
||||
|
||||
Including a header file produces the same results as copying the header file
|
||||
into each source file that needs it. Such copying would be time-consuming
|
||||
and error-prone. With a header file, the related declarations appear
|
||||
in only one place. If they need to be changed, they can be changed in one
|
||||
place, and programs that include the header file will automatically use the
|
||||
new version when next recompiled. The header file eliminates the labor of
|
||||
finding and changing all the copies as well as the risk that a failure to
|
||||
find one copy will result in inconsistencies within a program.
|
||||
|
||||
In C, the usual convention is to give header files names that end with `.h'.
|
||||
It is most portable to use only letters, digits, dashes, and underscores in
|
||||
header file names, and at most one dot.
|
||||
|
||||
Read more about using header files in official GCC documentation:
|
||||
|
||||
* Include Syntax
|
||||
* Include Operation
|
||||
* Once-Only Headers
|
||||
* Computed Includes
|
||||
|
||||
https://gcc.gnu.org/onlinedocs/cpp/Header-Files.html
|
|
@ -0,0 +1,46 @@
|
|||
|
||||
This directory is intended for project specific (private) libraries.
|
||||
PlatformIO will compile them to static libraries and link into executable file.
|
||||
|
||||
The source code of each library should be placed in a an own separate directory
|
||||
("lib/your_library_name/[here are source files]").
|
||||
|
||||
For example, see a structure of the following two libraries `Foo` and `Bar`:
|
||||
|
||||
|--lib
|
||||
| |
|
||||
| |--Bar
|
||||
| | |--docs
|
||||
| | |--examples
|
||||
| | |--src
|
||||
| | |- Bar.c
|
||||
| | |- Bar.h
|
||||
| | |- library.json (optional, custom build options, etc) https://docs.platformio.org/page/librarymanager/config.html
|
||||
| |
|
||||
| |--Foo
|
||||
| | |- Foo.c
|
||||
| | |- Foo.h
|
||||
| |
|
||||
| |- README --> THIS FILE
|
||||
|
|
||||
|- platformio.ini
|
||||
|--src
|
||||
|- main.c
|
||||
|
||||
and a contents of `src/main.c`:
|
||||
```
|
||||
#include <Foo.h>
|
||||
#include <Bar.h>
|
||||
|
||||
int main (void)
|
||||
{
|
||||
...
|
||||
}
|
||||
|
||||
```
|
||||
|
||||
PlatformIO Library Dependency Finder will find automatically dependent
|
||||
libraries scanning project source files.
|
||||
|
||||
More information about PlatformIO Library Dependency Finder
|
||||
- https://docs.platformio.org/page/librarymanager/ldf.html
|
|
@ -0,0 +1,18 @@
|
|||
; PlatformIO Project Configuration File
|
||||
;
|
||||
; Build options: build flags, source filter
|
||||
; Upload options: custom upload port, speed and extra flags
|
||||
; Library options: dependencies, extra library storages
|
||||
; Advanced options: extra scripting
|
||||
;
|
||||
; Please visit documentation for the other options and examples
|
||||
; https://docs.platformio.org/page/projectconf.html
|
||||
|
||||
[env:esp32dev]
|
||||
framework = arduino
|
||||
platform = espressif32 @ 4.1.0
|
||||
board = esp32dev
|
||||
upload_speed = 115200
|
||||
lib_deps =
|
||||
bodmer/TFT_eSPI @ ^2.5.23
|
||||
arturo182/BBQ10Keyboard@^1.1.0
|
|
@ -0,0 +1,352 @@
|
|||
// This will run quite slowly due to the large number of floating point calculations per pixel
|
||||
|
||||
#include <TFT_eSPI.h> // Hardware-specific library
|
||||
#include <SPI.h>
|
||||
TFT_eSPI tft = TFT_eSPI(); // Invoke custom library
|
||||
#define TFT_GREY 0x7BEF
|
||||
#include <WiFi.h>
|
||||
#include <WiFiUdp.h>
|
||||
|
||||
#include <BBQ10Keyboard.h>
|
||||
BBQ10Keyboard keyboard;
|
||||
|
||||
/* CLIENT */
|
||||
const char* ssid = "freethelong3";
|
||||
const char* password = "alle_informationen";
|
||||
|
||||
/* UDP SETUP */
|
||||
const char * udpAddress = "192.168.4.1";
|
||||
const int udpPort = 2390;
|
||||
boolean connected = false;
|
||||
int breakudp=0;
|
||||
#define CELLXY 2
|
||||
|
||||
int findex = 0;
|
||||
int s1values[15];
|
||||
int click_count = 0;
|
||||
|
||||
int paint_active = 0;
|
||||
|
||||
int cursor_x = 0;
|
||||
int cursor_y = 0;
|
||||
|
||||
uint16_t cursorColor = 0x0000;
|
||||
uint8_t colorIndex = 0;
|
||||
|
||||
#define GRIDX 160
|
||||
#define GRIDY 120
|
||||
#define CELLXY 12
|
||||
|
||||
#define GEN_DELAY 0
|
||||
//Current grid
|
||||
uint8_t grid[GRIDX][GRIDY];
|
||||
|
||||
//The new grid for the next generation
|
||||
uint8_t newgrid[GRIDX][GRIDY];
|
||||
|
||||
//Number of generations
|
||||
#define NUMGEN 1200
|
||||
|
||||
uint16_t genCount = 0;
|
||||
|
||||
WiFiUDP udp;
|
||||
|
||||
uint8_t posX;
|
||||
uint8_t posY;
|
||||
|
||||
bool blink_state;
|
||||
|
||||
|
||||
|
||||
void setup() {
|
||||
Serial.begin(115200);
|
||||
// Set initial position
|
||||
posX = 0;
|
||||
posY = 0;
|
||||
blink_state = true;
|
||||
|
||||
// Setup the LCD
|
||||
tft.init();
|
||||
tft.setRotation(3);
|
||||
tft.fillScreen(TFT_BLUE);
|
||||
tft.setTextSize(1);
|
||||
tft.setTextColor(TFT_WHITE);
|
||||
tft.setCursor(0, 0);
|
||||
// activate led backlight
|
||||
pinMode(32, OUTPUT);
|
||||
digitalWrite(32, HIGH);
|
||||
|
||||
Wire.begin();
|
||||
|
||||
keyboard.begin();
|
||||
keyboard.setBacklight(0.5f);
|
||||
|
||||
WiFi.begin(ssid, password);
|
||||
delay(1000);
|
||||
Serial.println("Connecting WiFi..");
|
||||
Serial.println(WiFi.localIP());
|
||||
Serial.println("Init complete");
|
||||
tft.println("init complete");
|
||||
tft.println("");
|
||||
delay(1000);
|
||||
}
|
||||
|
||||
void loop() {
|
||||
const int trackpad_x = keyboard.trackpad_x();
|
||||
const int trackpad_y = keyboard.trackpad_y();
|
||||
if (trackpad_x != 0 || trackpad_y != 0) {
|
||||
Serial.println("trackpad_x: "+String(trackpad_x)+"trackpad_y: "+String(trackpad_y));
|
||||
|
||||
if (paint_active == 0) tft.fillRect(cursor_x, cursor_y, CELLXY, CELLXY, TFT_BLUE);
|
||||
|
||||
cursor_x += trackpad_x;
|
||||
cursor_y += trackpad_y;
|
||||
|
||||
if (cursor_x<0) cursor_x = 0;
|
||||
if (cursor_y<0) cursor_y = 0;
|
||||
if ((cursor_x)>(320-CELLXY)) cursor_x = 320-CELLXY;
|
||||
if ((cursor_y)>(240-CELLXY)) cursor_y = 240-CELLXY;
|
||||
|
||||
tft.fillRect(cursor_x, cursor_y, CELLXY, CELLXY, cursorColor);
|
||||
}
|
||||
|
||||
const int keyCount = keyboard.keyCount();
|
||||
if (keyCount == 0)
|
||||
return;
|
||||
|
||||
const BBQ10Keyboard::KeyEvent key = keyboard.keyEvent();
|
||||
String state = "pressed";
|
||||
if (key.state == BBQ10Keyboard::StateLongPress) {
|
||||
state = "held down";
|
||||
} else if (key.state == BBQ10Keyboard::StateRelease) {
|
||||
state = "released";
|
||||
|
||||
if ((uint8_t)key.key == 6) {
|
||||
|
||||
if (paint_active == 1) {
|
||||
paint_active = 0;
|
||||
} else {
|
||||
paint_active = 1;
|
||||
}
|
||||
}
|
||||
if ((uint8_t)key.key == 18) {
|
||||
colorIndex++;
|
||||
uint8_t color = colorIndex % 8;
|
||||
switch (color) {
|
||||
case 0:
|
||||
cursorColor = 0xf800;
|
||||
break;
|
||||
case 1:
|
||||
cursorColor = 0x07e0;
|
||||
break;
|
||||
case 2:
|
||||
cursorColor = 0x001f;
|
||||
break;
|
||||
case 3:
|
||||
cursorColor = 0xffe0;
|
||||
break;
|
||||
case 4:
|
||||
cursorColor = 0x07ff;
|
||||
break;
|
||||
case 5:
|
||||
cursorColor = 0xf81f;
|
||||
break;
|
||||
case 6:
|
||||
cursorColor = 0xfdbf;
|
||||
break;
|
||||
case 7:
|
||||
cursorColor = 0xf652;
|
||||
break;
|
||||
default:
|
||||
cursorColor = 0x0000;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
// Serial.printf("key: '%c' (dec %d, hex %02x) %s\r\n", key.key, key.key, key.key, state.c_str());
|
||||
|
||||
if (key.state == BBQ10Keyboard::StatePress) {
|
||||
|
||||
/* TETRIS P1 RIGHT */
|
||||
if ((uint8_t)key.key == 100) {
|
||||
udp.beginPacket(udpAddress,udpPort);
|
||||
udp.printf("f%c",53);
|
||||
udp.endPacket();
|
||||
}
|
||||
|
||||
/* TETRIS P1 LEFT */
|
||||
if ((uint8_t)key.key == 97) {
|
||||
udp.beginPacket(udpAddress,udpPort);
|
||||
udp.printf("f%c",51);
|
||||
udp.endPacket();
|
||||
}
|
||||
|
||||
/* TETRIS P1 ROTATE */
|
||||
if ((uint8_t)key.key == 119) {
|
||||
udp.beginPacket(udpAddress,udpPort);
|
||||
udp.printf("f%c",55);
|
||||
udp.endPacket();
|
||||
}
|
||||
|
||||
/* TETRIS P1 DOWN */
|
||||
if ((uint8_t)key.key == 115) {
|
||||
udp.beginPacket(udpAddress,udpPort);
|
||||
udp.printf("f%c",54);
|
||||
udp.endPacket();
|
||||
}
|
||||
|
||||
if ((uint8_t)key.key == 5) {
|
||||
tft.fillScreen(TFT_BLUE);
|
||||
posX = 0;
|
||||
posY = 0;
|
||||
tft.setCursor(posX,posY);
|
||||
if (click_count>6) {
|
||||
click_count=0;
|
||||
} else {
|
||||
click_count+=1;
|
||||
}
|
||||
|
||||
|
||||
int sensorValue = 20;
|
||||
int sensorValue2 = 20;
|
||||
int sensorValue3 = 20;
|
||||
Serial.println(sensorValue);
|
||||
Serial.println(sensorValue2);
|
||||
Serial.println(sensorValue3);
|
||||
Serial.println(" ");
|
||||
delay(5);
|
||||
|
||||
if (breakudp==0) {
|
||||
udp.beginPacket(udpAddress,udpPort);
|
||||
if (click_count==0) {
|
||||
sensorValue = 53;
|
||||
udp.printf("e%c",sensorValue);
|
||||
}
|
||||
if (click_count==1) {
|
||||
sensorValue = 49;
|
||||
udp.printf("e%c",sensorValue);
|
||||
}
|
||||
if (click_count==2) {
|
||||
sensorValue = 56;
|
||||
udp.printf("e%c",sensorValue);
|
||||
}
|
||||
|
||||
if (click_count==3) {
|
||||
sensorValue = 50;
|
||||
udp.printf("e%c",sensorValue);
|
||||
}
|
||||
if (click_count==4) {
|
||||
sensorValue = 51;
|
||||
udp.printf("e%c",sensorValue);
|
||||
}
|
||||
|
||||
if (click_count==5) {
|
||||
sensorValue = 57;
|
||||
udp.printf("e%c",sensorValue);
|
||||
}
|
||||
if (click_count==6) {
|
||||
sensorValue = 54;
|
||||
udp.printf("e%c",sensorValue);
|
||||
}
|
||||
|
||||
udp.endPacket();
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
Serial.printf("posX: '%d' | posY: '%d' | key: '%d'\n", posX, posY, (uint8_t)key.key);
|
||||
}
|
||||
|
||||
|
||||
unsigned int rainbow(byte value)
|
||||
{
|
||||
// Value is expected to be in range 0-127
|
||||
// The value is converted to a spectrum colour from 0 = blue through to 127 = red
|
||||
|
||||
byte red = 0; // Red is the top 5 bits of a 16 bit colour value
|
||||
byte green = 0;// Green is the middle 6 bits
|
||||
byte blue = 0; // Blue is the bottom 5 bits
|
||||
|
||||
byte quadrant = value / 32;
|
||||
|
||||
if (quadrant == 0) {
|
||||
blue = 31;
|
||||
green = 2 * (value % 32);
|
||||
red = 0;
|
||||
}
|
||||
if (quadrant == 1) {
|
||||
blue = 31 - (value % 32);
|
||||
green = 63;
|
||||
red = 0;
|
||||
}
|
||||
if (quadrant == 2) {
|
||||
blue = 0;
|
||||
green = 63;
|
||||
red = value % 32;
|
||||
}
|
||||
if (quadrant == 3) {
|
||||
blue = 0;
|
||||
green = 63 - 2 * (value % 32);
|
||||
red = 31;
|
||||
}
|
||||
return (red << 11) + (green << 5) + blue;
|
||||
}
|
||||
|
||||
//Draws the grid on the display
|
||||
void drawGrid(int gen) {
|
||||
|
||||
uint16_t color = TFT_WHITE;
|
||||
for (int16_t x = 1; x < GRIDX - 1; x++) {
|
||||
for (int16_t y = 1; y < GRIDY - 1; y++) {
|
||||
if ((grid[x][y]) != (newgrid[x][y])) {
|
||||
if (newgrid[x][y] == 1) color = rainbow(map(int(gen*.09)%200, 0, 80, 0, 100));//color = 0xF000; //random(0xFFFF);
|
||||
else color = 0;
|
||||
tft.fillRect(CELLXY * x, CELLXY * y, CELLXY, CELLXY, color);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//Initialise Grid
|
||||
void initGrid(void) {
|
||||
for (int16_t x = 0; x < GRIDX; x++) {
|
||||
for (int16_t y = 0; y < GRIDY; y++) {
|
||||
newgrid[x][y] = 0;
|
||||
|
||||
if (x == 0 || x == GRIDX - 1 || y == 0 || y == GRIDY - 1) {
|
||||
grid[x][y] = 0;
|
||||
}
|
||||
else {
|
||||
if (random(12) == 1)
|
||||
grid[x][y] = 1;
|
||||
else
|
||||
grid[x][y] = 0;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//Compute the CA. Basically everything related to CA starts here
|
||||
void computeCA() {
|
||||
for (int16_t x = 1; x < GRIDX; x++) {
|
||||
for (int16_t y = 1; y < GRIDY; y++) {
|
||||
int neighbors = getNumberOfNeighbors(x, y);
|
||||
if (grid[x][y] == 1 && (neighbors == 2 || neighbors == 3 ))
|
||||
{
|
||||
newgrid[x][y] = 1;
|
||||
}
|
||||
else if (grid[x][y] == 1) newgrid[x][y] = 0;
|
||||
if (grid[x][y] == 0 && (neighbors == 3))
|
||||
{
|
||||
newgrid[x][y] = 1;
|
||||
}
|
||||
else if (grid[x][y] == 0) newgrid[x][y] = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Check the Moore neighbourhood
|
||||
int getNumberOfNeighbors(int x, int y) {
|
||||
return grid[x - 1][y] + grid[x - 1][y - 1] + grid[x][y - 1] + grid[x + 1][y - 1] + grid[x + 1][y] + grid[x + 1][y + 1] + grid[x][y + 1] + grid[x - 1][y + 1];
|
||||
}
|
|
@ -0,0 +1,11 @@
|
|||
|
||||
This directory is intended for PlatformIO Test Runner and project tests.
|
||||
|
||||
Unit Testing is a software testing method by which individual units of
|
||||
source code, sets of one or more MCU program modules together with associated
|
||||
control data, usage procedures, and operating procedures, are tested to
|
||||
determine whether they are fit for use. Unit testing finds problems early
|
||||
in the development cycle.
|
||||
|
||||
More information about PlatformIO Unit Testing:
|
||||
- https://docs.platformio.org/en/latest/advanced/unit-testing/index.html
|
Loading…
Reference in New Issue