Compare commits
47 Commits
master
..
c247b38f7b
| Author | SHA1 | Date | |
|---|---|---|---|
| c247b38f7b | |||
| 348a1a1e14 | |||
| 118291f8ab | |||
| 4a97988227 | |||
| 7aec14cbb9 | |||
| 331258692b | |||
| 0ecd846183 | |||
| 66140ea823 | |||
| c01439dc05 | |||
| 20d1ca79b8 | |||
| bd4a593963 | |||
| 3afaf3848f | |||
| a18ddf2cb1 | |||
| de9ff6f807 | |||
| f064794499 | |||
| 598f1262d7 | |||
| 889523f0c8 | |||
| 8f0dbd4cbd | |||
| 9ebbedb04a | |||
| 04a8904cbe | |||
| 810264aa71 | |||
| 171a48eb71 | |||
| c13310d540 | |||
| 4e94d7ad78 | |||
| 500641a6e2 | |||
| a5805aceb2 | |||
| c7e1b4805b | |||
| b667f9c255 | |||
| 199007c0c5 | |||
| c872f1a9ae | |||
| 5fcc0dda1e | |||
| 968d078c07 | |||
| dd9f59e418 | |||
| eb0eb436ed | |||
| 6db9bd85a5 | |||
| e4621f8ad8 | |||
| 1cf86768c0 | |||
| bd923e4fdc | |||
| 2dc06e8d79 | |||
| de2c0c167c | |||
| 0181c72a9d | |||
| f6608075ff | |||
| deccb3186c | |||
| 49b3b46ffe | |||
| 33c875c6bd | |||
| 3f627f08f7 | |||
| bc651eff27 |
Vendored
+1
-1
@@ -78,5 +78,5 @@
|
||||
},
|
||||
|
||||
"idf.currentSetup": "C:\\esp\\v5.4.3\\esp-idf",
|
||||
"idf.port": "COM16"
|
||||
"idf.port": "COM4"
|
||||
}
|
||||
|
||||
+1
-1
@@ -20,6 +20,6 @@ else()
|
||||
)
|
||||
include($ENV{IDF_PATH}/tools/cmake/project.cmake)
|
||||
message("Using Main App")
|
||||
project(LeoLightShow)
|
||||
project(WatchController)
|
||||
endif()
|
||||
endif()
|
||||
|
||||
@@ -2,6 +2,8 @@
|
||||
* @file TestableUTest.cpp
|
||||
* @author Gustice
|
||||
* @brief
|
||||
*
|
||||
* @copyright Copyright (c) 2024
|
||||
*/
|
||||
|
||||
#define DOCTEST_CONFIG_IMPLEMENT_WITH_MAIN
|
||||
|
||||
+1
-1
Submodule core updated: c80f61a60a...e584259b31
+12
-1
@@ -1,10 +1,21 @@
|
||||
dependencies:
|
||||
frozen-eye/esp_telnet:
|
||||
component_hash: e00a16d6372fa31df46b32e330847d6e09af2ec184d8c7cac4d183b3daac02e5
|
||||
dependencies:
|
||||
- name: idf
|
||||
require: private
|
||||
version: '>=4.0'
|
||||
source:
|
||||
registry_url: https://components.espressif.com/
|
||||
type: service
|
||||
version: 0.0.2
|
||||
idf:
|
||||
source:
|
||||
type: idf
|
||||
version: 5.4.3
|
||||
direct_dependencies:
|
||||
- frozen-eye/esp_telnet
|
||||
- idf
|
||||
manifest_hash: f963becbad30dee4a0a46222b7f0ae7dd40100701f7b7147a846011f8dabe9ca
|
||||
manifest_hash: f3dbb2beffe19f6e4fa3818b79ea2bfac679eaaf47effee78f152007a2be54f5
|
||||
target: esp32
|
||||
version: 2.0.0
|
||||
|
||||
@@ -0,0 +1,28 @@
|
||||
menu "Example Configuration"
|
||||
|
||||
config DEVICE_WIFI_SSID
|
||||
string "Wi-Fi SSID"
|
||||
default "eth2ap"
|
||||
help
|
||||
Set the SSID of Wi-Fi ap interface.
|
||||
|
||||
config DEVICE_WIFI_PASSWORD
|
||||
string "Wi-Fi Password"
|
||||
default "12345678"
|
||||
help
|
||||
Set the password of Wi-Fi ap interface.
|
||||
|
||||
config DEVICE_WIFI_CHANNEL
|
||||
int "WiFi channel"
|
||||
range 1 13
|
||||
default 1
|
||||
help
|
||||
Set the channel of Wi-Fi ap.
|
||||
|
||||
config DEVICE_MAX_STA_CONN
|
||||
int "Maximum STA connections"
|
||||
default 4
|
||||
help
|
||||
Maximum number of the station that allowed to connect to current Wi-Fi hotspot.
|
||||
|
||||
endmenu
|
||||
@@ -0,0 +1,6 @@
|
||||
## IDF Component Manager Manifest File
|
||||
# https://docs.espressif.com/projects/idf-component-manager/en/latest/reference/manifest_file.html
|
||||
# https://components.espressif.com
|
||||
|
||||
dependencies:
|
||||
frozen-eye/esp_telnet: "^0.0.2"
|
||||
+6
-7
@@ -1,6 +1,8 @@
|
||||
/**
|
||||
* @file watchMain.hpp
|
||||
* @author Gustice
|
||||
*
|
||||
* @copyright Copyright (c) 2024
|
||||
*/
|
||||
#pragma once
|
||||
|
||||
@@ -8,11 +10,6 @@
|
||||
#include <cstring>
|
||||
#include <cstdlib>
|
||||
#include <cmath>
|
||||
#include <chrono>
|
||||
#include <string>
|
||||
#include <map>
|
||||
#include <vector>
|
||||
|
||||
#include "sdkconfig.h"
|
||||
#include "esp_event.h"
|
||||
#include "esp_log.h"
|
||||
@@ -46,5 +43,7 @@
|
||||
#include "spit_player.hpp"
|
||||
#include "spit_type.hpp"
|
||||
#include "spit_client.hpp"
|
||||
#include "addressableLeRtz.hpp"
|
||||
#include "systemFunctions.hpp"
|
||||
#include <chrono>
|
||||
#include <string>
|
||||
#include <map>
|
||||
#include <vector>
|
||||
|
||||
+190
-153
@@ -13,9 +13,6 @@
|
||||
// ETH_PHY_LAN8720, // eth_type,
|
||||
// ETH_CLOCK_GPIO0_IN // eth_clk_mode as input
|
||||
// },
|
||||
//
|
||||
// LED-Strips: 14 - 22 - 30
|
||||
// >> update http://172.16.16.10:8000/LeoLightShow.bin
|
||||
|
||||
#include "config.hpp"
|
||||
#include "lighsMain.hpp"
|
||||
@@ -25,32 +22,63 @@ using namespace std;
|
||||
|
||||
string ClientName = "LeoLightsDev";
|
||||
string ProjectName = "LeoLightsProj";
|
||||
gpio_num_t LedPin = gpio_num_t::GPIO_NUM_16;
|
||||
gpio_num_t RelayPin = gpio_num_t::GPIO_NUM_18;
|
||||
|
||||
extern "C" { // This switch allows the ROS C-implementation to find this main
|
||||
void app_main(void);
|
||||
}
|
||||
|
||||
struct DeviceState {
|
||||
Color color{0x80, 0x80, 0x40}; // Color for the chosen bottle
|
||||
vector<uint8_t> grouping; // LED groups for LED-Strip
|
||||
vector<uint8_t> times; // Step times for effects
|
||||
Color color{0x80, 0x80, 0x80};
|
||||
vector<uint8_t> counts;
|
||||
vector<uint8_t> times;
|
||||
};
|
||||
struct MasterRequest {};
|
||||
struct SlaveResponse {};
|
||||
static fos::Queue<MasterRequest> commandQ(2);
|
||||
static fos::Queue<SlaveResponse> responseQ(2);
|
||||
struct StartCommand {
|
||||
uint8_t pos; // 0 for none / Valid indexes 1 .. 6
|
||||
};
|
||||
static fos::Queue<StartCommand> commandQ(2);
|
||||
|
||||
DeviceState State;
|
||||
static const char* TAG = "Light";
|
||||
static const char* VERSION = "V 0.7.0";
|
||||
|
||||
unique_ptr<Cli> pShell;
|
||||
|
||||
void onCommand(string name, Cli::CArgs args) {
|
||||
ESP_LOGI(TAG, "Invoking: %s", name.c_str());
|
||||
}
|
||||
|
||||
void startUpdate(Cli::CArgs args) {
|
||||
ESP_LOGI(TAG, "Invoking Update");
|
||||
if (args.size() != 1) {
|
||||
pShell->writeLine("Need URL to application");
|
||||
return;
|
||||
}
|
||||
// @ToDo: Start Update here
|
||||
}
|
||||
|
||||
void getConfig(Cli::CArgs args) {
|
||||
if (args.size() != 1) {
|
||||
pShell->writeLine("Needs string key for query");
|
||||
return;
|
||||
}
|
||||
auto key = args[0];
|
||||
auto& store = NvsApi::getInstance();
|
||||
auto val = store.getValue(key);
|
||||
pShell->writeLine(key + ": " + val + "");
|
||||
}
|
||||
|
||||
void setConfig(Cli::CArgs args) {
|
||||
if (args.size() != 2) {
|
||||
pShell->writeLine("Needs string key and value");
|
||||
return;
|
||||
}
|
||||
auto key = args[0];
|
||||
auto val = args[1];
|
||||
|
||||
auto& store = NvsApi::getInstance();
|
||||
pShell->writeLine(string{"Storing value = '"} + val + "'");
|
||||
store.setValue(key, val);
|
||||
}
|
||||
|
||||
void setLogServerConfig(Cli::CArgs args) {
|
||||
ESP_LOGI(TAG, "on showLogServerConfig:");
|
||||
auto& store = NvsApi::getInstance();
|
||||
@@ -66,7 +94,7 @@ void setLogServerConfig(Cli::CArgs args) {
|
||||
|
||||
void testLights(Cli::CArgs args) {
|
||||
ESP_LOGI(TAG, "on testLights:");
|
||||
commandQ.enqueue(make_unique<MasterRequest>());
|
||||
commandQ.enqueue(make_unique<StartCommand>());
|
||||
}
|
||||
|
||||
void showProcessValues(Cli::CArgs args) {
|
||||
@@ -75,7 +103,7 @@ void showProcessValues(Cli::CArgs args) {
|
||||
|
||||
sprintf(buff, "%02x,%02x,%02x", State.color.getRed(), State.color.getGreen(), State.color.getBlue());
|
||||
std::stringstream ssC;
|
||||
for (auto& c : State.grouping) {
|
||||
for (auto& c : State.counts) {
|
||||
ssC << string{c} << ",";
|
||||
}
|
||||
std::stringstream ssT;
|
||||
@@ -87,6 +115,24 @@ void showProcessValues(Cli::CArgs args) {
|
||||
pShell->writeLine(string{" Switch-Times: "} + ssT.str());
|
||||
}
|
||||
|
||||
void setSyslogLevel(Cli::CArgs args) {
|
||||
if (args.size() != 1) {
|
||||
pShell->writeLine("Needs SyslogLevel Warning = 4, Notice = 5, Informational = 6, Debug = 7");
|
||||
return;
|
||||
}
|
||||
|
||||
try {
|
||||
auto lvl = stoi(args[0]);
|
||||
if (lvl >= (int)Syslog::Severity::Warning && lvl <= (int)Syslog::Severity::Debug) {
|
||||
Syslog::setSeverity((Syslog::Severity)lvl);
|
||||
} else {
|
||||
pShell->writeLine("New level was not accepted");
|
||||
}
|
||||
} catch (const exception& e) {
|
||||
ESP_LOGI(TAG, "Failed to parse %s", args[0].c_str());
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Telnet socket via TCP/IP
|
||||
*
|
||||
@@ -100,14 +146,22 @@ static void telnetSocketTask(int addrFamily) {
|
||||
telnet.run(
|
||||
[](TcpSession& session) {
|
||||
pShell = make_unique<Cli>(session, [](string n, Cli::CArgs a) { onCommand(n, a); });
|
||||
pShell->addBinding(
|
||||
{"update", "Start OTA-Update-Process",
|
||||
[](Cli::CArgs a) { startUpdate(a); }});
|
||||
pShell->addBinding(
|
||||
{"setLogserver", "Set log server config ip",
|
||||
[](Cli::CArgs a) { setLogServerConfig(a); }});
|
||||
|
||||
Syslog::registerCli(*pShell);
|
||||
auto& store = NvsApi::getInstance();
|
||||
store.registerCli(*pShell);
|
||||
SystemFunctions::registerCli(*pShell);
|
||||
pShell->addBinding(
|
||||
{"setLogLevel", "Set severity log server",
|
||||
[](Cli::CArgs a) { setSyslogLevel(a); }});
|
||||
|
||||
pShell->addBinding(
|
||||
{"getcfg", "Get configuration value for key",
|
||||
[](Cli::CArgs a) { getConfig(a); }});
|
||||
pShell->addBinding(
|
||||
{"setcfg", "Set configuration value by key and value",
|
||||
[](Cli::CArgs a) { setConfig(a); }});
|
||||
|
||||
pShell->addBinding(
|
||||
{"setDyn", "set dynamics of movement (velocity,accelerations) as floats",
|
||||
@@ -130,62 +184,29 @@ void startShow(string data) {
|
||||
ESP_LOGI(TAG, "StartShuffle command %s", data.c_str());
|
||||
try {
|
||||
Syslog::logv(Syslog::Severity::Informational, "got Shuffle-Command");
|
||||
commandQ.enqueue(make_unique<MasterRequest>());
|
||||
commandQ.enqueue(make_unique<StartCommand>());
|
||||
} catch (const exception& e) {
|
||||
ESP_LOGE(TAG, "Error to process data %s, with ex: %s", data.c_str(), e.what());
|
||||
}
|
||||
}
|
||||
|
||||
constexpr uint32_t DmxUniverse = 0;
|
||||
constexpr int DmxChannelCount = 9;
|
||||
array<uint8_t, 512> LedData;
|
||||
|
||||
static void UniverseCallback(const uint8_t* data, const uint16_t size) {
|
||||
ESP_LOGD(TAG, "Got DMX");
|
||||
ESP_LOG_BUFFER_HEXDUMP("DMX", data, size, ESP_LOG_DEBUG);
|
||||
Syslog::logv(Syslog::Severity::Debug, "Got DMX: r%0x g%0x b%0x i%0x ...",
|
||||
/* RGB*/ data[0], data[1], data[2], /*Intens*/ data[3]);
|
||||
|
||||
// DMX 512
|
||||
for (int i = 0; i < LedData.size() / 4;) {
|
||||
LedData[i] = data[i];
|
||||
i++;
|
||||
LedData[i] = data[i];
|
||||
i++;
|
||||
LedData[i] = data[i];
|
||||
i++;
|
||||
LedData[i] = data[i];
|
||||
i++;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief DMX-Socket for ArtNet TCP/IP
|
||||
*
|
||||
* @details Tested with [Q Light Controller+](https://www.qlcplus.org/)
|
||||
* @param args ignored task argument
|
||||
*/
|
||||
static void dmxSocketTask(int addrFamily) {
|
||||
ESP_LOGI(TAG, "Starting ArtNet task");
|
||||
constexpr uint16_t ArtNetPort = arx::artnet::DEFAULT_PORT;
|
||||
IpAdr address = addrFamily == AF_INET ? IpAdr(INADDR_ANY, ArtNetPort) : IpAdr(ArtNetPort);
|
||||
|
||||
static void dmxSocketSenderTask(UdpSocket& socket) {
|
||||
try {
|
||||
while (true) {
|
||||
UdpSocket socket(address);
|
||||
socket.bindTo();
|
||||
|
||||
ArtnetReceiver artnet(socket);
|
||||
artnet.subscribe(DmxUniverse, UniverseCallback);
|
||||
artnet.parse();
|
||||
// parse artnet as long socket is active, then restart socket
|
||||
while (socket.isActive()) {
|
||||
ESP_LOGD(TAG, "Waiting for data");
|
||||
artnet.parse();
|
||||
}
|
||||
ArtnetSender artnet(socket);
|
||||
array<uint8_t, 16> data;
|
||||
while (socket.isActive()) {
|
||||
data[0]++;
|
||||
artnet.send("", 0, data.data(), data.size());
|
||||
fos::Task::delayMs(500);
|
||||
}
|
||||
|
||||
} catch (const std::exception& e) {
|
||||
} catch (const exception& e) {
|
||||
ESP_LOGE("UDP", "%s", e.what());
|
||||
}
|
||||
}
|
||||
@@ -264,19 +285,31 @@ const Macro macDemoFlicker = {
|
||||
void LightingTask() {
|
||||
ESP_LOGI(TAG, "Start Lighting");
|
||||
auto const& colorSource = State.color;
|
||||
array<Effect::EffectProcessor, 2> processors{
|
||||
Effect::EffectProcessor(8),
|
||||
Effect::EffectProcessor(8)};
|
||||
processors[0].setEffect(Effect::macDark, &colorSource, 0);
|
||||
processors[1].setEffect(Effect::macDark, &colorSource, 0);
|
||||
|
||||
AddressableLeRtz strip(LedPin, AddressableLeRtz::Type::Rgb, LedData.size() / 4);
|
||||
OutputPort relay(RelayPin);
|
||||
relay.write(true);
|
||||
const array<Effect::Macro, 2> PictoEffects{
|
||||
Effect::macDemoPulse,
|
||||
Effect::macDemoPulse};
|
||||
|
||||
while (true) {
|
||||
for (int i = 0; i < (LedData.size() / 4); i++) {
|
||||
auto* c = &LedData[i * 4];
|
||||
Color C{c[0], c[1], c[2], c[3]};
|
||||
strip.set(C, i, 1);
|
||||
}
|
||||
strip.send(); // takes ca. 5ms to send all the data
|
||||
fos::Task::delayMs(20);
|
||||
// ESP_LOGI(TAG, "Current color set r%i g%i b%i ",
|
||||
// State.color.getRed(), State.color.getGreen(), State.color.getBlue());
|
||||
// processors[0].setEffect(Effect::macDark, &colorSource, 0);
|
||||
// auto idx = 0;
|
||||
// Syslog::logv(Syslog::Severity::Informational, "Running show");
|
||||
// processors[idx].setEffect(PictoEffects[idx], &colorSource, 0);
|
||||
|
||||
// for (size_t i = 0; i < processors.size(); i++) {
|
||||
// auto col = processors[i].tick();
|
||||
// }
|
||||
// fos::Task::delayMs(40);
|
||||
static int cnt{};
|
||||
fos::Task::delayMs(1000);
|
||||
printf("running %d\n", cnt++);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -285,7 +318,7 @@ struct LocalSpitObj {
|
||||
string groupName;
|
||||
string name;
|
||||
};
|
||||
map<string, MasterRequest> ProvidedSpitActions;
|
||||
map<string, StartCommand> ProvidedSpitActions;
|
||||
map<string, string> ExpectedObjects;
|
||||
|
||||
void onServerEvent(SClient::ServerEvent event, const SadDetectedServer& p_DetectedServer) {
|
||||
@@ -481,8 +514,8 @@ void onPlaySpitType(string p_PlayerID, string spitTypeId, bool p_PlayerIsRunning
|
||||
if (p_Started == true) {
|
||||
auto command = ProvidedSpitActions[spitTypeId];
|
||||
// ESP_LOGI(TAG, "Player: %s is running: %s Object", p_PlayerID.data(), spitTypeId.c_str());
|
||||
commandQ.enqueue(make_unique<MasterRequest>());
|
||||
Syslog::logv(Syslog::Severity::Informational, "Got SPIT command");
|
||||
commandQ.enqueue(make_unique<StartCommand>());
|
||||
Syslog::logv(Syslog::Severity::Informational, "Got SPIT command for move ot : r%d", command.pos);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -498,83 +531,90 @@ void onPlayRemoteObjectStatus(const SType& sType, const SObject& sObject, uint64
|
||||
ESP_EARLY_LOGD(TAG, "eventPlayRemoteObjectStatus RemoteSPITType: %s RemoteSPITObject: %s Position: %lld Value: %d", sType.Name.get().data(), sObject.Name.get().data(), frameInsideObject, value);
|
||||
}
|
||||
|
||||
void SpitClientApp() {
|
||||
ESP_LOGI(TAG, "Starting SPIT task");
|
||||
// void SpitClientApp() {
|
||||
// ESP_LOGI(TAG, "Starting SPIT task");
|
||||
|
||||
auto& provided = SpitTypes.Provided;
|
||||
auto& expected = SpitTypes.Expected;
|
||||
// auto& provided = SpitTypes.Provided;
|
||||
// auto& expected = SpitTypes.Expected;
|
||||
// vector<LocalSpitObj> ProvidedObj;
|
||||
// ProvidedSpitActions[provided.startShuffle] = MoveCommand{.type = MoveType::Shuffle, .pos = 0};
|
||||
// ProvidedObj.push_back(LocalSpitObj{.iD = provided.startShuffle, .groupName = provided.group, .name = provided.startShuffle});
|
||||
// ExpectedObjects[expected.changingPos] = "";
|
||||
// for (size_t i = 0; i < 6; i++) {
|
||||
// ProvidedSpitActions[provided.moveToX[i]] = MoveCommand{.type = MoveType::StepTo, .pos = (uint8_t)(i + 1)};
|
||||
// ProvidedObj.push_back(LocalSpitObj{.iD = provided.moveToX[i], .groupName = provided.group, .name = provided.moveToX[i]});
|
||||
// ExpectedObjects[expected.inPosX[i]] = "";
|
||||
// }
|
||||
|
||||
vector<LocalSpitObj> ProvidedObj;
|
||||
ProvidedSpitActions[provided.group] = MasterRequest{};
|
||||
ProvidedObj.push_back(LocalSpitObj{.iD = provided.group, .groupName = provided.group, .name = provided.group});
|
||||
ProvidedSpitActions[provided.startShow] = MasterRequest{};
|
||||
ProvidedObj.push_back(LocalSpitObj{.iD = provided.startShow, .groupName = provided.group, .name = provided.startShow});
|
||||
// auto ip = spit::Socket::getAdaptersInfo();
|
||||
// spit::Socket socket(ip);
|
||||
// SClient spitClient(ClientName, ProjectName, socket,
|
||||
// {
|
||||
// .onServerEvent = onServerEvent,
|
||||
// .onConnectionStatus = onConnectionStatus,
|
||||
// .onProjectUpdate = onProjectUpdate,
|
||||
// .onSpitType = onSpitType,
|
||||
// .onSpitObject = onSpitObject,
|
||||
// .onPlay = onPlay,
|
||||
// .onPlaySpitType = onPlaySpitType,
|
||||
// .onPlayRemoteObjectStatus = onPlayRemoteObjectStatus,
|
||||
// .onCheckSpitTypeVeto = onCheckSpitTypeVeto,
|
||||
// .onCheckSpitObjectVeto = onCheckSpitObjectVeto,
|
||||
// });
|
||||
|
||||
ExpectedObjects[expected.showDone] = "";
|
||||
// for (auto& obj : ProvidedObj) {
|
||||
// SType* ptrSPITType1Fix = spitClient.createTypeFixed(obj.iD, obj.groupName, obj.name, 0, 0);
|
||||
// spitClient.setActionType(ptrSPITType1Fix->getID(), true); // should be executed whenever a SPITObject with this SPITType is played
|
||||
// }
|
||||
// spitClient.clientProjectLoaded();
|
||||
// spitClient.startServerAutoDetect();
|
||||
|
||||
auto ip = spit::Socket::getAdaptersInfo();
|
||||
spit::Socket socket(ip);
|
||||
SClient spitClient(ClientName, ProjectName, socket,
|
||||
{
|
||||
.onServerEvent = onServerEvent,
|
||||
.onConnectionStatus = onConnectionStatus,
|
||||
.onProjectUpdate = onProjectUpdate,
|
||||
.onSpitType = onSpitType,
|
||||
.onSpitObject = onSpitObject,
|
||||
.onPlay = onPlay,
|
||||
.onPlaySpitType = onPlaySpitType,
|
||||
.onPlayRemoteObjectStatus = onPlayRemoteObjectStatus,
|
||||
.onCheckSpitTypeVeto = onCheckSpitTypeVeto,
|
||||
.onCheckSpitObjectVeto = onCheckSpitObjectVeto,
|
||||
});
|
||||
// spitProjectFinish.take();
|
||||
// string serverProjectID = spitClient.getServerProjectID();
|
||||
// string serverProjectName = spitClient.getClientProjectName();
|
||||
// int serverFramesPerSecond = spitClient.getServerFramesPerSecond(); // set when the server reports his project, see eventProjectReport
|
||||
// ESP_LOGI(TAG, "eventProjectReport ID: %s Name: %s FramesPerSecond: %d", serverProjectID.data(), serverProjectName.data(), serverFramesPerSecond);
|
||||
|
||||
for (auto& obj : ProvidedObj) {
|
||||
SType* ptrSPITType1Fix = spitClient.createTypeFixed(obj.iD, obj.groupName, obj.name, 0, 0);
|
||||
spitClient.setActionType(ptrSPITType1Fix->getID(), true); // should be executed whenever a SPITObject with this SPITType is played
|
||||
}
|
||||
spitClient.clientProjectLoaded();
|
||||
spitClient.startServerAutoDetect();
|
||||
// for (auto&& obj : ExpectedObjects) {
|
||||
// if (obj.second == "") {
|
||||
// ESP_LOGE(TAG, "No matching Remote ID for %s", obj.first.c_str());
|
||||
// }
|
||||
// }
|
||||
|
||||
spitProjectFinish.take();
|
||||
string serverProjectID = spitClient.getServerProjectID();
|
||||
string serverProjectName = spitClient.getClientProjectName();
|
||||
int serverFramesPerSecond = spitClient.getServerFramesPerSecond(); // set when the server reports his project, see eventProjectReport
|
||||
ESP_LOGI(TAG, "eventProjectReport ID: %s Name: %s FramesPerSecond: %d", serverProjectID.data(), serverProjectName.data(), serverFramesPerSecond);
|
||||
// while (true) {
|
||||
// auto res = responseQueue.dequeue();
|
||||
// if (res->type == ResponseType::StartMoving) {
|
||||
// spitClient.sendRemoteObject(ExpectedObjects[expected.changingPos]);
|
||||
// } else if (res->type == ResponseType::StepAt) {
|
||||
// spitClient.sendRemoteObject(ExpectedObjects[expected.inPosX[res->pos - 1]]);
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
|
||||
for (auto&& obj : ExpectedObjects) {
|
||||
if (obj.second == "") {
|
||||
ESP_LOGE(TAG, "No matching Remote ID for %s", obj.first.c_str());
|
||||
}
|
||||
}
|
||||
// void MqttThread() {
|
||||
// ESP_LOGI(TAG, "Starting MQTT task");
|
||||
|
||||
while (true) {
|
||||
auto res = responseQ.dequeue();
|
||||
spitClient.sendRemoteObject(ExpectedObjects[expected.showDone]);
|
||||
}
|
||||
}
|
||||
// auto& store = NvsApi::getInstance();
|
||||
// auto broker = store.getValue(ConfigKeys.mqttBroker);
|
||||
// if (broker != "") {
|
||||
// ESP_LOGI(TAG, "Initializing MQTT");
|
||||
// auto prefix = store.getValue(ConfigKeys.mqttPrefix);
|
||||
// auto& client = MqttClient::init(broker, prefix);
|
||||
// if (!client.isRunning()) {
|
||||
// client.addSubscription(MqttTopics.moveTo, [](string d) { startShuffle(d); });
|
||||
// client.start();
|
||||
// }
|
||||
|
||||
void MqttThread() {
|
||||
ESP_LOGI(TAG, "Starting MQTT task");
|
||||
|
||||
auto& store = NvsApi::getInstance();
|
||||
auto broker = store.getValue(ConfigKeys.mqttBroker);
|
||||
if (broker != "") {
|
||||
ESP_LOGI(TAG, "Initializing MQTT");
|
||||
auto prefix = store.getValue(ConfigKeys.mqttPrefix);
|
||||
auto& client = MqttClient::init(broker, prefix);
|
||||
if (!client.isRunning()) {
|
||||
client.addSubscription(MqttTopics.startShow, [](string d) {
|
||||
commandQ.enqueue(make_unique<MasterRequest>());
|
||||
});
|
||||
client.start();
|
||||
}
|
||||
|
||||
while (true) {
|
||||
auto res = responseQ.dequeue();
|
||||
client.publish(MqttTopics.showDone, "");
|
||||
}
|
||||
}
|
||||
}
|
||||
// while (true) {
|
||||
// auto res = responseQueue.dequeue();
|
||||
// if (res->type == ResponseType::StartMoving) {
|
||||
// client.publish(MqttTopics.showDone, "");
|
||||
// } else if (res->type == ResponseType::StepAt) {
|
||||
// client.publish(MqttTopics.inPosition, to_string(res->pos));
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
|
||||
void app_main(void) {
|
||||
initialize_ethernet();
|
||||
@@ -584,11 +624,11 @@ void app_main(void) {
|
||||
etherActive.take();
|
||||
ESP_LOGI(TAG, "Start net services");
|
||||
|
||||
static int ipVersion = AF_INET;
|
||||
static fos::TaskT<int> telnetSocket(telnetSocketTask, ipVersion, "tcpServer", 4096);
|
||||
// static int ipVersion = AF_INET;
|
||||
// static fos::TaskT<int> telnetSocket(telnetSocketTask, ipVersion, "tcpServer", 4096);
|
||||
// static fos::Task spit(SpitClientApp, "SpitClient");
|
||||
// static fos::Task mqtt(MqttThread, "MqttEndpoint");
|
||||
static fos::TaskT<int> dmxNode(dmxSocketTask, ipVersion, "dmxNode", 4096);
|
||||
// // static fos::Task mqtt(MqttThread, "MqttEndpoint");
|
||||
// // static Task otaUpdate(SystemFunctions::OtaTaskEntry, "otaTask", 8192);
|
||||
|
||||
auto& store = NvsApi::getInstance();
|
||||
auto logger = store.getValue(ConfigKeys.syslogDest);
|
||||
@@ -598,12 +638,9 @@ void app_main(void) {
|
||||
|
||||
ESP_LOGI(TAG, "Configuration");
|
||||
ESP_LOGI(TAG, "%s: %s", ConfigKeys.syslogDest, store.getValue(ConfigKeys.syslogDest).c_str());
|
||||
// ESP_LOGI(TAG, "%s: %s", ConfigKeys.mqttBroker, store.getValue(ConfigKeys.mqttBroker).c_str());
|
||||
// ESP_LOGI(TAG, "%s: %s", ConfigKeys.mqttPrefix, store.getValue(ConfigKeys.mqttPrefix).c_str());
|
||||
// ESP_LOGI(TAG, "%s: %s", ConfigKeys.spitServer, store.getValue(ConfigKeys.spitServer).c_str());
|
||||
|
||||
ESP_LOGI(TAG, "## Starting : %s : %s",
|
||||
CONFIG_LWIP_LOCAL_HOSTNAME, VERSION);
|
||||
ESP_LOGI(TAG, "%s: %s", ConfigKeys.mqttBroker, store.getValue(ConfigKeys.mqttBroker).c_str());
|
||||
ESP_LOGI(TAG, "%s: %s", ConfigKeys.mqttPrefix, store.getValue(ConfigKeys.mqttPrefix).c_str());
|
||||
ESP_LOGI(TAG, "%s: %s", ConfigKeys.spitServer, store.getValue(ConfigKeys.spitServer).c_str());
|
||||
|
||||
while (true) {
|
||||
fos::Task::delayMs(5000);
|
||||
|
||||
@@ -1,8 +0,0 @@
|
||||
# Name, Type, SubType, Offset, Size, Flags
|
||||
# Note: if you have increased the bootloader size, make sure to update the offsets to avoid overlap
|
||||
nvs, data, nvs, , 0x4000,
|
||||
otadata, data, ota, , 0x2000,
|
||||
phy_init, data, phy, , 0x1000,
|
||||
ota_0, app, ota_0, , 1536K,
|
||||
ota_1, app, ota_1, , 1536K,
|
||||
spiffs, data, spiffs, , 936K,
|
||||
|
@@ -373,14 +373,14 @@ CONFIG_ESPTOOLPY_FLASHFREQ_40M=y
|
||||
# CONFIG_ESPTOOLPY_FLASHFREQ_20M is not set
|
||||
CONFIG_ESPTOOLPY_FLASHFREQ="40m"
|
||||
# CONFIG_ESPTOOLPY_FLASHSIZE_1MB is not set
|
||||
# CONFIG_ESPTOOLPY_FLASHSIZE_2MB is not set
|
||||
CONFIG_ESPTOOLPY_FLASHSIZE_4MB=y
|
||||
CONFIG_ESPTOOLPY_FLASHSIZE_2MB=y
|
||||
# CONFIG_ESPTOOLPY_FLASHSIZE_4MB is not set
|
||||
# CONFIG_ESPTOOLPY_FLASHSIZE_8MB is not set
|
||||
# CONFIG_ESPTOOLPY_FLASHSIZE_16MB is not set
|
||||
# CONFIG_ESPTOOLPY_FLASHSIZE_32MB is not set
|
||||
# CONFIG_ESPTOOLPY_FLASHSIZE_64MB is not set
|
||||
# CONFIG_ESPTOOLPY_FLASHSIZE_128MB is not set
|
||||
CONFIG_ESPTOOLPY_FLASHSIZE="4MB"
|
||||
CONFIG_ESPTOOLPY_FLASHSIZE="2MB"
|
||||
# CONFIG_ESPTOOLPY_HEADER_FLASHSIZE_UPDATE is not set
|
||||
CONFIG_ESPTOOLPY_BEFORE_RESET=y
|
||||
# CONFIG_ESPTOOLPY_BEFORE_NORESET is not set
|
||||
@@ -394,17 +394,26 @@ CONFIG_ESPTOOLPY_MONITOR_BAUD=115200
|
||||
#
|
||||
# Partition Table
|
||||
#
|
||||
# CONFIG_PARTITION_TABLE_SINGLE_APP is not set
|
||||
CONFIG_PARTITION_TABLE_SINGLE_APP=y
|
||||
# CONFIG_PARTITION_TABLE_SINGLE_APP_LARGE is not set
|
||||
# CONFIG_PARTITION_TABLE_TWO_OTA is not set
|
||||
# CONFIG_PARTITION_TABLE_TWO_OTA_LARGE is not set
|
||||
CONFIG_PARTITION_TABLE_CUSTOM=y
|
||||
# CONFIG_PARTITION_TABLE_CUSTOM is not set
|
||||
CONFIG_PARTITION_TABLE_CUSTOM_FILENAME="partitions.csv"
|
||||
CONFIG_PARTITION_TABLE_FILENAME="partitions.csv"
|
||||
CONFIG_PARTITION_TABLE_FILENAME="partitions_singleapp.csv"
|
||||
CONFIG_PARTITION_TABLE_OFFSET=0x8000
|
||||
CONFIG_PARTITION_TABLE_MD5=y
|
||||
# end of Partition Table
|
||||
|
||||
#
|
||||
# Example Configuration
|
||||
#
|
||||
CONFIG_DEVICE_WIFI_SSID="eth2ap"
|
||||
CONFIG_DEVICE_WIFI_PASSWORD="12345678"
|
||||
CONFIG_DEVICE_WIFI_CHANNEL=1
|
||||
CONFIG_DEVICE_MAX_STA_CONN=4
|
||||
# end of Example Configuration
|
||||
|
||||
#
|
||||
# Example Ethernet Configuration
|
||||
#
|
||||
@@ -829,7 +838,7 @@ CONFIG_HTTPD_SERVER_EVENT_POST_TIMEOUT=2000
|
||||
# ESP HTTPS OTA
|
||||
#
|
||||
# CONFIG_ESP_HTTPS_OTA_DECRYPT_CB is not set
|
||||
CONFIG_ESP_HTTPS_OTA_ALLOW_HTTP=y
|
||||
# CONFIG_ESP_HTTPS_OTA_ALLOW_HTTP is not set
|
||||
CONFIG_ESP_HTTPS_OTA_EVENT_POST_TIMEOUT=2000
|
||||
# end of ESP HTTPS OTA
|
||||
|
||||
@@ -2018,6 +2027,17 @@ CONFIG_LITTLEFS_MALLOC_STRATEGY_DEFAULT=y
|
||||
# CONFIG_LITTLEFS_MALLOC_STRATEGY_INTERNAL is not set
|
||||
CONFIG_LITTLEFS_ASSERTS=y
|
||||
# end of LittleFS
|
||||
|
||||
#
|
||||
# Telnet Server
|
||||
#
|
||||
CONFIG_TELNET_SERVER_DEFAULT_PORT=23
|
||||
CONFIG_TELNET_SERVER_MAX_CONNECTIONS=5
|
||||
CONFIG_TELNET_SERVER_STACK_SIZE=4096
|
||||
CONFIG_TELNET_SERVER_TASK_PRIORITY=24
|
||||
CONFIG_TELNET_SERVER_TASK_CORE=0
|
||||
CONFIG_TELNET_SERVER_REDIRECT_LOGS=0
|
||||
# end of Telnet Server
|
||||
# end of Component config
|
||||
|
||||
# CONFIG_IDF_EXPERIMENTAL_FEATURES is not set
|
||||
@@ -2068,7 +2088,7 @@ CONFIG_POST_EVENTS_FROM_ISR=y
|
||||
CONFIG_POST_EVENTS_FROM_IRAM_ISR=y
|
||||
CONFIG_GDBSTUB_SUPPORT_TASKS=y
|
||||
CONFIG_GDBSTUB_MAX_TASKS=32
|
||||
CONFIG_OTA_ALLOW_HTTP=y
|
||||
# CONFIG_OTA_ALLOW_HTTP is not set
|
||||
# CONFIG_TWO_UNIVERSAL_MAC_ADDRESS is not set
|
||||
CONFIG_FOUR_UNIVERSAL_MAC_ADDRESS=y
|
||||
CONFIG_NUMBER_OF_UNIVERSAL_MAC_ADDRESS=4
|
||||
|
||||
@@ -23,15 +23,3 @@ CONFIG_ETH_MDC_GPIO=23
|
||||
CONFIG_ETH_MDIO_GPIO=33
|
||||
CONFIG_ETH_PHY_RST_GPIO=5
|
||||
CONFIG_ETH_PHY_ADDR=1
|
||||
|
||||
#
|
||||
# OTA over plain HTTP (no TLS server in use yet)
|
||||
#
|
||||
CONFIG_ESP_HTTPS_OTA_ALLOW_HTTP=y
|
||||
|
||||
# Enable filesystem
|
||||
CONFIG_ESPTOOLPY_FLASHSIZE_4MB=y
|
||||
CONFIG_PARTITION_TABLE_CUSTOM=y
|
||||
CONFIG_PARTITION_TABLE_CUSTOM_FILENAME="partitions.csv"
|
||||
CONFIG_PARTITION_TABLE_FILENAME="partitions.csv"
|
||||
|
||||
|
||||
@@ -2,6 +2,8 @@
|
||||
* @file watchMain.cpp
|
||||
* @author Gustice
|
||||
* @brief ChaosWatch Application
|
||||
*
|
||||
* @copyright Copyright (c) 2024
|
||||
*/
|
||||
|
||||
/// NOTE: Create IDF shell navigate to directory ("test/integration")
|
||||
|
||||
@@ -2,6 +2,8 @@
|
||||
* @file unitTest.cpp
|
||||
* @author Gustice
|
||||
* @brief Unit/Integration-Test frame for hardware bound components
|
||||
*
|
||||
* @copyright Copyright (c) 2024
|
||||
*/
|
||||
|
||||
#include "unity.h"
|
||||
|
||||
Reference in New Issue
Block a user