/*********
https://randomnerdtutorials.com/esp32-dual-core-arduino-ide/
*********/
#include <WiFi.h>
#include "ESP32DMASPISlave.h"
#include <Adafruit_NeoPixel.h>
#define PIN 38 // ESP32-C3 built-in RGB led
#define NUMPIXELS 1
Adafruit_NeoPixel pixels (NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);
#define DELAYVAL 500
/*
//ESP32S3 Dev Modul
printf("SS:%d,\n",SS); //10
printf("MISO:%d,\n",MISO); //13
printf("MOSI:%d,\n",MOSI); //11
printf("SCK:%d,\n",SCK); //12
//Wemos LoLIN32
/*printf("SS:%d,\n",SS); //5
printf("MISO:%d,\n",MISO); //19
printf("MOSI:%d,\n",MOSI); //23
printf("SCK:%d,\n",SCK); //18
*/
//#define LED 2
//Wemos LoLIN32
//#define DSIGNAL 22 //CS3
//ESP32S3 Dev Modul
#define DSIGNAL 4 //CS3
ESP32DMASPI::Slave slave;
uint8_t* spi_slave_tx_buf;
uint8_t* spi_slave_rx_buf;
const char *ssid = "TP-Link_7D0E";
const char *password = "75211301";
const char *host = "192.168.0.100";
const int port = 12345;
IPAddress local_IP(192, 168, 0, 102); //static client IP address
// Set your Gateway IP address
IPAddress gateway(192, 168, 0, 1);
IPAddress subnet(255, 255, 255, 0);
static const uint32_t BUFFER_SIZE = 8192; //4108//-2048;
bool oksflag=true;
bool alloksflag=false;
bool buffer_empty=true;
bool onemore=true;
byte popflag=0;
byte globlalC=0;
#define SPI_DEVICE_HALFDUPLEX (1<<4)
WiFiClient client;
TaskHandle_t Task1;
TaskHandle_t Task2;
// LED pins
const int led1 = 2;
const int led2 = 4;
void OKSn()
{
String ok = "*OKn*";
if (client.connected()) {
client.println(ok);
}
Serial.print("*OK*number\n");
}
void OKS()
{
String ok = "*OK*";
if (client.connected()) {
client.println(ok);
}
Serial.print("*OK*\n");
}
void LED(byte R, byte B, byte G)
{
pixels.begin();
pixels.clear();
for(int i=0; i<NUMPIXELS; i++)
{
pixels.setPixelColor(i, pixels.Color (R, B, G));
pixels.show();
//delay(2000);
}
}
void ping()
{
//Szerver bemutatkozása, így folyamatosan látja hogy ha csatlakozik hozzá
{
String ok = "Name:ESP_NEW_2";
if (client.connected()) {
client.println(ok);
}
}
Serial.println("PING");
}
void set_buffer() {
/* for (uint32_t i = 0; i < BUFFER_SIZE; i++)
{
spi_slave_tx_buf[i] = (0xFF - i) & 0xFF;
}*/
memset(spi_slave_rx_buf, 0xff, BUFFER_SIZE);
memset(spi_slave_tx_buf, 0xff, BUFFER_SIZE);
}
void SendSPISignalLOW()
{
digitalWrite(DSIGNAL,LOW);
LED(2,20,2);
//digitalWrite(LED,LOW);
}
void SendSPISignalHIGH()
{
digitalWrite(DSIGNAL,HIGH);
LED(2,2,20);
//digitalWrite(LED,HIGH);
}
void ReadFromServer()
{
// Read from server and send to Serial or SPIslave
if (client.available())
{
String data = client.readString();//client.readStringUntil('\n');
/* for(int i=0; i<data.length();i++)
Serial.print(data[i],HEX);
Serial.println();*/
if(data=="*RST*")
ESP.restart();
if(data=="*hello*")
{
ping();
SendSPISignalHIGH();
alloksflag=true;
globlalC=0;
oksflag=true;
buffer_empty=true;
}
else
{
Serial.println("\n1");
if(buffer_empty==true)
{
memset(&spi_slave_tx_buf[0],0xff,BUFFER_SIZE);
memcpy(&spi_slave_tx_buf[0],data.c_str(), data.length());//BUFFER_SIZE);//);//udpsize);
/*for(int i=0; i<BUFFER_SIZE;i++)
spi_slave_tx_buf[i]=globlalC;//i%10+globlalC;//*10+i%10;*/
spi_slave_tx_buf[BUFFER_SIZE-2]=0x0D;
spi_slave_tx_buf[BUFFER_SIZE-1]=0x0A;
alloksflag=true;
buffer_empty=false;
//Serial.println("Received from server: "+data);
delay(50);
//CheckSum();
SendSPISignalLOW();
Serial.println("\n2");
globlalC++;
}
onemore=false;
}
//}
/*else
{
if(onemore==true)
{
SendSPISignalLOW();
onemore=false;
}
}*/
/*{
String ok = "*OK*";
if (client.connected()) {
client.println(ok);
}*/
}
}
void ReconnectedToServer()
{
// Reconnect to server if needed
if (!client.connected()) {
Serial.println("Connecting to server...");
if (client.connect(host, port)) {
Serial.println("Connected to server");
} else {
Serial.println("Connection failed");
}
}
}
void SlaveRemained()
{
if (slave.remained() == 0)
{
slave.queue(spi_slave_rx_buf, spi_slave_tx_buf, BUFFER_SIZE);
// if(digitalRead(SS)==1)
// Serial.println("remainedSS=1;");
// else
// Serial.println("remainedSS=0;");
}
// slave.wait(spi_slave_rx_buf, spi_slave_tx_buf, BUFFER_SIZE);
}
void ReadFromSerial()
{
// Read from Serial and send to server
if (Serial.available())
{
if (client.connected())
{
String data = Serial.readString();
if(data[0]=='1')
{
SendSPISignalHIGH();
alloksflag=true;
oksflag=true;
buffer_empty=true;
}
if(data[0]=='0')
{
SendSPISignalLOW();
alloksflag=false;
}
client.println(data);
OKS();
}
}
}
void setup() {
Serial.begin(115200);
pinMode(led1, OUTPUT);
pinMode(led2, OUTPUT);
pinMode(DSIGNAL,OUTPUT);
pinMode(SS,INPUT);
// to use DMA buffer, use these methods to allocate buffer
spi_slave_tx_buf = slave.allocDMABuffer(BUFFER_SIZE);
spi_slave_rx_buf = slave.allocDMABuffer(BUFFER_SIZE);
set_buffer();
delay(5000);
Serial.println();
// slave device configuration
slave.setDataMode(SPI_MODE0);
slave.setMaxTransferSize(BUFFER_SIZE);
slave.begin(HSPI); // VSPI
// Connect to Wi-Fi
Serial.println();
Serial.println();
Serial.print("Connecting to ");
Serial.println(ssid);
// WiFi.begin(ssid, password);
WiFi.setAutoReconnect(true);
WiFi.config(local_IP,gateway,subnet);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi connected");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
SendSPISignalHIGH();
//create a task that will be executed in the Task1code() function, with priority 1 and executed on core 0
xTaskCreatePinnedToCore(
Task1code, /* Task function. */
"Task1", /* name of task. */
10000, /* Stack size of task */
NULL, /* parameter of the task */
1, /* priority of the task */
&Task1, /* Task handle to keep track of created task */
0); /* pin task to core 0 */
delay(500);
//create a task that will be executed in the Task2code() function, with priority 1 and executed on core 1
xTaskCreatePinnedToCore(
Task2code, /* Task function. */
"Task2", /* name of task. */
10000, /* Stack size of task */
NULL, /* parameter of the task */
1, /* priority of the task */
&Task2, /* Task handle to keep track of created task */
1); /* pin task to core 1 */
delay(500);
}
//Task1code: blinks an LED every 1000 ms
void Task1code( void * pvParameters ){
Serial.print("Task1 running on core ");
Serial.println(xPortGetCoreID());
while(1){
ReadFromSerial();
ReadFromServer();
ReconnectedToServer();
}
}
//Task2code: blinks an LED every 700 ms
void Task2code( void * pvParameters ){
Serial.print("Task2 running on core ");
Serial.println(xPortGetCoreID());
while(1){
SlaveRemained();
while (slave.available()) //
{
if(spi_slave_rx_buf[2]==9&&spi_slave_rx_buf[3]==0x01)
{
Serial.println("OK a pictol");
onemore=true;
memset(&spi_slave_rx_buf[0],0,BUFFER_SIZE);
buffer_empty=true;
SendSPISignalHIGH();
// delay(1000);
/* printf("\n************************************\n");
for(int i=0; i<4108/2;i++)
printf("%d",spi_slave_tx_buf[i]);//i%10+globlalC;//*10+i%10;
printf("\n************************************\n");*/
memset(&spi_slave_rx_buf[0],0,BUFFER_SIZE);
OKS();
}
else
{
Serial.print("SPI:");
SendSPISignalHIGH();
OKS();
//printf("spi:%s8\n",&spi_slave_rx_buf[0]);
}
//memset(spi_slave_rx_buf, 0, BUFFER_SIZE);
//memset(spi_slave_tx_buf, 0, BUFFER_SIZE);
//printf("\n");
slave.pop();
//set_buffer();
}
}
}
void loop() {
}
/*
void setup() {
Serial.begin(115200);//(256000);
pinMode(LED,OUTPUT);
}
void loop() {
//SlaveRemained();
if (slave.remained() == 0)
{
slave.queue(spi_slave_rx_buf, spi_slave_tx_buf, BUFFER_SIZE);
// if(digitalRead(SS)==1)
// Serial.println("remainedSS=1;");
// else
// Serial.println("remainedSS=0;");
Serial.println("\n2.5");
}
//void yield();
yield();
// delay(1000);
}
*/