Compare commits
18 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 2397789047 | |||
| 858b7d81cc | |||
| b4277e9261 | |||
| d1f582e6ba | |||
| 407c155c4d | |||
| 3231120a1e | |||
| 47694df8a3 | |||
| f891f317fb | |||
| a3e487f2f1 | |||
| 16e7ba13f8 | |||
| 74f1c31193 | |||
| 1208bee756 | |||
| decaf80d1f | |||
| 5ca595eddc | |||
| 4106bcc67c | |||
| d607cd867a | |||
| f06cf9c3b1 | |||
| 2f5497c432 |
Vendored
+2
-1
@@ -15,5 +15,6 @@
|
|||||||
"idf.toolsPathWin": "C:\\Tools\\ESP",
|
"idf.toolsPathWin": "C:\\Tools\\ESP",
|
||||||
"idf.flashType": "UART",
|
"idf.flashType": "UART",
|
||||||
"C_Cpp.autoAddFileAssociations": false,
|
"C_Cpp.autoAddFileAssociations": false,
|
||||||
"project.deviceIp": "172.16.17.56"
|
"project.deviceIp": "172.16.17.56",
|
||||||
|
"sonarlint.pathToCompileCommands": "${workspaceFolder}\\build\\compile_commands.json",
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,11 @@
|
|||||||
|
# SPIT
|
||||||
|
|
||||||
|
Original implementation from Hag seem to be not suited for Embedded devices.
|
||||||
|
|
||||||
|
- Supports IPv4 only
|
||||||
|
- Reduced Threads to a minimum
|
||||||
|
- Then reduced usage of Mutexes to a minimum
|
||||||
|
- Reduced Sockets to a minimum
|
||||||
|
- Introduced containers and removed plain new and delete
|
||||||
|
- Removed UUID-Generation because SPIT-Types never change on embedded devices
|
||||||
|
- Callbacks instead of interfaces where suitable
|
||||||
Binary file not shown.
@@ -1,37 +0,0 @@
|
|||||||
#pragma once
|
|
||||||
|
|
||||||
#include <string>
|
|
||||||
using namespace std;
|
|
||||||
|
|
||||||
class I_SAD_Client {
|
|
||||||
public:
|
|
||||||
/**
|
|
||||||
* If a new server was found by the ServerAutoDetect mechanism, this function is called.<br>
|
|
||||||
* To do so the SAD_Client ServerAutoDetect has to be startet - see SAD_Client::startServerAutoDetect.<br>
|
|
||||||
* If a server can be reached via several IP addresses, the IP address is selected according to the following preference:<br>
|
|
||||||
* 1.) If a loopback address is available, it is used.<br>
|
|
||||||
* 2.) If an IP4 address is available, it is used.<br>
|
|
||||||
* 3.) In the other cases the IP6 address is used.<br>
|
|
||||||
* @param p_ID the id of the server (every started server should generate an id)
|
|
||||||
* @param p_Name the name of the SPIT server
|
|
||||||
* @param p_ComputerName the Hostname of the cpmputer on which the SPIT server is running
|
|
||||||
* @param p_IP the selected ip address of the SPIT server
|
|
||||||
* @param p_Port the port of the SPIT server
|
|
||||||
* @param p_Addition sometimes server may have additional informations
|
|
||||||
* @param p_IsIP4 the server ip is a ip4 address
|
|
||||||
*/
|
|
||||||
virtual void eventServerDetected(string p_ID, string p_Name, string p_ComputerName, string p_IP, string p_Port, string p_Addition, string p_ProjectName, string p_ClientIP, bool p_IsIP4) = 0;
|
|
||||||
/**
|
|
||||||
* If a SPITServer is not more found, this function is called.
|
|
||||||
* To do so the SAD_Client ServerAutoDetect has to be startet - see SAD_Client::startServerAutoDetect.<br>
|
|
||||||
* @param p_ID the id of the server (every started server should generate an id)
|
|
||||||
* @param p_Name the name of the SPIT server
|
|
||||||
* @param p_ComputerName the Hostname of the cpmputer on which the SPIT server is running
|
|
||||||
* @param p_IP the selected ip address of the SPIT server
|
|
||||||
* @param p_Port the port of the SPIT server
|
|
||||||
* @param p_Addition sometimes server may have additional informations
|
|
||||||
* @param p_IsIP4 the server ip is a ip4 address
|
|
||||||
*/
|
|
||||||
virtual void eventServerLost(string p_ID, string p_Name, string p_ComputerName, string p_IP, string p_Port, string p_Addition, string p_ProjectName, string p_ClientIP, bool p_IsIP4) = 0;
|
|
||||||
virtual void eventServerChanged(string p_ID, string p_Name, string p_ComputerName, string p_IP, string p_Port, string p_Addition, string p_ProjectName, string p_ClientIP, bool p_IsIP4) = 0;
|
|
||||||
};
|
|
||||||
@@ -1,85 +0,0 @@
|
|||||||
/*
|
|
||||||
* To change this license header, choose License Headers in Project Properties.
|
|
||||||
* To change this template file, choose Tools | Templates
|
|
||||||
* and open the template in the editor.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* File: MySPITApp.h
|
|
||||||
* Author: Hagi
|
|
||||||
*
|
|
||||||
* Created on 17. April 2019, 18:24
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef MYSPITAPP_H
|
|
||||||
#define MYSPITAPP_H
|
|
||||||
|
|
||||||
#include "SPIT_Client.h"
|
|
||||||
#include <chrono>
|
|
||||||
#include <string>
|
|
||||||
#include "SPITType.h"
|
|
||||||
#include "SPITObject.h"
|
|
||||||
#include "SPITPlayer.h"
|
|
||||||
#include "SAD_DetectedServer.hpp"
|
|
||||||
|
|
||||||
using namespace std;
|
|
||||||
|
|
||||||
class MyApp {
|
|
||||||
public:
|
|
||||||
MyApp();
|
|
||||||
// Client's infos is set by the client
|
|
||||||
static string s_ClientName;
|
|
||||||
static string s_ProjectName;
|
|
||||||
void init();
|
|
||||||
|
|
||||||
private:
|
|
||||||
SPIT_Client _SpitClient; // pointer to an instance of the SPIT_Client, which do the main work for you
|
|
||||||
|
|
||||||
// Server's project infos filled by eventProjectReport
|
|
||||||
static string m_ServerProjectID;
|
|
||||||
static string m_ServerProjectName;
|
|
||||||
static int m_ServerFramesPerSecond; // set when the server reports his project, see eventProjectReport
|
|
||||||
// liveSHOWsoftware will use 44100 frames per second as time resolution
|
|
||||||
// All times are given in frames,
|
|
||||||
|
|
||||||
public:
|
|
||||||
static void onServerEvent(SPIT_Client::ServerEvent event, const SAD_DetectedServer &p_DetectedServer);
|
|
||||||
static void onConnectionStatus(string p_ServerID, string p_ServerComputerName, string p_ServerName, int p_ServerStepTime, int p_ConnectionStatus, int p_OldConnectionStatus);
|
|
||||||
|
|
||||||
//----- Project -----
|
|
||||||
static void onStartProjectTransfer();
|
|
||||||
static void onEndProjectTransfer();
|
|
||||||
static void onProjectReport(string p_ProjectID, string p_ProjectName, int p_FramesPerSeoond);
|
|
||||||
static void onProjectClosed(string p_ProjectID);
|
|
||||||
|
|
||||||
//----- SPITType -----
|
|
||||||
static bool onCheckSpitTypeVeto(SPIT_Message::ReportSPITType* p_ReportSPITType);
|
|
||||||
static void onSpitType(bool p_New, const SPITType &p_SPITType);
|
|
||||||
static void onSpitTypeRemote(bool p_New, const SPITType &p_SPITType);
|
|
||||||
static void onSpitTypeRemoved(const SPITType &p_SPITType);
|
|
||||||
static void onSpitTypeRemoteRemoved(const SPITType &p_SPITType);
|
|
||||||
|
|
||||||
//----- SPITObject -----
|
|
||||||
static bool onCheckSpitObjectVeto(SPIT_Message::ReportSPITObject* p_ReportSPITObject);
|
|
||||||
static void onSpitObject(bool p_New, const SPITType &p_SPITType, const SPITObject &p_SPITObject);
|
|
||||||
static void onSpitObjectRemote(bool p_New, const SPITType &p_SPITType, const SPITObject &p_SPITObject);
|
|
||||||
static void onSpitObjectRemoved(const SPITType &p_SPITType, const SPITObject &p_SPITObject);
|
|
||||||
static void onSpitObjectRemoteRemoved(const SPITType &p_SPITType, const SPITObject &p_SPITObject);
|
|
||||||
|
|
||||||
//----- Play SPITObjects -----
|
|
||||||
static void onPlay(string p_PlayerID, string p_PlayerName, char p_PlayerType, bool p_PlayerIsRunning, long long p_TimeFrames);
|
|
||||||
static void onPlaySpitType(string p_PlayerID, string p_SPITTypeID, bool p_PlayerIsRunning, bool p_Started, bool p_Ended, double p_Value);
|
|
||||||
|
|
||||||
//----- Server changes status of one of his REMOTE SPITObjects -----
|
|
||||||
// REMOTE only Server->Client RemoteObject's play status
|
|
||||||
static void onPlayRemoteObjectStatus(const SPITType &p_SPITType, const SPITObject &p_SPITObject, long long p_FrameInsideObject, int p_Value);
|
|
||||||
|
|
||||||
void sendRemoteObject(string p_SPITObjectID, int p_Valueppm = 0, char p_ValueFlag = 0x00);
|
|
||||||
//-----
|
|
||||||
void testLiveShowRemote();
|
|
||||||
|
|
||||||
//------ User's options normally should not be used, the server is master of things ------
|
|
||||||
public:
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif /* MYSPITAPP_H */
|
|
||||||
@@ -1,117 +1,142 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include "I_SAD_Client.hpp"
|
#include <list>
|
||||||
|
#include <memory>
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <unordered_map>
|
#include <unordered_map>
|
||||||
#include <list>
|
|
||||||
|
|
||||||
using namespace std;
|
using namespace std;
|
||||||
|
|
||||||
class SAD_DetectedServer {
|
class SAD_DetectedServer;
|
||||||
|
class I_SAD_Client {
|
||||||
public:
|
public:
|
||||||
SAD_DetectedServer();
|
virtual void eventServerDetected(SAD_DetectedServer &server) = 0;
|
||||||
SAD_DetectedServer(const SAD_DetectedServer& orig) {
|
virtual void eventServerChanged(SAD_DetectedServer &server) = 0;
|
||||||
m_ID = orig.getID();
|
virtual void eventServerLost(SAD_DetectedServer &server) = 0;
|
||||||
m_Name = orig.getName();
|
};
|
||||||
m_ComputerName = orig.getComputerName();
|
|
||||||
m_IP = orig.getIP();
|
class SAD_DetectedServer {
|
||||||
m_IPIsIP4 = orig.getIpIsIP4();
|
public:
|
||||||
m_ClientIP = orig.getClientIP();
|
SAD_DetectedServer(string p_Name, string p_ID, string p_ComputerName,
|
||||||
m_Port = orig.getPort();
|
string p_IP, string p_Port, string p_ClientIP,
|
||||||
m_Additions = orig.getAdditions();
|
string p_Additions, string projName)
|
||||||
|
: m_Name(p_Name),
|
||||||
|
m_ID(p_ID),
|
||||||
|
m_ComputerName(p_ComputerName),
|
||||||
|
m_IP(p_IP),
|
||||||
|
m_Port(p_Port),
|
||||||
|
m_ClientIP(p_ClientIP),
|
||||||
|
m_Additions(p_Additions),
|
||||||
|
m_ServerProjectName(projName) {
|
||||||
}
|
}
|
||||||
~SAD_DetectedServer();
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
string m_ID;
|
string m_Name{};
|
||||||
string m_Name;
|
string m_ID{};
|
||||||
string m_ComputerName;
|
string m_ComputerName{};
|
||||||
string m_IP;
|
string m_IP{};
|
||||||
bool m_IPIsIP4;
|
string m_Port{};
|
||||||
string m_ClientIP;
|
string m_ClientIP{};
|
||||||
string m_Port;
|
string m_Additions{};
|
||||||
string m_Additions;
|
string m_ServerProjectName{};
|
||||||
string m_ServerProjectName;
|
bool m_New{true};
|
||||||
bool m_New;
|
bool m_Changed{};
|
||||||
bool m_Changed;
|
bool m_FoundAgain{};
|
||||||
bool m_FoundAgain;
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
string getID() const { return m_ID; }
|
string getID() const { return m_ID; }
|
||||||
string getName() const { return m_Name; }
|
string getName() const { return m_Name; }
|
||||||
string getComputerName() const { return m_ComputerName; }
|
string getComputerName() const { return m_ComputerName; }
|
||||||
string getIP() const { return m_IP; }
|
string getIP() const { return m_IP; }
|
||||||
bool getIpIsIP4() const { return m_IPIsIP4; }
|
|
||||||
string getPort() const { return m_Port; }
|
string getPort() const { return m_Port; }
|
||||||
string getClientIP() const { return m_ClientIP; }
|
string getClientIP() const { return m_ClientIP; }
|
||||||
string getAdditions() const { return m_Additions; }
|
string getAdditions() const { return m_Additions; }
|
||||||
string getProjectName() const { return m_ServerProjectName; }
|
string getProjectName() const { return m_ServerProjectName; }
|
||||||
private:
|
|
||||||
void setID(string p_ID) { m_ID = p_ID; }
|
|
||||||
void setName(string p_Name) { m_Name = p_Name; }
|
|
||||||
void setComputerName(string p_ComputerName) { m_ComputerName = p_ComputerName; }
|
|
||||||
void setIP(string p_IP) { m_IP = p_IP; }
|
|
||||||
void setClientIP(string p_IP) { m_ClientIP = p_IP; }
|
|
||||||
void setPort(string p_Port) { m_Port = p_Port; }
|
|
||||||
void setAdditions(string p_Additions) { m_Additions = p_Additions;}
|
|
||||||
void setProjectName(string p_ServerProjectName);
|
|
||||||
|
|
||||||
void setIPIsIP4(bool p_IsIP4) { m_IPIsIP4 = p_IsIP4; }
|
|
||||||
bool getNew() const { return m_New; }
|
bool getNew() const { return m_New; }
|
||||||
bool getChanged() const { return m_Changed; }
|
bool getChanged() const { return m_Changed; }
|
||||||
bool getFoundAgain() const { return m_FoundAgain; }
|
bool getFoundAgain() const { return m_FoundAgain; }
|
||||||
|
|
||||||
void setChanged() { m_Changed = true; }
|
void setChanged() { m_Changed = true; }
|
||||||
void setNew(bool p_New) { m_New = p_New; }
|
void setKnown() { m_New = false; }
|
||||||
void setFoundAgain() { m_FoundAgain = true; }
|
void setFoundAgain() { m_FoundAgain = true; }
|
||||||
|
void updateProjectName(string newProjectName) {
|
||||||
|
m_ServerProjectName = newProjectName;
|
||||||
|
if (m_ServerProjectName != newProjectName) {
|
||||||
|
m_Changed = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// SAD_Client m_ThreadSend will send to Multicast addresses
|
// SAD_Client m_ThreadSend will send to Multicast addresses
|
||||||
void startCycleSAD() {
|
void resetFlags() {
|
||||||
m_IPIsIP4 = false;
|
|
||||||
m_Changed = false;
|
m_Changed = false;
|
||||||
m_FoundAgain = false;
|
m_FoundAgain = false;
|
||||||
m_New = false;
|
m_New = false;
|
||||||
}
|
}
|
||||||
//SAD_Client m_Thread_Send has paused in the meantime m_ThreadReceive may received messages from servers
|
|
||||||
void endCycleSAD() { }
|
|
||||||
private:
|
private:
|
||||||
static unordered_map<string, SAD_DetectedServer*> s_DetectedServers;
|
static unordered_map<string, unique_ptr<SAD_DetectedServer>> sKnownServers;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
static const int PARAMINDEX_PRECODE = 0;
|
static constexpr int PARAMINDEX_PRECODE = 0;
|
||||||
static const int PARAMINDEX_SPITTASKID = 1;
|
static constexpr int PARAMINDEX_SPITTASKID = 1;
|
||||||
static const int PARAMINDEX_NAME = 2;
|
static constexpr int PARAMINDEX_NAME = 2;
|
||||||
static const int PARAMINDEX_ID = 3;
|
static constexpr int PARAMINDEX_ID = 3;
|
||||||
static const int PARAMINDEX_COMPUTERNAME = 4;
|
static constexpr int PARAMINDEX_COMPUTERNAME = 4;
|
||||||
static const int PARAMINDEX_PORT = 5;
|
static constexpr int PARAMINDEX_PORT = 5;
|
||||||
static const int PARAMINDEX_CLIENTIP = 6;
|
static constexpr int PARAMINDEX_CLIENTIP = 6;
|
||||||
static const int PARAMINDEX_ADDITIONS = 7;
|
static constexpr int PARAMINDEX_ADDITIONS = 7;
|
||||||
static const int PARAMINDEX_SERVERPROJECTNAME = 8;
|
static constexpr int PARAMINDEX_SERVERPROJECTNAME = 8;
|
||||||
static const int PARAMINDEX_IP = 9;
|
static constexpr int PARAMINDEX_IP = 9;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Used by SAD_Client to add a found SPITServer - don't use this manually
|
* Used by SAD_Client to add a found SPITServer - don't use this manually
|
||||||
* @param p_IsIP4 true = the server is reached via a IP4 address<br>false = the server is reahed via a IP6 address
|
* @param id the id of the server, every instance of a SPITServer has an own id
|
||||||
* @param p_ServerID the id of the server, every instance of a SPITServer has an own id
|
|
||||||
* @param p_ServerParams the server's parameter
|
* @param p_ServerParams the server's parameter
|
||||||
*/
|
*/
|
||||||
static void addDetectedServer(bool p_IsIP4, string p_ServerID, string p_ServerParams[]);
|
static void addDetectedServer(unique_ptr<SAD_DetectedServer> detected) {
|
||||||
/**
|
if (auto i = sKnownServers.find(detected->getID()); i != sKnownServers.end()) {
|
||||||
* Used by SAD_Client to remove a SPITServer - don't use this manually
|
auto &known = *(i->second.get());
|
||||||
* @param p_DetectedServer
|
known.setFoundAgain();
|
||||||
*/
|
if (detected->getProjectName() != known.getProjectName()) {
|
||||||
static void removeDetectedServer(SAD_DetectedServer* p_DetectedServer);
|
known.updateProjectName(detected->getProjectName());
|
||||||
/**
|
}
|
||||||
* Used by SAD_Client to clear all found SPITServers - don't use this manually
|
return;
|
||||||
*/
|
}
|
||||||
static void clearDetectedServers();
|
sKnownServers[detected->getID()] = move(detected);
|
||||||
/**
|
}
|
||||||
* Used by SAD_Client internally - don't use this manually
|
static void removeDetectedServer(SAD_DetectedServer &server) {
|
||||||
*/
|
auto i = sKnownServers.find(server.getID());
|
||||||
static void cycleStart();
|
if (i != sKnownServers.end()) {
|
||||||
|
sKnownServers.erase(i);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
static void clearDetectedServers() {
|
||||||
|
sKnownServers.clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
static void resetServerFlags() {
|
||||||
|
for (auto &srv : sKnownServers) {
|
||||||
|
srv.second->resetFlags();
|
||||||
|
}
|
||||||
|
}
|
||||||
/**
|
/**
|
||||||
* Used by SAD_Client internally -don't use this manually
|
* Used by SAD_Client internally -don't use this manually
|
||||||
* @param p_SADClientInterface
|
* @param p_SADClientInterface
|
||||||
*/
|
*/
|
||||||
static void cycleEnd(I_SAD_Client& p_SADClientInterface);
|
static void evaluateDetectedServers(I_SAD_Client &sadClient) {
|
||||||
|
for (auto &srv : sKnownServers) {
|
||||||
|
SAD_DetectedServer &known = *srv.second;
|
||||||
|
if (known.getNew()) {
|
||||||
|
known.setKnown();
|
||||||
|
sadClient.eventServerDetected(known);
|
||||||
|
} else if (known.getChanged()) {
|
||||||
|
sadClient.eventServerChanged(known);
|
||||||
|
} else if (known.getFoundAgain() == false) {
|
||||||
|
sadClient.eventServerLost(known);
|
||||||
|
removeDetectedServer(known);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns a reference of the DetectedServer with the id p_ServerID.<br>
|
* Returns a reference of the DetectedServer with the id p_ServerID.<br>
|
||||||
@@ -119,20 +144,7 @@ public:
|
|||||||
* @param p_ServerID the id of the SPITServer
|
* @param p_ServerID the id of the SPITServer
|
||||||
* @return the reference of the SAD_DetectedServer instance with getID() == p_ServerID
|
* @return the reference of the SAD_DetectedServer instance with getID() == p_ServerID
|
||||||
*/
|
*/
|
||||||
static const SAD_DetectedServer& getRefDetectedServer(string p_ServerID) {
|
static const SAD_DetectedServer &getRefDetectedServer(const string &id) {
|
||||||
SAD_DetectedServer* ptrDetectedServer = NULL;
|
return *sKnownServers.at(id);
|
||||||
{
|
|
||||||
auto i = s_DetectedServers.find(p_ServerID);
|
|
||||||
if (i != s_DetectedServers.end()) {
|
|
||||||
ptrDetectedServer = i->second;
|
|
||||||
}
|
}
|
||||||
if (ptrDetectedServer != NULL) {
|
|
||||||
return *ptrDetectedServer;
|
|
||||||
}
|
|
||||||
|
|
||||||
throw new exception();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -14,77 +14,49 @@
|
|||||||
#ifndef SPITOBJECT_H
|
#ifndef SPITOBJECT_H
|
||||||
#define SPITOBJECT_H
|
#define SPITOBJECT_H
|
||||||
|
|
||||||
#include "SPIT_Message.h"
|
|
||||||
#include "SPITType.h"
|
#include "SPITType.h"
|
||||||
#include <string>
|
#include "SPIT_Message.h"
|
||||||
#include <unordered_map>
|
#include "SpitRepo.hpp"
|
||||||
|
|
||||||
using namespace std;
|
using namespace std;
|
||||||
|
|
||||||
class SPITObjectListener;
|
class SPITObjectListener;
|
||||||
|
|
||||||
class SPITObject {
|
class SPITObject {
|
||||||
private:
|
|
||||||
|
|
||||||
static unordered_map<string, SPITObject*> s_SPITObjects;
|
|
||||||
static unordered_map<string, SPITObject*> s_SPITObjectsRemote;
|
|
||||||
public:
|
public:
|
||||||
static SPITObject* getSPITObject(string p_ID);
|
static void clearUnconfirmedSPITObjects(SpitRepo<SPITObject> &repo);
|
||||||
static const SPITObject& getSPITObjectRef(string p_ID);
|
static void setConfirmedFalse(SpitRepo<SPITObject> &repo);
|
||||||
static bool addSPITObject(SPITObject* p_ptrSpitObject);
|
static void eventProjectClosed(SpitRepo<SPITObject> &repo, SpitRepo<SPITObject> &remoteRepo);
|
||||||
static bool removeSPITObject(SPITObject* p_ptrSpitObject);
|
|
||||||
static bool removeSPITObject(string p_SpitObjectID);
|
|
||||||
static int getSPITObjectCount();
|
|
||||||
static SPITObject* getSPITObject(int p_Index);
|
|
||||||
static const SPITObject& getSPITObjectRef(int p_Index);
|
|
||||||
static void clearSPITObjects();
|
|
||||||
static void clearUnconfirmedSPITObjects();
|
|
||||||
static void setConfirmedFalse();
|
|
||||||
|
|
||||||
static SPITObject* getSPITObjectRemote(string p_ID);
|
SPITObject(string p_ID);
|
||||||
static const SPITObject& getSPITObjectRemoteRef(string p_ID);
|
|
||||||
static bool addSPITObjectRemote(SPITObject* p_ptrSpitObject);
|
|
||||||
static bool removeSPITObjectRemote(SPITObject* p_ptrSpitObject);
|
|
||||||
static bool removeSPITObjectRemote(string p_SpitObjectID);
|
|
||||||
static int getSPITObjectRemoteCount();
|
|
||||||
static SPITObject* getSPITObjectRemote(int p_Index);
|
|
||||||
static const SPITObject& getSPITObjectRemoteRef(int p_Index);
|
|
||||||
static void clearSPITObjectsRemote();
|
|
||||||
|
|
||||||
static void eventProjectClosed();
|
|
||||||
|
|
||||||
SPITObject();
|
|
||||||
// SPITObject(const SPITObject& orig);
|
|
||||||
~SPITObject();
|
|
||||||
private:
|
private:
|
||||||
string m_ID;
|
string m_ID;
|
||||||
string m_Name;
|
string m_Name{};
|
||||||
string m_SPITTypeID;
|
string m_SPITTypeID{};
|
||||||
string m_ServerParams;
|
string m_ServerParams{};
|
||||||
string m_Remark;
|
string m_Remark{};
|
||||||
bool m_Confirmed;
|
bool m_Confirmed{};
|
||||||
bool m_Fixed;
|
bool m_Fixed{};
|
||||||
bool m_CreatedByClient;
|
bool m_CreatedByClient{};
|
||||||
bool m_ServerRemote;
|
bool m_ServerRemote{};
|
||||||
bool m_ActionAssigned;
|
bool m_ActionAssigned{};
|
||||||
bool m_ActionAssignedType; //Virtual construct
|
bool m_ActionAssignedType{}; // Virtual construct
|
||||||
long long m_FrameStart;
|
long long m_FrameStart{};
|
||||||
long long m_FrameLength;
|
long long m_FrameLength{};
|
||||||
long long m_FrameFadeInLength;
|
long long m_FrameFadeInLength{};
|
||||||
long long m_FrameFadeOutLength;
|
long long m_FrameFadeOutLength{};
|
||||||
char m_ValueUse;
|
char m_ValueUse{0x01};
|
||||||
int m_ValueFactor;
|
int m_ValueFactor{1000000}; // Values are given in ppm -> 1000000 = 1/1;
|
||||||
int m_Track;
|
int m_Track{};
|
||||||
long long m_Delay;
|
long long m_Delay{};
|
||||||
long long m_Duration;
|
long long m_Duration{};
|
||||||
|
|
||||||
bool m_PlayPrePosition;
|
bool m_PlayPrePosition;
|
||||||
long long m_PlayTimeInsideFrames;
|
long long m_PlayTimeInsideFrames;
|
||||||
int m_PlayValue;
|
int m_PlayValue;
|
||||||
char m_PlayValueFlag;
|
char m_PlayValueFlag;
|
||||||
|
|
||||||
|
|
||||||
void initMembers();
|
|
||||||
public:
|
public:
|
||||||
string getID() const { return m_ID; }
|
string getID() const { return m_ID; }
|
||||||
string getName() const { return m_Name; }
|
string getName() const { return m_Name; }
|
||||||
@@ -94,7 +66,7 @@ public:
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns if the SPITType triggers an action on the Server or on the client.
|
* Returns if the SPITType triggers an action on the Server or on the client.
|
||||||
* @return false = the action is triggered on the client The client waits for the server to play objects of this SPITType<br>
|
* @return false = the action is triggered on the client The client waits for the server to play objects of this SPITType
|
||||||
* true = the action is triggered on the server. The server waits for the client to play objects of this SPITType.
|
* true = the action is triggered on the server. The server waits for the client to play objects of this SPITType.
|
||||||
*/
|
*/
|
||||||
bool getServerRemote() const { return m_ServerRemote; }
|
bool getServerRemote() const { return m_ServerRemote; }
|
||||||
@@ -105,16 +77,16 @@ public:
|
|||||||
*/
|
*/
|
||||||
bool getConfirmed() const { return m_Confirmed; }
|
bool getConfirmed() const { return m_Confirmed; }
|
||||||
bool getFixed() const { return m_Fixed; }
|
bool getFixed() const { return m_Fixed; }
|
||||||
bool getCreatedByClient() { return m_CreatedByClient; }
|
bool getCreatedByClient() const { return m_CreatedByClient; }
|
||||||
/**
|
/**
|
||||||
* This is a virtual construct - ActionAssignedType is not implemented in the SPITProtocol.<br>
|
* This is a virtual construct - ActionAssignedType is not implemented in the SPITProtocol.
|
||||||
* This is used when an action is associated with a SPITType. <br>
|
* This is used when an action is associated with a SPITType.
|
||||||
* Then this action is done for every SPITObject with the SPITType.
|
* Then this action is done for every SPITObject with the SPITType.
|
||||||
* @return true = an action is assigned for the SPITType.
|
* @return true = an action is assigned for the SPITType.
|
||||||
*/
|
*/
|
||||||
bool getActionAssignedType() const { return m_ActionAssignedType; }
|
bool getActionAssignedType() const { return m_ActionAssignedType; }
|
||||||
/** Returns if this SPITObject has an associated action or not.<br>
|
/** Returns if this SPITObject has an associated action or not.
|
||||||
* @return true = the user has asscociated an action with this SPITObject or <br>
|
* @return true = the user has asscociated an action with this SPITObject or
|
||||||
* the user has asscociated an action with the SPITType of this SPITObject
|
* the user has asscociated an action with the SPITType of this SPITObject
|
||||||
*/
|
*/
|
||||||
bool getActionAssigned() const { return m_ActionAssigned || m_ActionAssignedType; }
|
bool getActionAssigned() const { return m_ActionAssigned || m_ActionAssignedType; }
|
||||||
@@ -131,23 +103,23 @@ public:
|
|||||||
long long getDelay() const { return m_Delay; }
|
long long getDelay() const { return m_Delay; }
|
||||||
long long getDuration() const { return m_Duration; }
|
long long getDuration() const { return m_Duration; }
|
||||||
|
|
||||||
bool getProjectIndepended() const {
|
bool getProjectIndepended(SpitRepo<SPITType> &repo, SpitRepo<SPITType> &remoteRepo) const {
|
||||||
SPITType *ptrSPITType;
|
SPITType *ptrSPITType;
|
||||||
if (m_ServerRemote == false) {
|
if (m_ServerRemote == false) {
|
||||||
ptrSPITType = SPITType::getSPITType(m_SPITTypeID);
|
ptrSPITType = repo.getEntry(m_SPITTypeID);
|
||||||
if (ptrSPITType == NULL) return true;
|
if (ptrSPITType == nullptr)
|
||||||
|
return true;
|
||||||
return ptrSPITType->getProjectIndepended();
|
return ptrSPITType->getProjectIndepended();
|
||||||
}
|
} else {
|
||||||
else {
|
ptrSPITType = remoteRepo.getEntry(m_SPITTypeID);
|
||||||
ptrSPITType = SPITType::getSPITTypeRemote(m_SPITTypeID);
|
if (ptrSPITType == nullptr)
|
||||||
if (ptrSPITType == NULL) return true;
|
return true;
|
||||||
return ptrSPITType->getProjectIndepended();
|
return ptrSPITType->getProjectIndepended();
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
void setID(string p_ID);
|
|
||||||
bool setConfirmed(bool p_Confirmed);
|
bool setConfirmed(bool p_Confirmed);
|
||||||
void setCreatedByClient(bool p_CreatedByClient);
|
void setCreatedByClient(bool p_CreatedByClient) { m_CreatedByClient = p_CreatedByClient; }
|
||||||
bool setName(string p_Name);
|
bool setName(string p_Name);
|
||||||
bool setRemark(string p_Remark);
|
bool setRemark(string p_Remark);
|
||||||
bool setServerParams(string p_ServerParams);
|
bool setServerParams(string p_ServerParams);
|
||||||
@@ -167,10 +139,8 @@ public:
|
|||||||
bool setDuration(long long p_Duration);
|
bool setDuration(long long p_Duration);
|
||||||
|
|
||||||
bool setMessageOP(SPIT_Message::ReportSPITObject *p_ReportSPITObject);
|
bool setMessageOP(SPIT_Message::ReportSPITObject *p_ReportSPITObject);
|
||||||
void fillMessageOP(SPIT_Message::ReportSPITObject* p_ReportSPITObject);
|
void fillMessageOP(SPIT_Message::ReportSPITObject &p_ReportSPITObject);
|
||||||
void fillMessageOP(SPIT_Message::RemoveSPITObject* p_RemoveSPITObject);
|
void fillMessageOP(SPIT_Message::RemoveSPITObject &p_RemoveSPITObject);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
#endif /* SPITOBJECT_H */
|
#endif /* SPITOBJECT_H */
|
||||||
|
|
||||||
|
|||||||
@@ -23,13 +23,10 @@ class SPITPlayer {
|
|||||||
public:
|
public:
|
||||||
class PlaySPITType {
|
class PlaySPITType {
|
||||||
public:
|
public:
|
||||||
PlaySPITType();
|
|
||||||
PlaySPITType(SPITPlayer *p_SPITPlayer, string p_SPITObjectID);
|
PlaySPITType(SPITPlayer *p_SPITPlayer, string p_SPITObjectID);
|
||||||
PlaySPITType(const PlaySPITType &orig);
|
PlaySPITType(const PlaySPITType &orig);
|
||||||
|
|
||||||
string getSPITTypeID() const {
|
string getSPITTypeID() const { return m_SPITTypeID; }
|
||||||
return m_SPITTypeID;
|
|
||||||
}
|
|
||||||
|
|
||||||
void startPlaySequence();
|
void startPlaySequence();
|
||||||
bool getIsNew() const { return m_IsNew; }
|
bool getIsNew() const { return m_IsNew; }
|
||||||
@@ -57,14 +54,13 @@ public:
|
|||||||
//----- SPITPlayer ------
|
//----- SPITPlayer ------
|
||||||
public:
|
public:
|
||||||
// list the SPITPlayers
|
// list the SPITPlayers
|
||||||
static unordered_map<string, SPITPlayer*> s_SPITPlayers; //all actual played objects
|
static unordered_map<string, unique_ptr<SPITPlayer>> s_SPITPlayers; // all actual played objects
|
||||||
static SPITPlayer* getSPITPlayer(string p_PlayerID); //if a player does not exist creates a new one
|
static SPITPlayer &getSPITPlayer(string p_PlayerID); // if a player does not exist creates a new one
|
||||||
static void clearPlayers();
|
static void clearPlayers() { s_SPITPlayers.clear(); }
|
||||||
|
|
||||||
SPITPlayer(string p_PlayerID);
|
SPITPlayer(string p_PlayerID);
|
||||||
virtual ~SPITPlayer();
|
virtual ~SPITPlayer();
|
||||||
|
|
||||||
|
|
||||||
void startPlaySequence(); // called by SPIT_Client::parsePlaySPITStart
|
void startPlaySequence(); // called by SPIT_Client::parsePlaySPITStart
|
||||||
PlaySPITType *addSPITType_Playing(string p_SPITTypeID); // called by SPIT_Client::parsePlaySPITStart
|
PlaySPITType *addSPITType_Playing(string p_SPITTypeID); // called by SPIT_Client::parsePlaySPITStart
|
||||||
void endPlaySequence(); // called by SPIT_Client::parsePlaySPITEnd
|
void endPlaySequence(); // called by SPIT_Client::parsePlaySPITEnd
|
||||||
@@ -73,24 +69,24 @@ public:
|
|||||||
return m_ID;
|
return m_ID;
|
||||||
}
|
}
|
||||||
|
|
||||||
unordered_map<string, PlaySPITType*>* getPlaySPITTypes();
|
unordered_map<string, unique_ptr<PlaySPITType>> &getPlaySPITTypes() { return m_PlaySPITTypes; }
|
||||||
void setIsRunning(bool p_IsRunning);
|
void setIsRunning(bool p_IsRunning) { m_IsRunning = p_IsRunning; }
|
||||||
bool getIsRunning() { return m_IsRunning; }
|
void setName(string p_Name) { m_Name = p_Name; }
|
||||||
void setName(string p_Name);
|
void setType(char p_Type) { m_Type = p_Type; }
|
||||||
string getName() { return m_Name; }
|
void setTime(long long p_Frames) { m_TimeFrames = p_Frames; }
|
||||||
void setType(char p_Type);
|
bool getIsRunning() const { return m_IsRunning; }
|
||||||
char getType() { return m_Type; }
|
string getName() const { return m_Name; }
|
||||||
void setTime(long long p_Frames);
|
char getType() const { return m_Type; }
|
||||||
long long getTime() { return m_TimeFrames; }
|
long long getTime() const { return m_TimeFrames; }
|
||||||
|
|
||||||
private:
|
private:
|
||||||
string m_ID;
|
string m_ID;
|
||||||
string m_Name;
|
string m_Name;
|
||||||
char m_Type;
|
char m_Type;
|
||||||
unordered_map<string, PlaySPITType*> m_PlaySPITTypes;
|
unordered_map<string, unique_ptr<PlaySPITType>> m_PlaySPITTypes;
|
||||||
|
|
||||||
bool m_IsRunning;
|
bool m_IsRunning;
|
||||||
long long m_TimeFrames;
|
long long m_TimeFrames;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif /* SPITPLAYER_H */
|
#endif /* SPITPLAYER_H */
|
||||||
|
|
||||||
|
|||||||
@@ -16,17 +16,17 @@
|
|||||||
#ifndef SPITSOCKET_H
|
#ifndef SPITSOCKET_H
|
||||||
#define SPITSOCKET_H
|
#define SPITSOCKET_H
|
||||||
|
|
||||||
#include <string>
|
|
||||||
#include "esp_netif.h"
|
|
||||||
#include <sys/socket.h>
|
|
||||||
#include <netdb.h>
|
|
||||||
#include <arpa/inet.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <fcntl.h>
|
|
||||||
#include <unistd.h>
|
|
||||||
#include "Task.hpp"
|
#include "Task.hpp"
|
||||||
#include "esp_log.h"
|
#include "esp_log.h"
|
||||||
|
#include "esp_netif.h"
|
||||||
|
#include <arpa/inet.h>
|
||||||
|
#include <fcntl.h>
|
||||||
|
#include <netdb.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <string>
|
||||||
|
#include <sys/socket.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
|
||||||
using namespace std;
|
using namespace std;
|
||||||
|
|
||||||
@@ -79,16 +79,7 @@ public:
|
|||||||
//-------- class --------------
|
//-------- class --------------
|
||||||
SPITSocket(IPAddress ip) : mOwnIp(ip) {
|
SPITSocket(IPAddress ip) : mOwnIp(ip) {
|
||||||
m_UDPSocketIP4 = INVALID_SOCKET;
|
m_UDPSocketIP4 = INVALID_SOCKET;
|
||||||
|
|
||||||
m_ServerIP = "";
|
|
||||||
m_ServerPort = "";
|
|
||||||
m_ClientIP = "";
|
|
||||||
m_ClientPort = "";
|
|
||||||
m_BoundClientPort = "";
|
|
||||||
m_BoundClientFamily = 0;
|
|
||||||
m_IsBound = false;
|
|
||||||
createSocket_UDP();
|
createSocket_UDP();
|
||||||
|
|
||||||
}
|
}
|
||||||
virtual ~SPITSocket() {
|
virtual ~SPITSocket() {
|
||||||
ESP_LOGD("UDP", "Shutting down ...");
|
ESP_LOGD("UDP", "Shutting down ...");
|
||||||
@@ -101,67 +92,58 @@ public:
|
|||||||
fos::Task::delayMs(100);
|
fos::Task::delayMs(100);
|
||||||
m_IsBound = false;
|
m_IsBound = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
string m_ServerIP;
|
string m_ServerIP{};
|
||||||
string m_ServerPort;
|
string m_ServerPort{};
|
||||||
string m_ClientIP;
|
string m_ClientIP{};
|
||||||
string m_ClientPort; //port given by the user maybe "0"
|
string m_ClientPort{}; // port given by the user maybe "0"
|
||||||
string m_BoundClientPort; //port set after bind
|
string m_BoundClientPort{}; // port set after bind
|
||||||
int m_BoundClientFamily;
|
bool m_IsBound{};
|
||||||
bool m_IsBound;
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
/**
|
// Sets the ip address and port for server and client.
|
||||||
* Sets the ip address and port for server and client.
|
void setConnectionParams(const string &serverIp, const string &serverPort, const string &clientIp, const string &clientPort) {
|
||||||
* @param p_ServerIP
|
m_ServerIP = serverIp;
|
||||||
* @param p_ServerPort
|
m_ServerPort = serverPort;
|
||||||
* @param p_ClientIP
|
m_ClientIP = clientIp;
|
||||||
* @param p_ClientPort
|
m_ClientPort = clientPort;
|
||||||
*/
|
|
||||||
void setConnectionParams(string p_ServerIP, string p_ServerPort, string p_ClientIP, string p_ClientPort) {
|
|
||||||
m_ServerIP = p_ServerIP;
|
|
||||||
m_ServerPort = p_ServerPort;
|
|
||||||
m_ClientIP = p_ClientIP;
|
|
||||||
m_ClientPort = p_ClientPort;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Send a message to the server as set by setConnectionParams
|
* Send a message to the server as set by setConnectionParams
|
||||||
* @param p_MessageBytes byte buffer containing the message
|
* @param message byte buffer containing the message
|
||||||
* @param p_MessageLength length of the messaeg
|
* @param length length of the message
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
int sendMessage(const char* p_MessageBytes, int p_MessageLength) {
|
int sendMessage(const char *message, int length) {
|
||||||
if (m_ServerPort.length() <= 0)
|
if (m_ServerPort.length() <= 0) {
|
||||||
return -1;
|
return -1;
|
||||||
int intResult;
|
|
||||||
{
|
|
||||||
if (m_IsBound == false)
|
|
||||||
return -1;
|
|
||||||
intResult = sendMessageTo(m_BoundClientFamily, m_ServerIP, m_ServerPort, p_MessageBytes, p_MessageLength);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (m_IsBound == false) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
int intResult = sendMessageTo(m_ServerIP, m_ServerPort, message, length);
|
||||||
return intResult;
|
return intResult;
|
||||||
}
|
}
|
||||||
|
|
||||||
int receiveMessage(int p_InetFamily, char* p_Buffer, int p_BufferLength, string* p_ServerIP);
|
int receiveMessage(char *p_Buffer, int p_BufferLength, string *serverIp) const;
|
||||||
int setBroadcast(bool p_Broadcast);
|
int setBroadcast(bool p_Broadcast) const;
|
||||||
int bindSocket(string p_ServerIP, string p_ClientIP, string p_ClientPort);
|
int bindSocket(string clientIp, string clientPort);
|
||||||
|
|
||||||
// * Internal usage - don't use this manually
|
int sendMessageTo(const string &ip, const string &port, const char *message, int msgLength);
|
||||||
// * Use sendMessage instead
|
|
||||||
int sendMessageTo(int p_InetFamily, string p_ServerIP, string p_Port, const char* p_MessageBytes, int p_MessageLength);
|
|
||||||
|
|
||||||
string getServerIP() { return m_ServerIP; }
|
string getServerIP() const { return m_ServerIP; }
|
||||||
string getServerPort(){ return m_ServerPort; }
|
string getServerPort() const { return m_ServerPort; }
|
||||||
string getClientIP() { return m_ClientIP; }
|
string getClientIP() const { return m_ClientIP; }
|
||||||
string getClientPort() { return m_ClientPort; }
|
string getClientPort() const { return m_ClientPort; }
|
||||||
string getBoundClientPort() { return m_BoundClientPort; }
|
string getBoundClientPort() const { return m_BoundClientPort; }
|
||||||
void setBoundClientPort(string p_Port) { m_BoundClientPort = p_Port; }
|
void setBoundClientPort(const string &p_Port) { m_BoundClientPort = p_Port; }
|
||||||
void setBoundClientFamily(int p_Family) { m_BoundClientFamily = p_Family; }
|
|
||||||
int getBoundClientFamily() { return m_BoundClientFamily; }
|
|
||||||
void setIsBound(bool p_IsBound) { m_IsBound = p_IsBound; }
|
void setIsBound(bool p_IsBound) { m_IsBound = p_IsBound; }
|
||||||
bool getIsBound() { return m_IsBound; }
|
bool getIsBound() const { return m_IsBound; }
|
||||||
|
|
||||||
|
private:
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif /* SPITSOCKET_H */
|
#endif /* SPITSOCKET_H */
|
||||||
|
|
||||||
|
|||||||
@@ -16,55 +16,30 @@
|
|||||||
|
|
||||||
#include "SPITSocket.h"
|
#include "SPITSocket.h"
|
||||||
#include "SPIT_Message.h"
|
#include "SPIT_Message.h"
|
||||||
#include <string>
|
#include "SpitRepo.hpp"
|
||||||
#include <unordered_map>
|
|
||||||
|
|
||||||
using namespace std;
|
using namespace std;
|
||||||
|
|
||||||
class SPITTypeListener;
|
class SPITTypeListener;
|
||||||
|
|
||||||
class SPITType {
|
class SPITType {
|
||||||
private:
|
|
||||||
static unordered_map<string, SPITType*> s_SPITTypes;
|
|
||||||
static unordered_map<string, SPITType*> s_SPITTypesRemote;
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
static SPITType* getSPITType(string p_ID);
|
static void setConfirmedFalse(SpitRepo<SPITType> &repo);
|
||||||
static const SPITType& getSPITTypeRef(string p_ID);
|
static void eventProjectClosed(SpitRepo<SPITType> &repo, SpitRepo<SPITType> &remoteRepo);
|
||||||
static bool addSPITType(SPITType* p_ptrSpitType);
|
|
||||||
static bool removeSPITType(SPITType* p_ptrSpitType);
|
|
||||||
static int getSPITTypeCount();
|
|
||||||
static SPITType* getSPITType(int p_Index);
|
|
||||||
static const SPITType& getSPITTypeRef(int p_Index);
|
|
||||||
static void clearSPITTypes();
|
|
||||||
static void setConfirmedFalse();
|
|
||||||
|
|
||||||
static SPITType* getSPITTypeRemote(string p_ID);
|
SPITType(string p_ID);
|
||||||
static const SPITType& getSPITTypeRemoteRef(string p_ID);
|
|
||||||
static bool addSPITTypeRemote(SPITType* p_ptrSpitType);
|
|
||||||
static bool removeSPITTypeRemote(SPITType* p_ptrSpitType);
|
|
||||||
static int getSPITTypeRemoteCount();
|
|
||||||
static SPITType* getSPITTypeRemote(int p_Index);
|
|
||||||
static const SPITType& getSPITTypeRemoteRef(int p_Index);
|
|
||||||
static void clearSPITTypesRemote();
|
|
||||||
|
|
||||||
static void eventProjectClosed();
|
|
||||||
|
|
||||||
SPITType();
|
|
||||||
SPITType(string p_ID, string p_GroupName, string p_Name, bool p_Fixed, bool p_ProjectIndepended, long long p_DefaultDelay, long long p_DefaultDuration);
|
SPITType(string p_ID, string p_GroupName, string p_Name, bool p_Fixed, bool p_ProjectIndepended, long long p_DefaultDelay, long long p_DefaultDuration);
|
||||||
// SPITType(const SPITType& orig);
|
|
||||||
~SPITType();
|
|
||||||
private:
|
|
||||||
|
|
||||||
bool m_Confirmed;
|
private:
|
||||||
|
bool m_Confirmed{};
|
||||||
string m_ID;
|
string m_ID;
|
||||||
bool m_Fixed;
|
bool m_Fixed{};
|
||||||
bool m_ServerRemote;
|
bool m_ServerRemote{};
|
||||||
bool m_ServerProjectIndepended;
|
bool m_ServerProjectIndepended{};
|
||||||
string m_GroupName;
|
string m_GroupName{};
|
||||||
string m_Name;
|
string m_Name{};
|
||||||
long long m_DefaultDelay;
|
long long m_DefaultDelay{};
|
||||||
long long m_DefaultDuration;
|
long long m_DefaultDuration{};
|
||||||
|
|
||||||
bool m_CreatedByClient; // flag true = the SPITTyype is created by the client
|
bool m_CreatedByClient; // flag true = the SPITTyype is created by the client
|
||||||
// false = the SPITType is received from the server
|
// false = the SPITType is received from the server
|
||||||
@@ -72,24 +47,17 @@ private:
|
|||||||
bool m_ActionAssigned; // This is a virtual flag if user associates an action with a SPITType.
|
bool m_ActionAssigned; // This is a virtual flag if user associates an action with a SPITType.
|
||||||
// Can be used to setActionAssigned for all SPITObjects with this SPITType
|
// Can be used to setActionAssigned for all SPITObjects with this SPITType
|
||||||
|
|
||||||
void initMembers();
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
string getID() const { return m_ID; }
|
string getID() const { return m_ID; }
|
||||||
string getGroupName() const { return m_GroupName; }
|
string getGroupName() const { return m_GroupName; }
|
||||||
string getName() const { return m_Name; }
|
string getName() const { return m_Name; }
|
||||||
/**
|
/**
|
||||||
* Returns if the SPITType triggers an action on the Server or on the client.
|
* Returns if the SPITType triggers an action on the Server or on the client.
|
||||||
* @return false = the action is triggered on the client The client waits for the server to play objects of this SPITType<br>
|
* @return false = the action is triggered on the client The client waits for the server to play objects of this SPITType
|
||||||
* true = the action is triggered on the server. The server waits for the client to play objects of this SPITType.
|
* true = the action is triggered on the server. The server waits for the client to play objects of this SPITType.
|
||||||
*/
|
*/
|
||||||
bool getServerRemote() const {
|
bool getServerRemote() const { return m_ServerRemote; }
|
||||||
return m_ServerRemote;
|
bool getProjectIndepended() const { return m_ServerProjectIndepended; }
|
||||||
}
|
|
||||||
|
|
||||||
bool getProjectIndepended() const {
|
|
||||||
return m_ServerProjectIndepended;
|
|
||||||
}
|
|
||||||
/**
|
/**
|
||||||
* This is used by the server and client to tell if the other side has registered the changes.
|
* This is used by the server and client to tell if the other side has registered the changes.
|
||||||
* @return true = other side has registered the changes.
|
* @return true = other side has registered the changes.
|
||||||
@@ -101,42 +69,36 @@ public:
|
|||||||
bool getCreatedByClient() const { return m_CreatedByClient; }
|
bool getCreatedByClient() const { return m_CreatedByClient; }
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Virtual construct - means ActionAssigned for SPITTypes is is not implemented in SPITProtocol.<br>
|
* Virtual construct - means ActionAssigned for SPITTypes is is not implemented in SPITProtocol.
|
||||||
* This can used to setActionAssigned to all SPITObjects with this SPITType.<br>
|
* This can used to setActionAssigned to all SPITObjects with this SPITType.
|
||||||
* This may be used in the case when the same action should be done for every SPITObject with this SPITType associated.<br>
|
* This may be used in the case when the same action should be done for every SPITObject with this SPITType associated.
|
||||||
* @return true = the user has associated an action with this SPITType.
|
* @return true = the user has associated an action with this SPITType.
|
||||||
*/
|
*/
|
||||||
bool getActionAssigned() const {
|
bool getActionAssigned() const {
|
||||||
return m_ActionAssigned;
|
return m_ActionAssigned;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool setGroupName(const string &p_GroupName);
|
||||||
public:
|
bool setName(const string &p_Name);
|
||||||
void setID(string p_ID);
|
|
||||||
bool setGroupName(string p_GroupName);
|
|
||||||
bool setName(string p_Name);
|
|
||||||
bool setServerRemote(bool p_BelongstoServer);
|
bool setServerRemote(bool p_BelongstoServer);
|
||||||
bool setProjectIndepended(bool p_ProjectIndepeneded);
|
bool setProjectIndepended(bool p_ProjectIndepeneded);
|
||||||
bool setConfirmed(bool p_Confirmed);
|
bool setConfirmed(bool p_Confirmed);
|
||||||
bool setFixed(bool p_Fixed);
|
bool setFixed(bool p_Fixed);
|
||||||
bool setDefaultDelay(long long p_Delay);
|
bool setDefaultDelay(long long p_Delay);
|
||||||
bool setDefaultDuration(long long p_Duration);
|
bool setDefaultDuration(long long p_Duration);
|
||||||
|
|
||||||
void setCreatedByClient(bool p_CreatedByClient);
|
void setCreatedByClient(bool p_CreatedByClient);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Virtual construct - means ActionAssigned for SPITTypes is is not implemented in SPITProtocol.<br>
|
* Virtual construct - means ActionAssigned for SPITTypes is is not implemented in SPITProtocol.
|
||||||
* This can used to setActionAssigned to all SPITObjects with this SPITType.<br>
|
* This can used to setActionAssigned to all SPITObjects with this SPITType.
|
||||||
* This may be used in the case when the same action should be done for every SPITObject with this SPITType associated.<br>
|
* This may be used in the case when the same action should be done for every SPITObject with this SPITType associated.
|
||||||
* @return true = the m_ActionAssigned has changed.
|
* @return true = the m_ActionAssigned has changed.
|
||||||
*/
|
*/
|
||||||
bool setActionAssigned(bool p_ActionAssigned);
|
bool setActionAssigned(bool p_ActionAssigned);
|
||||||
|
|
||||||
bool setMessageOP(SPIT_Message::ReportSPITType* p_ReportSPITType);
|
bool setMessageOP(SPIT_Message::ReportSPITType &reportSpitType);
|
||||||
void fillMessageOP(SPIT_Message::ReportSPITType* p_ReportSPITType);
|
void fillMessageOP(SPIT_Message::ReportSPITType &smReportSpitType) const;
|
||||||
void fillMessageOP(SPIT_Message::RemoveSPITType* p_RemoveSPITType);
|
void fillMessageOP(SPIT_Message::RemoveSPITType &smRemoveSpitType) const;
|
||||||
// static char* stringCopy(const char* p_String);
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
#endif /* SPITTYPE_H */
|
#endif /* SPITTYPE_H */
|
||||||
@@ -14,12 +14,13 @@
|
|||||||
#ifndef SPIT_CLIENT_H
|
#ifndef SPIT_CLIENT_H
|
||||||
#define SPIT_CLIENT_H
|
#define SPIT_CLIENT_H
|
||||||
|
|
||||||
#include "SPITSocket.h"
|
|
||||||
#include "SAD_DetectedServer.hpp"
|
#include "SAD_DetectedServer.hpp"
|
||||||
#include "SPIT_Message.h"
|
|
||||||
#include "SPITType.h"
|
|
||||||
#include "SPITObject.h"
|
#include "SPITObject.h"
|
||||||
#include "SPITPlayer.h"
|
#include "SPITPlayer.h"
|
||||||
|
#include "SPITSocket.h"
|
||||||
|
#include "SPITType.h"
|
||||||
|
#include "SPIT_Message.h"
|
||||||
|
#include "SpitRepo.hpp"
|
||||||
#include <memory>
|
#include <memory>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
@@ -31,78 +32,76 @@ public:
|
|||||||
/** Maximal length of a SPITMessage*/
|
/** Maximal length of a SPITMessage*/
|
||||||
static const int MAXSPITMESSAGEBYTECOUNT = 512;
|
static const int MAXSPITMESSAGEBYTECOUNT = 512;
|
||||||
|
|
||||||
enum ServerEvent {
|
enum class ProjUpdate {
|
||||||
|
ServerLoaded,
|
||||||
|
StartTransfer,
|
||||||
|
EndTransfer,
|
||||||
|
ServerClosed,
|
||||||
|
};
|
||||||
|
enum class ServerEvent {
|
||||||
Detect,
|
Detect,
|
||||||
Lost,
|
Lost,
|
||||||
Changed,
|
Changed,
|
||||||
};
|
};
|
||||||
|
enum class ObjectEvent {
|
||||||
struct Callbacks {
|
Created,
|
||||||
void(*onServerEvent)(ServerEvent event, const SAD_DetectedServer &p_DetectedServer);
|
Changed,
|
||||||
void(*onConnectionStatus)(string p_ServerID, string p_ServerComputerName, string p_ServerName, int p_ServerStepTime, int p_ConnectionStatus, int p_OldConnectionStatus);
|
Deleted
|
||||||
void(*onStartProjectTransfer)();
|
};
|
||||||
void(*onEndProjectTransfer)();
|
enum class Connection {
|
||||||
void(*onProjectClosed)(string);
|
None = 0, // No Connection established.<br>Either no connect tried or disconnected
|
||||||
void(*onProjectReport)(string p_ProjectID, string p_ProjectName, int p_FramesPerSeoond);
|
NoneServer = 1, // Server has disconnected
|
||||||
void(*onSpitType)(bool p_New, const SPITType &p_SPITType);
|
Lost = 2, // The connection is lost<br>Either because of a network crash or because the server no longer responds.
|
||||||
void(*onSpitTypeRemote)(bool p_New, const SPITType &p_SPITType);
|
Ok = 3, // Connection to the serv er is established.
|
||||||
void(*onSpitObject)(bool p_New, const SPITType &p_SPITType, const SPITObject &p_SPITObject);
|
TryConnection = 4, // A connection to the server is tried.
|
||||||
void(*onSpitObjectRemote)(bool p_New, const SPITType &p_SPITType, const SPITObject &p_SPITObject);
|
|
||||||
void(*onSpitTypeRemoved)(const SPITType &p_SPITType);
|
|
||||||
void(*onSpitTypeRemoteRemoved)(const SPITType &p_SPITType);
|
|
||||||
void(*onSpitObjectRemoved)(const SPITType &p_SPITType, const SPITObject &p_SPITObject);
|
|
||||||
void(*onSpitObjectRemoteRemoved)(const SPITType &p_SPITType, const SPITObject &p_SPITObject);
|
|
||||||
void(*onPlay)(string p_PlayerID, string p_PlayerName, char p_PlayerType, bool p_PlayerIsRunning, long long p_TimeFrames);
|
|
||||||
void(*onPlaySpitType)(string p_PlayerID, string p_SPITTypeID, bool p_PlayerIsRunning, bool p_Started, bool p_Ended, double p_Value);
|
|
||||||
void(*onPlayRemoteObjectStatus)(const SPITType &p_SPITType, const SPITObject &p_SPITObject, long long p_FrameInsideObject, int p_Value);
|
|
||||||
bool(*onCheckSpitTypeVeto)(SPIT_Message::ReportSPITType* p_ReportSPITType);
|
|
||||||
bool(*onCheckSpitObjectVeto)(SPIT_Message::ReportSPITObject* p_ReportSPITObject);
|
|
||||||
};
|
};
|
||||||
|
|
||||||
//----- Connection Status -----
|
struct Callbacks {
|
||||||
public:
|
void (*onServerEvent)(ServerEvent event, const SAD_DetectedServer &p_DetectedServer){};
|
||||||
/** No Connection established.<br>Either no connect tried or disconnected*/
|
void (*onConnectionStatus)(string p_ServerID, string p_ServerComputerName, string p_ServerName, int p_ServerStepTime, Connection p_ConnectionStatus, Connection p_OldConnectionStatus){};
|
||||||
static const int CONNECTION_NONE = 0;
|
void (*onProjectUpdate)(ProjUpdate state, string projectId){};
|
||||||
/** Server has disconnected*/
|
void (*onSpitType)(ObjectEvent event, bool isRemote, const SPITType &p_SPITType){};
|
||||||
static const int CONNECTION_NONESERVER = 1;
|
void (*onSpitObject)(ObjectEvent event, bool isRemote, const SPITType &p_SPITType, const SPITObject &p_SPITObject){};
|
||||||
/** The connection is lost<br>Either because of a network crash or because the server no longer responds.*/
|
|
||||||
static const int CONNECTION_LOST = 2;
|
void (*onPlay)(string p_PlayerID, string p_PlayerName, char p_PlayerType, bool p_PlayerIsRunning, long long p_TimeFrames){};
|
||||||
/** Connection to the serv er is established.*/
|
void (*onPlaySpitType)(string p_PlayerID, string p_SPITTypeID, bool p_PlayerIsRunning, bool p_Started, bool p_Ended, double p_Value){};
|
||||||
static const int CONNECTION_OK = 3;
|
void (*onPlayRemoteObjectStatus)(const SPITType &p_SPITType, const SPITObject &p_SPITObject, long long p_FrameInsideObject, int p_Value){};
|
||||||
/** A connection to the server is tried.*/
|
bool (*onCheckSpitTypeVeto)(bool knownType, bool createdByClient){};
|
||||||
static const int CONNECTION_TRYCONNECTION = 4;
|
bool (*onCheckSpitObjectVeto)(bool knownType){};
|
||||||
|
};
|
||||||
|
|
||||||
//------ PlayerType ------
|
//------ PlayerType ------
|
||||||
public:
|
public:
|
||||||
/** continous main player, time value can be used like a timecode.<br>The time value is the position in server's project.<br>A server should use only one main player.*/
|
/** continous main player, time value can be used like a timecode.<br>The time value is the position in server's project.<br>A server should use only one main player.*/
|
||||||
static const char PLAYERTYPE_MAIN = 0x02;
|
static constexpr char PLAYERTYPE_MAIN = 0x02;
|
||||||
/** continous player. This player plays SPIT objects sometime during the project.*/
|
/** continous player. This player plays SPIT objects sometime during the project.*/
|
||||||
static const char PLAYERTYPE_CONTINOUS = 0x01;
|
static constexpr char PLAYERTYPE_CONTINOUS = 0x01;
|
||||||
/** diescrete player. This player is used to transmit single discrete values.*/
|
/** diescrete player. This player is used to transmit single discrete values.*/
|
||||||
static const char PLAYERTYPE_DISCRETE = 0x00;
|
static constexpr char PLAYERTYPE_DISCRETE = 0x00;
|
||||||
|
|
||||||
//------ Value Flag ------
|
//------ Value Flag ------
|
||||||
//------ used by sendRemoteObject
|
//------ used by sendRemoteObject
|
||||||
public:
|
public:
|
||||||
/**Set the given value directly*/
|
/**Set the given value directly*/
|
||||||
static const char VALUEFLAG_DIRECT = 0x00;
|
static constexpr char VALUEFLAG_DIRECT = 0x00;
|
||||||
/**Increase the existing value by the given value.<br>This is usefull e.g. when instead of a fader a endless wheel is used*/
|
/**Increase the existing value by the given value.<br>This is usefull e.g. when instead of a fader a endless wheel is used*/
|
||||||
static const char VALUEFLAG_INCREASE = 0x01;
|
static constexpr char VALUEFLAG_INCREASE = 0x01;
|
||||||
/**Decrease the existing value by the given value.<br>This is usefull e.g. when instead of a fader a endless wheel is used*/
|
/**Decrease the existing value by the given value.<br>This is usefull e.g. when instead of a fader a endless wheel is used*/
|
||||||
static const char VALUEFLAG_DECREASE = 0x02;
|
static constexpr char VALUEFLAG_DECREASE = 0x02;
|
||||||
|
static constexpr int MAX_OVERTAKING_SPIT_MESSAGES = 10;
|
||||||
|
|
||||||
//----- SPIT_Client -----
|
//----- SPIT_Client -----
|
||||||
public:
|
public:
|
||||||
SPIT_Client(string name, string projName, Callbacks calls);
|
SPIT_Client(string name, string projName, Callbacks calls);
|
||||||
virtual ~SPIT_Client();
|
virtual ~SPIT_Client();
|
||||||
static int s_MAX_OVERTAKING_SPIT_MESSAGES;
|
|
||||||
private:
|
private:
|
||||||
Callbacks mCallbacks;
|
Callbacks mCallbacks;
|
||||||
|
|
||||||
fos::TaskT<SPIT_Client &> *m_ThreadReceive{};
|
fos::TaskT<SPIT_Client &> *m_ThreadReceive{};
|
||||||
bool m_StopReceiveSPITMessages;
|
bool m_StopReceiveSPITMessages{};
|
||||||
|
|
||||||
int m_ConnectionStatus;
|
Connection m_ConnectionStatus{Connection::None};
|
||||||
bool m_DisconnectedByServer{}; // flag true = when server disconnects
|
bool m_DisconnectedByServer{}; // flag true = when server disconnects
|
||||||
string m_ID;
|
string m_ID;
|
||||||
string m_Name;
|
string m_Name;
|
||||||
@@ -111,9 +110,9 @@ private:
|
|||||||
|
|
||||||
string m_ClientProjectName;
|
string m_ClientProjectName;
|
||||||
|
|
||||||
unsigned char m_MessageNumber_Send;
|
uint8_t m_MessageNumber_Send{1};
|
||||||
int m_MessageNumber_Received;
|
int m_MessageNumber_Received{-1}; // set to -1 because the first received message will set the number (1..255)
|
||||||
vector<SPIT_Message*> m_OvertakingSPIT_Messages;
|
vector<unique_ptr<SPIT_Message>> m_OvertakingSPIT_Messages;
|
||||||
|
|
||||||
// Server's info filled by parseConnectAnswer
|
// Server's info filled by parseConnectAnswer
|
||||||
string m_ServerID{};
|
string m_ServerID{};
|
||||||
@@ -174,8 +173,7 @@ private:
|
|||||||
// Reconnect to the server when connection is lost see eventConnectionStatus and eventServerDetected
|
// Reconnect to the server when connection is lost see eventConnectionStatus and eventServerDetected
|
||||||
bool _doReconnect{}; // true = on eventServerDetected connect to the server identified by m_ServerID
|
bool _doReconnect{}; // true = on eventServerDetected connect to the server identified by m_ServerID
|
||||||
public:
|
public:
|
||||||
void fillHeader(SPIT_Message::Header* p_Header);
|
int sendSPITMessage(SPIT_Message::OPPart & spitMessageOPPart);
|
||||||
int sendSPITMessage(SPIT_Message::OPPart& p_SPITMessageOPPart);
|
|
||||||
|
|
||||||
//--------------- ServerAutoDetection SAD ---------------
|
//--------------- ServerAutoDetection SAD ---------------
|
||||||
public:
|
public:
|
||||||
@@ -184,10 +182,10 @@ public:
|
|||||||
/** Stops the autodetection of SPITServers in the local network*/
|
/** Stops the autodetection of SPITServers in the local network*/
|
||||||
void stopServerAutoDetect();
|
void stopServerAutoDetect();
|
||||||
/** Called every time a new SPITServer is detetced in the local network */
|
/** Called every time a new SPITServer is detetced in the local network */
|
||||||
void eventServerDetected(string p_ID, string p_Name, string p_ComputerName, string p_IP, string p_Port, string p_Addition, string p_ProjectName, string p_ClientIP, bool p_IsIP4);
|
void eventServerDetected(SAD_DetectedServer &server);
|
||||||
/** Called every time a prior detected SPITServer is is no longer found.*/
|
/** Called every time a prior detected SPITServer is is no longer found.*/
|
||||||
void eventServerLost(string p_ID, string p_Name, string p_ComputerName, string p_IP, string p_Port, string p_Addition, string p_ProjectName, string p_ClientIP, bool p_IsIP4);
|
void eventServerLost(SAD_DetectedServer &server);
|
||||||
void eventServerChanged(string p_ID, string p_Name, string p_ComputerName, string p_IP, string p_Port, string p_Addition, string p_ProjectName, string p_ClientIP, bool p_IsIP4);
|
void eventServerChanged(SAD_DetectedServer &server);
|
||||||
|
|
||||||
//--------------- Connection ---------------
|
//--------------- Connection ---------------
|
||||||
public:
|
public:
|
||||||
@@ -209,15 +207,16 @@ public:
|
|||||||
void disconnect();
|
void disconnect();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void disconnectInternal(int p_Cause);
|
void disconnectInternal(Connection p_Cause);
|
||||||
void resetMessageNumberReceived();
|
void resetMessageNumberReceived();
|
||||||
void parseSPIT_Message(unique_ptr<SPIT_Message> p_SPITMessage);
|
void parseSPIT_Message(unique_ptr<SPIT_Message> p_SPITMessage);
|
||||||
void checkParseSPIT_Message(unique_ptr<SPIT_Message> p_SPITMessage);
|
void checkParseSPIT_Message(unique_ptr<SPIT_Message> p_SPITMessage);
|
||||||
void addOvertakingSPIT_Message(SPIT_Message* p_SPIT_Message);
|
void addOvertakingSPIT_Message(unique_ptr<SPIT_Message> p_SPIT_Message);
|
||||||
void parseConnectAnswer(SPIT_Message::ConnectAnswer* p_ConnectAnswer);
|
void parseConnectAnswer(SPIT_Message::ConnectAnswer &p_ConnectAnswer);
|
||||||
void parseDisconnect(SPIT_Message::Disconnect* p_Disconnect);
|
void parseDisconnect(SPIT_Message::Disconnect &p_Disconnect);
|
||||||
void parseWatchdog(SPIT_Message::Watchdog* p_Watchdog);
|
void parseWatchdog(SPIT_Message::Watchdog &p_Watchdog);
|
||||||
void parseWatchdogAnswer(SPIT_Message::WatchdogAnswer* p_WatchdogAnswer);
|
void parseWatchdogAnswer(SPIT_Message::WatchdogAnswer &p_WatchdogAnswer);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
/** Used internally*/
|
/** Used internally*/
|
||||||
void sendWatchdog();
|
void sendWatchdog();
|
||||||
@@ -225,8 +224,9 @@ public:
|
|||||||
void eventWatchdogLost();
|
void eventWatchdogLost();
|
||||||
//--------------- SPIT Project ---------------
|
//--------------- SPIT Project ---------------
|
||||||
private:
|
private:
|
||||||
void parseReportSPITProject(SPIT_Message::ReportSPITProject* p_ReportSPITProject);
|
void parseReportSPITProject(SPIT_Message::ReportSPITProject &p_ReportSPITProject);
|
||||||
void parseCloseSPITProject(SPIT_Message::CloseSPITProject* p_CloseSPITProject);
|
void parseCloseSPITProject(SPIT_Message::CloseSPITProject &p_CloseSPITProject);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
/** Returns the SPITServer's project ID - may be the same as the project's name*/
|
/** Returns the SPITServer's project ID - may be the same as the project's name*/
|
||||||
string getServerProjectID();
|
string getServerProjectID();
|
||||||
@@ -236,9 +236,10 @@ public:
|
|||||||
int getServerFramesPerSecond();
|
int getServerFramesPerSecond();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void parseRequestProjectTransfer(SPIT_Message::RequestProjectTransfer* p_RequestProjectTransfer);
|
void parseRequestProjectTransfer(SPIT_Message::RequestProjectTransfer &p_RequestProjectTransfer);
|
||||||
void parseStartProjectTransfer(SPIT_Message::StartProjectTransfer* p_StartProjectTransfer);
|
void parseStartProjectTransfer(SPIT_Message::StartProjectTransfer &p_StartProjectTransfer);
|
||||||
void parseEndProjectTransfer(SPIT_Message::EndProjectTransfer* p_EndProjectTransfer);
|
void parseEndProjectTransfer(SPIT_Message::EndProjectTransfer &p_EndProjectTransfer);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
static void sendProject(SPIT_Client *p_PtrSPIT_Client);
|
static void sendProject(SPIT_Client *p_PtrSPIT_Client);
|
||||||
|
|
||||||
@@ -270,11 +271,13 @@ public:
|
|||||||
* @return the pointer to the new SPITType.
|
* @return the pointer to the new SPITType.
|
||||||
*/
|
*/
|
||||||
SPITType *createSPITType(string p_ID, string p_GroupName, string p_Name, long long p_DefaultDelay, long long p_DefaultDuration, bool p_Fixed, bool p_ProjectIndepended);
|
SPITType *createSPITType(string p_ID, string p_GroupName, string p_Name, long long p_DefaultDelay, long long p_DefaultDuration, bool p_Fixed, bool p_ProjectIndepended);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
// receive SPITTypes
|
// receive SPITTypes
|
||||||
void parseReportSPITType(SPIT_Message::ReportSPITType* p_ReportSPITType);
|
void parseReportSPITType(SPIT_Message::ReportSPITType &p_ReportSPITType);
|
||||||
void parseRemoveSPITType(SPIT_Message::RemoveSPITType* p_RemoveSPITType);
|
void parseRemoveSPITType(SPIT_Message::RemoveSPITType &p_RemoveSPITType);
|
||||||
int sendSPITTypeInternal(SPITType* p_SPITType);
|
int sendSPITTypeInternal(SPITType &p_SPITType);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
/**
|
/**
|
||||||
* If a client wants to change a SPITType, he should send it to the server.<br>
|
* If a client wants to change a SPITType, he should send it to the server.<br>
|
||||||
@@ -290,13 +293,14 @@ public:
|
|||||||
* @return 0 = is sended, -1 = is not sended
|
* @return 0 = is sended, -1 = is not sended
|
||||||
*/
|
*/
|
||||||
int removeSPITType(string p_SPITTypeID);
|
int removeSPITType(string p_SPITTypeID);
|
||||||
public:
|
|
||||||
|
|
||||||
|
public:
|
||||||
//--------------- SPIT Objects ---------------
|
//--------------- SPIT Objects ---------------
|
||||||
private:
|
private:
|
||||||
void parseReportSPITObject(SPIT_Message::ReportSPITObject* p_ReportSPITObject);
|
void parseReportSPITObject(SPIT_Message::ReportSPITObject &p_ReportSPITObject);
|
||||||
void parseRemoveSPITObject(SPIT_Message::RemoveSPITObject* p_RemoveSPITObject);
|
void parseRemoveSPITObject(SPIT_Message::RemoveSPITObject &p_RemoveSPITObject);
|
||||||
int sendSPITObjectInternal(SPITObject *ptrSPITObject);
|
int sendSPITObjectInternal(SPITObject *ptrSPITObject);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
/**
|
/**
|
||||||
* When the client changes a SPITObject (normally the client should not do this), then it should send the changes to the SPITServer.<br>
|
* When the client changes a SPITObject (normally the client should not do this), then it should send the changes to the SPITServer.<br>
|
||||||
@@ -312,14 +316,14 @@ public:
|
|||||||
* @return 0 = sended, -1 = not sended
|
* @return 0 = sended, -1 = not sended
|
||||||
*/
|
*/
|
||||||
int removeSPITObject(string p_SPITObjectID);
|
int removeSPITObject(string p_SPITObjectID);
|
||||||
public:
|
|
||||||
|
|
||||||
|
public:
|
||||||
//--------------- Play SPIT Objects ---------------
|
//--------------- Play SPIT Objects ---------------
|
||||||
private:
|
private:
|
||||||
void parsePlaySPITStart(SPIT_Message::PlaySPITStart* p_PlaySPITStart);
|
void parsePlaySPITStart(SPIT_Message::PlaySPITStart &p_PlaySPITStart);
|
||||||
void parsePlaySPITObject(SPIT_Message::PlaySPITObject* p_PlaySPITObject);
|
void parsePlaySPITObject(SPIT_Message::PlaySPITObject &p_PlaySPITObject);
|
||||||
void parsePlaySPITEnd(SPIT_Message::PlaySPITEnd* p_PlaySPITEnd);
|
void parsePlaySPITEnd(SPIT_Message::PlaySPITEnd &p_PlaySPITEnd);
|
||||||
void parseReportPlayStatus(SPIT_Message::ReportPlayStatus* p_ReportPlayStatus);
|
void parseReportPlayStatus(SPIT_Message::ReportPlayStatus &p_ReportPlayStatus);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
//--------- Remote ----------
|
//--------- Remote ----------
|
||||||
@@ -328,7 +332,7 @@ private:
|
|||||||
private:
|
private:
|
||||||
static void processSocketTask(SPIT_Client &instance);
|
static void processSocketTask(SPIT_Client &instance);
|
||||||
fos::TaskT<SPIT_Client &> *sThread{};
|
fos::TaskT<SPIT_Client &> *sThread{};
|
||||||
bool abortSearch{};
|
bool mAbortSearch{};
|
||||||
bool sAnswered{};
|
bool sAnswered{};
|
||||||
static fos::Semaphore sStartSad;
|
static fos::Semaphore sStartSad;
|
||||||
SPITSocket *mSPITSocket;
|
SPITSocket *mSPITSocket;
|
||||||
@@ -336,7 +340,10 @@ private:
|
|||||||
sAnswered = true;
|
sAnswered = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
SpitRepo<SPITObject> mSpitObjects;
|
||||||
|
SpitRepo<SPITObject> mRemoteSpitObjects;
|
||||||
|
SpitRepo<SPITType> mSpitTypes;
|
||||||
|
SpitRepo<SPITType> mRemoteSpitTypes;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif /* SPIT_CLIENT_H */
|
#endif /* SPIT_CLIENT_H */
|
||||||
|
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,68 @@
|
|||||||
|
#pragma once
|
||||||
|
#include <memory>
|
||||||
|
#include <string>
|
||||||
|
#include <unordered_map>
|
||||||
|
|
||||||
|
template <typename T>
|
||||||
|
class SpitRepo {
|
||||||
|
public:
|
||||||
|
bool hasEntry(const string &id) {
|
||||||
|
return mEntries.contains(id);
|
||||||
|
}
|
||||||
|
|
||||||
|
T *getEntry(const string &id) {
|
||||||
|
auto i = mEntries.find(id);
|
||||||
|
if (i == mEntries.end()) {
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
return i->second.get();
|
||||||
|
}
|
||||||
|
|
||||||
|
const T &getEntryRef(const string &id) {
|
||||||
|
return *mEntries.at(id);
|
||||||
|
}
|
||||||
|
|
||||||
|
T *getEntry(int index) {
|
||||||
|
if (index >= 0 && index < mEntries.size()) {
|
||||||
|
return next(mEntries.begin(), index)->second.get();
|
||||||
|
}
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
const T &getEntryRef(int index) {
|
||||||
|
if (index >= 0 && index < mEntries.size()) {
|
||||||
|
auto i = next(mEntries.begin(), index);
|
||||||
|
return *i->second;
|
||||||
|
} else {
|
||||||
|
throw "SPITObject index out of range";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void addEntry(unique_ptr<T> entry) {
|
||||||
|
mEntries[entry->getID()] = move(entry);
|
||||||
|
}
|
||||||
|
bool removeEntry(const T &entry) {
|
||||||
|
return removeEntry(entry.getID());
|
||||||
|
}
|
||||||
|
bool removeEntry(const string &id) {
|
||||||
|
auto i = mEntries.find(id);
|
||||||
|
if (i == mEntries.end()) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
mEntries.erase(i);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
int getEntryCount() {
|
||||||
|
return mEntries.size();
|
||||||
|
}
|
||||||
|
|
||||||
|
unordered_map<string, unique_ptr<T>> &getRepo() {
|
||||||
|
return mEntries;
|
||||||
|
}
|
||||||
|
|
||||||
|
void clearEntries() {
|
||||||
|
mEntries.clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
unordered_map<string, unique_ptr<T>> mEntries;
|
||||||
|
};
|
||||||
@@ -1,452 +0,0 @@
|
|||||||
|
|
||||||
#include "MyApp.h"
|
|
||||||
#include "Task.hpp"
|
|
||||||
#include "esp_log.h"
|
|
||||||
#include "Semaphore.hpp"
|
|
||||||
#include "Queue.hpp"
|
|
||||||
#include <list>
|
|
||||||
|
|
||||||
const char *TAG = "SPIT";
|
|
||||||
|
|
||||||
MyApp::MyApp() :
|
|
||||||
_SpitClient (
|
|
||||||
s_ClientName, s_ProjectName,
|
|
||||||
{
|
|
||||||
.onServerEvent = onServerEvent,
|
|
||||||
.onConnectionStatus = onConnectionStatus,
|
|
||||||
.onStartProjectTransfer = onStartProjectTransfer,
|
|
||||||
.onEndProjectTransfer = onEndProjectTransfer,
|
|
||||||
.onProjectClosed = onProjectClosed,
|
|
||||||
.onProjectReport = onProjectReport,
|
|
||||||
.onSpitType = onSpitType,
|
|
||||||
.onSpitTypeRemote = onSpitTypeRemote,
|
|
||||||
.onSpitObject = onSpitObject,
|
|
||||||
.onSpitObjectRemote = onSpitObjectRemote,
|
|
||||||
.onSpitTypeRemoved = onSpitTypeRemoved,
|
|
||||||
.onSpitTypeRemoteRemoved = onSpitTypeRemoteRemoved,
|
|
||||||
.onSpitObjectRemoved = onSpitObjectRemoved,
|
|
||||||
.onSpitObjectRemoteRemoved = onSpitObjectRemoteRemoved,
|
|
||||||
.onPlay = onPlay,
|
|
||||||
.onPlaySpitType = onPlaySpitType,
|
|
||||||
.onPlayRemoteObjectStatus = onPlayRemoteObjectStatus,
|
|
||||||
.onCheckSpitTypeVeto = onCheckSpitTypeVeto,
|
|
||||||
.onCheckSpitObjectVeto = onCheckSpitObjectVeto,
|
|
||||||
}) {
|
|
||||||
}
|
|
||||||
|
|
||||||
string MyApp::m_ServerProjectID{};
|
|
||||||
string MyApp::m_ServerProjectName{};
|
|
||||||
int MyApp::m_ServerFramesPerSecond{44100}; // set when the server reports his project, see eventProjectReport
|
|
||||||
|
|
||||||
void MyApp::init() {
|
|
||||||
SPITType *ptrSPITType1Fix = _SpitClient.createSPITTypeFixed("MySPITAPP_Action1ID", "ActionGroupName", "Action1Name", 0, 0);
|
|
||||||
SPITType *ptrSPITType2Fix = _SpitClient.createSPITTypeFixed("MySPITAPP_Action2ID", "ActionGroupName", "Action2Name", 0, 0);
|
|
||||||
|
|
||||||
// When an action exist which should be done whenever a SPITObject with this SPITType is played,
|
|
||||||
// then you should 'setAssignedActionType' to true
|
|
||||||
_SpitClient.setActionSPITType(ptrSPITType1Fix->getID(), true);
|
|
||||||
_SpitClient.setActionSPITType(ptrSPITType2Fix->getID(), true);
|
|
||||||
_SpitClient.clientProjectLoaded();
|
|
||||||
_SpitClient.startServerAutoDetect();
|
|
||||||
}
|
|
||||||
|
|
||||||
void MyApp::onServerEvent(SPIT_Client::ServerEvent event, const SAD_DetectedServer &p_DetectedServer) {
|
|
||||||
switch (event)
|
|
||||||
{
|
|
||||||
case SPIT_Client::ServerEvent::Detect:
|
|
||||||
ESP_LOGI(TAG, "SERVER DETECTED");
|
|
||||||
ESP_LOGI(TAG, " Name: %s", p_DetectedServer.getName().data());
|
|
||||||
ESP_LOGI(TAG, " ID: %s", p_DetectedServer.getID().data());
|
|
||||||
ESP_LOGI(TAG, " Computer: %s", p_DetectedServer.getComputerName().data());
|
|
||||||
ESP_LOGI(TAG, " IP: %s", p_DetectedServer.getIP().data());
|
|
||||||
ESP_LOGI(TAG, " Port: %s", p_DetectedServer.getPort().data());
|
|
||||||
ESP_LOGI(TAG, " Addition: %s", p_DetectedServer.getAdditions().data());
|
|
||||||
ESP_LOGI(TAG, " ClientIP: %s", p_DetectedServer.getClientIP().data());
|
|
||||||
break;
|
|
||||||
case SPIT_Client::ServerEvent::Lost:
|
|
||||||
ESP_LOGW(TAG, "Server lost Name: %s IP: %s", p_DetectedServer.getName().data(), p_DetectedServer.getIP().data());
|
|
||||||
|
|
||||||
break;
|
|
||||||
case SPIT_Client::ServerEvent::Changed:
|
|
||||||
ESP_LOGW(TAG, "Server lost Name: %s IP: %s", p_DetectedServer.getName().data(), p_DetectedServer.getIP().data());
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//---------------------------------------
|
|
||||||
//---------- Connecting event ----------
|
|
||||||
|
|
||||||
void MyApp::onConnectionStatus(string p_ServerID, string p_ServerComputerName, string p_ServerName, int p_ServerStepTime, int p_ConnectionStatus, int p_OldConnectionStatus) {
|
|
||||||
ESP_LOGI(TAG, "MySPITApp: eventConnectionStatus %d ", p_ConnectionStatus);
|
|
||||||
}
|
|
||||||
|
|
||||||
//-----------------------------------------------------------
|
|
||||||
//---------- Server's Project events ------------------------
|
|
||||||
/**
|
|
||||||
* The Server reports his loaded project
|
|
||||||
* Called when
|
|
||||||
* a) the connection to the server is established.
|
|
||||||
* b) server load a new project
|
|
||||||
* c) server saves the project under a new name
|
|
||||||
* @param p_ProjectID the server project's id (maybe the filename of the project or a part o it or the same as p_ProjectName)
|
|
||||||
* @param p_ProjectName the server project's name
|
|
||||||
* @param p_FramesPerSeoond All times in SPIT are given in frames. FramesPerSecond can be used to convert frames to seconds....
|
|
||||||
*/
|
|
||||||
void MyApp::onProjectReport(string p_ProjectID, string p_ProjectName, int p_FramesPerSeoond) {
|
|
||||||
ESP_LOGI(TAG, "eventProjectReport ID: %s Name: %s FramesPerSecond: %d", p_ProjectID.data(), p_ProjectName.data(), p_FramesPerSeoond);
|
|
||||||
m_ServerProjectID = p_ProjectID;
|
|
||||||
m_ServerProjectName = p_ProjectName;
|
|
||||||
m_ServerFramesPerSecond = p_FramesPerSeoond;
|
|
||||||
// set the frames per second as the server - perhaps the client's time values have to be recalculated.
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Called when the server closes his project.
|
|
||||||
* @param p_ProjectID the id of the project
|
|
||||||
* The server loads only one project at time-> the ID is not actually necessary
|
|
||||||
*/
|
|
||||||
void MyApp::onProjectClosed(string p_ProjectID) {
|
|
||||||
ESP_LOGI(TAG, "eventProjectClosed ID: %s", p_ProjectID.data());
|
|
||||||
// If we don't save SPITServer's project specific information
|
|
||||||
// perhaps close all SPITObjects and RemoteSPITObjects to avoid conflicts, when the SPITServer loads a new project
|
|
||||||
// SPITObject::clearSPITObjects();
|
|
||||||
// SPITObject::clearSPITObjectsRemote();
|
|
||||||
}
|
|
||||||
|
|
||||||
// The server starts the transfer of its project, that means
|
|
||||||
// All SPITTypes and SPITObjects available on the server are transferred in the following.
|
|
||||||
void MyApp::onStartProjectTransfer() {
|
|
||||||
ESP_LOGI(TAG, "eventStartProjectTransfer");
|
|
||||||
}
|
|
||||||
// The transfer of the server's SPITTypes and SPITObjects is finished.
|
|
||||||
void MyApp::onEndProjectTransfer() {
|
|
||||||
ESP_LOGI(TAG, "eventEndProjectTransfer");
|
|
||||||
}
|
|
||||||
|
|
||||||
//----------------------------------------------------
|
|
||||||
//--------- SPITType events ----------
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The SPITCLientInterface (implemented by this) will be asked to veto the SPITType while SPIT_Client.parseReportSPITType.<br>
|
|
||||||
* @param p_ReportSPITType
|
|
||||||
* @return false = the SPITType is denied, true = the SPITType is accepted
|
|
||||||
*/
|
|
||||||
bool MyApp::onCheckSpitTypeVeto(SPIT_Message::ReportSPITType* p_ReportSPITType) {
|
|
||||||
if (p_ReportSPITType == NULL) return true;
|
|
||||||
SPITType* ptrSPITType;
|
|
||||||
ptrSPITType = SPITType::getSPITType(p_ReportSPITType->getID());
|
|
||||||
|
|
||||||
//Don't allow foreign SPITTypes
|
|
||||||
if (ptrSPITType == NULL) return false;
|
|
||||||
if (ptrSPITType->getCreatedByClient() == false) return false;
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool MyApp::onCheckSpitObjectVeto(SPIT_Message::ReportSPITObject* p_ReportSPITObject) {
|
|
||||||
if (p_ReportSPITObject == NULL) return true;
|
|
||||||
SPITType* ptrSPITType;
|
|
||||||
ptrSPITType = SPITType::getSPITType(p_ReportSPITObject->getSPITTypeID());
|
|
||||||
if (ptrSPITType == NULL) return false;
|
|
||||||
|
|
||||||
//Don't allow SPITObjects which refers to a SPITType which is not created by this client - other SPITTypes cannot be handled here
|
|
||||||
//if (ptrSPITType->getCreatedByClient() == false) return false;
|
|
||||||
|
|
||||||
// SPITObject* ptrSPITObject;
|
|
||||||
// ptrSPITObject = SPITObject::getSPITObject(p_ReportSPITOnject->getID());
|
|
||||||
//Don't allow foreign SPITTypes
|
|
||||||
// if (ptrSPITObject == NULL) return false;
|
|
||||||
|
|
||||||
return true;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Called when the server has created, loaded or changed a SPITType.
|
|
||||||
* May also occur when the server confirms a SPITType created or changed by the client.
|
|
||||||
* @param p_New true = server created a new SPITType
|
|
||||||
* false = server changed a existing SPITType
|
|
||||||
* @param p_SPITType a reference to a copy of the SPITType instance.
|
|
||||||
*/
|
|
||||||
void MyApp::onSpitType(bool p_New, const SPITType &p_SPITType) {
|
|
||||||
// fetch information of the SPITType
|
|
||||||
if (p_New) {
|
|
||||||
ESP_LOGD(TAG, "eventSPITType NEW");
|
|
||||||
} else {
|
|
||||||
ESP_LOGD(TAG, "eventSPITType CHANGED");
|
|
||||||
}
|
|
||||||
ESP_LOGI(TAG, " ID: %s GroupName: %s Name: %s confirmed: %d", p_SPITType.getID().data(), p_SPITType.getGroupName().data(), p_SPITType.getName().data(), p_SPITType.getConfirmed());
|
|
||||||
|
|
||||||
// Check your actions
|
|
||||||
// Whenever you provide an action for this SPITType take this over in your code.
|
|
||||||
// call _SpitClient.setActionSPITType(p_SPITType.getID(), true);
|
|
||||||
|
|
||||||
// for our little excample as described in loadClientProject we do following
|
|
||||||
// This may be redundand, because we defined the SPITTypes as fixed, so the server can't change them
|
|
||||||
// But foe all SPITTypes which are not fixed we need to setActionSPITType
|
|
||||||
|
|
||||||
// if ("MySPITAPP_Action1ID" == p_SPITType.getID()) {
|
|
||||||
// _SpitClient.setActionSPITType(p_SPITType.getID(), true);
|
|
||||||
// }
|
|
||||||
// if ("MySPITAPP_Action2ID" == p_SPITType.getID()) {
|
|
||||||
// _SpitClient.setActionSPITType(p_SPITType.getID(), true);
|
|
||||||
// }
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* Called when the server has created or changed a Remote SPITType.
|
|
||||||
* Remote SPITType are used in Remote SPITObjects. A Remote SPITObject is used to remote control the SPITServer.
|
|
||||||
* @param p_New true = server created a new SPITType / false = server changed a existing SPITType
|
|
||||||
*/
|
|
||||||
void MyApp::onSpitTypeRemote(bool p_New, const SPITType &p_SPITType) {
|
|
||||||
if (p_New) {
|
|
||||||
ESP_LOGD(TAG, "eventSPITTypeRemote NEW");
|
|
||||||
} else {
|
|
||||||
// we had to inform all Remote SPITObjects using the p_SPITType
|
|
||||||
// perhaps the SPITObject uses information from the SPITType
|
|
||||||
SPITObject *ptrSPITObject;
|
|
||||||
int intSPITObjectCount;
|
|
||||||
intSPITObjectCount = SPITObject::getSPITObjectRemoteCount();
|
|
||||||
for (int intObject = 0; intObject < intSPITObjectCount; intObject++) {
|
|
||||||
ptrSPITObject = SPITObject::getSPITObjectRemote(intObject);
|
|
||||||
if (ptrSPITObject == NULL)
|
|
||||||
continue;
|
|
||||||
if (ptrSPITObject->getSPITTypeID() == p_SPITType.getID()) {
|
|
||||||
// call ecentSPITObjectRemote
|
|
||||||
onSpitObjectRemote(false, p_SPITType, *ptrSPITObject);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
ESP_LOGD(TAG, "eventSPITTypeRemote CHANGED");
|
|
||||||
}
|
|
||||||
ESP_LOGD(TAG, "ID: %s GroupName: %s Name: %s confirmed: %d",
|
|
||||||
p_SPITType.getID().data(), p_SPITType.getGroupName().data(), p_SPITType.getName().data(), p_SPITType.getConfirmed());
|
|
||||||
// this is a remote SPITType, if you want you can list this for later remote use.
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Called when the server has removed a SPITType.
|
|
||||||
* After this function has been exited the SPITType is emeoved from the SPITType-List and the pointer is deleted.
|
|
||||||
* So use the pointer immediately or use the copyconstructor to make a copy for extended use.
|
|
||||||
* You have to release the copy yourself later (delete ptr...)
|
|
||||||
*/
|
|
||||||
void MyApp::onSpitTypeRemoved(const SPITType &p_SPITType) {
|
|
||||||
ESP_LOGD(TAG, "eventSPITType Removed");
|
|
||||||
ESP_LOGD(TAG, " ID: %s GroupName: %s Name: %s\n", p_SPITType.getID().data(), p_SPITType.getGroupName().data(), p_SPITType.getName().data());
|
|
||||||
|
|
||||||
// Check your actions
|
|
||||||
// take the removal of the SPITType over in your code
|
|
||||||
|
|
||||||
// CAUTION: Deleted SPIT types can be added later again (perhaps per UNDO on the SPITServer)
|
|
||||||
//-> don't remove your assigned action immediately - keep it to reassign it later
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* Called when the server has removed a Remote SPITType.
|
|
||||||
* Remote SPITType are used in Remote SPITObjects. A Remote SPITObject is used to remote control the SPITServer.
|
|
||||||
* After this function has been exited the SPITType is emeoved from the Remote SPITType-List and the pointer is deleted.
|
|
||||||
* So use the pointer immediately or use the copyconstructor to make a copy for extended use.
|
|
||||||
* You have to release the copy yourself later (delete ptr...)
|
|
||||||
* @param p_SPITType a reference to a copy of the SPITType instance.
|
|
||||||
*/
|
|
||||||
void MyApp::onSpitTypeRemoteRemoved(const SPITType &p_SPITType) {
|
|
||||||
ESP_LOGD(TAG, "eventSPITTypeRemote Removed");
|
|
||||||
ESP_LOGD(TAG, " ID: %s GroupName: %s Name: %s\n", p_SPITType.getID().data(), p_SPITType.getGroupName().data(), p_SPITType.getName().data());
|
|
||||||
|
|
||||||
// This is a remote SPITType
|
|
||||||
// If you have listet this prior you should remove it from the list
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Called when the server has created, loaded or changed a SPITObject.
|
|
||||||
* May also occur when the server confirms a SPITObject created by the client, what the client should never do!!.
|
|
||||||
* @param p_New true = server created a new SPITObject
|
|
||||||
* false = server changed a existing SPITObject
|
|
||||||
* @param p_SPITType a reference to a copy of the associated SPITType instance.
|
|
||||||
* @param p_SPITObject a reference to a copy of the SPITObject instance.
|
|
||||||
*/
|
|
||||||
void MyApp::onSpitObject(bool p_New, const SPITType &p_SPITType, const SPITObject &p_SPITObject) {
|
|
||||||
if (p_New) {
|
|
||||||
ESP_LOGI(TAG, "eventSPITObject NEW");
|
|
||||||
} else {
|
|
||||||
ESP_LOGD(TAG, "eventSPITObject CHANGED");
|
|
||||||
}
|
|
||||||
ESP_LOGI(TAG, " ID: %s Name: %s -> SPITType: %s", p_SPITObject.getID().data(), p_SPITObject.getName().data(), p_SPITType.getName().data());
|
|
||||||
|
|
||||||
// check your actions
|
|
||||||
// Whenever you provide an action for this SPITObject take this over in your code.
|
|
||||||
// call _SpitClient.setActionSPITObject(p_SPITObject.getID(), true);
|
|
||||||
|
|
||||||
// for our little excample as described in loadClientProject:
|
|
||||||
// We have only actions for SPITTypes - means every SPITObject with the associated "Actionx"-SPITTypes will trigger the action when it is played
|
|
||||||
//-> no need to do something here, because setActionSPITType has been set prior and the SPITObject will automatically inherits this
|
|
||||||
// SPITObjects with other SPITTypes asscciated will trigger no actions
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* Called when the server has created or changed a Remote SPITObject.
|
|
||||||
* A Remote SPITObject is used to remote control the SPITServer.
|
|
||||||
* @param p_New true = server created a new remote SPITObject
|
|
||||||
* false = server changed a existing remote SPITObject
|
|
||||||
* @param p_SPITType a reference to a copy of the associated SPITType instance.
|
|
||||||
* @param p_SPITObject a reference to a copy of the SPITObject instance.
|
|
||||||
*/
|
|
||||||
void MyApp::onSpitObjectRemote(bool p_New, const SPITType &p_SPITType, const SPITObject &p_SPITObject) {
|
|
||||||
if (p_New) {
|
|
||||||
ESP_LOGI(TAG, "eventSPITObjectRemote NEW");
|
|
||||||
} else {
|
|
||||||
ESP_LOGD(TAG, "eventSPITObjectRemote CHANGED");
|
|
||||||
}
|
|
||||||
ESP_LOGI(TAG, " ID: %s Name: %s -> SPITType: %s", p_SPITObject.getID().data(), p_SPITObject.getName().data(), p_SPITType.getName().data());
|
|
||||||
|
|
||||||
// This is a remote SPITObject which can be used to remote control the server.
|
|
||||||
// If you want you can list this for later use
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Called when the server has removed a SPITObject.
|
|
||||||
* After this function has been exited the SPITObject is emeoved from the SPITObject-List and the pointer is deleted.
|
|
||||||
* So use the pointer immediately or use the copyconstructor to make a copy for extended use.
|
|
||||||
* You have to release the copy yourself later (delete ptr...)
|
|
||||||
* @param p_SPITType a reference to a copy of the associated SPITType instance.
|
|
||||||
* @param p_SPITObject a reference to a copy of the SPITObject instance.
|
|
||||||
*/
|
|
||||||
void MyApp::onSpitObjectRemoved(const SPITType &p_SPITType, const SPITObject &p_SPITObject) {
|
|
||||||
ESP_LOGD(TAG, "eventSPITObject Removed");
|
|
||||||
ESP_LOGD(TAG, " ID: %s Name: %s\n", p_SPITObject.getID().data(), p_SPITObject.getName().data());
|
|
||||||
|
|
||||||
// Check your actions
|
|
||||||
// take the removal of the SPITObject over in your code
|
|
||||||
|
|
||||||
// CAUTION: Deleted SPITObjects can be added later again (perhaps per UNDO on the SPITServer)
|
|
||||||
//-> don't remove your assigned action immediately - keep it to reassign it later
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* Called when the server has removed a Remote SPITObject.
|
|
||||||
* A Remote SPITObject is used to remote control the SPITServer.
|
|
||||||
* After this function has been exited the SPITObject is emeoved from the SPITObject-List and the pointer is deleted.
|
|
||||||
* So use the pointer immediately or use the copyconstructor to make a copy for extended use.
|
|
||||||
* You have to release the copy yourself later (delete ptr...)
|
|
||||||
* @param p_SPITType a reference to a copy of the associated SPITType instance.
|
|
||||||
* @param p_SPITObject a reference to a copy of the SPITObject instance.
|
|
||||||
*/
|
|
||||||
void MyApp::onSpitObjectRemoteRemoved(const SPITType &p_SPITType, const SPITObject &p_SPITObject) {
|
|
||||||
ESP_LOGD(TAG, "eventSPITObjectRemote Removed");
|
|
||||||
ESP_LOGD(TAG, " ID: %s Name: %s\n", p_SPITObject.getID().data(), p_SPITObject.getName().data());
|
|
||||||
|
|
||||||
// This is a remote SPITObject
|
|
||||||
// If you have listet this prior you should remove it from the list
|
|
||||||
}
|
|
||||||
|
|
||||||
//--------------------------------------------------------------
|
|
||||||
//---------------- Playing SPITObjects ----------------
|
|
||||||
// Following is called when the SPITServer play SPITObjects.
|
|
||||||
// For every step the server does following sequence occurs:
|
|
||||||
// a) eventPlay
|
|
||||||
// b) several eventPlayObject for each actual played SPITObjectin this step
|
|
||||||
// NEXT STAP of the server
|
|
||||||
// a) eventPlay
|
|
||||||
// b) several eventPlayObject for each actual played SPITObject in this step
|
|
||||||
// ...
|
|
||||||
|
|
||||||
// SPITServer may use several methods for playing SPITObjects.
|
|
||||||
// e.g. liveSHOWsoftware has the timeline and jingles which plays objects, where the timeline the main player is.
|
|
||||||
// SPIT distinguishes between the different players. All eventPlay... functions contain the information which player plays the SPIT object.
|
|
||||||
|
|
||||||
void MyApp::onPlay(string p_PlayerID, string p_PlayerName, char p_PlayerType, bool p_PlayerIsRunning, long long p_TimeFrames) {
|
|
||||||
ESP_LOGD(TAG, "eventPlay Player: %s Runs: %d Time: %lld", p_PlayerName.data(), p_PlayerIsRunning, p_TimeFrames);
|
|
||||||
|
|
||||||
switch (p_PlayerType) {
|
|
||||||
case SPIT_Client::PLAYERTYPE_MAIN:
|
|
||||||
// p_FrameTimes contains the position inside the server's project, we can use it like a timecode
|
|
||||||
int intMilliseconds;
|
|
||||||
intMilliseconds = (int)(((double)p_TimeFrames / (double)m_ServerFramesPerSecond) * 1000);
|
|
||||||
break;
|
|
||||||
case SPIT_Client::PLAYERTYPE_CONTINOUS:
|
|
||||||
// The olayer is playing only single Object sequences sometime during the project
|
|
||||||
break;
|
|
||||||
case SPIT_Client::PLAYERTYPE_DISCRETE:
|
|
||||||
// Only discrete values where submitted, e.g the fader position of remote faders.
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Called when the SPITServer plays a SPITObject. For every played SPITObject one eventPlayObject is called.
|
|
||||||
* You can decide here which action should be done or not.
|
|
||||||
*
|
|
||||||
* @param p_Started true = The SPITObject is newly played (e.g. in liveSHOWsoftware the cursor enters the SPITObject)
|
|
||||||
* @param p_Ended Das true = Playback of SPITObject finished (e.g. in liveSHOWsoftware the cursor has exited the SPIT object)
|
|
||||||
* @param p_SPITType the associated SPITType of p_SPITObject
|
|
||||||
* @param p_SPITObject the actual played or stopped SPITObject
|
|
||||||
* @param p_PlayObject contains information about the play status:
|
|
||||||
* frame where the cursor is inside the SPITObject
|
|
||||||
* whether the player is running or not
|
|
||||||
* the actual value of the SPITObject (in liveSHOWsoftware objects ma faded in or out or the main value is decreased, ..
|
|
||||||
*/
|
|
||||||
void MyApp::onPlaySpitType(string p_PlayerID, string p_SPITTypeID, bool p_PlayerIsRunning, bool p_Started, bool p_Ended, double p_Value) {
|
|
||||||
// double doubleValue = ((double)p_PlayObject.getValue() / 1000000) * ((double)p_PlayObject.getValueFactor() / 1000000);
|
|
||||||
|
|
||||||
ESP_LOGD(TAG, "eventPlayObject Player: %s is running: %d Object Started: %d Stopped: %d", p_PlayerID.data(), p_PlayerIsRunning, p_Started, p_Ended);
|
|
||||||
// ESP_LOGD(TAG, " SPITType: %s SPITObject: %s Position: %lld Value: %f\n", p_SPITTypeID.data(), p_SPITObject.getName().data(), p_PlayObject.getFrameInside(), doubleValue);
|
|
||||||
ESP_LOGD(TAG, " SPITType: %s Value: %f\n", p_SPITTypeID.data(), p_Value);
|
|
||||||
|
|
||||||
if (p_SPITTypeID == "MySPITAPP_Action1ID") { // do Action 1
|
|
||||||
// we can get some information about the play status
|
|
||||||
if (p_Started == true) {
|
|
||||||
ESP_LOGI(TAG, "MyApp AKTION 1 started Value: %f and running: %d", p_Value, p_PlayerIsRunning);
|
|
||||||
} else if (p_Ended == true) {
|
|
||||||
ESP_LOGI(TAG, "MyApp AKTION 1 ended"); // p_PlayObject.getFrameInside() is -1
|
|
||||||
} else {
|
|
||||||
ESP_LOGD(TAG, "MyApp AKTION 1 is played Value: %f and running: %d", p_Value, p_PlayerIsRunning);
|
|
||||||
}
|
|
||||||
} else if (p_SPITTypeID == "MySPITAPP_Action2ID") { // do Action 2
|
|
||||||
if (p_Started == true) {
|
|
||||||
ESP_LOGI(TAG, "AKTION 2 started Value: %f and running: %d", p_Value, p_PlayerIsRunning);
|
|
||||||
} else if (p_Ended == true) {
|
|
||||||
ESP_LOGI(TAG, "AKTION 2 ended"); // p_PlayObject.getFrameInside() is -1
|
|
||||||
} else {
|
|
||||||
ESP_LOGD(TAG, "AKTION 2 is played Value: %f and running: %d", p_Value, p_PlayerIsRunning);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//--------------------------------------------------------------
|
|
||||||
//---------------- Remote Control SPITServer ----------------
|
|
||||||
// The SPITServer has sent all possibilities to control it remotely - remote SPITObjects - see eventSPITObjectRemote
|
|
||||||
// Some of them may control functionality with values (fader psotions for loudness of sound, ...).
|
|
||||||
// When the server changes one of these value objects, it sends an eventPlayRemoteObjectStatus.
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Called when a remote SpitObject which value function is changed by the server.
|
|
||||||
* This allows the Client to adjust its display for the remote command.
|
|
||||||
* @param p_SPITType the assigned remote SPITType of p_SPITObject
|
|
||||||
* @param p_SPITObject the remote SPITObject which is changed
|
|
||||||
* @param p_FrameInsideObject can be discarded
|
|
||||||
* @param p_Value the new value
|
|
||||||
*/
|
|
||||||
void MyApp::onPlayRemoteObjectStatus(const SPITType &p_SPITType, const SPITObject &p_SPITObject, long long p_FrameInsideObject, int p_Value) {
|
|
||||||
ESP_LOGD(TAG, "eventPlayRemoteObjectStatus RemoteSPITType: %s RemoteSPITObject: %s Position: %lld Value: %d", p_SPITType.getName().data(), p_SPITObject.getName().data(), p_FrameInsideObject, p_Value);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Send a remote control command to the SPITServer.
|
|
||||||
* There may be different command types:
|
|
||||||
* a) Some don't use value e.g. go to next scene, olay a jingle, ..
|
|
||||||
* b) Some use values e.g. the main sound fader
|
|
||||||
* @param p_SPITObjectID the id of the remote SPITObject (this represents the remote control command)
|
|
||||||
* @param p_Valueppm the value in ppm
|
|
||||||
* in case a) the value is ignored
|
|
||||||
* in case b) the value is used
|
|
||||||
* @param p_ValueFlag indicates how the server should use p_Valueppm:
|
|
||||||
* VALUEFLAG_DIRECT (0x00) The server will overwrite his existing value with p_Value
|
|
||||||
* VALUEFLAG_INCREASE (0x01) The server increases his existing value by p_Valueppm
|
|
||||||
* VALUEFLAG_DECREASE (0x01) The server decreases his existing value by p_Valueppm
|
|
||||||
*/
|
|
||||||
void MyApp::sendRemoteObject(string p_SPITObjectID, int p_Valueppm, char p_ValueFlag) {
|
|
||||||
_SpitClient.sendRemoteObject(p_SPITObjectID, p_Valueppm, p_ValueFlag);
|
|
||||||
}
|
|
||||||
|
|
||||||
void MyApp::testLiveShowRemote() {
|
|
||||||
// We jump to the next Scenebridge - no Value is needed
|
|
||||||
_SpitClient.sendRemoteObject("playControlStart");
|
|
||||||
}
|
|
||||||
@@ -1,177 +0,0 @@
|
|||||||
/*
|
|
||||||
* To change this license header, choose License Headers in Project Properties.
|
|
||||||
* To change this template file, choose Tools | Templates
|
|
||||||
* and open the template in the editor.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* SAD_DetectedServer holds information about SPIT Server detected by ServerAutoDetection (SAD).
|
|
||||||
* File: SAD_DetectedServer.cpp
|
|
||||||
* Author: Hagi
|
|
||||||
*
|
|
||||||
* Created on 4. Mai 2019, 13:51
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "SAD_DetectedServer.hpp"
|
|
||||||
#include "esp_log.h"
|
|
||||||
|
|
||||||
static const char * TAG = "SpitSrv";
|
|
||||||
|
|
||||||
unordered_map<string, SAD_DetectedServer*> SAD_DetectedServer::s_DetectedServers;
|
|
||||||
|
|
||||||
SAD_DetectedServer::~SAD_DetectedServer() {
|
|
||||||
}
|
|
||||||
//----- Detected Server -----
|
|
||||||
SAD_DetectedServer::SAD_DetectedServer() {
|
|
||||||
m_ID = "";
|
|
||||||
m_Name = "";
|
|
||||||
m_ComputerName = "";
|
|
||||||
m_ClientIP = "";
|
|
||||||
m_Port = "";
|
|
||||||
m_Additions = "";
|
|
||||||
m_IPIsIP4 = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
void SAD_DetectedServer::setProjectName(string p_ServerProjectName) {
|
|
||||||
if (m_ServerProjectName.compare(p_ServerProjectName) != 0) {
|
|
||||||
if (m_New == false) {
|
|
||||||
m_Changed = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
m_ServerProjectName = p_ServerProjectName;
|
|
||||||
}
|
|
||||||
|
|
||||||
void SAD_DetectedServer::cycleStart() {
|
|
||||||
for (auto i = s_DetectedServers.begin(); i != s_DetectedServers.end(); i++) {
|
|
||||||
i->second->startCycleSAD();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
void SAD_DetectedServer::cycleEnd(I_SAD_Client& sadClient) {
|
|
||||||
list<SAD_DetectedServer*> o_LostServers;
|
|
||||||
list<SAD_DetectedServer*> o_NewServers;
|
|
||||||
list<SAD_DetectedServer*> o_ChangedServers;
|
|
||||||
SAD_DetectedServer* ptrDetectedServer;
|
|
||||||
{
|
|
||||||
for (auto i = s_DetectedServers.begin(); i != s_DetectedServers.end(); i++) {
|
|
||||||
ptrDetectedServer = i->second;
|
|
||||||
if (ptrDetectedServer->getFoundAgain() == false) {
|
|
||||||
o_LostServers.push_back(ptrDetectedServer);
|
|
||||||
ptrDetectedServer->endCycleSAD();
|
|
||||||
}
|
|
||||||
else if (ptrDetectedServer->getNew()) {
|
|
||||||
o_NewServers.push_back(ptrDetectedServer);
|
|
||||||
ptrDetectedServer->setNew(false);
|
|
||||||
ptrDetectedServer->endCycleSAD();
|
|
||||||
}
|
|
||||||
else if (ptrDetectedServer->getChanged()) {
|
|
||||||
o_ChangedServers.push_back(ptrDetectedServer);
|
|
||||||
ptrDetectedServer->endCycleSAD();
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
ptrDetectedServer->endCycleSAD();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
//Notify client interface about lost servers
|
|
||||||
for (auto i = o_LostServers.begin(); i != o_LostServers.end(); i++) {
|
|
||||||
ptrDetectedServer = *i;
|
|
||||||
sadClient.eventServerLost(ptrDetectedServer->getID(), ptrDetectedServer->getName(),
|
|
||||||
ptrDetectedServer->getComputerName(), ptrDetectedServer->getIP(), ptrDetectedServer->getPort(), ptrDetectedServer->getAdditions(),ptrDetectedServer->getProjectName(),
|
|
||||||
ptrDetectedServer->getClientIP(),
|
|
||||||
ptrDetectedServer->getIpIsIP4());
|
|
||||||
}
|
|
||||||
//Remove lost servers
|
|
||||||
for (auto i = o_LostServers.begin(); i != o_LostServers.end(); i++) {
|
|
||||||
ptrDetectedServer = *i;
|
|
||||||
removeDetectedServer(ptrDetectedServer);
|
|
||||||
}
|
|
||||||
o_LostServers.clear();
|
|
||||||
|
|
||||||
for (auto i = o_NewServers.begin(); i != o_NewServers.end(); i++) {
|
|
||||||
ptrDetectedServer = *i;
|
|
||||||
sadClient.eventServerDetected(ptrDetectedServer->getID(), ptrDetectedServer->getName(),
|
|
||||||
ptrDetectedServer->getComputerName(), ptrDetectedServer->getIP(), ptrDetectedServer->getPort(), ptrDetectedServer->getAdditions(),ptrDetectedServer->getProjectName(),
|
|
||||||
ptrDetectedServer->getClientIP(),
|
|
||||||
ptrDetectedServer->getIpIsIP4());
|
|
||||||
}
|
|
||||||
o_NewServers.clear();
|
|
||||||
for (auto i = o_ChangedServers.begin(); i != o_ChangedServers.end(); i++) {
|
|
||||||
ptrDetectedServer = *i;
|
|
||||||
sadClient.eventServerChanged(ptrDetectedServer->getID(), ptrDetectedServer->getName(),
|
|
||||||
ptrDetectedServer->getComputerName(), ptrDetectedServer->getIP(), ptrDetectedServer->getPort(), ptrDetectedServer->getAdditions(),ptrDetectedServer->getProjectName(),
|
|
||||||
ptrDetectedServer->getClientIP(),
|
|
||||||
ptrDetectedServer->getIpIsIP4());
|
|
||||||
}
|
|
||||||
o_ChangedServers.clear();
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* Used by SAD_Client to add a found SPITServer - don't use this manually
|
|
||||||
* @param p_IsIP4 true = the server is reached via a IP4 address<br>false = the server is reahed via a IP6 address
|
|
||||||
* @param p_ServerID the id of the server, every instance of a SPITServer has an own id
|
|
||||||
* @param p_ServerParams the server's parameter
|
|
||||||
*/
|
|
||||||
void SAD_DetectedServer::addDetectedServer(bool p_IsIP4, string p_ServerID, string p_ServerParams[]) {
|
|
||||||
SAD_DetectedServer* ptrDetectedServer;
|
|
||||||
{
|
|
||||||
auto i = s_DetectedServers.find(p_ServerID);
|
|
||||||
if (i != s_DetectedServers.end()) {
|
|
||||||
ptrDetectedServer = i->second;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
ptrDetectedServer = new SAD_DetectedServer();
|
|
||||||
ptrDetectedServer->setID(p_ServerParams[PARAMINDEX_ID]);
|
|
||||||
ptrDetectedServer->setNew(true);
|
|
||||||
}
|
|
||||||
ptrDetectedServer->setFoundAgain();
|
|
||||||
|
|
||||||
//second prefer IP4
|
|
||||||
if (p_IsIP4 == true) {
|
|
||||||
ptrDetectedServer->setIP(p_ServerParams[PARAMINDEX_IP]);
|
|
||||||
ptrDetectedServer->setIPIsIP4(true);
|
|
||||||
ptrDetectedServer->setClientIP(p_ServerParams[PARAMINDEX_CLIENTIP]);
|
|
||||||
}
|
|
||||||
else if (ptrDetectedServer->getIpIsIP4() == false){
|
|
||||||
ptrDetectedServer->setIP(p_ServerParams[PARAMINDEX_IP]);
|
|
||||||
ptrDetectedServer->setClientIP(p_ServerParams[PARAMINDEX_CLIENTIP]);
|
|
||||||
}
|
|
||||||
ptrDetectedServer->setName(p_ServerParams[PARAMINDEX_NAME]);
|
|
||||||
ptrDetectedServer->setComputerName(p_ServerParams[PARAMINDEX_COMPUTERNAME]);
|
|
||||||
ptrDetectedServer->setPort(p_ServerParams[PARAMINDEX_PORT]);
|
|
||||||
ptrDetectedServer->setAdditions(p_ServerParams[PARAMINDEX_ADDITIONS]);
|
|
||||||
ptrDetectedServer->setProjectName(p_ServerParams[PARAMINDEX_SERVERPROJECTNAME]);
|
|
||||||
|
|
||||||
s_DetectedServers[ptrDetectedServer->getID()] = ptrDetectedServer;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* Used by SAD_Client to remove a SPITServer - don't use this manually
|
|
||||||
* @param p_DetectedServer
|
|
||||||
*/
|
|
||||||
void SAD_DetectedServer::removeDetectedServer(SAD_DetectedServer* p_DetectedServer) {
|
|
||||||
SAD_DetectedServer* o_DetectedServer;
|
|
||||||
{
|
|
||||||
auto i = s_DetectedServers.find(p_DetectedServer->getID());
|
|
||||||
if (i != s_DetectedServers.end()) {
|
|
||||||
o_DetectedServer = i->second;
|
|
||||||
i = s_DetectedServers.erase(i);
|
|
||||||
delete o_DetectedServer;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Used by SAD_Client to clear all found SPITServers - don't use this manually
|
|
||||||
*/
|
|
||||||
void SAD_DetectedServer::clearDetectedServers() {
|
|
||||||
SAD_DetectedServer* ptrDetectedServer;
|
|
||||||
{
|
|
||||||
for (auto i = s_DetectedServers.begin(); i != s_DetectedServers.end(); i++) {
|
|
||||||
ptrDetectedServer = i->second;
|
|
||||||
i = s_DetectedServers.erase(i);
|
|
||||||
delete ptrDetectedServer;
|
|
||||||
if (i == s_DetectedServers.end()) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
+136
-326
@@ -14,283 +14,50 @@
|
|||||||
|
|
||||||
#include "SPITObject.h"
|
#include "SPITObject.h"
|
||||||
#include "SPITSocket.h"
|
#include "SPITSocket.h"
|
||||||
|
#include "esp_log.h"
|
||||||
unordered_map<string, SPITObject*> SPITObject::s_SPITObjects;
|
|
||||||
unordered_map<string, SPITObject*> SPITObject::s_SPITObjectsRemote;
|
|
||||||
|
|
||||||
SPITObject* SPITObject::getSPITObject(string p_ID) {
|
|
||||||
{
|
|
||||||
auto i = s_SPITObjects.find(p_ID);
|
|
||||||
if (i == s_SPITObjects.end()) {
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
return i->second;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* Returns the reference of the SPITObject with ID == p_ID.<br>
|
|
||||||
* Throws an exception if no SPITObject is not found.<br>
|
|
||||||
* @param p_ID the ID
|
|
||||||
* @return reference of the SPITType with ID == p_ID
|
|
||||||
*/
|
|
||||||
const SPITObject& SPITObject::getSPITObjectRef(string p_ID) {
|
|
||||||
{
|
|
||||||
auto i = s_SPITObjects.find(p_ID);
|
|
||||||
if (i == s_SPITObjects.end()) {
|
|
||||||
throw "SPITObject no SPITObject with given id";
|
|
||||||
}
|
|
||||||
return *(i->second);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
SPITObject* SPITObject::getSPITObjectRemote(string p_ID) {
|
|
||||||
{
|
|
||||||
auto i = s_SPITObjectsRemote.find(p_ID);
|
|
||||||
if (i == s_SPITObjectsRemote.end()) {
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
return i->second;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* Returns the reference of the remote SPITObject with ID == p_ID.<br>
|
|
||||||
* Throws an exception if no SPITObject is not found.<br>
|
|
||||||
* @param p_ID the ID
|
|
||||||
* @return reference of the SPITType with ID == p_ID
|
|
||||||
*/
|
|
||||||
const SPITObject& SPITObject::getSPITObjectRemoteRef(string p_ID) {
|
|
||||||
{
|
|
||||||
auto i = s_SPITObjectsRemote.find(p_ID);
|
|
||||||
if (i == s_SPITObjectsRemote.end()) {
|
|
||||||
throw "Remote SPITObject no SPITObject with given id";
|
|
||||||
}
|
|
||||||
return *(i->second);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
bool SPITObject::addSPITObject(SPITObject* p_ptrSPITObject) {
|
|
||||||
if (p_ptrSPITObject == NULL) return false;
|
|
||||||
{
|
|
||||||
s_SPITObjects[p_ptrSPITObject->getID()] = p_ptrSPITObject;
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
bool SPITObject::addSPITObjectRemote(SPITObject* p_ptrSPITObject) {
|
|
||||||
if (p_ptrSPITObject == NULL) return false;
|
|
||||||
{
|
|
||||||
s_SPITObjectsRemote[p_ptrSPITObject->getID()] = p_ptrSPITObject;
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
bool SPITObject::removeSPITObject(SPITObject* p_ptrSPITObject) {
|
|
||||||
if (p_ptrSPITObject == NULL) return false;
|
|
||||||
return removeSPITObject(p_ptrSPITObject->getID());
|
|
||||||
}
|
|
||||||
bool SPITObject::removeSPITObject(string p_SPITObjectID) {
|
|
||||||
{
|
|
||||||
auto i = s_SPITObjects.find(p_SPITObjectID);
|
|
||||||
if (i == s_SPITObjects.end()) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
i = s_SPITObjects.erase(i);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
bool SPITObject::removeSPITObjectRemote(SPITObject* p_ptrSPITObject) {
|
|
||||||
if (p_ptrSPITObject == NULL) return false;
|
|
||||||
return removeSPITObjectRemote(p_ptrSPITObject->getID());
|
|
||||||
}
|
|
||||||
bool SPITObject::removeSPITObjectRemote(string p_ptrSPITObject) {
|
|
||||||
{
|
|
||||||
auto i = s_SPITObjectsRemote.find(p_ptrSPITObject);
|
|
||||||
if (i == s_SPITObjectsRemote.end()) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
i = s_SPITObjectsRemote.erase(i);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
int SPITObject::getSPITObjectCount() {
|
|
||||||
return s_SPITObjects.size();
|
|
||||||
}
|
|
||||||
int SPITObject::getSPITObjectRemoteCount() {
|
|
||||||
return s_SPITObjectsRemote.size();
|
|
||||||
}
|
|
||||||
SPITObject* SPITObject::getSPITObject(int p_Index) {
|
|
||||||
SPITObject* ptrSPITObject = NULL;
|
|
||||||
{
|
|
||||||
if (p_Index >= 0 && p_Index < s_SPITObjects.size()) {
|
|
||||||
unordered_map<string, SPITObject*>::iterator i = next(s_SPITObjects.begin(), p_Index);
|
|
||||||
ptrSPITObject = i->second;
|
|
||||||
return ptrSPITObject;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* Returns a reference to the SPITObject at position p_Index.<br>
|
|
||||||
* Throws an exception if p_Index is out of range.<br>
|
|
||||||
* @param p_Index position
|
|
||||||
* @return the reference of the SPITObject at position.
|
|
||||||
*/
|
|
||||||
const SPITObject& SPITObject::getSPITObjectRef(int p_Index) {
|
|
||||||
SPITObject* ptrSPITObject = NULL;
|
|
||||||
{
|
|
||||||
if (p_Index >= 0 && p_Index < s_SPITObjects.size()) {
|
|
||||||
unordered_map<string, SPITObject*>::iterator i = next(s_SPITObjects.begin(), p_Index);
|
|
||||||
ptrSPITObject = i->second;
|
|
||||||
return *ptrSPITObject;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
throw "SPITObject index out of range";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
SPITObject* SPITObject::getSPITObjectRemote(int p_Index) {
|
|
||||||
SPITObject* ptrSPITObject = NULL;
|
|
||||||
{
|
|
||||||
if (p_Index >= 0 && p_Index < s_SPITObjectsRemote.size()) {
|
|
||||||
unordered_map<string, SPITObject*>::iterator i = next(s_SPITObjectsRemote.begin(), p_Index);
|
|
||||||
ptrSPITObject = i->second;
|
|
||||||
return ptrSPITObject;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* Returns a reference to the remote SPITObject at position p_Index.<br>
|
|
||||||
* Throws an exception if p_Index is out of range.<br>
|
|
||||||
* @param p_Index position
|
|
||||||
* @return the reference of the SPITObject at position.
|
|
||||||
*/
|
|
||||||
const SPITObject& SPITObject::getSPITObjectRemoteRef(int p_Index) {
|
|
||||||
SPITObject* ptrSPITObject = NULL;
|
|
||||||
{
|
|
||||||
if (p_Index >= 0 && p_Index < s_SPITObjectsRemote.size()) {
|
|
||||||
unordered_map<string, SPITObject*>::iterator i = next(s_SPITObjectsRemote.begin(), p_Index);
|
|
||||||
ptrSPITObject = i->second;
|
|
||||||
return *ptrSPITObject;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
throw "Remote SPITObject index out of range";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void SPITObject::clearSPITObjects() {
|
|
||||||
SPITObject* ptrSPITObject;
|
|
||||||
{
|
|
||||||
for (auto i = s_SPITObjects.begin(); i != s_SPITObjects.end(); i++) {
|
|
||||||
ptrSPITObject = i->second;
|
|
||||||
i = s_SPITObjects.erase(i);
|
|
||||||
delete ptrSPITObject;
|
|
||||||
if (i == s_SPITObjects.end()) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
void SPITObject::clearSPITObjectsRemote() {
|
|
||||||
SPITObject* ptrSPITObject;
|
|
||||||
{
|
|
||||||
for (auto i = s_SPITObjectsRemote.begin(); i != s_SPITObjectsRemote.end(); i++) {
|
|
||||||
ptrSPITObject = i->second;
|
|
||||||
i = s_SPITObjectsRemote.erase(i);
|
|
||||||
delete ptrSPITObject;
|
|
||||||
if (i == s_SPITObjectsRemote.end()) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* clears all unconfirmed SPITObjects not created by this SPIT_Client.
|
* clears all unconfirmed SPITObjects not created by this SPIT_Client.
|
||||||
*/
|
*/
|
||||||
void SPITObject::clearUnconfirmedSPITObjects() {
|
void SPITObject::clearUnconfirmedSPITObjects(SpitRepo<SPITObject> &repo) {
|
||||||
for (auto i = s_SPITObjects.begin(); i != s_SPITObjects.end(); i++) {
|
auto &entries = repo.getRepo();
|
||||||
SPITObject* ptrSPITObject = i->second;
|
for (auto i = entries.begin(); i != entries.end();) {
|
||||||
|
SPITObject *ptrSPITObject = i->second.get();
|
||||||
if (ptrSPITObject->getCreatedByClient() == false && ptrSPITObject->getConfirmed() == false) {
|
if (ptrSPITObject->getCreatedByClient() == false && ptrSPITObject->getConfirmed() == false) {
|
||||||
i = s_SPITObjects.erase(i);
|
i = entries.erase(i);
|
||||||
delete ptrSPITObject;
|
} else {
|
||||||
}
|
i++;
|
||||||
if (i == s_SPITObjects.end()) {
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void SPITObject::eventProjectClosed() {
|
void SPITObject::eventProjectClosed(SpitRepo<SPITObject> &repo, SpitRepo<SPITObject> &remoteRepo) {
|
||||||
for (auto i = s_SPITObjects.begin(); i != s_SPITObjects.end(); i++) {
|
auto &entries = repo.getRepo();
|
||||||
SPITObject* ptrSPITObject = i->second;
|
for (auto i = entries.begin(); i != entries.end(); ) {
|
||||||
|
SPITObject *ptrSPITObject = i->second.get();
|
||||||
if (ptrSPITObject->getCreatedByClient() == true) {
|
if (ptrSPITObject->getCreatedByClient() == true) {
|
||||||
|
i++;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
i = s_SPITObjects.erase(i);
|
i = entries.erase(i);
|
||||||
delete ptrSPITObject;
|
|
||||||
if (i == s_SPITObjects.end()) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
// Remote
|
// Remote
|
||||||
for (auto i = s_SPITObjectsRemote.begin(); i != s_SPITObjectsRemote.end(); i++) {
|
remoteRepo.clearEntries();
|
||||||
SPITObject* ptrSPITObject = i->second;
|
|
||||||
i = s_SPITObjectsRemote.erase(i);
|
|
||||||
delete ptrSPITObject;
|
|
||||||
if (i == s_SPITObjectsRemote.end()) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
/**
|
/**
|
||||||
* sets confirmed = false for all SPITObjects.<br>
|
* sets confirmed = false for all SPITObjects.
|
||||||
* This should be called when the client has loaded a project.<br>
|
* This should be called when the client has loaded a project.
|
||||||
*/
|
*/
|
||||||
void SPITObject::setConfirmedFalse() {
|
void SPITObject::setConfirmedFalse(SpitRepo<SPITObject> &repo) {
|
||||||
SPITObject* ptrSPITObject;
|
auto &entries = repo.getRepo();
|
||||||
{
|
for (auto i = entries.begin(); i != entries.end(); i++) {
|
||||||
for (auto i = s_SPITObjects.begin(); i != s_SPITObjects.end(); i++) {
|
i->second->setConfirmed(false);
|
||||||
ptrSPITObject = i->second;
|
|
||||||
ptrSPITObject->setConfirmed(false);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
SPITObject::SPITObject(string p_ID) {
|
||||||
|
m_ID = p_ID;
|
||||||
SPITObject::SPITObject() {
|
|
||||||
initMembers();
|
|
||||||
}
|
}
|
||||||
void SPITObject::initMembers() {
|
|
||||||
m_ActionAssigned = false;
|
|
||||||
m_ActionAssignedType = false;
|
|
||||||
m_Confirmed = false;
|
|
||||||
m_Delay = 0;
|
|
||||||
m_Duration = 0;
|
|
||||||
m_Fixed = false;
|
|
||||||
m_CreatedByClient = false;
|
|
||||||
m_FrameFadeInLength = 0;
|
|
||||||
m_FrameFadeOutLength = 0;
|
|
||||||
m_FrameLength = 0;
|
|
||||||
m_FrameStart = 0;
|
|
||||||
m_Remark = "";
|
|
||||||
m_ID = createGUID();
|
|
||||||
m_Name = "";
|
|
||||||
m_SPITTypeID = "";
|
|
||||||
m_ServerParams = "";
|
|
||||||
m_ServerRemote = false;
|
|
||||||
m_Track = 0;
|
|
||||||
m_ValueFactor = 1000000; //Values are given in ppm -> 1000000 = 1/1;
|
|
||||||
m_ValueUse = 0x01;
|
|
||||||
}
|
|
||||||
|
|
||||||
SPITObject::~SPITObject() { }
|
|
||||||
|
|
||||||
|
|
||||||
bool SPITObject::setMessageOP(SPIT_Message::ReportSPITObject *p_ReportSPITObject) {
|
bool SPITObject::setMessageOP(SPIT_Message::ReportSPITObject *p_ReportSPITObject) {
|
||||||
bool boolChangeAllowed;
|
bool boolChangeAllowed;
|
||||||
@@ -298,8 +65,7 @@ bool SPITObject::setMessageOP(SPIT_Message::ReportSPITObject* p_ReportSPITObject
|
|||||||
|
|
||||||
if (m_CreatedByClient == true && m_Fixed == true) {
|
if (m_CreatedByClient == true && m_Fixed == true) {
|
||||||
boolChangeAllowed = false;
|
boolChangeAllowed = false;
|
||||||
}
|
} else {
|
||||||
else {
|
|
||||||
boolChangeAllowed = true;
|
boolChangeAllowed = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -307,124 +73,148 @@ bool SPITObject::setMessageOP(SPIT_Message::ReportSPITObject* p_ReportSPITObject
|
|||||||
if (m_CreatedByClient) {
|
if (m_CreatedByClient) {
|
||||||
// Server reports a client created SPITType -> the type is confirmed
|
// Server reports a client created SPITType -> the type is confirmed
|
||||||
m_Confirmed = true;
|
m_Confirmed = true;
|
||||||
}
|
} else {
|
||||||
else {
|
|
||||||
// type is NOT client created -> the client has to confirm the SPITtype
|
// type is NOT client created -> the client has to confirm the SPITtype
|
||||||
m_Confirmed = p_ReportSPITObject->getConfirmed();
|
m_Confirmed = p_ReportSPITObject->getConfirmed();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (m_Delay != p_ReportSPITObject->getDelay()) {
|
if (m_Delay != p_ReportSPITObject->getDelay()) {
|
||||||
if (boolChangeAllowed == false) throw new exception();
|
if (boolChangeAllowed == false) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
m_Delay = p_ReportSPITObject->getDelay();
|
m_Delay = p_ReportSPITObject->getDelay();
|
||||||
boolChanged = true;
|
boolChanged = true;
|
||||||
}
|
}
|
||||||
if (m_Duration != p_ReportSPITObject->getDuration()) {
|
if (m_Duration != p_ReportSPITObject->getDuration()) {
|
||||||
if (boolChangeAllowed == false) throw new exception();
|
if (boolChangeAllowed == false) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
m_Duration = p_ReportSPITObject->getDuration();
|
m_Duration = p_ReportSPITObject->getDuration();
|
||||||
boolChanged = true;
|
boolChanged = true;
|
||||||
}
|
}
|
||||||
if (m_Fixed != p_ReportSPITObject->getFixed()) {
|
if (m_Fixed != p_ReportSPITObject->getFixed()) {
|
||||||
if (boolChangeAllowed == false) throw new exception();
|
if (boolChangeAllowed == false) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
m_Fixed = p_ReportSPITObject->getFixed();
|
m_Fixed = p_ReportSPITObject->getFixed();
|
||||||
boolChanged = true;
|
boolChanged = true;
|
||||||
}
|
}
|
||||||
if (m_FrameFadeInLength != p_ReportSPITObject->getFrameFadeInLength()) {
|
if (m_FrameFadeInLength != p_ReportSPITObject->getFrameFadeInLength()) {
|
||||||
if (boolChangeAllowed == false) throw new exception();
|
if (boolChangeAllowed == false) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
m_FrameFadeInLength = p_ReportSPITObject->getFrameFadeInLength();
|
m_FrameFadeInLength = p_ReportSPITObject->getFrameFadeInLength();
|
||||||
boolChanged = true;
|
boolChanged = true;
|
||||||
}
|
}
|
||||||
if (m_FrameFadeOutLength != p_ReportSPITObject->getFrameFadeOutLength()) {
|
if (m_FrameFadeOutLength != p_ReportSPITObject->getFrameFadeOutLength()) {
|
||||||
if (boolChangeAllowed == false) throw new exception();
|
if (boolChangeAllowed == false) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
m_FrameFadeOutLength = p_ReportSPITObject->getFrameFadeOutLength();
|
m_FrameFadeOutLength = p_ReportSPITObject->getFrameFadeOutLength();
|
||||||
boolChanged = true;
|
boolChanged = true;
|
||||||
}
|
}
|
||||||
if (m_FrameLength != p_ReportSPITObject->getFrameLength()) {
|
if (m_FrameLength != p_ReportSPITObject->getFrameLength()) {
|
||||||
if (boolChangeAllowed == false) throw new exception();
|
if (boolChangeAllowed == false) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
m_FrameLength = p_ReportSPITObject->getFrameLength();
|
m_FrameLength = p_ReportSPITObject->getFrameLength();
|
||||||
boolChanged = true;
|
boolChanged = true;
|
||||||
}
|
}
|
||||||
if (m_FrameStart != p_ReportSPITObject->getFrameStart()) {
|
if (m_FrameStart != p_ReportSPITObject->getFrameStart()) {
|
||||||
if (boolChangeAllowed == false) throw new exception();
|
if (boolChangeAllowed == false) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
m_FrameStart = p_ReportSPITObject->getFrameStart();
|
m_FrameStart = p_ReportSPITObject->getFrameStart();
|
||||||
boolChanged = true;
|
boolChanged = true;
|
||||||
}
|
}
|
||||||
if (m_Remark != p_ReportSPITObject->getRemark()) {
|
if (m_Remark != p_ReportSPITObject->getRemark()) {
|
||||||
if (boolChangeAllowed == false) throw new exception();
|
if (boolChangeAllowed == false) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
m_Remark = p_ReportSPITObject->getRemark();
|
m_Remark = p_ReportSPITObject->getRemark();
|
||||||
boolChanged = true;
|
boolChanged = true;
|
||||||
}
|
}
|
||||||
if (m_ID != p_ReportSPITObject->getID()) {
|
if (m_ID != p_ReportSPITObject->getID()) {
|
||||||
if (boolChangeAllowed == false) throw new exception();
|
if (boolChangeAllowed == false) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
m_ID = p_ReportSPITObject->getID();
|
m_ID = p_ReportSPITObject->getID();
|
||||||
boolChanged = true;
|
boolChanged = true;
|
||||||
}
|
}
|
||||||
if (m_Name != p_ReportSPITObject->getName()) {
|
if (m_Name != p_ReportSPITObject->getName()) {
|
||||||
if (boolChangeAllowed == false) throw new exception();
|
if (boolChangeAllowed == false) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
m_Name = p_ReportSPITObject->getName();
|
m_Name = p_ReportSPITObject->getName();
|
||||||
boolChanged = true;
|
boolChanged = true;
|
||||||
}
|
}
|
||||||
if (m_SPITTypeID != p_ReportSPITObject->getSPITTypeID()) {
|
if (m_SPITTypeID != p_ReportSPITObject->getSPITTypeID()) {
|
||||||
if (boolChangeAllowed == false) throw new exception();
|
if (boolChangeAllowed == false) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
m_SPITTypeID = p_ReportSPITObject->getSPITTypeID();
|
m_SPITTypeID = p_ReportSPITObject->getSPITTypeID();
|
||||||
boolChanged = true;
|
boolChanged = true;
|
||||||
}
|
}
|
||||||
if (m_ServerParams != p_ReportSPITObject->getServerParams()) {
|
if (m_ServerParams != p_ReportSPITObject->getServerParams()) {
|
||||||
if (boolChangeAllowed == false) throw new exception();
|
if (boolChangeAllowed == false) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
m_ServerParams = p_ReportSPITObject->getServerParams();
|
m_ServerParams = p_ReportSPITObject->getServerParams();
|
||||||
boolChanged = true;
|
boolChanged = true;
|
||||||
}
|
}
|
||||||
if (m_ServerRemote != p_ReportSPITObject->getServerRemote()) {
|
if (m_ServerRemote != p_ReportSPITObject->getServerRemote()) {
|
||||||
if (boolChangeAllowed == false) throw new exception();
|
if (boolChangeAllowed == false) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
m_ServerRemote = p_ReportSPITObject->getServerRemote();
|
m_ServerRemote = p_ReportSPITObject->getServerRemote();
|
||||||
boolChanged = true;
|
boolChanged = true;
|
||||||
}
|
}
|
||||||
if (m_Track != p_ReportSPITObject->getTrack()) {
|
if (m_Track != p_ReportSPITObject->getTrack()) {
|
||||||
if (boolChangeAllowed == false) throw new exception();
|
if (boolChangeAllowed == false) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
m_Track = p_ReportSPITObject->getTrack();
|
m_Track = p_ReportSPITObject->getTrack();
|
||||||
boolChanged = true;
|
boolChanged = true;
|
||||||
}
|
}
|
||||||
if (m_ValueFactor != p_ReportSPITObject->getValueFactor()) {
|
if (m_ValueFactor != p_ReportSPITObject->getValueFactor()) {
|
||||||
if (boolChangeAllowed == false) throw new exception();
|
if (boolChangeAllowed == false) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
m_ValueFactor = p_ReportSPITObject->getValueFactor();
|
m_ValueFactor = p_ReportSPITObject->getValueFactor();
|
||||||
boolChanged = true;
|
boolChanged = true;
|
||||||
}
|
}
|
||||||
if (m_ValueUse != p_ReportSPITObject->getValueUse()) {
|
if (m_ValueUse != p_ReportSPITObject->getValueUse()) {
|
||||||
if (boolChangeAllowed == false) throw new exception();
|
if (boolChangeAllowed == false) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
m_ValueUse = p_ReportSPITObject->getValueUse();
|
m_ValueUse = p_ReportSPITObject->getValueUse();
|
||||||
boolChanged = true;
|
boolChanged = true;
|
||||||
}
|
}
|
||||||
return boolChanged;
|
return boolChanged;
|
||||||
}
|
}
|
||||||
|
|
||||||
void SPITObject::fillMessageOP(SPIT_Message::ReportSPITObject* p_ReportSPITObject) {
|
void SPITObject::fillMessageOP(SPIT_Message::ReportSPITObject &p_ReportSPITObject) {
|
||||||
p_ReportSPITObject->setActionAssigned(getActionAssigned()); //Action can be assigned to type or to this object
|
p_ReportSPITObject.setActionAssigned(getActionAssigned()); // Action can be assigned to type or to this object
|
||||||
p_ReportSPITObject->setConfirmed(m_Confirmed);
|
p_ReportSPITObject.setConfirmed(m_Confirmed);
|
||||||
p_ReportSPITObject->setDelay(m_Delay);
|
p_ReportSPITObject.setDelay(m_Delay);
|
||||||
p_ReportSPITObject->setDuration(m_Duration);
|
p_ReportSPITObject.setDuration(m_Duration);
|
||||||
p_ReportSPITObject->setFixed(m_Fixed);
|
p_ReportSPITObject.setFixed(m_Fixed);
|
||||||
p_ReportSPITObject->setFrameFadeInLength(m_FrameFadeInLength);
|
p_ReportSPITObject.setFrameFadeInLength(m_FrameFadeInLength);
|
||||||
p_ReportSPITObject->setFrameFadeOutLength(m_FrameFadeOutLength);
|
p_ReportSPITObject.setFrameFadeOutLength(m_FrameFadeOutLength);
|
||||||
p_ReportSPITObject->setFrameLength(m_FrameLength);
|
p_ReportSPITObject.setFrameLength(m_FrameLength);
|
||||||
p_ReportSPITObject->setFrameStart(m_FrameStart);
|
p_ReportSPITObject.setFrameStart(m_FrameStart);
|
||||||
p_ReportSPITObject->setID(m_ID);
|
p_ReportSPITObject.setID(m_ID);
|
||||||
p_ReportSPITObject->setName(m_Name);
|
p_ReportSPITObject.setName(m_Name);
|
||||||
p_ReportSPITObject->setRemark(m_Remark);
|
p_ReportSPITObject.setRemark(m_Remark);
|
||||||
p_ReportSPITObject->setSPITTypeID(m_SPITTypeID);
|
p_ReportSPITObject.setSPITTypeID(m_SPITTypeID);
|
||||||
p_ReportSPITObject->setServerParams(m_ServerParams);
|
p_ReportSPITObject.setServerParams(m_ServerParams);
|
||||||
p_ReportSPITObject->setServerRemote(m_ServerRemote);
|
p_ReportSPITObject.setServerRemote(m_ServerRemote);
|
||||||
p_ReportSPITObject->setTrack(m_Track);
|
p_ReportSPITObject.setTrack(m_Track);
|
||||||
p_ReportSPITObject->setValueFactor(m_ValueFactor);
|
p_ReportSPITObject.setValueFactor(m_ValueFactor);
|
||||||
p_ReportSPITObject->setValueUse(m_ValueUse);
|
p_ReportSPITObject.setValueUse(m_ValueUse);
|
||||||
}
|
}
|
||||||
void SPITObject::fillMessageOP(SPIT_Message::RemoveSPITObject* p_RemoveSPITObject) {
|
void SPITObject::fillMessageOP(SPIT_Message::RemoveSPITObject &p_RemoveSPITObject) {
|
||||||
p_RemoveSPITObject->setID(m_ID);
|
p_RemoveSPITObject.setID(m_ID);
|
||||||
}
|
|
||||||
|
|
||||||
void SPITObject::setID(string p_ID) {
|
|
||||||
m_ID = p_ID;
|
|
||||||
}
|
|
||||||
void SPITObject::setCreatedByClient(bool p_CreatedByClient) {
|
|
||||||
m_CreatedByClient = p_CreatedByClient;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -433,121 +223,141 @@ void SPITObject::setCreatedByClient(bool p_CreatedByClient) {
|
|||||||
* @return if m_Confirmed has changed
|
* @return if m_Confirmed has changed
|
||||||
*/
|
*/
|
||||||
bool SPITObject::setConfirmed(bool p_Confirmed) {
|
bool SPITObject::setConfirmed(bool p_Confirmed) {
|
||||||
if (m_Confirmed == p_Confirmed) return false;
|
if (m_Confirmed == p_Confirmed)
|
||||||
|
return false;
|
||||||
m_Confirmed = p_Confirmed;
|
m_Confirmed = p_Confirmed;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool SPITObject::setName(string p_Name) {
|
bool SPITObject::setName(string p_Name) {
|
||||||
if (m_Name == p_Name) return false;
|
if (m_Name == p_Name)
|
||||||
|
return false;
|
||||||
m_Name = p_Name;
|
m_Name = p_Name;
|
||||||
m_Confirmed = false;
|
m_Confirmed = false;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
bool SPITObject::setRemark(string p_Remark) {
|
bool SPITObject::setRemark(string p_Remark) {
|
||||||
if (m_Remark == p_Remark) return false;
|
if (m_Remark == p_Remark)
|
||||||
|
return false;
|
||||||
m_Remark = p_Remark;
|
m_Remark = p_Remark;
|
||||||
m_Confirmed = false;
|
m_Confirmed = false;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
bool SPITObject::setServerParams(string p_ServerParams) {
|
bool SPITObject::setServerParams(string p_ServerParams) {
|
||||||
if (m_ServerParams == p_ServerParams) return false;
|
if (m_ServerParams == p_ServerParams)
|
||||||
|
return false;
|
||||||
m_ServerParams = p_ServerParams;
|
m_ServerParams = p_ServerParams;
|
||||||
m_Confirmed = false;
|
m_Confirmed = false;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
bool SPITObject::setSPITTypeID(string p_SPITTypeID) {
|
bool SPITObject::setSPITTypeID(string p_SPITTypeID) {
|
||||||
if (m_SPITTypeID == p_SPITTypeID) return false;
|
if (m_SPITTypeID == p_SPITTypeID)
|
||||||
|
return false;
|
||||||
m_SPITTypeID = p_SPITTypeID;
|
m_SPITTypeID = p_SPITTypeID;
|
||||||
m_Confirmed = false;
|
m_Confirmed = false;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
bool SPITObject::setServerRemote(bool p_BelongstoServer) {
|
bool SPITObject::setServerRemote(bool p_BelongstoServer) {
|
||||||
if (m_ServerRemote == p_BelongstoServer) return false;
|
if (m_ServerRemote == p_BelongstoServer)
|
||||||
|
return false;
|
||||||
m_ServerRemote = p_BelongstoServer;
|
m_ServerRemote = p_BelongstoServer;
|
||||||
m_Confirmed = false;
|
m_Confirmed = false;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
/**
|
/**
|
||||||
* This is a virtual construct - ActionAssignedType is not implemented in the SPITProtocol.<br>
|
* This is a virtual construct - ActionAssignedType is not implemented in the SPITProtocol.
|
||||||
* This is used when an action is associated with a SPITType. <br>
|
* This is used when an action is associated with a SPITType.
|
||||||
* Then this action is done for every SPITObject with the SPITType.
|
* Then this action is done for every SPITObject with the SPITType.
|
||||||
* @return true = an action is assigned for the SPITType.
|
* @return true = an action is assigned for the SPITType.
|
||||||
*/
|
*/
|
||||||
bool SPITObject::setActionAssignedType(bool p_ActionAssigned) {
|
bool SPITObject::setActionAssignedType(bool p_ActionAssigned) {
|
||||||
if (m_ActionAssignedType == p_ActionAssigned) return false;
|
if (m_ActionAssignedType == p_ActionAssigned)
|
||||||
|
return false;
|
||||||
bool boolOldActionAssigend;
|
bool boolOldActionAssigend;
|
||||||
boolOldActionAssigend = getActionAssigned();
|
boolOldActionAssigend = getActionAssigned();
|
||||||
m_ActionAssignedType = p_ActionAssigned;
|
m_ActionAssignedType = p_ActionAssigned;
|
||||||
if (getActionAssigned() == boolOldActionAssigend) return false;
|
if (getActionAssigned() == boolOldActionAssigend)
|
||||||
|
return false;
|
||||||
m_Confirmed = false;
|
m_Confirmed = false;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
bool SPITObject::setActionAssigned(bool p_ActionAssigned) {
|
bool SPITObject::setActionAssigned(bool p_ActionAssigned) {
|
||||||
if (m_ActionAssigned == p_ActionAssigned) return false;
|
if (m_ActionAssigned == p_ActionAssigned)
|
||||||
|
return false;
|
||||||
bool boolOldActionAssigend;
|
bool boolOldActionAssigend;
|
||||||
boolOldActionAssigend = getActionAssigned();
|
boolOldActionAssigend = getActionAssigned();
|
||||||
m_ActionAssigned = p_ActionAssigned;
|
m_ActionAssigned = p_ActionAssigned;
|
||||||
if (getActionAssigned() == boolOldActionAssigend) return false;
|
if (getActionAssigned() == boolOldActionAssigend)
|
||||||
|
return false;
|
||||||
m_Confirmed = false;
|
m_Confirmed = false;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
bool SPITObject::setFixed(bool p_Fixed) {
|
bool SPITObject::setFixed(bool p_Fixed) {
|
||||||
if (m_Fixed == p_Fixed) return false;
|
if (m_Fixed == p_Fixed)
|
||||||
|
return false;
|
||||||
m_Fixed = p_Fixed;
|
m_Fixed = p_Fixed;
|
||||||
m_Confirmed = false;
|
m_Confirmed = false;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
bool SPITObject::setFrameStart(long long p_FrameStart) {
|
bool SPITObject::setFrameStart(long long p_FrameStart) {
|
||||||
if (m_FrameStart == p_FrameStart) return false;
|
if (m_FrameStart == p_FrameStart)
|
||||||
|
return false;
|
||||||
m_FrameStart = p_FrameStart;
|
m_FrameStart = p_FrameStart;
|
||||||
m_Confirmed = false;
|
m_Confirmed = false;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
bool SPITObject::setFrameLength(long long p_FrameLength) {
|
bool SPITObject::setFrameLength(long long p_FrameLength) {
|
||||||
if (m_FrameLength == p_FrameLength) return false;
|
if (m_FrameLength == p_FrameLength)
|
||||||
|
return false;
|
||||||
m_FrameLength = p_FrameLength;
|
m_FrameLength = p_FrameLength;
|
||||||
m_Confirmed = false;
|
m_Confirmed = false;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
bool SPITObject::setFrameFadeInLength(long long p_FrameFadeInLength) {
|
bool SPITObject::setFrameFadeInLength(long long p_FrameFadeInLength) {
|
||||||
if (m_FrameFadeInLength == p_FrameFadeInLength) return false;
|
if (m_FrameFadeInLength == p_FrameFadeInLength)
|
||||||
|
return false;
|
||||||
m_FrameFadeInLength = p_FrameFadeInLength;
|
m_FrameFadeInLength = p_FrameFadeInLength;
|
||||||
m_Confirmed = false;
|
m_Confirmed = false;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
bool SPITObject::setFrameFadeOutLength(long long p_FrameFadeOutLength) {
|
bool SPITObject::setFrameFadeOutLength(long long p_FrameFadeOutLength) {
|
||||||
if (m_FrameFadeOutLength == p_FrameFadeOutLength) return false;
|
if (m_FrameFadeOutLength == p_FrameFadeOutLength)
|
||||||
|
return false;
|
||||||
m_FrameFadeOutLength = p_FrameFadeOutLength;
|
m_FrameFadeOutLength = p_FrameFadeOutLength;
|
||||||
m_Confirmed = false;
|
m_Confirmed = false;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
bool SPITObject::setValueUse(char p_ValueUse) {
|
bool SPITObject::setValueUse(char p_ValueUse) {
|
||||||
if (m_ValueUse == p_ValueUse) return false;
|
if (m_ValueUse == p_ValueUse)
|
||||||
|
return false;
|
||||||
m_ValueUse = p_ValueUse;
|
m_ValueUse = p_ValueUse;
|
||||||
m_Confirmed = false;
|
m_Confirmed = false;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
bool SPITObject::setValueFactor(int p_ValueFactor) {
|
bool SPITObject::setValueFactor(int p_ValueFactor) {
|
||||||
if (m_ValueFactor == p_ValueFactor) return false;
|
if (m_ValueFactor == p_ValueFactor)
|
||||||
|
return false;
|
||||||
m_ValueFactor = p_ValueFactor;
|
m_ValueFactor = p_ValueFactor;
|
||||||
m_Confirmed = false;
|
m_Confirmed = false;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
bool SPITObject::setTrack(int p_Track) {
|
bool SPITObject::setTrack(int p_Track) {
|
||||||
if (m_Track == p_Track) return false;
|
if (m_Track == p_Track)
|
||||||
|
return false;
|
||||||
m_Track = p_Track;
|
m_Track = p_Track;
|
||||||
m_Confirmed = false;
|
m_Confirmed = false;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
bool SPITObject::setDelay(long long p_Delay) {
|
bool SPITObject::setDelay(long long p_Delay) {
|
||||||
if (m_Delay == p_Delay) return false;
|
if (m_Delay == p_Delay)
|
||||||
|
return false;
|
||||||
m_Delay = p_Delay;
|
m_Delay = p_Delay;
|
||||||
m_Confirmed = false;
|
m_Confirmed = false;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
bool SPITObject::setDuration(long long p_Duration) {
|
bool SPITObject::setDuration(long long p_Duration) {
|
||||||
if (m_Duration == p_Duration) return false;
|
if (m_Duration == p_Duration)
|
||||||
|
return false;
|
||||||
m_Duration = p_Duration;
|
m_Duration = p_Duration;
|
||||||
m_Confirmed = false;
|
m_Confirmed = false;
|
||||||
return true;
|
return true;
|
||||||
|
|||||||
@@ -13,70 +13,30 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#include "SPITPlayer.h"
|
#include "SPITPlayer.h"
|
||||||
|
#include "esp_log.h"
|
||||||
|
#include <memory>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
unordered_map<string, SPITPlayer*> SPITPlayer::s_SPITPlayers;
|
using namespace std;
|
||||||
|
|
||||||
SPITPlayer* SPITPlayer::getSPITPlayer(string p_PlayerID) {
|
unordered_map<string, unique_ptr<SPITPlayer>> SPITPlayer::s_SPITPlayers;
|
||||||
{
|
|
||||||
|
SPITPlayer &SPITPlayer::getSPITPlayer(string p_PlayerID) {
|
||||||
auto i = s_SPITPlayers.find(p_PlayerID);
|
auto i = s_SPITPlayers.find(p_PlayerID);
|
||||||
if (i == s_SPITPlayers.end()) {
|
if (i == s_SPITPlayers.end()) {
|
||||||
s_SPITPlayers[p_PlayerID] = new SPITPlayer(p_PlayerID);
|
s_SPITPlayers[p_PlayerID] = make_unique<SPITPlayer>(p_PlayerID);
|
||||||
}
|
}
|
||||||
i = s_SPITPlayers.find(p_PlayerID);
|
return *s_SPITPlayers.at(p_PlayerID);
|
||||||
if (i == s_SPITPlayers.end()) return NULL;
|
|
||||||
return i->second;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void SPITPlayer::clearPlayers() {
|
|
||||||
;
|
|
||||||
vector<SPITPlayer*> o_SPITPlayers;
|
|
||||||
for (auto i = s_SPITPlayers.begin(); i != s_SPITPlayers.end(); i++) {
|
|
||||||
SPITPlayer* ptrSPITPlayer = i->second;
|
|
||||||
o_SPITPlayers.push_back(ptrSPITPlayer);
|
|
||||||
}
|
|
||||||
for (auto i = o_SPITPlayers.begin(); i != o_SPITPlayers.end(); i++) {
|
|
||||||
SPITPlayer* ptrSPITPlayer = *i;
|
|
||||||
delete ptrSPITPlayer;
|
|
||||||
}
|
|
||||||
o_SPITPlayers.clear();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
SPITPlayer::SPITPlayer(string p_PlayerID) {
|
SPITPlayer::SPITPlayer(string p_PlayerID) {
|
||||||
m_ID = p_PlayerID;
|
m_ID = p_PlayerID;
|
||||||
s_SPITPlayers[p_PlayerID] = this;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
SPITPlayer::~SPITPlayer() {
|
SPITPlayer::~SPITPlayer() {
|
||||||
PlaySPITType* ptrPlaySPITType;
|
m_PlaySPITTypes.clear();
|
||||||
for (auto i = m_PlaySPITTypes.begin(); i != m_PlaySPITTypes.end(); i++) {
|
|
||||||
ptrPlaySPITType = i->second;
|
|
||||||
i = m_PlaySPITTypes.erase(i);
|
|
||||||
delete ptrPlaySPITType;
|
|
||||||
if (i == m_PlaySPITTypes.end()) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
void SPITPlayer::setIsRunning(bool p_IsRunning) {
|
|
||||||
m_IsRunning = p_IsRunning;
|
|
||||||
}
|
|
||||||
void SPITPlayer::setName(string p_Name) {
|
|
||||||
m_Name = p_Name;
|
|
||||||
}
|
|
||||||
void SPITPlayer::setType(char p_Type) {
|
|
||||||
m_Type = p_Type;
|
|
||||||
}
|
|
||||||
void SPITPlayer::setTime(long long p_Frames) {
|
|
||||||
m_TimeFrames = p_Frames;
|
|
||||||
}
|
|
||||||
|
|
||||||
unordered_map<string, SPITPlayer::PlaySPITType*>* SPITPlayer::getPlaySPITTypes() {
|
|
||||||
return &m_PlaySPITTypes;
|
|
||||||
}
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
* @param p_SPITObjectID
|
* @param p_SPITObjectID
|
||||||
@@ -85,49 +45,38 @@ unordered_map<string, SPITPlayer::PlaySPITType*>* SPITPlayer::getPlaySPITTypes()
|
|||||||
*/
|
*/
|
||||||
SPITPlayer::PlaySPITType *SPITPlayer::addSPITType_Playing(string p_SPITTypeID) {
|
SPITPlayer::PlaySPITType *SPITPlayer::addSPITType_Playing(string p_SPITTypeID) {
|
||||||
PlaySPITType *ptrPlaySPITType;
|
PlaySPITType *ptrPlaySPITType;
|
||||||
|
|
||||||
auto i = m_PlaySPITTypes.find(p_SPITTypeID);
|
auto i = m_PlaySPITTypes.find(p_SPITTypeID);
|
||||||
if (i == m_PlaySPITTypes.end()) {
|
if (i == m_PlaySPITTypes.end()) {
|
||||||
ptrPlaySPITType = new PlaySPITType(this, p_SPITTypeID);
|
auto playSpitType = make_unique<PlaySPITType>(this, p_SPITTypeID);
|
||||||
ptrPlaySPITType->setIsPlayed(true);
|
ptrPlaySPITType = playSpitType.get();
|
||||||
ptrPlaySPITType->setIsNew(true);
|
m_PlaySPITTypes[p_SPITTypeID] = move(playSpitType);
|
||||||
m_PlaySPITTypes[p_SPITTypeID] = ptrPlaySPITType;
|
} else {
|
||||||
|
ptrPlaySPITType = i->second.get();
|
||||||
}
|
}
|
||||||
else {
|
|
||||||
ptrPlaySPITType = i->second;
|
|
||||||
ptrPlaySPITType->setIsPlayed(true);
|
ptrPlaySPITType->setIsPlayed(true);
|
||||||
}
|
|
||||||
return ptrPlaySPITType;
|
return ptrPlaySPITType;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void SPITPlayer::startPlaySequence() {
|
void SPITPlayer::startPlaySequence() {
|
||||||
PlaySPITType* ptrPlaySPITType;
|
|
||||||
for (auto i = m_PlaySPITTypes.begin(); i != m_PlaySPITTypes.end(); i++) {
|
for (auto i = m_PlaySPITTypes.begin(); i != m_PlaySPITTypes.end(); i++) {
|
||||||
ptrPlaySPITType = i->second;
|
PlaySPITType *ptrPlaySPITType = i->second.get();
|
||||||
ptrPlaySPITType->startPlaySequence();
|
ptrPlaySPITType->startPlaySequence();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void SPITPlayer::endPlaySequence() {
|
void SPITPlayer::endPlaySequence() {
|
||||||
PlaySPITType* ptrPlaySPITType;
|
for (auto i = m_PlaySPITTypes.begin(); i != m_PlaySPITTypes.end();) {
|
||||||
|
if (i->second.get()->getIsPlayed() == false) {
|
||||||
for (auto i = m_PlaySPITTypes.begin(); i != m_PlaySPITTypes.end(); i++) {
|
|
||||||
ptrPlaySPITType = i->second;
|
|
||||||
if (ptrPlaySPITType->getIsPlayed() == false) {
|
|
||||||
i = m_PlaySPITTypes.erase(i);
|
i = m_PlaySPITTypes.erase(i);
|
||||||
delete ptrPlaySPITType;
|
} else {
|
||||||
if (i == m_PlaySPITTypes.end()) {
|
++i;
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
SPITPlayer::PlaySPITType::PlaySPITType() {
|
|
||||||
}
|
|
||||||
SPITPlayer::PlaySPITType::PlaySPITType(SPITPlayer *p_SPITPlayer, string p_SPITTypeID) {
|
SPITPlayer::PlaySPITType::PlaySPITType(SPITPlayer *p_SPITPlayer, string p_SPITTypeID) {
|
||||||
|
m_IsNew = true;
|
||||||
|
|
||||||
m_SPITTypeID = p_SPITTypeID;
|
m_SPITTypeID = p_SPITTypeID;
|
||||||
m_PlayerID = p_SPITPlayer->getID();
|
m_PlayerID = p_SPITPlayer->getID();
|
||||||
m_PlayerName = p_SPITPlayer->getName();
|
m_PlayerName = p_SPITPlayer->getName();
|
||||||
|
|||||||
@@ -15,11 +15,11 @@
|
|||||||
|
|
||||||
#include "SPITSocket.h"
|
#include "SPITSocket.h"
|
||||||
#include "Task.hpp"
|
#include "Task.hpp"
|
||||||
|
#include "esp/uuid.h"
|
||||||
#include "esp_log.h"
|
#include "esp_log.h"
|
||||||
#include "esp_netif.h"
|
#include "esp_netif.h"
|
||||||
#include "esp/uuid.h"
|
|
||||||
#include <unistd.h>
|
|
||||||
#include <string>
|
#include <string>
|
||||||
|
#include <unistd.h>
|
||||||
using namespace std;
|
using namespace std;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -27,27 +27,25 @@ using namespace std;
|
|||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
bool SPITSocket::createSocket_UDP() {
|
bool SPITSocket::createSocket_UDP() {
|
||||||
bool boolSuccess = true;
|
|
||||||
int intResult = -1;
|
|
||||||
int intOptionValue4 = 1;
|
|
||||||
|
|
||||||
// ip4
|
|
||||||
if (m_UDPSocketIP4 != INVALID_SOCKET) {
|
if (m_UDPSocketIP4 != INVALID_SOCKET) {
|
||||||
close(m_UDPSocketIP4);
|
close(m_UDPSocketIP4);
|
||||||
m_UDPSocketIP4 = INVALID_SOCKET;
|
m_UDPSocketIP4 = INVALID_SOCKET;
|
||||||
}
|
}
|
||||||
|
|
||||||
m_UDPSocketIP4 = socket(AF_INET, SOCK_DGRAM, 0);
|
m_UDPSocketIP4 = socket(AF_INET, SOCK_DGRAM, 0);
|
||||||
|
int intResult = -1;
|
||||||
|
bool success = true;
|
||||||
if (m_UDPSocketIP4 == INVALID_SOCKET) {
|
if (m_UDPSocketIP4 == INVALID_SOCKET) {
|
||||||
boolSuccess = false;
|
success = false;
|
||||||
} else {
|
} else {
|
||||||
|
int intOptionValue4 = 1;
|
||||||
intResult = setsockopt(m_UDPSocketIP4, SOL_SOCKET, SO_REUSEADDR, (void *)&intOptionValue4, sizeof(intOptionValue4));
|
intResult = setsockopt(m_UDPSocketIP4, SOL_SOCKET, SO_REUSEADDR, (void *)&intOptionValue4, sizeof(intOptionValue4));
|
||||||
}
|
}
|
||||||
if (intResult < 0) {
|
if (intResult < 0) {
|
||||||
boolSuccess = false;
|
success = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (boolSuccess == true) {
|
if (success == true) {
|
||||||
struct timeval tv;
|
struct timeval tv;
|
||||||
tv.tv_sec = 1; // seconds
|
tv.tv_sec = 1; // seconds
|
||||||
tv.tv_usec = 0; // microseconds (0.0 sec)
|
tv.tv_usec = 0; // microseconds (0.0 sec)
|
||||||
@@ -64,138 +62,99 @@ bool SPITSocket::createSocket_UDP() {
|
|||||||
// intResult = setsockopt(m_UDPSocketIP4, SOL_SOCKET, SO_RCVBUF, (void*)&intBufferSize, sizeof(intBufferSize));
|
// intResult = setsockopt(m_UDPSocketIP4, SOL_SOCKET, SO_RCVBUF, (void*)&intBufferSize, sizeof(intBufferSize));
|
||||||
// intResult = setsockopt(m_UDPSocketIP4, SOL_SOCKET, SO_SNDBUF, (void*)&intBufferSize, sizeof(intBufferSize));
|
// intResult = setsockopt(m_UDPSocketIP4, SOL_SOCKET, SO_SNDBUF, (void*)&intBufferSize, sizeof(intBufferSize));
|
||||||
}
|
}
|
||||||
return boolSuccess;
|
return success;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Binds the socket to the client's ip address and port. The socket option SO_REUSEADDR is set to true.
|
* Binds the socket to the client's ip address and port. The socket option SO_REUSEADDR is set to true.
|
||||||
* @param p_ClientIP ip address of the client
|
* @param clientIp ip address of the client
|
||||||
* @param p_ClientPort port of the client.
|
* @param clientPort port of the client.
|
||||||
* if p_Port == "0" any free port will be used
|
* if p_Port == "0" any free port will be used
|
||||||
* @return -1 id bind fails, o if bind is ok
|
* @return -1 id bind fails, o if bind is ok
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
int SPITSocket::bindSocket(string p_ServerIP, string p_ClientIP, string p_ClientPort) {
|
int SPITSocket::bindSocket(string clientIp, string clientPort) {
|
||||||
addrinfo *clientAI;
|
|
||||||
struct sockaddr_in *ptrIP4SocketAddress;
|
|
||||||
struct sockaddr_in o_IP4SocketAddress;
|
|
||||||
int intSocklen;
|
|
||||||
string stringClientPort;
|
string stringClientPort;
|
||||||
if (p_ClientPort.length() <= 0)
|
if (clientPort.length() <= 0)
|
||||||
stringClientPort = "0";
|
stringClientPort = "0";
|
||||||
else
|
else
|
||||||
stringClientPort = p_ClientPort;
|
stringClientPort = clientPort;
|
||||||
// int intResult = SOCKET_ERROR;
|
addrinfo *clientAI;
|
||||||
int intResult = 0;
|
if (getaddrinfo(clientIp.data(), clientPort.data(), nullptr, &clientAI) != 0) {
|
||||||
if (getaddrinfo(p_ClientIP.data(), p_ClientPort.data(), NULL, &clientAI) != 0) {
|
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
switch (clientAI->ai_family) {
|
|
||||||
case AF_INET:
|
|
||||||
if (m_UDPSocketIP4 == INVALID_SOCKET) {
|
if (m_UDPSocketIP4 == INVALID_SOCKET) {
|
||||||
break;
|
return -1;
|
||||||
}
|
}
|
||||||
ptrIP4SocketAddress = reinterpret_cast<sockaddr_in *>(clientAI->ai_addr);
|
auto *socketAdr = (sockaddr_in *)(clientAI->ai_addr);
|
||||||
intSocklen = sizeof(*ptrIP4SocketAddress);
|
int intSocklen = sizeof(*socketAdr);
|
||||||
// copy the ptrIP4SocketAddress, may be not filled correct by getaddrinfo
|
// copy the socketAdr, may be not filled correct by getaddrinfo
|
||||||
|
sockaddr_in o_IP4SocketAddress;
|
||||||
memset(&o_IP4SocketAddress, 0, intSocklen);
|
memset(&o_IP4SocketAddress, 0, intSocklen);
|
||||||
o_IP4SocketAddress.sin_addr = ptrIP4SocketAddress->sin_addr;
|
o_IP4SocketAddress.sin_addr = socketAdr->sin_addr;
|
||||||
o_IP4SocketAddress.sin_family = ptrIP4SocketAddress->sin_family;
|
o_IP4SocketAddress.sin_family = socketAdr->sin_family;
|
||||||
// o_IP4SocketAddress.sin_zero = ptrIP4SocketAddress->sin_zero;
|
o_IP4SocketAddress.sin_port = socketAdr->sin_port;
|
||||||
o_IP4SocketAddress.sin_port = ptrIP4SocketAddress->sin_port;
|
int intResult = bind(m_UDPSocketIP4, (const sockaddr *)(socketAdr), (socklen_t)intSocklen);
|
||||||
intResult = bind(m_UDPSocketIP4, (const sockaddr *)(ptrIP4SocketAddress), (socklen_t)intSocklen);
|
|
||||||
if (intResult < 0) {
|
if (intResult < 0) {
|
||||||
break;
|
return intResult;
|
||||||
}
|
}
|
||||||
setBoundClientFamily(AF_INET);
|
if ((intResult == 0) &&
|
||||||
if (intResult == 0) {
|
(getsockname(m_UDPSocketIP4, (sockaddr *)socketAdr, (socklen_t *)&intSocklen) != -1)) {
|
||||||
if (getsockname(m_UDPSocketIP4, (sockaddr *)ptrIP4SocketAddress, (socklen_t *)&intSocklen) != -1) {
|
setBoundClientPort(to_string((int)socketAdr->sin_port));
|
||||||
setBoundClientPort(to_string((int)ptrIP4SocketAddress->sin_port));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
setBoundClientFamily(0);
|
|
||||||
intResult = -1;
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
freeaddrinfo(clientAI);
|
freeaddrinfo(clientAI);
|
||||||
|
|
||||||
if (intResult == -1) {
|
setIsBound(intResult != -1);
|
||||||
setIsBound(false);
|
|
||||||
} else {
|
|
||||||
setIsBound(true);
|
|
||||||
}
|
|
||||||
return intResult;
|
return intResult;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Set whether the sockat are brodcast sockets or not. Set the sockopt SO_BROADCAST to 0 or 1
|
* Set whether the socket are broadcast sockets or not. Set the sockopt SO_BROADCAST to 0 or 1
|
||||||
* @param p_Broadcast true SO_BROADCAST is set
|
* @param p_Broadcast true SO_BROADCAST is set
|
||||||
* false = SO_BROADCAST is not set
|
* false = SO_BROADCAST is not set
|
||||||
* @return 0 = ok, -1 = error
|
* @return 0 = ok, -1 = error
|
||||||
*/
|
*/
|
||||||
int SPITSocket::setBroadcast(bool p_Broadcast) {
|
int SPITSocket::setBroadcast(bool broadcast) const {
|
||||||
int intResult;
|
int intOptionValue = broadcast ? 1 : 0;
|
||||||
int intOptionValue = 1;
|
int intResult = setsockopt(m_UDPSocketIP4, SOL_SOCKET, SO_BROADCAST, &intOptionValue, sizeof(int));
|
||||||
u_char charOptionValue = 0x01;
|
|
||||||
// IP4
|
|
||||||
if (p_Broadcast) {
|
|
||||||
intOptionValue = 1;
|
|
||||||
} else {
|
|
||||||
intOptionValue = 0;
|
|
||||||
}
|
|
||||||
intResult = setsockopt(m_UDPSocketIP4, SOL_SOCKET, SO_BROADCAST, &intOptionValue, sizeof(int));
|
|
||||||
// intResult = setsockopt(m_UDPSocketIP4, IPPROTO_IP, IP_MULTICAST_LOOP, (void*)&charOptionValue, sizeof(charOptionValue));
|
|
||||||
|
|
||||||
return intResult;
|
return intResult;
|
||||||
}
|
}
|
||||||
/**
|
/**
|
||||||
*
|
* @param ip the ip address of the server
|
||||||
* @param p_InetFamily AF_INET or AF_INET6
|
* @param port the port of the server
|
||||||
* @param p_ServerIP the ip address of the server
|
* @param msg buffer containing the message
|
||||||
* @param p_ServerPort the port of the server
|
* @param msgLength the length of the message
|
||||||
* @param p_MessageBytes buffer containing the message
|
|
||||||
* @param p_MessageLength the length of the message
|
|
||||||
* @return -1 send fails
|
* @return -1 send fails
|
||||||
* 0 send is done
|
* 0 send is done
|
||||||
*/
|
*/
|
||||||
int SPITSocket::sendMessageTo(int p_InetFamily, string p_ServerIP, string p_ServerPort, const char *p_MessageBytes, int p_MessageLength) {
|
int SPITSocket::sendMessageTo(const string &ip, const string &port, const char *message, int msgLength) {
|
||||||
if (m_UDPSocketIP4 == INVALID_SOCKET)
|
if (m_UDPSocketIP4 == INVALID_SOCKET) {
|
||||||
return -1;
|
|
||||||
struct addrinfo *ptrAddressInfo;
|
|
||||||
struct sockaddr_in *ptrIP4SocketAddress;
|
|
||||||
struct sockaddr_in o_IP4SocketAddress;
|
|
||||||
int intSocklen;
|
|
||||||
int intResult = -1;
|
|
||||||
|
|
||||||
// prepare AddressInfo
|
|
||||||
if (getaddrinfo(p_ServerIP.data(), p_ServerPort.data(), NULL, &ptrAddressInfo) != 0) {
|
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
switch (ptrAddressInfo->ai_family) {
|
|
||||||
case AF_INET:
|
// prepare AddressInfo
|
||||||
ptrIP4SocketAddress = reinterpret_cast<sockaddr_in *>(ptrAddressInfo->ai_addr);
|
int intResult = -1;
|
||||||
intSocklen = sizeof(*ptrIP4SocketAddress);
|
addrinfo *ptrAddressInfo;
|
||||||
|
if (getaddrinfo(ip.data(), port.data(), nullptr, &ptrAddressInfo) != 0) {
|
||||||
|
return intResult;
|
||||||
|
}
|
||||||
|
|
||||||
|
auto *ptrIP4SocketAddress = (sockaddr_in *)(ptrAddressInfo->ai_addr);
|
||||||
|
int intSocklen = sizeof(*ptrIP4SocketAddress);
|
||||||
if (m_UDPSocketIP4 != INVALID_SOCKET) {
|
if (m_UDPSocketIP4 != INVALID_SOCKET) {
|
||||||
// copy the ptrIP4SocketAddress, may be not filled correct by getaddrinfo
|
// copy the ptrIP4SocketAddress, may be not filled correct by getaddrinfo
|
||||||
|
sockaddr_in o_IP4SocketAddress;
|
||||||
memset(&o_IP4SocketAddress, 0, intSocklen);
|
memset(&o_IP4SocketAddress, 0, intSocklen);
|
||||||
o_IP4SocketAddress.sin_addr = ptrIP4SocketAddress->sin_addr;
|
o_IP4SocketAddress.sin_addr = ptrIP4SocketAddress->sin_addr;
|
||||||
o_IP4SocketAddress.sin_family = ptrIP4SocketAddress->sin_family;
|
o_IP4SocketAddress.sin_family = ptrIP4SocketAddress->sin_family;
|
||||||
o_IP4SocketAddress.sin_port = ptrIP4SocketAddress->sin_port;
|
o_IP4SocketAddress.sin_port = ptrIP4SocketAddress->sin_port;
|
||||||
intResult = sendto(m_UDPSocketIP4, p_MessageBytes, p_MessageLength, 0, (const sockaddr *)&o_IP4SocketAddress, (socklen_t)intSocklen);
|
intResult = sendto(m_UDPSocketIP4, message, msgLength, 0, (const sockaddr *)&o_IP4SocketAddress, (socklen_t)intSocklen);
|
||||||
if (intResult < 0) {
|
if (intResult < 0) {
|
||||||
printf("UnixSocket::sendMessageTo IP4 sendto %s FAILED %s\n", p_ServerIP.data(), strerror(errno));
|
ESP_LOGE("SPIT", "sendMessageTo IP4 sendto %s FAILED %s\n", ip.data(), strerror(errno));
|
||||||
printf("UnixSocket::sendMessageTo ret=%d %s / %s / %d\n", intResult,
|
ESP_LOGE("SPIT", "sendMessageTo ret=%d %s / %s / %d\n", intResult, port.data(), message, msgLength);
|
||||||
p_ServerPort.data(), p_MessageBytes, p_MessageLength);
|
|
||||||
}
|
}
|
||||||
freeaddrinfo(ptrAddressInfo);
|
freeaddrinfo(ptrAddressInfo);
|
||||||
}
|
}
|
||||||
break;
|
|
||||||
default:
|
|
||||||
intResult = -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (intResult < 0) {
|
if (intResult < 0) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
@@ -204,53 +163,39 @@ int SPITSocket::sendMessageTo(int p_InetFamily, string p_ServerIP, string p_Serv
|
|||||||
/**
|
/**
|
||||||
* Call this for receiving a message
|
* Call this for receiving a message
|
||||||
* This will block until a message is received or the underlying socket is closed
|
* This will block until a message is received or the underlying socket is closed
|
||||||
* @param p_InetFamily either AF_INET or AF_INET6<br>
|
|
||||||
* The SPITSocket creates two udp sockets, one for IP4 and one for IP6
|
|
||||||
* This parameter decides from which socket should a message recieved
|
|
||||||
* @param p_Buffer the buffer containing the received message later.
|
* @param p_Buffer the buffer containing the received message later.
|
||||||
* @param p_BufferLength the size of the buffer
|
* @param p_BufferLength the size of the buffer
|
||||||
* @param p_ServerIP a pointer to a string, when a messages is received the string will contain the ip address of the sender/server
|
* @param p_ServerIP a pointer to a string, when a messages is received the string will contain the ip address of the sender/server
|
||||||
* if p_ServerIP is NULL - no detection of the server will be done.
|
* if p_ServerIP is NULL - no detection of the server will be done.
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
int SPITSocket::receiveMessage(int p_InetFamily, char *p_Buffer, int p_BufferLength, string *p_ServerIP) {
|
int SPITSocket::receiveMessage(char *p_Buffer, int p_BufferLength, string *serverIp) const {
|
||||||
int intResult = -1;
|
int intResult = -1;
|
||||||
// ADDRINFO *AI;
|
|
||||||
struct sockaddr_in o_IP4SocketAddress;
|
|
||||||
int intSocklen;
|
|
||||||
|
|
||||||
switch (p_InetFamily) {
|
|
||||||
case AF_INET:
|
|
||||||
if (m_UDPSocketIP4 == INVALID_SOCKET) {
|
if (m_UDPSocketIP4 == INVALID_SOCKET) {
|
||||||
break;
|
return intResult;
|
||||||
}
|
}
|
||||||
intSocklen = sizeof(o_IP4SocketAddress);
|
sockaddr_in o_IP4SocketAddress;
|
||||||
|
int intSocklen = sizeof(o_IP4SocketAddress);
|
||||||
memset(&o_IP4SocketAddress, 0, intSocklen);
|
memset(&o_IP4SocketAddress, 0, intSocklen);
|
||||||
intResult = recvfrom(m_UDPSocketIP4, (void *)p_Buffer, p_BufferLength, 0, (sockaddr *)&o_IP4SocketAddress, (socklen_t *)&intSocklen);
|
intResult = recvfrom(m_UDPSocketIP4, (void *)p_Buffer, p_BufferLength, 0, (sockaddr *)&o_IP4SocketAddress, (socklen_t *)&intSocklen);
|
||||||
if (intResult >= 0) {
|
if (intResult >= 0 && serverIp != nullptr) {
|
||||||
if (p_ServerIP != NULL) {
|
|
||||||
char bufferIP4[INET_ADDRSTRLEN];
|
char bufferIP4[INET_ADDRSTRLEN];
|
||||||
inet_ntop(AF_INET, &(o_IP4SocketAddress.sin_addr), bufferIP4, intSocklen);
|
inet_ntop(AF_INET, &(o_IP4SocketAddress.sin_addr), bufferIP4, intSocklen);
|
||||||
*p_ServerIP = bufferIP4;
|
*serverIp = bufferIP4;
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
return intResult;
|
return intResult;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
SPITSocket::IPAddress SPITSocket::getAdaptersInfo() {
|
SPITSocket::IPAddress SPITSocket::getAdaptersInfo() {
|
||||||
// iterate over active interfaces, and print out IPs
|
// iterate over active interfaces, and print out IPs
|
||||||
esp_netif_t *netif = NULL;
|
esp_netif_t *netif = nullptr;
|
||||||
while ((netif = esp_netif_next_unsafe(netif)) != NULL) {
|
if ((netif = esp_netif_next_unsafe(netif)) != nullptr) {
|
||||||
ESP_LOGI("SPIT", "Connected to %s", esp_netif_get_desc(netif));
|
ESP_LOGI("SPIT", "Connected to %s", esp_netif_get_desc(netif));
|
||||||
esp_netif_ip_info_t ip;
|
esp_netif_ip_info_t ip;
|
||||||
ESP_ERROR_CHECK(esp_netif_get_ip_info(netif, &ip));
|
ESP_ERROR_CHECK(esp_netif_get_ip_info(netif, &ip));
|
||||||
ESP_LOGI("SPIT", "- IPv4 address: " IPSTR ",", IP2STR(&ip.ip));
|
ESP_LOGI("SPIT", "- IPv4 address: " IPSTR ",", IP2STR(&ip.ip));
|
||||||
ESP_LOGI("SPIT", "- IPv4 netmask: " IPSTR ",", IP2STR(&ip.netmask));
|
ESP_LOGI("SPIT", "- IPv4 netmask: " IPSTR ",", IP2STR(&ip.netmask));
|
||||||
char buffer[64];
|
char buffer[64];
|
||||||
|
|
||||||
sprintf(buffer, IPSTR, IP2STR(&ip.ip));
|
sprintf(buffer, IPSTR, IP2STR(&ip.ip));
|
||||||
string stringIP4 = buffer;
|
string stringIP4 = buffer;
|
||||||
sprintf(buffer, IPSTR, IP2STR(&ip.netmask));
|
sprintf(buffer, IPSTR, IP2STR(&ip.netmask));
|
||||||
@@ -261,28 +206,18 @@ SPITSocket::IPAddress SPITSocket::getAdaptersInfo() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
string createGUID() {
|
string createGUID() {
|
||||||
// uuid_t id;
|
|
||||||
// uuid_generate(id);
|
|
||||||
// char *guid_string = new char[100];
|
|
||||||
// uuid_unparse(id, guid_string);
|
|
||||||
// string stringGUID = guid_string;
|
|
||||||
// return stringGUID;
|
|
||||||
|
|
||||||
uuid_t uu;
|
uuid_t uu;
|
||||||
char uu_str[UUID_STR_LEN];
|
|
||||||
|
|
||||||
uuid_generate(uu);
|
uuid_generate(uu);
|
||||||
|
char uu_str[UUID_STR_LEN];
|
||||||
uuid_unparse(uu, uu_str);
|
uuid_unparse(uu, uu_str);
|
||||||
string stringGUID = uu_str;
|
return {uu_str};
|
||||||
return stringGUID;
|
|
||||||
}
|
}
|
||||||
/** The name of the client's host computer*/
|
|
||||||
string getClientHostName() {
|
string getClientHostName() {
|
||||||
string stringHostName = "";
|
|
||||||
const char *hostname;
|
const char *hostname;
|
||||||
esp_netif_get_hostname(esp_netif_get_default_netif(), &hostname);
|
esp_netif_get_hostname(esp_netif_get_default_netif(), &hostname);
|
||||||
if (hostname != nullptr) {
|
if (hostname != nullptr) {
|
||||||
stringHostName = hostname;
|
return {hostname};
|
||||||
}
|
}
|
||||||
return stringHostName;;
|
return "";
|
||||||
}
|
}
|
||||||
|
|||||||
+105
-318
@@ -12,354 +12,127 @@
|
|||||||
* Created on 8. April 2019, 08:40
|
* Created on 8. April 2019, 08:40
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
#include "SPITType.h"
|
#include "SPITType.h"
|
||||||
#include "esp_log.h"
|
#include "esp_log.h"
|
||||||
|
|
||||||
static const char *TAG = "SPIT";
|
static const char *TAG = "SPIT";
|
||||||
|
|
||||||
unordered_map<string, SPITType*> SPITType::s_SPITTypes;
|
void SPITType::eventProjectClosed(SpitRepo<SPITType> &repo, SpitRepo<SPITType> &remoteRepo) {
|
||||||
unordered_map<string, SPITType*> SPITType::s_SPITTypesRemote;
|
auto &entries = repo.getRepo();
|
||||||
|
for (auto i = entries.begin(); i != entries.end();) {
|
||||||
SPITType* SPITType::getSPITType(string p_ID) {
|
SPITType *ptrSPITType = i->second.get();
|
||||||
{
|
|
||||||
auto i = s_SPITTypes.find(p_ID);
|
|
||||||
if (i == s_SPITTypes.end()) {
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
return i->second;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* Returns the reference of the SPITType with ID == p_ID.<br>
|
|
||||||
* Throws an exception if no SPITType is not found.<br>
|
|
||||||
* @param p_ID the ID
|
|
||||||
* @return reference of the SPITType with ID == p_ID
|
|
||||||
*/
|
|
||||||
const SPITType& SPITType::getSPITTypeRef(string p_ID) {
|
|
||||||
{
|
|
||||||
auto i = s_SPITTypes.find(p_ID);
|
|
||||||
if (i == s_SPITTypes.end()) {
|
|
||||||
throw "SPITType no SPITType with given ID";
|
|
||||||
}
|
|
||||||
return *(i->second);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
SPITType* SPITType::getSPITTypeRemote(string p_ID) {
|
|
||||||
{
|
|
||||||
auto i = s_SPITTypesRemote.find(p_ID);
|
|
||||||
if (i == s_SPITTypesRemote.end()) {
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
return i->second;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* Returns the reference of the remote SPITType with ID == p_ID.<br>
|
|
||||||
* Throws an exception if no SPITType is not found.<br>
|
|
||||||
* @param p_ID the ID
|
|
||||||
* @return reference of the SPITType with ID == p_ID
|
|
||||||
*/
|
|
||||||
const SPITType& SPITType::getSPITTypeRemoteRef(string p_ID) {
|
|
||||||
{
|
|
||||||
auto i = s_SPITTypesRemote.find(p_ID);
|
|
||||||
if (i == s_SPITTypesRemote.end()) {
|
|
||||||
throw "Remote SPITType no SPITType with given ID";
|
|
||||||
}
|
|
||||||
return *(i->second);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
bool SPITType::addSPITType(SPITType* p_ptrSpitType) {
|
|
||||||
if (p_ptrSpitType == NULL) return false;
|
|
||||||
{
|
|
||||||
s_SPITTypes[p_ptrSpitType->getID()] = p_ptrSpitType;
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
bool SPITType::addSPITTypeRemote(SPITType* p_ptrSpitType) {
|
|
||||||
if (p_ptrSpitType == NULL) return false;
|
|
||||||
{
|
|
||||||
s_SPITTypesRemote[p_ptrSpitType->getID()] = p_ptrSpitType;
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
bool SPITType::removeSPITType(SPITType* p_ptrSpitType) {
|
|
||||||
if (p_ptrSpitType == NULL) return false;
|
|
||||||
{
|
|
||||||
auto i = s_SPITTypes.find(p_ptrSpitType->getID());
|
|
||||||
if (i == s_SPITTypes.end()) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
i = s_SPITTypes.erase(i);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
bool SPITType::removeSPITTypeRemote(SPITType* p_ptrSpitType) {
|
|
||||||
if (p_ptrSpitType == NULL) return false;
|
|
||||||
{
|
|
||||||
auto i = s_SPITTypesRemote.find(p_ptrSpitType->getID());
|
|
||||||
if (i == s_SPITTypesRemote.end()) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
i = s_SPITTypesRemote.erase(i);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
int SPITType::getSPITTypeCount() {
|
|
||||||
return s_SPITTypes.size();
|
|
||||||
}
|
|
||||||
int SPITType::getSPITTypeRemoteCount() {
|
|
||||||
return s_SPITTypesRemote.size();
|
|
||||||
}
|
|
||||||
SPITType* SPITType::getSPITType(int p_Index) {
|
|
||||||
SPITType* ptrSPITType = NULL;
|
|
||||||
{
|
|
||||||
if (p_Index < s_SPITTypes.size()) {
|
|
||||||
unordered_map<string, SPITType*>::iterator i = next(s_SPITTypes.begin(), p_Index);
|
|
||||||
ptrSPITType = i->second;
|
|
||||||
}
|
|
||||||
return ptrSPITType;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* Returns a reference to the SPITType at position p_Index.<br>
|
|
||||||
* Throws an exception if p_Index is out of range.<br>
|
|
||||||
* @param p_Index position
|
|
||||||
* @return the reference of the SPITType at position.
|
|
||||||
*/
|
|
||||||
const SPITType& SPITType::getSPITTypeRef(int p_Index) {
|
|
||||||
SPITType* ptrSPITType = NULL;
|
|
||||||
{
|
|
||||||
if (p_Index >= 0 && p_Index < s_SPITTypes.size()) {
|
|
||||||
unordered_map<string, SPITType*>::iterator i = next(s_SPITTypes.begin(), p_Index);
|
|
||||||
ptrSPITType = i->second;
|
|
||||||
return *ptrSPITType;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
throw "SPITType index out of range";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
SPITType* SPITType::getSPITTypeRemote(int p_Index) {
|
|
||||||
SPITType* ptrSPITType = NULL;
|
|
||||||
{
|
|
||||||
if (p_Index < s_SPITTypesRemote.size()) {
|
|
||||||
unordered_map<string, SPITType*>::iterator i = next(s_SPITTypesRemote.begin(), p_Index);
|
|
||||||
ptrSPITType = i->second;
|
|
||||||
}
|
|
||||||
return ptrSPITType;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* Returns a reference to the remote SPITType at position p_Index.<br>
|
|
||||||
* Throws an exception if p_Index is out of range.<br>
|
|
||||||
* @param p_Index position
|
|
||||||
* @return the reference of the SPITType at position.
|
|
||||||
*/
|
|
||||||
const SPITType& SPITType::getSPITTypeRemoteRef(int p_Index) {
|
|
||||||
SPITType* ptrSPITType = NULL;
|
|
||||||
{
|
|
||||||
if (p_Index >= 0 && p_Index < s_SPITTypesRemote.size()) {
|
|
||||||
unordered_map<string, SPITType*>::iterator i = next(s_SPITTypesRemote.begin(), p_Index);
|
|
||||||
ptrSPITType = i->second;
|
|
||||||
return *ptrSPITType;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
throw "Remote SPITType index out of range";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void SPITType::clearSPITTypes() {
|
|
||||||
SPITType* ptrSPITType;
|
|
||||||
{
|
|
||||||
for (auto i = s_SPITTypes.begin(); i != s_SPITTypes.end(); i++) {
|
|
||||||
ptrSPITType = i->second;
|
|
||||||
i = s_SPITTypes.erase(i);
|
|
||||||
delete ptrSPITType;
|
|
||||||
if (i == s_SPITTypes.end()) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
void SPITType::clearSPITTypesRemote() {
|
|
||||||
SPITType* ptrSPITType;
|
|
||||||
{
|
|
||||||
for (auto i = s_SPITTypesRemote.begin(); i != s_SPITTypesRemote.end(); i++) {
|
|
||||||
ptrSPITType = i->second;
|
|
||||||
i = s_SPITTypesRemote.erase(i);
|
|
||||||
delete ptrSPITType;
|
|
||||||
if (i == s_SPITTypesRemote.end()) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void SPITType::eventProjectClosed() {
|
|
||||||
SPITType* ptrSPITType;
|
|
||||||
for (auto i = s_SPITTypes.begin(); i != s_SPITTypes.end(); i++) {
|
|
||||||
ptrSPITType = i->second;
|
|
||||||
if (ptrSPITType->getCreatedByClient() == true) {
|
if (ptrSPITType->getCreatedByClient() == true) {
|
||||||
|
i++;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
i = s_SPITTypes.erase(i);
|
i = entries.erase(i);
|
||||||
delete ptrSPITType;
|
|
||||||
if (i == s_SPITTypes.end()) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
// Remote
|
// Remote
|
||||||
for (auto i = s_SPITTypesRemote.begin(); i != s_SPITTypesRemote.end(); i++) {
|
remoteRepo.clearEntries();
|
||||||
ptrSPITType = i->second;
|
|
||||||
i = s_SPITTypesRemote.erase(i);
|
|
||||||
delete ptrSPITType;
|
|
||||||
if (i == s_SPITTypesRemote.end()) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Sets confirmed = false for all SPITTypes.<br>
|
* Sets confirmed = false for all SPITTypes.
|
||||||
* This should be called when the client has loaded a project.<br>
|
* This should be called when the client has loaded a project.
|
||||||
*/
|
*/
|
||||||
void SPITType::setConfirmedFalse() {
|
void SPITType::setConfirmedFalse(SpitRepo<SPITType> &repo) {
|
||||||
SPITType* ptrSPITType;
|
auto &entries = repo.getRepo();
|
||||||
{
|
for (auto i = entries.begin(); i != entries.end(); i++) {
|
||||||
for (auto i = s_SPITTypes.begin(); i != s_SPITTypes.end(); i++) {
|
i->second->setConfirmed(false);
|
||||||
ptrSPITType = i->second;
|
|
||||||
ptrSPITType->setConfirmed(false);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
SPITType::SPITType(string p_ID) {
|
||||||
|
m_ID = p_ID;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
SPITType::SPITType(string id, string grpName, string name, bool fixed, bool projectIndependent, long long defaultDelay, long long defaultDuration) {
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
SPITType::SPITType() {
|
|
||||||
initMembers();
|
|
||||||
}
|
|
||||||
/*
|
|
||||||
SPITType::SPITType(const SPITType& orig) {
|
|
||||||
m_Confirmed = orig.getConfirmed();
|
|
||||||
m_DefaultDelay = orig.getDefaultDelay();
|
|
||||||
m_DefaultDuration = orig.getDefaultDuration();
|
|
||||||
m_Fixed = orig.getFixed();
|
|
||||||
m_GroupName = orig.getGroupName();
|
|
||||||
m_ID = orig.getID();
|
|
||||||
m_Name = orig.getName();
|
|
||||||
m_ServerProjectIndepended = orig.getProjectIndepended();
|
|
||||||
m_ServerRemote = orig.getServerRemote();
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
SPITType::SPITType(string p_ID, string p_GroupName, string p_Name, bool p_Fixed, bool p_ProjectIndepended,long long p_DefaultDelay, long long p_DefaultDuration) {
|
|
||||||
initMembers();
|
|
||||||
m_ActionAssigned = false;
|
m_ActionAssigned = false;
|
||||||
m_Confirmed = false;
|
m_Confirmed = false;
|
||||||
m_ID = p_ID;
|
m_ID = id;
|
||||||
m_GroupName = p_GroupName;
|
m_GroupName = grpName;
|
||||||
m_Name = p_Name;
|
m_Name = name;
|
||||||
m_Fixed = p_Fixed;
|
m_Fixed = fixed;
|
||||||
m_ServerProjectIndepended = p_ProjectIndepended;
|
m_ServerProjectIndepended = projectIndependent;
|
||||||
m_DefaultDelay = p_DefaultDelay;
|
m_DefaultDelay = defaultDelay;
|
||||||
m_DefaultDuration = p_DefaultDuration;
|
m_DefaultDuration = defaultDuration;
|
||||||
}
|
}
|
||||||
|
|
||||||
SPITType::~SPITType() {
|
|
||||||
}
|
|
||||||
|
|
||||||
void SPITType::initMembers() {
|
|
||||||
m_Confirmed = false;
|
|
||||||
m_DefaultDelay = 0;
|
|
||||||
m_DefaultDuration = 0;
|
|
||||||
m_Fixed = false;
|
|
||||||
m_GroupName = "";
|
|
||||||
m_ID = createGUID();
|
|
||||||
m_Name = "";
|
|
||||||
m_ServerProjectIndepended = false;
|
|
||||||
m_ServerRemote = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void SPITType::setCreatedByClient(bool p_CreatedByClient) {
|
void SPITType::setCreatedByClient(bool p_CreatedByClient) {
|
||||||
m_CreatedByClient = p_CreatedByClient;
|
m_CreatedByClient = p_CreatedByClient;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void SPITType::setID(string p_ID) {
|
|
||||||
m_ID = p_ID;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This is used by the server and client to tell if the other side has registered the changes.
|
* This is used by the server and client to tell if the other side has registered the changes.
|
||||||
* @param p_Confirmed
|
* @param p_Confirmed
|
||||||
* @return if m_Confirmed has changed
|
* @return if m_Confirmed has changed
|
||||||
*/
|
*/
|
||||||
bool SPITType::setConfirmed(bool p_Confirmed) {
|
bool SPITType::setConfirmed(bool p_Confirmed) {
|
||||||
if (m_Confirmed == p_Confirmed) return false;
|
if (m_Confirmed == p_Confirmed)
|
||||||
|
return false;
|
||||||
m_Confirmed = p_Confirmed;
|
m_Confirmed = p_Confirmed;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool SPITType::setGroupName(string p_GroupName) {
|
bool SPITType::setGroupName(const string &p_GroupName) {
|
||||||
if (m_GroupName == p_GroupName) return false;
|
if (m_GroupName == p_GroupName)
|
||||||
|
return false;
|
||||||
m_GroupName = p_GroupName;
|
m_GroupName = p_GroupName;
|
||||||
m_Confirmed = false;
|
m_Confirmed = false;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
bool SPITType::setName(string p_Name) {
|
bool SPITType::setName(const string &p_Name) {
|
||||||
if (m_Name == p_Name) return false;
|
if (m_Name == p_Name)
|
||||||
|
return false;
|
||||||
m_Name = p_Name;
|
m_Name = p_Name;
|
||||||
m_Confirmed = false;
|
m_Confirmed = false;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
bool SPITType::setServerRemote(bool p_BelongstoServer) {
|
bool SPITType::setServerRemote(bool p_BelongstoServer) {
|
||||||
if (m_ServerRemote == p_BelongstoServer) return false;
|
if (m_ServerRemote == p_BelongstoServer)
|
||||||
|
return false;
|
||||||
m_ServerRemote = p_BelongstoServer;
|
m_ServerRemote = p_BelongstoServer;
|
||||||
m_Confirmed = false;
|
m_Confirmed = false;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
bool SPITType::setProjectIndepended(bool p_ProjectIndepended) {
|
bool SPITType::setProjectIndepended(bool p_ProjectIndepended) {
|
||||||
if (m_ServerProjectIndepended == p_ProjectIndepended) return false;
|
if (m_ServerProjectIndepended == p_ProjectIndepended)
|
||||||
|
return false;
|
||||||
m_ServerProjectIndepended = p_ProjectIndepended;
|
m_ServerProjectIndepended = p_ProjectIndepended;
|
||||||
m_Confirmed = false;
|
m_Confirmed = false;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
bool SPITType::setFixed(bool p_Fixed) {
|
bool SPITType::setFixed(bool p_Fixed) {
|
||||||
if (m_Fixed == p_Fixed) return false;
|
if (m_Fixed == p_Fixed)
|
||||||
|
return false;
|
||||||
m_Fixed = p_Fixed;
|
m_Fixed = p_Fixed;
|
||||||
m_Confirmed = false;
|
m_Confirmed = false;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
bool SPITType::setDefaultDelay(long long p_Delay) {
|
bool SPITType::setDefaultDelay(long long p_Delay) {
|
||||||
if (m_DefaultDelay == p_Delay) return false;
|
if (m_DefaultDelay == p_Delay)
|
||||||
|
return false;
|
||||||
m_DefaultDelay = p_Delay;
|
m_DefaultDelay = p_Delay;
|
||||||
m_Confirmed = false;
|
m_Confirmed = false;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
bool SPITType::setDefaultDuration(long long p_Duration) {
|
bool SPITType::setDefaultDuration(long long p_Duration) {
|
||||||
if (m_DefaultDuration == p_Duration) return false;
|
if (m_DefaultDuration == p_Duration)
|
||||||
|
return false;
|
||||||
m_DefaultDuration = p_Duration;
|
m_DefaultDuration = p_Duration;
|
||||||
m_Confirmed = false;
|
m_Confirmed = false;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Virtual construct - means ActionAssigned for SPITTypes is is not implemented in SPITProtocol.<br>
|
* Virtual construct - means ActionAssigned for SPITTypes is is not implemented in SPITProtocol.
|
||||||
* This can used to setActionAssigned to all SPITObjects with this SPITType.<br>
|
* This can used to setActionAssigned to all SPITObjects with this SPITType.
|
||||||
* This may be used in the case when the same action should be done for every SPITObject with this SPITType associated.<br>
|
* This may be used in the case when the same action should be done for every SPITObject with this SPITType associated.
|
||||||
* @return true = the m_ActionAssigned has changed.
|
* @return true = the m_ActionAssigned has changed.
|
||||||
*/
|
*/
|
||||||
bool SPITType::setActionAssigned(bool p_ActionAssigned) {
|
bool SPITType::setActionAssigned(bool p_ActionAssigned) {
|
||||||
if (m_ActionAssigned == p_ActionAssigned) return false;
|
if (m_ActionAssigned == p_ActionAssigned)
|
||||||
|
return false;
|
||||||
m_ActionAssigned = p_ActionAssigned;
|
m_ActionAssigned = p_ActionAssigned;
|
||||||
m_Confirmed = false;
|
m_Confirmed = false;
|
||||||
return true;
|
return true;
|
||||||
@@ -368,83 +141,97 @@ void SPITType::setCreatedByClient(bool p_CreatedByClient) {
|
|||||||
/**
|
/**
|
||||||
* Set the content of the SPITType as received from the server
|
* Set the content of the SPITType as received from the server
|
||||||
* @param p_ReportSPITType
|
* @param p_ReportSPITType
|
||||||
* @return true = the SPITType is changed<br>
|
* @return true = the SPITType is changed
|
||||||
* false = the SPITType is NOT changed, because it is not allowed to change.
|
* false = the SPITType is NOT changed, because it is not allowed to change.
|
||||||
*/
|
*/
|
||||||
bool SPITType::setMessageOP(SPIT_Message::ReportSPITType* p_ReportSPITType) {
|
bool SPITType::setMessageOP(SPIT_Message::ReportSPITType &reportSpitType) {
|
||||||
bool boolChangeAllowed;
|
bool boolChangeAllowed;
|
||||||
bool boolChanged = false;
|
bool boolChanged = false;
|
||||||
|
|
||||||
if (m_CreatedByClient == true && m_Fixed == true) {
|
if (m_CreatedByClient == true && m_Fixed == true) {
|
||||||
boolChangeAllowed = false;
|
boolChangeAllowed = false;
|
||||||
}
|
} else {
|
||||||
else {
|
|
||||||
boolChangeAllowed = true;
|
boolChangeAllowed = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
//Confirmation should be changable
|
// Confirmation should be changeable
|
||||||
if (m_CreatedByClient) {
|
if (m_CreatedByClient) {
|
||||||
// Server reports a client created SPITType -> the type is confirmed
|
// Server reports a client created SPITType -> the type is confirmed
|
||||||
m_Confirmed = true;
|
m_Confirmed = true;
|
||||||
}
|
} else {
|
||||||
else {
|
|
||||||
// type is NOT client created -> the client has to confirm the SPITtype
|
// type is NOT client created -> the client has to confirm the SPITtype
|
||||||
m_Confirmed = p_ReportSPITType->getConfirmed();
|
m_Confirmed = reportSpitType.getConfirmed();
|
||||||
}
|
}
|
||||||
if (m_DefaultDelay != p_ReportSPITType->getDelay()) {
|
if (m_DefaultDelay != reportSpitType.getDelay()) {
|
||||||
if (boolChangeAllowed == false) throw new exception();
|
if (boolChangeAllowed == false) {
|
||||||
m_DefaultDelay = p_ReportSPITType->getDelay();
|
return false;
|
||||||
|
}
|
||||||
|
m_DefaultDelay = reportSpitType.getDelay();
|
||||||
boolChanged = true;
|
boolChanged = true;
|
||||||
}
|
}
|
||||||
if (m_DefaultDuration != p_ReportSPITType->getDuration()) {
|
if (m_DefaultDuration != reportSpitType.getDuration()) {
|
||||||
if (boolChangeAllowed == false) throw new exception();
|
if (boolChangeAllowed == false) {
|
||||||
m_DefaultDuration = p_ReportSPITType->getDuration();
|
return false;
|
||||||
|
}
|
||||||
|
m_DefaultDuration = reportSpitType.getDuration();
|
||||||
boolChanged = true;
|
boolChanged = true;
|
||||||
}
|
}
|
||||||
if (m_Fixed != p_ReportSPITType->getFixed()) {
|
if (m_Fixed != reportSpitType.getFixed()) {
|
||||||
if (boolChangeAllowed == false) throw new exception();
|
if (boolChangeAllowed == false) {
|
||||||
m_Fixed = p_ReportSPITType->getFixed();
|
return false;
|
||||||
|
}
|
||||||
|
m_Fixed = reportSpitType.getFixed();
|
||||||
boolChanged = true;
|
boolChanged = true;
|
||||||
}
|
}
|
||||||
if (m_GroupName != p_ReportSPITType->getGroupName()) {
|
if (m_GroupName != reportSpitType.getGroupName()) {
|
||||||
if (boolChangeAllowed == false) throw new exception();
|
if (boolChangeAllowed == false) {
|
||||||
m_GroupName = p_ReportSPITType->getGroupName();
|
return false;
|
||||||
|
}
|
||||||
|
m_GroupName = reportSpitType.getGroupName();
|
||||||
boolChanged = true;
|
boolChanged = true;
|
||||||
}
|
}
|
||||||
if (m_ID != p_ReportSPITType->getID()) {
|
if (m_ID != reportSpitType.getID()) {
|
||||||
if (boolChangeAllowed == false) throw new exception();
|
if (boolChangeAllowed == false) {
|
||||||
m_ID = p_ReportSPITType->getID();
|
return false;
|
||||||
|
}
|
||||||
|
m_ID = reportSpitType.getID();
|
||||||
boolChanged = true;
|
boolChanged = true;
|
||||||
}
|
}
|
||||||
if (m_Name != p_ReportSPITType->getName()) {
|
if (m_Name != reportSpitType.getName()) {
|
||||||
if (boolChangeAllowed == false) throw new exception();
|
if (boolChangeAllowed == false) {
|
||||||
m_Name = p_ReportSPITType->getName();
|
return false;
|
||||||
|
}
|
||||||
|
m_Name = reportSpitType.getName();
|
||||||
boolChanged = true;
|
boolChanged = true;
|
||||||
}
|
}
|
||||||
if (m_ServerProjectIndepended != p_ReportSPITType->getServerProjectIndepended()) {
|
if (m_ServerProjectIndepended != reportSpitType.getServerProjectIndepended()) {
|
||||||
if (boolChangeAllowed == false) throw new exception();
|
if (boolChangeAllowed == false) {
|
||||||
m_ServerProjectIndepended = p_ReportSPITType->getServerProjectIndepended();
|
return false;
|
||||||
|
}
|
||||||
|
m_ServerProjectIndepended = reportSpitType.getServerProjectIndepended();
|
||||||
boolChanged = true;
|
boolChanged = true;
|
||||||
}
|
}
|
||||||
if (m_ServerRemote != p_ReportSPITType->getServerRemote()) {
|
if (m_ServerRemote != reportSpitType.getServerRemote()) {
|
||||||
if (boolChangeAllowed == false) throw new exception();
|
if (boolChangeAllowed == false) {
|
||||||
m_ServerRemote = p_ReportSPITType->getServerRemote();
|
return false;
|
||||||
|
}
|
||||||
|
m_ServerRemote = reportSpitType.getServerRemote();
|
||||||
boolChanged = true;
|
boolChanged = true;
|
||||||
}
|
}
|
||||||
return boolChanged;
|
return boolChanged;
|
||||||
}
|
}
|
||||||
|
|
||||||
void SPITType::fillMessageOP(SPIT_Message::ReportSPITType* ptrSMReportSPITType) {
|
void SPITType::fillMessageOP(SPIT_Message::ReportSPITType &smReportSpitType) const {
|
||||||
ptrSMReportSPITType->setConfirmed(m_Confirmed);
|
smReportSpitType.setConfirmed(m_Confirmed);
|
||||||
ptrSMReportSPITType->setDelay(m_DefaultDelay);
|
smReportSpitType.setDelay(m_DefaultDelay);
|
||||||
ptrSMReportSPITType->setDuration(m_DefaultDuration);
|
smReportSpitType.setDuration(m_DefaultDuration);
|
||||||
ptrSMReportSPITType->setFixed(m_Fixed);
|
smReportSpitType.setFixed(m_Fixed);
|
||||||
ptrSMReportSPITType->setGroupName(m_GroupName);
|
smReportSpitType.setGroupName(m_GroupName);
|
||||||
ptrSMReportSPITType->setID(m_ID);
|
smReportSpitType.setID(m_ID);
|
||||||
ptrSMReportSPITType->setName(m_Name);
|
smReportSpitType.setName(m_Name);
|
||||||
ptrSMReportSPITType->setServerProjectIndepended(m_ServerProjectIndepended);
|
smReportSpitType.setServerProjectIndepended(m_ServerProjectIndepended);
|
||||||
ptrSMReportSPITType->setServerRemote(m_ServerRemote);
|
smReportSpitType.setServerRemote(m_ServerRemote);
|
||||||
}
|
}
|
||||||
void SPITType::fillMessageOP(SPIT_Message::RemoveSPITType* ptrSMRemoveSPITType) {
|
void SPITType::fillMessageOP(SPIT_Message::RemoveSPITType &smRemoveSpitType) const {
|
||||||
ptrSMRemoveSPITType->setID(m_ID);
|
smRemoveSpitType.setID(m_ID);
|
||||||
}
|
}
|
||||||
|
|||||||
+538
-812
File diff suppressed because it is too large
Load Diff
+762
-1243
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,4 @@
|
|||||||
|
idf_component_register(
|
||||||
|
INCLUDE_DIRS "."
|
||||||
|
REQUIRES devHal
|
||||||
|
)
|
||||||
@@ -0,0 +1,50 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "StepperDrv8833.hpp"
|
||||||
|
#include "stepperMotor.hpp"
|
||||||
|
#include <cmath>
|
||||||
|
|
||||||
|
class WatchMotor {
|
||||||
|
static constexpr uint8_t Positions = 6;
|
||||||
|
|
||||||
|
public:
|
||||||
|
WatchMotor(StepperMotor &stepper, OutputPort &sleep)
|
||||||
|
: _stepper(stepper),
|
||||||
|
_motorSleep(sleep) {
|
||||||
|
_motorSleep.write(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
void moveTo(uint8_t sign, uint8_t profile = 0) {
|
||||||
|
sign = sign % 6;
|
||||||
|
|
||||||
|
float delta = 2.0F * std::numbers::pi;
|
||||||
|
float corr = 0.0F;
|
||||||
|
float currentPos = _stepper.getScaledPos() * 6;
|
||||||
|
if ((_currentIndex > 4) && (currentPos < 2)) {
|
||||||
|
corr = 6 - _currentIndex - currentPos;
|
||||||
|
} else if ((_currentIndex < 2) && (currentPos > 2)) {
|
||||||
|
corr = _currentIndex + 6 - currentPos;
|
||||||
|
} else {
|
||||||
|
corr = _currentIndex - currentPos;
|
||||||
|
}
|
||||||
|
|
||||||
|
// stepper.getScaledPos() * 6
|
||||||
|
if (_currentIndex < sign) {
|
||||||
|
delta = delta / 6 * (sign - _currentIndex);
|
||||||
|
} else if (_currentIndex > sign) {
|
||||||
|
delta = delta / 6 * (sign + 6 - _currentIndex);
|
||||||
|
}
|
||||||
|
ESP_LOGD("MV", "Moving to %d by %.2f + %.2f", sign, delta, corr);
|
||||||
|
|
||||||
|
_stepper.moveBy(delta + corr, profile);
|
||||||
|
_currentIndex = sign;
|
||||||
|
}
|
||||||
|
|
||||||
|
float getScaled() { return _stepper.getScaledPos() * 6; }
|
||||||
|
uint8_t getIndex() { return _currentIndex; }
|
||||||
|
|
||||||
|
private:
|
||||||
|
StepperMotor &_stepper;
|
||||||
|
OutputPort &_motorSleep;
|
||||||
|
uint8_t _currentIndex{};
|
||||||
|
};
|
||||||
+1
-1
Submodule core updated: 3041a17851...c85bfa2afc
+188
@@ -0,0 +1,188 @@
|
|||||||
|
I (23) boot: ESP-IDF v5.3 2nd stage bootloader
|
||||||
|
I (24) boot: compile time Feb 15 2025 17:51:30
|
||||||
|
I (24) boot: chip revision: v0.0
|
||||||
|
I (26) boot.esp32c6: SPI Speed : 80MHz
|
||||||
|
I (31) boot.esp32c6: SPI Mode : DIO
|
||||||
|
I (36) boot.esp32c6: SPI Flash Size : 8MB
|
||||||
|
I (41) boot: Enabling RNG early entropy source...
|
||||||
|
I (46) boot: Partition Table:
|
||||||
|
I (50) boot: ## Label Usage Type ST Offset Length
|
||||||
|
I (57) boot: 0 nvs WiFi data 01 02 00009000 00006000
|
||||||
|
I (64) boot: 1 phy_init RF data 01 01 0000f000 00001000
|
||||||
|
I (72) boot: 2 factory factory app 00 00 00010000 00100000
|
||||||
|
I (79) boot: End of partition table
|
||||||
|
I (83) esp_image: segment 0: paddr=00010020 vaddr=42070020 size=2b2e0h (176864) map
|
||||||
|
I (128) esp_image: segment 1: paddr=0003b308 vaddr=40800000 size=04d10h ( 19728) load
|
||||||
|
I (134) esp_image: segment 2: paddr=00040020 vaddr=42000020 size=6bfe0h (442336) map
|
||||||
|
I (226) esp_image: segment 3: paddr=000ac008 vaddr=40804d10 size=094b0h ( 38064) load
|
||||||
|
I (235) esp_image: segment 4: paddr=000b54c0 vaddr=4080e1c0 size=01bd0h ( 7120) load
|
||||||
|
I (241) boot: Loaded app from partition at offset 0x10000
|
||||||
|
I (242) boot: Disabling RNG early entropy source...
|
||||||
|
I (256) cpu_start: Unicore app
|
||||||
|
I (265) cpu_start: Pro cpu start user code
|
||||||
|
I (265) cpu_start: cpu freq: 160000000 Hz
|
||||||
|
I (265) app_init: Application information:
|
||||||
|
I (268) app_init: Project name: X_WatchController_FW
|
||||||
|
I (274) app_init: App version: 858b7d8-dirty
|
||||||
|
I (279) app_init: Compile time: Apr 8 2025 22:42:59
|
||||||
|
I (285) app_init: ELF file SHA256: ab11b461f...
|
||||||
|
I (290) app_init: ESP-IDF: v5.3
|
||||||
|
I (295) efuse_init: Min chip rev: v0.0
|
||||||
|
I (300) efuse_init: Max chip rev: v0.99
|
||||||
|
I (305) efuse_init: Chip rev: v0.0
|
||||||
|
I (309) heap_init: Initializing. RAM available for dynamic allocation:
|
||||||
|
I (317) heap_init: At 40812120 len 0006A4F0 (425 KiB): RAM
|
||||||
|
I (323) heap_init: At 4087C610 len 00002F54 (11 KiB): RAM
|
||||||
|
I (329) heap_init: At 50000000 len 00003FE8 (15 KiB): RTCRAM
|
||||||
|
I (336) spi_flash: detected chip: generic
|
||||||
|
I (340) spi_flash: flash io: dio
|
||||||
|
I (345) sleep: Configure to isolate all GPIO pins in sleep state
|
||||||
|
I (351) sleep: Enable automatic switching of GPIO sleep configuration
|
||||||
|
I (358) coexist: coex firmware version: dab85ae96
|
||||||
|
I (385) coexist: coexist rom version 5b8dcfa
|
||||||
|
I (386) main_task: Started on CPU0
|
||||||
|
I (386) main_task: Calling app_main()
|
||||||
|
I (396) esp_eth.netif.netif_glue: 42:4c:ca:ff:fe:4e
|
||||||
|
I (396) esp_eth.netif.netif_glue: ethernet attached to netif
|
||||||
|
I (406) Watch: Ethernet Started
|
||||||
|
I (406) Watch: Start Lighting
|
||||||
|
I (406) gpio: GPIO[10]| InputEn: 1| OutputEn: 1| OpenDrain: 1| Pullup: 1| Pulldown: 0| Intr:0
|
||||||
|
I (416) gpio: GPIO[11]| InputEn: 1| OutputEn: 1| OpenDrain: 1| Pullup: 1| Pulldown: 0| Intr:0
|
||||||
|
I (426) Watch: Start Stepper
|
||||||
|
I (426) gpio: GPIO[18]| InputEn: 1| OutputEn: 0| OpenDrain: 0| Pullup: 0| Pulldown: 0| Intr:0
|
||||||
|
I (436) gpio: GPIO[8]| InputEn: 1| OutputEn: 0| OpenDrain: 0| Pullup: 0| Pulldown: 0| Intr:0
|
||||||
|
I (446) gpio: GPIO[15]| InputEn: 0| OutputEn: 1| OpenDrain: 0| Pullup: 0| Pulldown: 0| Intr:0
|
||||||
|
I (456) TMR: Create timer handle
|
||||||
|
I (456) TMR: Setup timer
|
||||||
|
I (456) Stepper: Find Home
|
||||||
|
I (466) Stepper: Homing ...
|
||||||
|
I (466) Stepper: Fast find right side of home sensor
|
||||||
|
I (486) gpio: GPIO[1]| InputEn: 0| OutputEn: 1| OpenDrain: 0| Pullup: 0| Pulldown: 0| Intr:0
|
||||||
|
I (2206) Stepper: Find right side of home sensor
|
||||||
|
I (2376) Stepper: Find end of sensor
|
||||||
|
I (2406) Watch: Ethernet Link Up
|
||||||
|
I (2406) Watch: Ethernet Link Up
|
||||||
|
I (2406) Watch: Ethernet HW Addr 00:00:00:00:00:00
|
||||||
|
I (3406) esp_netif_handlers: eth ip: 172.16.17.56, mask: 255.255.0.0, gw: 172.16.0.1
|
||||||
|
I (3406) Watch: Ethernet Got IP Address
|
||||||
|
I (3406) Watch: ~~~~~~~~~~~
|
||||||
|
I (3406) Watch: ETHIP:172.16.17.56
|
||||||
|
I (3416) Watch: ETHMASK:255.255.0.0
|
||||||
|
I (3416) Watch: ETHGW:172.16.0.1
|
||||||
|
I (3416) Watch: ~~~~~~~~~~~
|
||||||
|
I (5186) Stepper: Find left side of home sensor
|
||||||
|
I (5646) Stepper: Move back to mid position 116
|
||||||
|
I (6806) Stepper: Reset position
|
||||||
|
I (7086) Stepper: Got to 1
|
||||||
|
I (7086) Watch: Fist Position is 0.03
|
||||||
|
I (7106) Watch: Changing picto-Illum to pos = 0
|
||||||
|
I (7106) Watch: Current color set r128 g128 b128
|
||||||
|
I (13426) Watch: Start net services
|
||||||
|
I (13426) Watch: Starting Telnet task
|
||||||
|
I (13426) TCP: Socket created
|
||||||
|
I (13426) Watch: Starting ArtNet task
|
||||||
|
I (13426) TCP: Socket bound, port 23
|
||||||
|
I (13426) Watch: Starting SPIT task
|
||||||
|
I (13426) UDP: Starting syslog session to 172.16.16.10
|
||||||
|
I (13426) UDP: Socket bound, port 6454
|
||||||
|
I (13436) Telnet: Socket waiting for connect
|
||||||
|
I (13436) SPIT: Connected to eth
|
||||||
|
I (13456) SPIT: - IPv4 address: 172.16.17.56,
|
||||||
|
I (13456) SPIT: - IPv4 netmask: 255.255.0.0,
|
||||||
|
I (13446) SysLog: Starting Syslog Task
|
||||||
|
I (13466) Watch: NEW SPIT-Type ID: ActionStartShuffle GroupName: CatasWatchMovement Name: ActionStartShuffle confirmed: 0
|
||||||
|
I (13466) UDP: Socket bound, port 514
|
||||||
|
I (13486) Watch: NEW SPIT-Type ID: ActionMoveTo1 GroupName: CatasWatchMovement Name: ActionMoveTo1 confirmed: 0
|
||||||
|
I (13496) Watch: NEW SPIT-Type ID: ActionMoveTo2 GroupName: CatasWatchMovement Name: ActionMoveTo2 confirmed: 0
|
||||||
|
I (13506) Watch: NEW SPIT-Type ID: ActionMoveTo3 GroupName: CatasWatchMovement Name: ActionMoveTo3 confirmed: 0
|
||||||
|
I (13516) Watch: NEW SPIT-Type ID: ActionMoveTo4 GroupName: CatasWatchMovement Name: ActionMoveTo4 confirmed: 0
|
||||||
|
I (13526) Watch: NEW SPIT-Type ID: ActionMoveTo5 GroupName: CatasWatchMovement Name: ActionMoveTo5 confirmed: 0
|
||||||
|
I (13536) Watch: NEW SPIT-Type ID: ActionMoveTo6 GroupName: CatasWatchMovement Name: ActionMoveTo6 confirmed: 0
|
||||||
|
I (13546) SPIT: Starting Socket managing
|
||||||
|
I (17656) Watch: SERVER DETECTED
|
||||||
|
I (17656) Watch: Name: liveShowSPIT
|
||||||
|
I (17656) Watch: ID: 698a3e4f-1ae9-4dd8-9015-29332d29629e
|
||||||
|
I (17656) Watch: Computer: GgP17
|
||||||
|
I (17656) Watch: IP: 172.16.16.10
|
||||||
|
I (17666) Watch: Port: 15120
|
||||||
|
I (17666) Watch: Addition:
|
||||||
|
I (17666) Watch: ClientIP: 172.16.17.56
|
||||||
|
I (17676) SPIT: connect to 172.16.16.10 / 15120
|
||||||
|
I (17676) Watch: MySPITApp: eventConnectionStatus 0->0
|
||||||
|
I (17686) Watch: MySPITApp: eventConnectionStatus 0->4
|
||||||
|
I (18196) Watch: eventProjectReport ID: CatasWatchProject
|
||||||
|
I (18196) Watch: eventStartProjectTransfer
|
||||||
|
W (18306) SPIT: TypeVeto e019646a-4e24-4608-954e-da4ca6761bb6 / ToIgnore 43
|
||||||
|
I (18326) Watch: NEW SPIT-Object ID: 00000m8uedyyt0000000000000002sb0va8bom Name: -> SPITType: ActionStartShuffle
|
||||||
|
I (18336) Watch: NEW SPIT-Object ID: 00000m8uedyyt0000000000000002rd0va8bom Name: -> SPITType: ActionMoveTo1
|
||||||
|
I (18356) Watch: NEW SPIT-Object ID: 00000m8uedyyt0000000000000002vl0va8bom Name: -> SPITType: ActionMoveTo2
|
||||||
|
I (18366) Watch: NEW SPIT-Object ID: 00000m8uedyyt0000000000000002wh0va8bom Name: -> SPITType: ActionMoveTo3
|
||||||
|
I (18386) Watch: NEW SPIT-Object ID: 00000m8uedyyt0000000000000002yl0va8bom Name: -> SPITType: ActionMoveTo4
|
||||||
|
I (18396) Watch: NEW SPIT-Object ID: 00000m8uedyyt0000000000000002tc0va8bom Name: -> SPITType: ActionMoveTo5
|
||||||
|
I (18416) Watch: NEW SPIT-Object ID: 00000m8uedyyt0000000000000002zi0va8bom Name: -> SPITType: ActionMoveTo6
|
||||||
|
I (18446) Watch: Min heap size: 297568 / FreeHeap 299880
|
||||||
|
I (18446) Watch: NEW SPIT-REMOTE-Type ID: playControlStart GroupName: Playcontrol Name: start confirmed: 1
|
||||||
|
I (18466) Watch: NEW SPIT-REMOTE-Type ID: playControlPause GroupName: Playcontrol Name: pause confirmed: 1
|
||||||
|
I (18476) Watch: NEW SPIT-REMOTE-Type ID: nextSceneBridge GroupName: Playcontrol Name: next scene confirmed: 1
|
||||||
|
I (18496) Watch: NEW SPIT-REMOTE-Type ID: nextMainSceneBridge GroupName: Playcontrol Name: next main scene confirmed: 1
|
||||||
|
I (18506) Watch: NEW SPIT-REMOTE-Type ID: previuosSceneBridge GroupName: Playcontrol Name: previous scene confirmed: 1
|
||||||
|
I (18526) Watch: NEW SPIT-REMOTE-Type ID: previousMainSceneBridge GroupName: Playcontrol Name: previous main scene confirmed: 1
|
||||||
|
I (18546) Watch: NEW SPIT-REMOTE-Type ID: mainmixerSound_Volume00 GroupName: Main Mixer Name: Sound confirmed: 1
|
||||||
|
I (18556) Watch: NEW SPIT-REMOTE-Type ID: mainmixerDMX_Dimmer00 GroupName: Main Mixer Name: confirmed: 1
|
||||||
|
I (18566) Watch: NEW SPIT-REMOTE-Type ID: mainmixerDMX_RGB00 GroupName: Main Mixer Name: confirmed: 1
|
||||||
|
I (18586) Watch: NEW SPIT-REMOTE-Type ID: mainmixerDMX_RGB10 GroupName: Main Mixer Name: confirmed: 1
|
||||||
|
I (18606) Watch: NEW SPIT-REMOTE-Type ID: mainmixerDMX_RGB20 GroupName: Main Mixer Name: confirmed: 1
|
||||||
|
I (18616) Watch: NEW SPIT-REMOTE-Type ID: mainmixerDMX_RGB30 GroupName: Main Mixer Name: confirmed: 1
|
||||||
|
I (18636) Watch: NEW SPIT-REMOTE-Type ID: mainmixerDMX_RGB40 GroupName: Main Mixer Name: confirmed: 1
|
||||||
|
I (18646) Watch: NEW SPIT-REMOTE-Type ID: mainmixerDMX_RGB50 GroupName: Main Mixer Name: confirmed: 1
|
||||||
|
I (18666) Watch: NEW SPIT-REMOTE-Type ID: mainmixerMedia_SoundVolume00 GroupName: Main Mixer Name: Media confirmed: 1
|
||||||
|
I (18686) Watch: NEW SPIT-REMOTE-Type ID: mainmixerMedia_Transparency00 GroupName: Main Mixer Name: Media confirmed: 1
|
||||||
|
I (18696) Watch: NEW SPIT-REMOTE-Type ID: selectedJingles GroupName: Playcontrol Name: selected Jingles confirmed: 1
|
||||||
|
I (18716) Watch: NEW SPIT-REMOTE-Type ID: selectedJingleGroups GroupName: Playcontrol Name: selected Jinglegroups confirmed: 1
|
||||||
|
I (18726) Watch: NEW SPIT-REMOTE-Type ID: 00000m8uedyyt0000000000000000lo0va8bom GroupName: MainScene Name: ChangingPositionScene confirmed: 1
|
||||||
|
I (18746) Watch: NEW SPIT-REMOTE-Type ID: 00000m8uedyyt0000000000000000m70va8bom GroupName: MainScene Name: InPosition1Scene confirmed: 1
|
||||||
|
I (18756) Watch: NEW SPIT-REMOTE-Type ID: 00000m8uedyyt0000000000000000mh0va8bom GroupName: MainScene Name: InPosition2Scene confirmed: 1
|
||||||
|
I (18776) Watch: NEW SPIT-REMOTE-Type ID: 00000m8uedyyt0000000000000000mr0va8bom GroupName: MainScene Name: InPosition3Scene confirmed: 1
|
||||||
|
I (18786) Watch: NEW SPIT-REMOTE-Type ID: 00000m8uedyyt0000000000000000nk0va8bom GroupName: MainScene Name: InPosition4Scene confirmed: 1
|
||||||
|
I (18806) Watch: NEW SPIT-REMOTE-Type ID: 00000m8uedyyt0000000000000000nu0va8bom GroupName: MainScene Name: InPosition5Scene confirmed: 1
|
||||||
|
I (18826) Watch: NEW SPIT-REMOTE-Type ID: 00000m8uedyyt0000000000000000o40va8bom GroupName: MainScene Name: InPosition6Scene confirmed: 1
|
||||||
|
I (18836) Watch: NEW SPIT-REMOTE-Type ID: 00000m8uedyyt0000000000000001au0va8bom GroupName: MainScene Name: StartShuffle confirmed: 1
|
||||||
|
I (18856) Watch: NEW SPIT-REMOTE-Type ID: 00000m8uedyyt0000000000000001fj0va8bom GroupName: MainScene Name: Fence confirmed: 1
|
||||||
|
I (18866) Watch: NEW SPIT-REMOTE-Object ID: playControlStart Name: start -> SPITType: start
|
||||||
|
I (18886) Watch: NEW SPIT-REMOTE-Object ID: playControlPause Name: pause -> SPITType: pause
|
||||||
|
I (18906) Watch: NEW SPIT-REMOTE-Object ID: nextSceneBridge Name: next scene -> SPITType: next scene
|
||||||
|
I (18916) Watch: NEW SPIT-REMOTE-Object ID: nextMainSceneBridge Name: next main scene -> SPITType: next main scene
|
||||||
|
I (18936) Watch: NEW SPIT-REMOTE-Object ID: previuosSceneBridge Name: previous scene -> SPITType: previous scene
|
||||||
|
I (18946) Watch: NEW SPIT-REMOTE-Object ID: previousMainSceneBridge Name: previous main scene -> SPITType: previous main scene
|
||||||
|
I (18966) Watch: NEW SPIT-REMOTE-Object ID: mainmixerSound_Volume00 Name: Sound Volume -> SPITType: Sound
|
||||||
|
I (18976) Watch: NEW SPIT-REMOTE-Object ID: mainmixerDMX_Dimmer00 Name: Dimmer -> SPITType:
|
||||||
|
I (18996) Watch: NEW SPIT-REMOTE-Object ID: mainmixerDMX_RGB00 Name: Red -> SPITType:
|
||||||
|
I (19006) Watch: NEW SPIT-REMOTE-Object ID: mainmixerDMX_RGB10 Name: Green -> SPITType:
|
||||||
|
I (19026) Watch: NEW SPIT-REMOTE-Object ID: mainmixerDMX_RGB20 Name: Blue -> SPITType:
|
||||||
|
I (19036) Watch: NEW SPIT-REMOTE-Object ID: mainmixerDMX_RGB30 Name: Cyan -> SPITType:
|
||||||
|
I (19056) Watch: NEW SPIT-REMOTE-Object ID: mainmixerDMX_RGB40 Name: Magenta -> SPITType:
|
||||||
|
I (19076) Watch: NEW SPIT-REMOTE-Object ID: mainmixerDMX_RGB50 Name: Yellow -> SPITType:
|
||||||
|
I (19086) Watch: NEW SPIT-REMOTE-Object ID: mainmixerMedia_SoundVolume00 Name: Sound Volume -> SPITType: Media
|
||||||
|
I (19106) Watch: NEW SPIT-REMOTE-Object ID: mainmixerMedia_Transparency00 Name: Media Transparency -> SPITType: Media
|
||||||
|
I (19116) Watch: NEW SPIT-REMOTE-Object ID: selectedJinglesps Name: Play / Stop -> SPITType: selected Jingles
|
||||||
|
I (19136) Watch: NEW SPIT-REMOTE-Object ID: selectedJinglespf Name: Play / Fade Out -> SPITType: selected Jingles
|
||||||
|
I (19146) Watch: NEW SPIT-REMOTE-Object ID: selectedJingleGroupsps Name: Play / Stop -> SPITType: selected Jinglegroups
|
||||||
|
I (19166) Watch: NEW SPIT-REMOTE-Object ID: selectedJingleGroupspf Name: Play / Fade Out -> SPITType: selected Jinglegroups
|
||||||
|
I (19176) Watch: NEW SPIT-REMOTE-Object ID: 00000m8uedyyt0000000000000000lo0va8bom Name: play -> SPITType: ChangingPositionScene
|
||||||
|
W (19196) SPIT: Finished searching
|
||||||
|
W (19196) SPIT: Start working
|
||||||
|
I (19196) Watch: NEW SPIT-REMOTE-Object ID: 00000m8uedyyt0000000000000000m70va8bom Name: play -> SPITType: InPosition1Scene
|
||||||
|
I (19216) Watch: NEW SPIT-REMOTE-Object ID: 00000m8uedyyt0000000000000000mh0va8bom Name: play -> SPITType: InPosition2Scene
|
||||||
|
I (19226) Watch: NEW SPIT-REMOTE-Object ID: 00000m8uedyyt0000000000000000mr0va8bom Name: play -> SPITType: InPosition3Scene
|
||||||
|
I (19246) Watch: NEW SPIT-REMOTE-Object ID: 00000m8uedyyt0000000000000000nk0va8bom Name: play -> SPITType: InPosition4Scene
|
||||||
|
I (19256) Watch: NEW SPIT-REMOTE-Object ID: 00000m8uedyyt0000000000000000nu0va8bom Name: play -> SPITType: InPosition5Scene
|
||||||
|
I (19276) Watch: NEW SPIT-REMOTE-Object ID: 00000m8uedyyt0000000000000000o40va8bom Name: play -> SPITType: InPosition6Scene
|
||||||
|
I (19286) Watch: NEW SPIT-REMOTE-Object ID: 00000m8uedyyt0000000000000001au0va8bom Name: play -> SPITType: StartShuffle
|
||||||
|
I (19306) Watch: NEW SPIT-REMOTE-Object ID: 00000m8uedyyt0000000000000001fj0va8bom Name: play -> SPITType: Fence
|
||||||
|
I (19316) Watch: eventEndProjectTransfer
|
||||||
|
I (19316) Watch: eventProjectReport ID: CatasWatchProject Name: FramesPerSecond: 44100
|
||||||
|
I (23446) Watch: Min heap size: 278024 / FreeHeap 282460
|
||||||
|
I (28446) Watch: Min heap size: 278024 / FreeHeap 282460
|
||||||
|
I (33446) Watch: Min heap size: 278024 / FreeHeap 282460
|
||||||
|
I (38446) Watch: Min heap size: 278024 / FreeHeap 282460
|
||||||
|
I (43446) Watch: Min heap size: 278024 / FreeHeap 282460
|
||||||
Binary file not shown.
Binary file not shown.
|
Before Width: | Height: | Size: 25 KiB After Width: | Height: | Size: 26 KiB |
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -0,0 +1,5 @@
|
|||||||
|
{\rtf1\ansi
|
||||||
|
{\fonttbl\f0\fnil Monospaced;}
|
||||||
|
|
||||||
|
\par
|
||||||
|
}
|
||||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
+382
-66
@@ -6,15 +6,18 @@
|
|||||||
* @copyright Copyright (c) 2024
|
* @copyright Copyright (c) 2024
|
||||||
*/
|
*/
|
||||||
|
|
||||||
// Conig-Key:
|
/* Watchface
|
||||||
//
|
6/
|
||||||
//
|
5 / 1
|
||||||
//
|
4 2
|
||||||
|
3
|
||||||
|
*/
|
||||||
|
|
||||||
struct {
|
struct {
|
||||||
const char *syslogDest = "syslogDst"; // example: "172.16.16.10"
|
const char *syslogDest = "syslogDst"; // example: "172.16.16.10"
|
||||||
const char *mqttBroker = "mqttBroker"; // example: "172.16.17.62"
|
const char *mqttBroker = "mqttBroker"; // example: "172.16.16.10"
|
||||||
const char *mqttPrefix = "mqttPrefix"; // example: "SomeTag"
|
const char *mqttPrefix = "mqttPrefix"; // example: "SomeTag"
|
||||||
|
const char *spitServer = "spitServer"; // example: "172.16.16.10"
|
||||||
} ConfigKeys;
|
} ConfigKeys;
|
||||||
|
|
||||||
// MQTT Topics
|
// MQTT Topics
|
||||||
@@ -27,6 +30,33 @@ struct {
|
|||||||
const char *changingPosition = /* <mqttPrefix>/ */ "watch/changingPosition";
|
const char *changingPosition = /* <mqttPrefix>/ */ "watch/changingPosition";
|
||||||
} MqttTopics;
|
} MqttTopics;
|
||||||
|
|
||||||
|
struct {
|
||||||
|
const char *expectedServer = "";
|
||||||
|
struct {
|
||||||
|
const char *group = "CatasWatchMovement";
|
||||||
|
const char *startShuffle = "ActionStartShuffle";
|
||||||
|
const char *moveToX[6] = {
|
||||||
|
"ActionMoveTo1",
|
||||||
|
"ActionMoveTo2",
|
||||||
|
"ActionMoveTo3",
|
||||||
|
"ActionMoveTo4",
|
||||||
|
"ActionMoveTo5",
|
||||||
|
"ActionMoveTo6",
|
||||||
|
};
|
||||||
|
} Provided;
|
||||||
|
struct {
|
||||||
|
const char *changingPos = "ChangingPositionScene";
|
||||||
|
const char *inPosX[6] = {
|
||||||
|
"InPosition1Scene",
|
||||||
|
"InPosition2Scene",
|
||||||
|
"InPosition3Scene",
|
||||||
|
"InPosition4Scene",
|
||||||
|
"InPosition5Scene",
|
||||||
|
"InPosition6Scene",
|
||||||
|
};
|
||||||
|
} Expected;
|
||||||
|
} SpitTypes;
|
||||||
|
|
||||||
// ToDo:
|
// ToDo:
|
||||||
// - MQTT Integration
|
// - MQTT Integration
|
||||||
// - OTA
|
// - OTA
|
||||||
@@ -36,8 +66,8 @@ struct {
|
|||||||
|
|
||||||
#include "watchMain.hpp"
|
#include "watchMain.hpp"
|
||||||
|
|
||||||
string MyApp::s_ClientName = "CatasWatchDev";
|
string ClientName = "CatasWatchDev";
|
||||||
string MyApp::s_ProjectName = "CatastrphicProj";
|
string ProjectName = "CatastrphicProj";
|
||||||
|
|
||||||
extern "C" { // This switch allows the ROS C-implementation to find this main
|
extern "C" { // This switch allows the ROS C-implementation to find this main
|
||||||
void app_main(void);
|
void app_main(void);
|
||||||
@@ -47,20 +77,29 @@ struct DeviceState {
|
|||||||
uint8_t minJumps{6};
|
uint8_t minJumps{6};
|
||||||
uint8_t maxJumps{32};
|
uint8_t maxJumps{32};
|
||||||
uint8_t profile{};
|
uint8_t profile{};
|
||||||
uint8_t restTime{};
|
uint8_t shuffleRate{};
|
||||||
float speed = 1.0; // Rad/sec
|
float speed = 1.0; // Rad/sec
|
||||||
float accel = 1.0; // Rad/sec^2
|
float accel = 1.0; // Rad/sec^2
|
||||||
Color color{0x80, 0x80, 0x80};
|
Color color{0x80, 0x80, 0x80};
|
||||||
uint8_t pictogram{}; // 0..5 active Pictogramm
|
|
||||||
};
|
};
|
||||||
|
|
||||||
enum class MoveType {
|
enum class MoveType {
|
||||||
StepTo,
|
StepTo,
|
||||||
|
Demo,
|
||||||
Shuffle,
|
Shuffle,
|
||||||
Demo
|
};
|
||||||
|
enum class ResponseType {
|
||||||
|
StepAt,
|
||||||
|
StartMoving,
|
||||||
};
|
};
|
||||||
struct MoveCommand {
|
struct MoveCommand {
|
||||||
MoveType type;
|
MoveType type;
|
||||||
|
// 1..6
|
||||||
|
uint8_t pos;
|
||||||
|
};
|
||||||
|
struct WatchIndex {
|
||||||
|
ResponseType type;
|
||||||
|
// 1..6
|
||||||
uint8_t pos;
|
uint8_t pos;
|
||||||
};
|
};
|
||||||
struct PictoIllumCommand {
|
struct PictoIllumCommand {
|
||||||
@@ -68,6 +107,7 @@ struct PictoIllumCommand {
|
|||||||
};
|
};
|
||||||
|
|
||||||
static fos::Queue<MoveCommand> commandQueue(8);
|
static fos::Queue<MoveCommand> commandQueue(8);
|
||||||
|
static fos::Queue<WatchIndex> responseQueue(8);
|
||||||
static fos::Queue<PictoIllumCommand> pictoIllumQue(2);
|
static fos::Queue<PictoIllumCommand> pictoIllumQue(2);
|
||||||
|
|
||||||
DeviceState activeState;
|
DeviceState activeState;
|
||||||
@@ -245,7 +285,7 @@ static void UniverseCallback(const uint8_t *data, const uint16_t size) {
|
|||||||
Syslog::logv(Syslog::Severity::Debug, "Got DMX: r%0x g%0x b%0x i%0x m%i M%i p%i a%i w%i r%i",
|
Syslog::logv(Syslog::Severity::Debug, "Got DMX: r%0x g%0x b%0x i%0x m%i M%i p%i a%i w%i r%i",
|
||||||
/* RGB*/ data[0], data[1], data[2], /*Intens*/ data[3],
|
/* RGB*/ data[0], data[1], data[2], /*Intens*/ data[3],
|
||||||
/* MinMaxJumps */ data[4], data[5], /*profile*/ data[6], /*accel/speed*/ data[7], data[8],
|
/* MinMaxJumps */ data[4], data[5], /*profile*/ data[6], /*accel/speed*/ data[7], data[8],
|
||||||
/*RestTime*/ data[9]);
|
/*shuffleRate*/ data[9]);
|
||||||
|
|
||||||
float intens = (float)data[3] / UINT8_MAX;
|
float intens = (float)data[3] / UINT8_MAX;
|
||||||
activeState.color = Color{
|
activeState.color = Color{
|
||||||
@@ -263,7 +303,7 @@ static void UniverseCallback(const uint8_t *data, const uint16_t size) {
|
|||||||
activeState.accel = (float)accel / 100 + 0.5; // min .5 / max 3
|
activeState.accel = (float)accel / 100 + 0.5; // min .5 / max 3
|
||||||
activeState.speed = (float)velo / 100 + 0.5; // min .5 / max 3
|
activeState.speed = (float)velo / 100 + 0.5; // min .5 / max 3
|
||||||
|
|
||||||
activeState.restTime = data[9];
|
activeState.shuffleRate = data[9];
|
||||||
}
|
}
|
||||||
|
|
||||||
void moveToSubs(std::string data) {
|
void moveToSubs(std::string data) {
|
||||||
@@ -346,6 +386,7 @@ static void dmxSocketTask(int addrFamily) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fos::Semaphore etherActive;
|
fos::Semaphore etherActive;
|
||||||
|
fos::Semaphore spitProjectFinish;
|
||||||
|
|
||||||
/** Event handler for IP_EVENT_ETH_GOT_IP */
|
/** Event handler for IP_EVENT_ETH_GOT_IP */
|
||||||
static void got_ip_event_handler(void *arg, esp_event_base_t event_base,
|
static void got_ip_event_handler(void *arg, esp_event_base_t event_base,
|
||||||
@@ -437,7 +478,7 @@ namespace Effect {
|
|||||||
};
|
};
|
||||||
|
|
||||||
const Macro macDemoFlicker = {
|
const Macro macDemoFlicker = {
|
||||||
{64, 1, &InitSlopeWave, StateMachine::UpdateWave, 0xFF},
|
{16, 1, &InitSlopeWave, StateMachine::UpdateWave, 0xFF},
|
||||||
{32, 1, StateMachine::UpdateFlicker, 0xFF},
|
{32, 1, StateMachine::UpdateFlicker, 0xFF},
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
@@ -472,14 +513,23 @@ void LightingTask() {
|
|||||||
processors[5].setEffect(Effect::macDark, &colorSource, 0);
|
processors[5].setEffect(Effect::macDark, &colorSource, 0);
|
||||||
|
|
||||||
const std::array<Effect::Macro, 6> PictoEffects{
|
const std::array<Effect::Macro, 6> PictoEffects{
|
||||||
|
Effect::macDemoPulse, // 1
|
||||||
Effect::macDemoPulse,
|
Effect::macDemoPulse,
|
||||||
Effect::macDemoPulse,
|
Effect::macDemoPulse,
|
||||||
Effect::macDemoPulse,
|
Effect::macDemoPulse,
|
||||||
Effect::macDemoPulse,
|
Effect::macStartFlicker,
|
||||||
Effect::macDemoPulse,
|
Effect::macDemoPulse}; // 6
|
||||||
Effect::macStartFlicker};
|
|
||||||
|
|
||||||
uint8_t lastPicto = 0;
|
uint8_t lastPicto = 1;
|
||||||
|
|
||||||
|
std::array<uint16_t *, 6> startPoints{
|
||||||
|
&(values[0][4]), // 1
|
||||||
|
&(values[1][12]),
|
||||||
|
&(values[1][8]),
|
||||||
|
&(values[1][4]),
|
||||||
|
&(values[0][12]),
|
||||||
|
&(values[0][8]), // 6
|
||||||
|
};
|
||||||
|
|
||||||
while (true) {
|
while (true) {
|
||||||
auto onPos = pictoIllumQue.dequeue(0);
|
auto onPos = pictoIllumQue.dequeue(0);
|
||||||
@@ -504,14 +554,6 @@ void LightingTask() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
std::array<uint16_t *, 6> startPoints{
|
|
||||||
&(values[0][4]),
|
|
||||||
&(values[0][8]),
|
|
||||||
&(values[0][12]),
|
|
||||||
&(values[1][4]),
|
|
||||||
&(values[1][8]),
|
|
||||||
&(values[1][12]),
|
|
||||||
};
|
|
||||||
for (size_t i = 0; i < processors.size(); i++) {
|
for (size_t i = 0; i < processors.size(); i++) {
|
||||||
auto col = processors[i].tick();
|
auto col = processors[i].tick();
|
||||||
auto sp = startPoints[i];
|
auto sp = startPoints[i];
|
||||||
@@ -533,7 +575,7 @@ void MovementTask() {
|
|||||||
StepperDriverDrv8833::Pins stepperPins{
|
StepperDriverDrv8833::Pins stepperPins{
|
||||||
LEDC_TIMER_0,
|
LEDC_TIMER_0,
|
||||||
{LEDC_CHANNEL_0, LEDC_CHANNEL_1, LEDC_CHANNEL_2, LEDC_CHANNEL_3},
|
{LEDC_CHANNEL_0, LEDC_CHANNEL_1, LEDC_CHANNEL_2, LEDC_CHANNEL_3},
|
||||||
{GPIO_NUM_23, GPIO_NUM_22, GPIO_NUM_21, GPIO_NUM_20},
|
{GPIO_NUM_21, GPIO_NUM_20, GPIO_NUM_23, GPIO_NUM_22},
|
||||||
};
|
};
|
||||||
StepperDriverDrv8833 stepperDriver(stepperPins, MicroSteps, 0.25F);
|
StepperDriverDrv8833 stepperDriver(stepperPins, MicroSteps, 0.25F);
|
||||||
stepperDriver.setPos(0);
|
stepperDriver.setPos(0);
|
||||||
@@ -549,25 +591,34 @@ void MovementTask() {
|
|||||||
|
|
||||||
StepperMotor stepper(stepperCfg, stepperDriver, initSens);
|
StepperMotor stepper(stepperCfg, stepperDriver, initSens);
|
||||||
|
|
||||||
|
WatchMotor watch(stepper, motorSleep);
|
||||||
|
|
||||||
ESP_LOGI("Stepper", "Find Home");
|
ESP_LOGI("Stepper", "Find Home");
|
||||||
stepper.findRef();
|
stepper.findRef();
|
||||||
// Illum 1
|
// Todo Set by User-Interface
|
||||||
pictoIllumQue.enqueue(std::make_unique<PictoIllumCommand>(1));
|
for (size_t i = 0; i < 7; i++) {
|
||||||
|
stepper.fullStep(1);
|
||||||
|
fos::Task::delayMs(40);
|
||||||
|
}
|
||||||
|
(void)stepper.zeroPosition();
|
||||||
|
while (!stepper.isIdle()) {
|
||||||
|
fos::Task::delayMs(40);
|
||||||
|
}
|
||||||
|
// watch.moveTo(1, ProfileGenerator::Unitform);
|
||||||
|
ESP_LOGI("Stepper", "Got to 1");
|
||||||
|
// Illum 6
|
||||||
|
pictoIllumQue.enqueue(std::make_unique<PictoIllumCommand>(0));
|
||||||
|
|
||||||
ESP_LOGI(TAG, "Fist Position is %f.2", stepper.getScaledPos() * 6);
|
ESP_LOGI(TAG, "Fist Position is %.2f", watch.getScaled());
|
||||||
fos::Task::delayMs(1000);
|
fos::Task::delayMs(1000);
|
||||||
|
|
||||||
activeState.pictogram = 0;
|
|
||||||
|
|
||||||
while (true) {
|
while (true) {
|
||||||
ESP_LOGD(TAG, "Waiting for command");
|
ESP_LOGD(TAG, "Waiting for command");
|
||||||
auto cmd = commandQueue.dequeue();
|
auto cmd = commandQueue.dequeue();
|
||||||
if (cmd->type == MoveType::StepTo) {
|
if (cmd->type == MoveType::StepTo) {
|
||||||
if (stepper.isIdle()) {
|
if (stepper.isIdle()) {
|
||||||
pictoIllumQue.enqueue(std::make_unique<PictoIllumCommand>(0));
|
|
||||||
int newPos = cmd->pos;
|
int newPos = cmd->pos;
|
||||||
if ((newPos >= 1) && (newPos <= 6)) {
|
if ((newPos >= 1) && (newPos <= 6)) {
|
||||||
auto idx = newPos - 1;
|
|
||||||
Syslog::logv(Syslog::Severity::Informational,
|
Syslog::logv(Syslog::Severity::Informational,
|
||||||
"Triggered movement to picto pos:%i ", newPos);
|
"Triggered movement to picto pos:%i ", newPos);
|
||||||
} else {
|
} else {
|
||||||
@@ -575,60 +626,320 @@ void MovementTask() {
|
|||||||
"Got invalid index for illuminated pictogram =%i ", newPos);
|
"Got invalid index for illuminated pictogram =%i ", newPos);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
int delta = newPos - activeState.pictogram;
|
|
||||||
if (delta <= 0) {
|
int jumps = newPos - watch.getIndex();
|
||||||
delta += 6;
|
if (jumps <= 0) {
|
||||||
|
jumps += 6;
|
||||||
}
|
}
|
||||||
delta = delta + (activeState.minJumps % 6) * 6;
|
jumps = jumps + (activeState.minJumps % 6) * 6;
|
||||||
if (delta < activeState.minJumps) {
|
if (jumps < activeState.minJumps) {
|
||||||
delta += 6;
|
jumps += 6;
|
||||||
}
|
}
|
||||||
Syslog::logv(Syslog::Severity::Notice,
|
Syslog::logv(Syslog::Severity::Notice,
|
||||||
"Running Stepper by %i steps with prof=%i a=%.2f w=%.2f",
|
"Running Stepper by %i steps with prof=%i a=%.2f w=%.2f",
|
||||||
delta, activeState.profile, activeState.accel, activeState.speed);
|
jumps, activeState.profile, activeState.accel, activeState.speed);
|
||||||
pictoIllumQue.enqueue(std::make_unique<PictoIllumCommand>(0));
|
pictoIllumQue.enqueue(std::make_unique<PictoIllumCommand>(0));
|
||||||
stepper.moveBy(delta * std::numbers::pi / 3,
|
responseQueue.enqueue(std::make_unique<WatchIndex>(ResponseType::StartMoving, 0));
|
||||||
activeState.profile, activeState.accel, activeState.speed);
|
watch.moveTo(newPos, activeState.profile);
|
||||||
|
|
||||||
pictoIllumQue.enqueue(std::make_unique<PictoIllumCommand>(newPos));
|
pictoIllumQue.enqueue(std::make_unique<PictoIllumCommand>(newPos));
|
||||||
activeState.pictogram = newPos;
|
responseQueue.enqueue(std::make_unique<WatchIndex>(ResponseType::StepAt, newPos));
|
||||||
}
|
}
|
||||||
} else if (cmd->type == MoveType::Demo) {
|
} else if (cmd->type == MoveType::Demo) {
|
||||||
int i = 0;
|
ESP_LOGI(TAG, "Running Demo");
|
||||||
while (i++ < 80) {
|
for (size_t i = ProfileGenerator::Smooth; i < ProfileGenerator::NumProfiles; i++) {
|
||||||
stepperDriver.step(1);
|
ESP_LOGI(TAG, "Running Profile %d ", i);
|
||||||
stepperDriver.getSubPos();
|
fos::Task::delayMs(1000);
|
||||||
fos::Task::delayMs(100);
|
int steps[3]{4, 2, 0};
|
||||||
}
|
for (size_t j = 0; j < 3; j++) {
|
||||||
ESP_LOGI("Stepper", "Find Home");
|
watch.moveTo(steps[j], i);
|
||||||
stepper.findRef();
|
|
||||||
activeState.pictogram = -1;
|
|
||||||
stepper.findRef();
|
|
||||||
fos::Task::delayMs(1000);
|
fos::Task::delayMs(1000);
|
||||||
for (size_t i = 0; i < 6; i++) {
|
|
||||||
stepper.moveBy(std::numbers::pi / 3);
|
|
||||||
while (!stepper.isIdle()) {
|
|
||||||
fos::Task::delayMs(100);
|
|
||||||
}
|
}
|
||||||
ESP_LOGI(TAG, "Position is %f.2", stepper.getScaledPos() * 6);
|
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
fos::Task::delayMs(100);
|
fos::Task::delayMs(100);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
struct LocalSpitObj {
|
||||||
|
string iD;
|
||||||
|
string groupName;
|
||||||
|
string name;
|
||||||
|
};
|
||||||
|
std::map<string, MoveCommand> ProvidedSpitActions;
|
||||||
|
std::map<string, string> ExpectedObjects;
|
||||||
|
|
||||||
|
void onServerEvent(SPIT_Client::ServerEvent event, const SAD_DetectedServer &p_DetectedServer) {
|
||||||
|
switch (event) {
|
||||||
|
case SPIT_Client::ServerEvent::Detect:
|
||||||
|
ESP_LOGI(TAG, "SERVER DETECTED");
|
||||||
|
ESP_LOGI(TAG, " Name: %s", p_DetectedServer.getName().data());
|
||||||
|
ESP_LOGI(TAG, " ID: %s", p_DetectedServer.getID().data());
|
||||||
|
ESP_LOGI(TAG, " Computer: %s", p_DetectedServer.getComputerName().data());
|
||||||
|
ESP_LOGI(TAG, " IP: %s", p_DetectedServer.getIP().data());
|
||||||
|
ESP_LOGI(TAG, " Port: %s", p_DetectedServer.getPort().data());
|
||||||
|
ESP_LOGI(TAG, " Addition: %s", p_DetectedServer.getAdditions().data());
|
||||||
|
ESP_LOGI(TAG, " ClientIP: %s", p_DetectedServer.getClientIP().data());
|
||||||
|
break;
|
||||||
|
case SPIT_Client::ServerEvent::Lost:
|
||||||
|
ESP_LOGW(TAG, "Server lost Name: %s IP: %s", p_DetectedServer.getName().data(), p_DetectedServer.getIP().data());
|
||||||
|
|
||||||
|
break;
|
||||||
|
case SPIT_Client::ServerEvent::Changed:
|
||||||
|
ESP_LOGW(TAG, "Server lost Name: %s IP: %s", p_DetectedServer.getName().data(), p_DetectedServer.getIP().data());
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void onConnectionStatus(string p_ServerID, string p_ServerComputerName, string p_ServerName, int p_ServerStepTime,
|
||||||
|
SPIT_Client::Connection p_ConnectionStatus, SPIT_Client::Connection p_OldConnectionStatus) {
|
||||||
|
ESP_LOGI(TAG, "MySPITApp: eventConnectionStatus %d->%d ", (int)p_OldConnectionStatus, (int)p_ConnectionStatus);
|
||||||
|
}
|
||||||
|
|
||||||
|
// The transfer of the server's SPITTypes and SPITObjects is finished.
|
||||||
|
void onProjectUpdate(SPIT_Client::ProjUpdate state, string projectId) {
|
||||||
|
|
||||||
|
switch (state) {
|
||||||
|
case SPIT_Client::ProjUpdate::ServerLoaded:
|
||||||
|
ESP_LOGI(TAG, "eventProjectReport ID: %s ", projectId.data());
|
||||||
|
break;
|
||||||
|
case SPIT_Client::ProjUpdate::StartTransfer:
|
||||||
|
ESP_LOGI(TAG, "eventStartProjectTransfer");
|
||||||
|
break;
|
||||||
|
case SPIT_Client::ProjUpdate::EndTransfer:
|
||||||
|
ESP_LOGI(TAG, "eventEndProjectTransfer");
|
||||||
|
spitProjectFinish.give();
|
||||||
|
break;
|
||||||
|
case SPIT_Client::ProjUpdate::ServerClosed:
|
||||||
|
ESP_LOGI(TAG, "eventProjectClosed ID: %s", projectId.data());
|
||||||
|
// If we don't save SPITServer's project specific information
|
||||||
|
// perhaps close all SPITObjects and RemoteSPITObjects to avoid conflicts, when the SPITServer loads a new project
|
||||||
|
// SPITObject::clearSPITObjects();
|
||||||
|
// SPITObject::clearSPITObjectsRemote();
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bool onCheckSpitTypeVeto(bool knownType, bool createdByClient) {
|
||||||
|
if (!knownType || !createdByClient) { // Don't allow foreign SPITTypes
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool onCheckSpitObjectVeto(bool knownType) {
|
||||||
|
return true; // Bypass veto
|
||||||
|
if (!knownType) { // Don't allow objects of unregistered SPITTypes
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Called when the server has created, loaded, changed or deleted a (Remote) SPITType.
|
||||||
|
// Remote SPITType are used in Remote SPITObjects. A Remote SPITObject is used to remote control the SPITServer.
|
||||||
|
// May also occur when the server confirms a SPITType created or changed by the client.
|
||||||
|
void onSpitType(SPIT_Client::ObjectEvent event, bool isRemote, const SPITType &p_SPITType) {
|
||||||
|
if (isRemote) {
|
||||||
|
if (event == SPIT_Client::ObjectEvent::Created) {
|
||||||
|
ESP_LOGI(TAG, "NEW SPIT-REMOTE-Type ID: %s GroupName: %s Name: %s confirmed: %d", p_SPITType.getID().data(), p_SPITType.getGroupName().data(), p_SPITType.getName().data(), p_SPITType.getConfirmed());
|
||||||
|
auto typeName = p_SPITType.getName();
|
||||||
|
if (ExpectedObjects.contains(typeName)) {
|
||||||
|
ExpectedObjects[typeName] = p_SPITType.getID();
|
||||||
|
}
|
||||||
|
} else if (event == SPIT_Client::ObjectEvent::Changed) {
|
||||||
|
// we had to inform all Remote SPITObjects using the p_SPITType
|
||||||
|
// perhaps the SPITObject uses information from the SPITType
|
||||||
|
// SPITObject *ptrSPITObject;
|
||||||
|
// int intSPITObjectCount;
|
||||||
|
// intSPITObjectCount = SPITObject::getSPITObjectRemoteCount();
|
||||||
|
// for (int intObject = 0; intObject < intSPITObjectCount; intObject++) {
|
||||||
|
// ptrSPITObject = SPITObject::getSPITObjectRemote(intObject);
|
||||||
|
// if (ptrSPITObject == nullptr)
|
||||||
|
// continue;
|
||||||
|
// if (ptrSPITObject->getSPITTypeID() == p_SPITType.getID()) {
|
||||||
|
// // call ecentSPITObjectRemote
|
||||||
|
// // onSpitObjectRemote(SPIT_Client::ObjectEvent::Changed, p_SPITType, *ptrSPITObject);
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
ESP_LOGI(TAG, "SPIT-REMOTE-Type CHANGED ID: %s GroupName: %s Name: %s confirmed: %d", p_SPITType.getID().data(), p_SPITType.getGroupName().data(), p_SPITType.getName().data(), p_SPITType.getConfirmed());
|
||||||
|
} else if (event == SPIT_Client::ObjectEvent::Deleted) {
|
||||||
|
ESP_LOGD(TAG, "SPIT-REMOTE-Type Removed ID: %s GroupName: %s Name: %s\n", p_SPITType.getID().data(), p_SPITType.getGroupName().data(), p_SPITType.getName().data());
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (event == SPIT_Client::ObjectEvent::Created) {
|
||||||
|
// Whenever you provide an action for this SPITType take this over in your code.
|
||||||
|
// call _SpitClient.setActionSPITType(p_SPITType.getID(), true);
|
||||||
|
ESP_LOGI(TAG, "NEW SPIT-Type ID: %s GroupName: %s Name: %s confirmed: %d", p_SPITType.getID().data(), p_SPITType.getGroupName().data(), p_SPITType.getName().data(), p_SPITType.getConfirmed());
|
||||||
|
} else if (event == SPIT_Client::ObjectEvent::Changed) {
|
||||||
|
ESP_LOGI(TAG, "SPIT-Type CHANGED ID: %s GroupName: %s Name: %s confirmed: %d", p_SPITType.getID().data(), p_SPITType.getGroupName().data(), p_SPITType.getName().data(), p_SPITType.getConfirmed());
|
||||||
|
} else if (event == SPIT_Client::ObjectEvent::Deleted) {
|
||||||
|
ESP_LOGI(TAG, "SPIT-Type Removed ID: %s GroupName: %s Name: %s\n", p_SPITType.getID().data(), p_SPITType.getGroupName().data(), p_SPITType.getName().data());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Called when the server has created, loaded or changed a SPITObject.
|
||||||
|
// A Remote SPITObject is used to remote control the SPITServer.
|
||||||
|
// May also occur when the server confirms a SPITObject created by the client, what the client should never do!!.
|
||||||
|
// false = server changed a existing SPITObject
|
||||||
|
// @param p_SPITType a reference to a copy of the associated SPITType instance.
|
||||||
|
// @param p_SPITObject a reference to a copy of the SPITObject instance.
|
||||||
|
void onSpitObject(SPIT_Client::ObjectEvent event, bool isRemote, const SPITType &p_SPITType, const SPITObject &p_SPITObject) {
|
||||||
|
if (isRemote) {
|
||||||
|
if (event == SPIT_Client::ObjectEvent::Created) {
|
||||||
|
ESP_LOGI(TAG, "NEW SPIT-REMOTE-Object ID: %s Name: %s -> SPITType: %s", p_SPITObject.getID().data(), p_SPITObject.getName().data(), p_SPITType.getName().data());
|
||||||
|
// This is a remote SPITObject which can be used to remote control the server.
|
||||||
|
// If you want you can list this for later use
|
||||||
|
} else if (event == SPIT_Client::ObjectEvent::Changed) {
|
||||||
|
ESP_LOGI(TAG, "SPIT-REMOTE-Object CHANGED ID: %s Name: %s -> SPITType: %s", p_SPITObject.getID().data(), p_SPITObject.getName().data(), p_SPITType.getName().data());
|
||||||
|
} else if (event == SPIT_Client::ObjectEvent::Deleted) {
|
||||||
|
ESP_LOGD(TAG, "SPIT-REMOTE-Object Removed ID: %s Name: %s\n", p_SPITObject.getID().data(), p_SPITObject.getName().data());
|
||||||
|
// This is a remote SPITObject
|
||||||
|
// If you have listet this prior you should remove it from the list
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (event == SPIT_Client::ObjectEvent::Created) {
|
||||||
|
ESP_LOGI(TAG, "NEW SPIT-Object ID: %s Name: %s -> SPITType: %s", p_SPITObject.getID().data(), p_SPITObject.getName().data(), p_SPITType.getName().data());
|
||||||
|
// check your actions
|
||||||
|
// Whenever you provide an action for this SPITObject take this over in your code.
|
||||||
|
// call _SpitClient.setActionSPITObject(p_SPITObject.getID(), true);
|
||||||
|
|
||||||
|
// for our little excample as described in loadClientProject:
|
||||||
|
// We have only actions for SPITTypes - means every SPITObject with the associated "Actionx"-SPITTypes will trigger the action when it is played
|
||||||
|
//-> no need to do something here, because setActionSPITType has been set prior and the SPITObject will automatically inherits this
|
||||||
|
// SPITObjects with other SPITTypes asscciated will trigger no actions
|
||||||
|
|
||||||
|
} else if (event == SPIT_Client::ObjectEvent::Changed) {
|
||||||
|
ESP_LOGI(TAG, "SPIT-Object CHANGED ID: %s Name: %s -> SPITType: %s", p_SPITObject.getID().data(), p_SPITObject.getName().data(), p_SPITType.getName().data());
|
||||||
|
} else if (event == SPIT_Client::ObjectEvent::Deleted) {
|
||||||
|
ESP_LOGD(TAG, "SPIT-Object Removed ID: %s Name: %s\n", p_SPITObject.getID().data(), p_SPITObject.getName().data());
|
||||||
|
// Check your actions
|
||||||
|
// take the removal of the SPITObject over in your code
|
||||||
|
|
||||||
|
// CAUTION: Deleted SPITObjects can be added later again (perhaps per UNDO on the SPITServer)
|
||||||
|
//-> don't remove your assigned action immediately - keep it to reassign it later
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// SPITServer may use several methods for playing SPITObjects.
|
||||||
|
// e.g. liveSHOWsoftware has the timeline and jingles which plays objects, where the timeline the main player is.
|
||||||
|
// SPIT distinguishes between the different players. All eventPlay... functions contain the information which player plays the SPIT object.
|
||||||
|
void onPlay(string p_PlayerID, string p_PlayerName, char p_PlayerType, bool p_PlayerIsRunning, long long p_TimeFrames) {
|
||||||
|
ESP_LOGD(TAG, "eventPlay Player: %s Runs: %d Time: %lld", p_PlayerName.data(), p_PlayerIsRunning, p_TimeFrames);
|
||||||
|
|
||||||
|
switch (p_PlayerType) {
|
||||||
|
case SPIT_Client::PLAYERTYPE_MAIN:
|
||||||
|
// p_FrameTimes contains the position inside the server's project, we can use it like a timecode
|
||||||
|
// int intMilliseconds = (int)(((double)p_TimeFrames / (double)m_ServerFramesPerSecond) * 1000);
|
||||||
|
break;
|
||||||
|
case SPIT_Client::PLAYERTYPE_CONTINOUS:
|
||||||
|
// The olayer is playing only single Object sequences sometime during the project
|
||||||
|
break;
|
||||||
|
case SPIT_Client::PLAYERTYPE_DISCRETE:
|
||||||
|
// Only discrete values where submitted, e.g the fader position of remote faders.
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Called when the SPITServer plays a SPITObject. For every played SPITObject one eventPlayObject is called.
|
||||||
|
* You can decide here which action should be done or not.
|
||||||
|
*/
|
||||||
|
void onPlaySpitType(string p_PlayerID, string spitTypeId, bool p_PlayerIsRunning, bool p_Started, bool p_Ended, double p_Value) {
|
||||||
|
// double doubleValue = ((double)p_PlayObject.getValue() / 1000000) * ((double)p_PlayObject.getValueFactor() / 1000000);
|
||||||
|
|
||||||
|
ESP_LOGD(TAG, "eventPlayObject Player: %s is running: %d Object Started: %d Stopped: %d", p_PlayerID.data(), p_PlayerIsRunning, p_Started, p_Ended);
|
||||||
|
// ESP_LOGD(TAG, " SPITType: %s SPITObject: %s Position: %lld Value: %f\n", spitTypeId.data(), p_SPITObject.getName().data(), p_PlayObject.getFrameInside(), doubleValue);
|
||||||
|
ESP_LOGD(TAG, " SPITType: %s Value: %f\n", spitTypeId.data(), p_Value);
|
||||||
|
|
||||||
|
if (!ProvidedSpitActions.contains(spitTypeId)) {
|
||||||
|
ESP_LOGE(TAG, "SPIT ID %s is not accepted", spitTypeId.c_str());
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (p_Started == true) {
|
||||||
|
auto command = ProvidedSpitActions[spitTypeId];
|
||||||
|
ESP_LOGI(TAG, "Player: %s is running: %s Object", p_PlayerID.data(), spitTypeId.c_str());
|
||||||
|
commandQueue.enqueue(std::make_unique<MoveCommand>(command));
|
||||||
|
Syslog::logv(Syslog::Severity::Informational, "Got SPIT command for move ot : r%d", command.pos);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Called when a remote SpitObject which value function is changed by the server.
|
||||||
|
* This allows the Client to adjust its display for the remote command.
|
||||||
|
* @param p_SPITType the assigned remote SPITType of p_SPITObject
|
||||||
|
* @param p_SPITObject the remote SPITObject which is changed
|
||||||
|
* @param p_FrameInsideObject can be discarded
|
||||||
|
* @param p_Value the new value
|
||||||
|
*/
|
||||||
|
void onPlayRemoteObjectStatus(const SPITType &p_SPITType, const SPITObject &p_SPITObject, long long p_FrameInsideObject, int p_Value) {
|
||||||
|
ESP_EARLY_LOGD(TAG, "eventPlayRemoteObjectStatus RemoteSPITType: %s RemoteSPITObject: %s Position: %lld Value: %d", p_SPITType.getName().data(), p_SPITObject.getName().data(), p_FrameInsideObject, p_Value);
|
||||||
|
}
|
||||||
|
|
||||||
void SpitClientApp() {
|
void SpitClientApp() {
|
||||||
ESP_LOGI(TAG, "Starting SPIT task");
|
ESP_LOGI(TAG, "Starting SPIT task");
|
||||||
auto ptrMyApp = std::make_unique<MyApp>();
|
|
||||||
|
|
||||||
|
auto &provided = SpitTypes.Provided;
|
||||||
|
auto &expected = SpitTypes.Expected;
|
||||||
|
std::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++) {
|
||||||
|
ProvidedObj.push_back(LocalSpitObj{.iD = provided.moveToX[i], .groupName = provided.group, .name = provided.moveToX[i]});
|
||||||
|
ProvidedSpitActions[provided.moveToX[i]] = MoveCommand{.type = MoveType::StepTo, .pos = (uint8_t)(i + 1)};
|
||||||
|
ExpectedObjects[expected.inPosX[i]] = "";
|
||||||
|
}
|
||||||
|
|
||||||
// load a client project and start auto detection of SPITServers
|
SPIT_Client spitClient(ClientName, ProjectName,
|
||||||
ptrMyApp->init();
|
{
|
||||||
|
.onServerEvent = onServerEvent,
|
||||||
|
.onConnectionStatus = onConnectionStatus,
|
||||||
|
.onProjectUpdate = onProjectUpdate,
|
||||||
|
.onSpitType = onSpitType,
|
||||||
|
.onSpitObject = onSpitObject,
|
||||||
|
.onPlay = onPlay,
|
||||||
|
.onPlaySpitType = onPlaySpitType,
|
||||||
|
.onPlayRemoteObjectStatus = onPlayRemoteObjectStatus,
|
||||||
|
.onCheckSpitTypeVeto = onCheckSpitTypeVeto,
|
||||||
|
.onCheckSpitObjectVeto = onCheckSpitObjectVeto,
|
||||||
|
});
|
||||||
|
|
||||||
|
for (auto &obj : ProvidedObj) {
|
||||||
|
SPITType *ptrSPITType1Fix = spitClient.createSPITTypeFixed(obj.iD, obj.groupName, obj.name, 0, 0);
|
||||||
|
spitClient.setActionSPITType(ptrSPITType1Fix->getID(), true); // should be executed whenever a SPITObject with this SPITType is played
|
||||||
|
}
|
||||||
|
spitClient.clientProjectLoaded();
|
||||||
|
spitClient.startServerAutoDetect();
|
||||||
|
|
||||||
|
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 : ExpectedObjects) {
|
||||||
|
if (obj.second == "") {
|
||||||
|
ESP_LOGE(TAG, "No matching Remote ID for %s", obj.first.c_str());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
while (true) {
|
while (true) {
|
||||||
fos::Task::delayMs(10000);
|
auto res = responseQueue.dequeue();
|
||||||
ESP_LOGI(TAG, "Test LiveShow");
|
if (res->type == ResponseType::StartMoving) {
|
||||||
ptrMyApp->testLiveShowRemote(); //This is an excample how to remote control the liveSHOWsoftware
|
spitClient.sendRemoteObject(ExpectedObjects[expected.changingPos]);
|
||||||
|
} else if (res->type == ResponseType::StepAt) {
|
||||||
|
spitClient.sendRemoteObject(ExpectedObjects[expected.inPosX[res->pos - 1]]);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -641,10 +952,11 @@ void app_main(void) {
|
|||||||
ESP_ERROR_CHECK(ret);
|
ESP_ERROR_CHECK(ret);
|
||||||
initialize_ethernet();
|
initialize_ethernet();
|
||||||
NvsApi::init();
|
NvsApi::init();
|
||||||
static fos::Task lightingTask(LightingTask, "Lights", 0x4000uL);
|
static fos::Task lightingTask(LightingTask, "Lights", 0x8000uL);
|
||||||
static fos::Task movementTask(MovementTask, "Motor", 0x4000uL);
|
static fos::Task movementTask(MovementTask, "Motor", 0x8000uL);
|
||||||
|
|
||||||
etherActive.take();
|
etherActive.take();
|
||||||
|
fos::Task::delayMs(10000);
|
||||||
ESP_LOGI(TAG, "Start net services");
|
ESP_LOGI(TAG, "Start net services");
|
||||||
|
|
||||||
static int ipVersion = AF_INET;
|
static int ipVersion = AF_INET;
|
||||||
@@ -675,5 +987,9 @@ void app_main(void) {
|
|||||||
fos::Task::delayMs(5000);
|
fos::Task::delayMs(5000);
|
||||||
// ToDo send
|
// ToDo send
|
||||||
Syslog::logv(Syslog::Severity::Notice, "Health state");
|
Syslog::logv(Syslog::Severity::Notice, "Health state");
|
||||||
|
// ESP_LOGI(TAG, "Min heap size: %" PRIu32 " / FreeHeap %" PRIu32 "\n",
|
||||||
|
ESP_LOGI(TAG, "Min heap size: %u / FreeHeap %lu",
|
||||||
|
heap_caps_get_minimum_free_size(MALLOC_CAP_DEFAULT),
|
||||||
|
esp_get_free_heap_size());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+13
-3
@@ -7,8 +7,9 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
|
||||||
#include <string.h>
|
#include <cstring>
|
||||||
#include <stdlib.h>
|
#include <cstdlib>
|
||||||
|
#include <cmath>
|
||||||
#include "sdkconfig.h"
|
#include "sdkconfig.h"
|
||||||
#include "esp_event.h"
|
#include "esp_event.h"
|
||||||
#include "esp_log.h"
|
#include "esp_log.h"
|
||||||
@@ -36,7 +37,7 @@
|
|||||||
#include "Processor.hpp"
|
#include "Processor.hpp"
|
||||||
#include "nvsFunctions.hpp"
|
#include "nvsFunctions.hpp"
|
||||||
#include "mqttClient.hpp"
|
#include "mqttClient.hpp"
|
||||||
#include "MyApp.h"
|
#include "watchFace.hpp"
|
||||||
|
|
||||||
// #include "esp_chip_info.h"
|
// #include "esp_chip_info.h"
|
||||||
// #include "esp_flash.h"
|
// #include "esp_flash.h"
|
||||||
@@ -52,3 +53,12 @@
|
|||||||
// #include <inttypes.h>
|
// #include <inttypes.h>
|
||||||
// #include <sys/param.h>
|
// #include <sys/param.h>
|
||||||
// #include <unistd.h>
|
// #include <unistd.h>
|
||||||
|
|
||||||
|
#include "SAD_DetectedServer.hpp"
|
||||||
|
#include "SPITObject.h"
|
||||||
|
#include "SPITPlayer.h"
|
||||||
|
#include "SPITType.h"
|
||||||
|
#include "SPIT_Client.h"
|
||||||
|
#include <chrono>
|
||||||
|
#include <string>
|
||||||
|
#include <map>
|
||||||
|
|||||||
@@ -0,0 +1,12 @@
|
|||||||
|
cmake_minimum_required(VERSION 3.16)
|
||||||
|
|
||||||
|
set(EXTRA_COMPONENT_DIRS
|
||||||
|
"../../core/components"
|
||||||
|
"../../core/managed_components"
|
||||||
|
"../../components"
|
||||||
|
# "../../managed_components"
|
||||||
|
)
|
||||||
|
|
||||||
|
include($ENV{IDF_PATH}/tools/cmake/project.cmake)
|
||||||
|
project(INTEGRATION_TESTS_FW)
|
||||||
|
|
||||||
@@ -0,0 +1,2 @@
|
|||||||
|
idf_component_register(SRCS "movementTests.cpp"
|
||||||
|
INCLUDE_DIRS ".")
|
||||||
@@ -0,0 +1,322 @@
|
|||||||
|
/**
|
||||||
|
* @file watchMain.cpp
|
||||||
|
* @author Gustice
|
||||||
|
* @brief ChaosWatch Application
|
||||||
|
*
|
||||||
|
* @copyright Copyright (c) 2024
|
||||||
|
*/
|
||||||
|
|
||||||
|
/// NOTE: Create IDF shell navigate to directory ("test/integration")
|
||||||
|
// and run "idf.py -p COM9 flash monitor"
|
||||||
|
|
||||||
|
#include "Processor.hpp"
|
||||||
|
#include "PwmExpanderPca9685.hpp"
|
||||||
|
#include "StepperDrv8833.hpp"
|
||||||
|
#include "Task.hpp"
|
||||||
|
#include "esp_event.h"
|
||||||
|
#include "esp_log.h"
|
||||||
|
#include "sdkconfig.h"
|
||||||
|
#include "stepperMotor.hpp"
|
||||||
|
#include "watchFace.hpp"
|
||||||
|
#include <array>
|
||||||
|
#include <cmath>
|
||||||
|
#include <cstdlib>
|
||||||
|
#include <cstring>
|
||||||
|
|
||||||
|
/* Watchface Indicies
|
||||||
|
6/ 5/
|
||||||
|
5 / 1 4 / 0
|
||||||
|
4 2 3 1
|
||||||
|
3 2
|
||||||
|
*/
|
||||||
|
|
||||||
|
extern "C" { // This switch allows the ROS C-implementation to find this main
|
||||||
|
void app_main(void);
|
||||||
|
}
|
||||||
|
|
||||||
|
static const char *TAG = "IT";
|
||||||
|
|
||||||
|
struct DeviceState {
|
||||||
|
uint8_t minJumps{6};
|
||||||
|
uint8_t maxJumps{32};
|
||||||
|
uint8_t profile{};
|
||||||
|
uint8_t restTime{};
|
||||||
|
float speed = 1.0; // Rad/sec
|
||||||
|
float accel = 1.0; // Rad/sec^2
|
||||||
|
Color color{0x80, 0x80, 0x80};
|
||||||
|
uint8_t pictogram{}; // 0..5 active Pictogramm
|
||||||
|
};
|
||||||
|
|
||||||
|
class IndexIllumination {
|
||||||
|
public:
|
||||||
|
IndexIllumination()
|
||||||
|
: master(I2C_NUM_0, /*sda=*/GPIO_NUM_10, /*scl=*/GPIO_NUM_11),
|
||||||
|
ledDriver1(master, /*iverted=*/false),
|
||||||
|
ledDriver2(master, /*iverted=*/false, 0x41),
|
||||||
|
pwmEnable(GPIO_NUM_1, GpioPort::Logic::Inverted),
|
||||||
|
RED{CRed.getColor<Color::Rgbw>()},
|
||||||
|
GREEN{CGreen.getColor<Color::Rgbw>()},
|
||||||
|
BLUE{CBlue.getColor<Color::Rgbw>()} {
|
||||||
|
pwmEnable.write(true);
|
||||||
|
clearColorData();
|
||||||
|
syncToDevice();
|
||||||
|
}
|
||||||
|
|
||||||
|
void clearColorData() {
|
||||||
|
for (size_t i = 0; i < 2; i++) {
|
||||||
|
for (size_t j = 0; j < PmwExpanderPca9685::PwmChannels; j++) {
|
||||||
|
Values[i][j] = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void setColorOfIndexTo(uint8_t idx, Color::Rgbw color) {
|
||||||
|
if (idx >= 6) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
auto sp = LedStartPoints[idx];
|
||||||
|
sp[0] = (uint16_t)(color.white) << 5;
|
||||||
|
sp[1] = (uint16_t)(color.blue) << 5;
|
||||||
|
sp[2] = (uint16_t)(color.green) << 5;
|
||||||
|
sp[3] = (uint16_t)(color.red) << 5;
|
||||||
|
}
|
||||||
|
|
||||||
|
void syncToDevice() {
|
||||||
|
ledDriver1.sendImage(Values[0]);
|
||||||
|
ledDriver2.sendImage(Values[1]);
|
||||||
|
}
|
||||||
|
|
||||||
|
void flashAll(Color::Rgbw color, int duration = 200) {
|
||||||
|
clearColorData();
|
||||||
|
for (size_t i = 0; i < 6; i++) {
|
||||||
|
setColorOfIndexTo(i, color);
|
||||||
|
}
|
||||||
|
syncToDevice();
|
||||||
|
fos::Task::delayMs(duration);
|
||||||
|
clearColorData();
|
||||||
|
syncToDevice();
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
PmwExpanderPca9685::GrayValues Values[2]{};
|
||||||
|
std::array<uint16_t *, 6> LedStartPoints{
|
||||||
|
&(Values[0][4]), // 1
|
||||||
|
&(Values[1][12]),
|
||||||
|
&(Values[1][8]),
|
||||||
|
&(Values[1][4]),
|
||||||
|
&(Values[0][12]),
|
||||||
|
&(Values[0][8]), // 6
|
||||||
|
};
|
||||||
|
|
||||||
|
I2cMaster master;
|
||||||
|
PmwExpanderPca9685 ledDriver1;
|
||||||
|
PmwExpanderPca9685 ledDriver2;
|
||||||
|
OutputPort pwmEnable;
|
||||||
|
const Color::Rgbw RED;
|
||||||
|
const Color::Rgbw GREEN;
|
||||||
|
const Color::Rgbw BLUE;
|
||||||
|
};
|
||||||
|
|
||||||
|
DeviceState activeState;
|
||||||
|
|
||||||
|
void IndexColorSweep(IndexIllumination &illum) {
|
||||||
|
const auto RED = CRed.getColor<Color::Rgbw>();
|
||||||
|
const auto GREEN = CGreen.getColor<Color::Rgbw>();
|
||||||
|
const auto BLUE = CBlue.getColor<Color::Rgbw>();
|
||||||
|
|
||||||
|
illum.flashAll(RED);
|
||||||
|
fos::Task::delayMs(200);
|
||||||
|
illum.flashAll(GREEN);
|
||||||
|
fos::Task::delayMs(200);
|
||||||
|
illum.flashAll(BLUE);
|
||||||
|
fos::Task::delayMs(200);
|
||||||
|
|
||||||
|
illum.clearColorData();
|
||||||
|
illum.setColorOfIndexTo(0, GREEN);
|
||||||
|
illum.syncToDevice();
|
||||||
|
fos::Task::delayMs(500);
|
||||||
|
|
||||||
|
illum.clearColorData();
|
||||||
|
illum.setColorOfIndexTo(0, RED);
|
||||||
|
illum.setColorOfIndexTo(1, GREEN);
|
||||||
|
illum.syncToDevice();
|
||||||
|
fos::Task::delayMs(500);
|
||||||
|
|
||||||
|
illum.clearColorData();
|
||||||
|
illum.setColorOfIndexTo(1, RED);
|
||||||
|
illum.setColorOfIndexTo(2, GREEN);
|
||||||
|
illum.syncToDevice();
|
||||||
|
fos::Task::delayMs(500);
|
||||||
|
|
||||||
|
illum.clearColorData();
|
||||||
|
illum.setColorOfIndexTo(2, RED);
|
||||||
|
illum.setColorOfIndexTo(3, GREEN);
|
||||||
|
illum.syncToDevice();
|
||||||
|
fos::Task::delayMs(500);
|
||||||
|
|
||||||
|
illum.clearColorData();
|
||||||
|
illum.setColorOfIndexTo(3, RED);
|
||||||
|
illum.setColorOfIndexTo(4, GREEN);
|
||||||
|
illum.syncToDevice();
|
||||||
|
fos::Task::delayMs(500);
|
||||||
|
|
||||||
|
illum.clearColorData();
|
||||||
|
illum.setColorOfIndexTo(4, RED);
|
||||||
|
illum.setColorOfIndexTo(5, GREEN);
|
||||||
|
illum.syncToDevice();
|
||||||
|
fos::Task::delayMs(500);
|
||||||
|
|
||||||
|
illum.clearColorData();
|
||||||
|
illum.setColorOfIndexTo(5, RED);
|
||||||
|
illum.syncToDevice();
|
||||||
|
fos::Task::delayMs(500);
|
||||||
|
|
||||||
|
illum.clearColorData();
|
||||||
|
illum.setColorOfIndexTo(0, GREEN);
|
||||||
|
illum.syncToDevice();
|
||||||
|
}
|
||||||
|
|
||||||
|
constexpr bool DoFlushAtBeginning = false;
|
||||||
|
constexpr bool DoFullTurns = false;
|
||||||
|
constexpr bool DoTurnSteps = false;
|
||||||
|
constexpr bool DoTurnProfiles = true;
|
||||||
|
|
||||||
|
void testMovementTask() {
|
||||||
|
esp_log_level_set(TAG, ESP_LOG_DEBUG);
|
||||||
|
esp_log_level_set("STP", ESP_LOG_DEBUG);
|
||||||
|
ESP_LOGD(TAG, "Init Lights for signaling");
|
||||||
|
|
||||||
|
IndexIllumination illum;
|
||||||
|
|
||||||
|
if constexpr (DoFlushAtBeginning) {
|
||||||
|
IndexColorSweep(illum);
|
||||||
|
}
|
||||||
|
const auto BLUE = CBlue.getColor<Color::Rgbw>();
|
||||||
|
|
||||||
|
ESP_LOGD(TAG, "Init Stepper");
|
||||||
|
|
||||||
|
constexpr int MicroSteps = 32;
|
||||||
|
constexpr float Intensity = 0.25;
|
||||||
|
constexpr float StepWidth = 1.8;
|
||||||
|
StepperDriverDrv8833::Pins stepperPins({LEDC_TIMER_0,
|
||||||
|
{LEDC_CHANNEL_0, LEDC_CHANNEL_1, LEDC_CHANNEL_2, LEDC_CHANNEL_3},
|
||||||
|
{GPIO_NUM_21, GPIO_NUM_20, GPIO_NUM_23, GPIO_NUM_22}});
|
||||||
|
StepperDriverDrv8833 stepperDriver(stepperPins, MicroSteps, Intensity);
|
||||||
|
StepperConfig stepperCfg(StepWidth, MicroSteps);
|
||||||
|
InputPort initSens(GPIO_NUM_18);
|
||||||
|
OutputPort motorSleep(GPIO_NUM_15, GpioPort::Logic::Inverted);
|
||||||
|
StepperMotor stepper(stepperCfg, stepperDriver, initSens);
|
||||||
|
|
||||||
|
WatchMotor watch(stepper, motorSleep);
|
||||||
|
|
||||||
|
///
|
||||||
|
/// Full Turns with full steps
|
||||||
|
///
|
||||||
|
if constexpr (DoFullTurns) {
|
||||||
|
ESP_LOGD(TAG, "Find Home");
|
||||||
|
stepper.findRef();
|
||||||
|
ESP_LOGD(TAG, "Fist Position is %3d / %.2f / Micro %d", stepper.getQuanted(), stepper.getScaledPos() * 6, stepper.getSubPos());
|
||||||
|
fos::Task::delayMs(2000);
|
||||||
|
|
||||||
|
ESP_LOGD(TAG, "Make one turns with full steps");
|
||||||
|
// stepper.setPos(0);
|
||||||
|
illum.flashAll(BLUE);
|
||||||
|
int i = 0;
|
||||||
|
|
||||||
|
ESP_LOGD(TAG, "Position at begin is %3d / %.2f", stepper.getQuanted(), stepper.getScaledPos() * 6);
|
||||||
|
while (i++ < 200) {
|
||||||
|
stepper.fullStep(1);
|
||||||
|
fos::Task::delayMs(100);
|
||||||
|
ESP_LOGD(TAG, "Position is %3d / %.2f", stepper.getQuanted(), stepper.getScaledPos() * 6);
|
||||||
|
}
|
||||||
|
fos::Task::delayMs(2000);
|
||||||
|
|
||||||
|
int spB = stepper.getSubPos();
|
||||||
|
stepper.demoFullTurn();
|
||||||
|
int spE = stepper.getSubPos();
|
||||||
|
ESP_LOGD(TAG, "Fullsteps SubPos begin %d / end %d", spB, spE);
|
||||||
|
fos::Task::delayMs(2000);
|
||||||
|
|
||||||
|
ESP_LOGD(TAG, "Position at begin is %3d / %.2f", stepper.getQuanted(), stepper.getScaledPos() * 6);
|
||||||
|
i = 0;
|
||||||
|
while (i++ < 64) {
|
||||||
|
stepper.step(1);
|
||||||
|
fos::Task::delayMs(100);
|
||||||
|
ESP_LOGD(TAG, "Position is %3d / %.2f", stepper.getQuanted(), stepper.getScaledPos() * 6);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
///
|
||||||
|
/// Homing
|
||||||
|
///
|
||||||
|
ESP_LOGD(TAG, "Find Home");
|
||||||
|
stepper.findRef();
|
||||||
|
ESP_LOGD(TAG, "Fist Position is %3d / %.2f / Micro %d", stepper.getQuanted(), stepper.getScaledPos() * 6, stepper.getSubPos());
|
||||||
|
for (size_t i = 0; i < 7; i++) {
|
||||||
|
stepper.fullStep(1);
|
||||||
|
fos::Task::delayMs(40);
|
||||||
|
}
|
||||||
|
illum.flashAll(BLUE);
|
||||||
|
fos::Task::delayMs(1000);
|
||||||
|
|
||||||
|
auto ref = stepper.zeroPosition();
|
||||||
|
ESP_LOGD(TAG, "Reference saved at %.2f ", ref);
|
||||||
|
ESP_LOGD(TAG, "Correct Home");
|
||||||
|
|
||||||
|
///
|
||||||
|
/// Multiple Turns continuous
|
||||||
|
///
|
||||||
|
if constexpr (DoTurnSteps) {
|
||||||
|
|
||||||
|
ESP_LOGD(TAG, "Fist Position is %3d / %.2f / Micro %d", stepper.getQuanted(), stepper.getScaledPos() * 6, stepper.getSubPos());
|
||||||
|
fos::Task::delayMs(1000);
|
||||||
|
ESP_LOGI(TAG, "Move to each index multiple times");
|
||||||
|
illum.flashAll(BLUE);
|
||||||
|
for (size_t i = 1; i <= 2 * 3; i++) {
|
||||||
|
watch.moveTo(3 * i);
|
||||||
|
ESP_LOGD(TAG, "Position is %3d / %.2f", stepper.getQuanted(), stepper.getScaledPos() * 6);
|
||||||
|
}
|
||||||
|
|
||||||
|
ESP_LOGI(TAG, "Move to each index multiple times");
|
||||||
|
illum.flashAll(BLUE);
|
||||||
|
for (size_t i = 1; i <= 6 * 3; i++) {
|
||||||
|
watch.moveTo(i);
|
||||||
|
ESP_LOGD(TAG, "Position is %3d / %.2f", stepper.getQuanted(), stepper.getScaledPos() * 6);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
///
|
||||||
|
/// All other Profiles
|
||||||
|
///
|
||||||
|
if constexpr (DoTurnProfiles) {
|
||||||
|
for (size_t i = ProfileGenerator::Smooth; i < ProfileGenerator::NumProfiles; i++) {
|
||||||
|
// for (size_t i = ProfileGenerator::JumpIn; i < ProfileGenerator::NumProfiles; i++) { // If only part is needed
|
||||||
|
ESP_LOGI(TAG, "Running Profile %d ", i);
|
||||||
|
ESP_LOGD(TAG, "Fist Position is %3d / %.2f / Micro %d", stepper.getQuanted(), stepper.getScaledPos() * 6, stepper.getSubPos());
|
||||||
|
fos::Task::delayMs(1000);
|
||||||
|
illum.flashAll(BLUE);
|
||||||
|
int steps[3]{4, 2, 0};
|
||||||
|
for (size_t j = 0; j < 3; j++) {
|
||||||
|
watch.moveTo(steps[j], i);
|
||||||
|
ESP_LOGI(TAG, "Last position is %3d / %.2f", stepper.getQuanted(), stepper.getScaledPos() * 6);
|
||||||
|
fos::Task::delayMs(1000);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
while (true) {
|
||||||
|
ESP_LOGI(TAG, "Finish");
|
||||||
|
fos::Task::delayMs(60000);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void app_main(void) {
|
||||||
|
ESP_LOGI(TAG, "Start Movement Integration Tests");
|
||||||
|
|
||||||
|
static fos::Task movementTest(testMovementTask, "Move", fos::Task::DefaultStackSize * 8);
|
||||||
|
|
||||||
|
while (true) {
|
||||||
|
fos::Task::delayMs(5000);
|
||||||
|
// ESP_LOGI(TAG, "Finish");
|
||||||
|
}
|
||||||
|
}
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,18 @@
|
|||||||
|
#
|
||||||
|
# Compiler options
|
||||||
|
#
|
||||||
|
CONFIG_COMPILER_CXX_EXCEPTIONS=y
|
||||||
|
|
||||||
|
#
|
||||||
|
# Serial flasher config
|
||||||
|
#
|
||||||
|
CONFIG_ESPTOOLPY_FLASHSIZE_8MB=y
|
||||||
|
CONFIG_ESPTOOLPY_FLASHSIZE="8MB"
|
||||||
|
|
||||||
|
#
|
||||||
|
# Log output
|
||||||
|
#
|
||||||
|
CONFIG_LOG_DEFAULT_LEVEL_INFO=y
|
||||||
|
CONFIG_LOG_DEFAULT_LEVEL=3
|
||||||
|
CONFIG_LOG_MAXIMUM_LEVEL_DEBUG=y
|
||||||
|
CONFIG_LOG_MAXIMUM_LEVEL=4
|
||||||
+3
@@ -0,0 +1,3 @@
|
|||||||
|
{
|
||||||
|
"cmake.cmakePath": "C:/msys64/usr/bin/cmake.exe"
|
||||||
|
}
|
||||||
@@ -20,7 +20,7 @@ project(UnitTests)
|
|||||||
find_package(doctest REQUIRED PATHS "/mingw64/lib/cmake")
|
find_package(doctest REQUIRED PATHS "/mingw64/lib/cmake")
|
||||||
# target_link_libraries(${PROJECT_NAME} PRIVATE doctest::doctest)
|
# target_link_libraries(${PROJECT_NAME} PRIVATE doctest::doctest)
|
||||||
|
|
||||||
addSubDirs_ofRoot("${CMAKE_CURRENT_LIST_DIR}/../components")
|
addSubDirs_ofRoot("${CMAKE_CURRENT_LIST_DIR}/../../components")
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -3,7 +3,10 @@ cmake_minimum_required(VERSION 3.16)
|
|||||||
|
|
||||||
# Include the components directory of the main application:
|
# Include the components directory of the main application:
|
||||||
#
|
#
|
||||||
set(EXTRA_COMPONENT_DIRS "../components ../managed_components")
|
set(EXTRA_COMPONENT_DIRS
|
||||||
|
"../../components"
|
||||||
|
# "../../managed_components"
|
||||||
|
)
|
||||||
|
|
||||||
# Set the components to include the tests for.
|
# Set the components to include the tests for.
|
||||||
# This can be overriden from CMake cache:
|
# This can be overriden from CMake cache:
|
||||||
@@ -0,0 +1,9 @@
|
|||||||
|
dependencies:
|
||||||
|
idf:
|
||||||
|
component_hash: null
|
||||||
|
source:
|
||||||
|
type: idf
|
||||||
|
version: 5.3.0
|
||||||
|
manifest_hash: c4f4ec05313d427eb56c633f78ce213e553379725bf2af3c511665f930571beb
|
||||||
|
target: esp32c6
|
||||||
|
version: 1.0.0
|
||||||
Reference in New Issue
Block a user