Lot of new functions for tinytest
- command every allowing to add peridic evaluations very usefull for benchmarks and load tests - on/off command
This commit is contained in:
@@ -138,7 +138,7 @@ std::set<std::string> commands = {
|
|||||||
"auto", "broker", "blink", "client", "connect",
|
"auto", "broker", "blink", "client", "connect",
|
||||||
"create", "delete", "help", "interval",
|
"create", "delete", "help", "interval",
|
||||||
"ls", "ip", "off", "on", "set",
|
"ls", "ip", "off", "on", "set",
|
||||||
"publish", "reset", "subscribe", "unsubscribe", "view"
|
"publish", "reset", "subscribe", "unsubscribe", "view", "every"
|
||||||
};
|
};
|
||||||
|
|
||||||
void getCommand(std::string& search)
|
void getCommand(std::string& search)
|
||||||
@@ -316,74 +316,44 @@ std::map<MqttClient*, automatic*> automatic::autos;
|
|||||||
|
|
||||||
bool compare(std::string s, const char* cmd)
|
bool compare(std::string s, const char* cmd)
|
||||||
{
|
{
|
||||||
if (s.length()==0 or s.length()>strlen(cmd)) return false;
|
uint8_t p=0;
|
||||||
return strncmp(cmd, s.c_str(), s.length())==0;
|
while(s[p++]==*cmd++)
|
||||||
|
{
|
||||||
|
if (*cmd==0 or s[p]==0) return true;
|
||||||
|
if (s[p]==' ') return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
using ClientFunction = void(*)(std::string& cmd, MqttClient* publish);
|
using ClientFunction = void(*)(std::string& cmd, MqttClient* publish);
|
||||||
|
|
||||||
|
struct Every
|
||||||
|
{
|
||||||
|
std::string cmd;
|
||||||
|
uint32_t ms;
|
||||||
|
uint32_t next;
|
||||||
|
|
||||||
|
void dump()
|
||||||
|
{
|
||||||
|
auto mill=millis();
|
||||||
|
Serial << ms << "ms [" << cmd << "] next in ";
|
||||||
|
if (mill > next)
|
||||||
|
Serial << "now";
|
||||||
|
else
|
||||||
|
Serial << next-mill << "ms";
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
uint32_t blink_ms_on[16];
|
uint32_t blink_ms_on[16];
|
||||||
uint32_t blink_ms_off[16];
|
uint32_t blink_ms_off[16];
|
||||||
uint32_t blink_next[16];
|
uint32_t blink_next[16];
|
||||||
bool blink_state[16];
|
bool blink_state[16];
|
||||||
int16_t blink;
|
int16_t blink;
|
||||||
void loop()
|
|
||||||
|
std::vector<Every> everies;
|
||||||
|
|
||||||
|
void eval(std::string& cmd)
|
||||||
{
|
{
|
||||||
auto ms=millis();
|
|
||||||
int8_t out=0;
|
|
||||||
int16_t blink_bits = blink;
|
|
||||||
while(blink_bits)
|
|
||||||
{
|
|
||||||
if (blink_ms_on[out] and ms > blink_next[out])
|
|
||||||
{
|
|
||||||
if (blink_state[out])
|
|
||||||
{
|
|
||||||
blink_next[out] += blink_ms_on[out];
|
|
||||||
digitalWrite(out, LOW);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
blink_next[out] += blink_ms_off[out];
|
|
||||||
digitalWrite(abs(out), HIGH);
|
|
||||||
}
|
|
||||||
blink_state[out] = not blink_state[out];
|
|
||||||
}
|
|
||||||
blink_bits >>=1;
|
|
||||||
out++;
|
|
||||||
}
|
|
||||||
|
|
||||||
static long count;
|
|
||||||
MDNS.update();
|
|
||||||
|
|
||||||
if (MqttClient::counter != count)
|
|
||||||
{
|
|
||||||
Serial << "# " << MqttClient::counter << endl;
|
|
||||||
count = MqttClient::counter;
|
|
||||||
}
|
|
||||||
for(auto it: brokers)
|
|
||||||
it.second->loop();
|
|
||||||
|
|
||||||
for(auto it: clients)
|
|
||||||
it.second->loop();
|
|
||||||
|
|
||||||
automatic::loop();
|
|
||||||
|
|
||||||
if (Serial.available())
|
|
||||||
{
|
|
||||||
static std::string cmd;
|
|
||||||
char c=Serial.read();
|
|
||||||
|
|
||||||
if (c==10 or c==14)
|
|
||||||
{
|
|
||||||
|
|
||||||
Serial << "----------------[ " << cmd.c_str() << " ]--------------" << endl;
|
|
||||||
static std::string last_cmd;
|
|
||||||
if (cmd=="!")
|
|
||||||
cmd=last_cmd;
|
|
||||||
else
|
|
||||||
last_cmd=cmd;
|
|
||||||
|
|
||||||
if (cmd.substr(0,3)!="set") replaceVars(cmd);
|
|
||||||
while(cmd.length())
|
while(cmd.length())
|
||||||
{
|
{
|
||||||
MqttError retval = MqttOk;
|
MqttError retval = MqttOk;
|
||||||
@@ -501,6 +471,60 @@ void loop()
|
|||||||
client->dump();
|
client->dump();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else if (compare(s, "on"))
|
||||||
|
{
|
||||||
|
uint8_t pin=getint(cmd, 2);
|
||||||
|
pinMode(pin, OUTPUT);
|
||||||
|
digitalWrite(pin, HIGH);
|
||||||
|
}
|
||||||
|
else if (compare(s, "off"))
|
||||||
|
{
|
||||||
|
uint8_t pin=getint(cmd, 2);
|
||||||
|
pinMode(pin, OUTPUT);
|
||||||
|
digitalWrite(pin, LOW);
|
||||||
|
}
|
||||||
|
else if (compare(s, "every"))
|
||||||
|
{
|
||||||
|
uint32_t ms = getint(cmd, 0);
|
||||||
|
if (ms and cmd.length())
|
||||||
|
{
|
||||||
|
Every every;
|
||||||
|
every.ms=ms;
|
||||||
|
every.cmd=cmd;
|
||||||
|
every.next=millis()+ms;
|
||||||
|
everies.push_back(every);
|
||||||
|
every.dump();
|
||||||
|
Serial << endl;
|
||||||
|
cmd="";
|
||||||
|
}
|
||||||
|
else if (ms==0 and compare(cmd, "list"))
|
||||||
|
{
|
||||||
|
getword(cmd);
|
||||||
|
Serial << "List of everies (ms=" << millis() << ")" << endl;
|
||||||
|
uint8_t count=0;
|
||||||
|
for(auto& every: everies)
|
||||||
|
{
|
||||||
|
Serial << count << ": ";
|
||||||
|
every.dump();
|
||||||
|
Serial << endl;
|
||||||
|
count++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (ms==0 and compare(cmd, "remove"))
|
||||||
|
{
|
||||||
|
getword(cmd);
|
||||||
|
int8_t every=getint(cmd, -1);
|
||||||
|
if (every==-1 and compare(cmd, "all"))
|
||||||
|
{
|
||||||
|
getword(cmd);
|
||||||
|
everies.clear();
|
||||||
|
}
|
||||||
|
else if (everies.size() > (uint8_t)every)
|
||||||
|
{
|
||||||
|
everies.erase(everies.begin()+every);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
else if (compare(s, "blink"))
|
else if (compare(s, "blink"))
|
||||||
{
|
{
|
||||||
int8_t blink_nr = getint(cmd, -1);
|
int8_t blink_nr = getint(cmd, -1);
|
||||||
@@ -639,6 +663,8 @@ void loop()
|
|||||||
Serial << " set [name][value]" << endl;
|
Serial << " set [name][value]" << endl;
|
||||||
Serial << " ! repeat last command" << endl;
|
Serial << " ! repeat last command" << endl;
|
||||||
Serial << endl;
|
Serial << endl;
|
||||||
|
Serial << " every ms [command]; every list; every remove [nr|all]" << endl;
|
||||||
|
Serial << " on {output}; off {output}" << endl;
|
||||||
Serial << " $id : name of the client." << endl;
|
Serial << " $id : name of the client." << endl;
|
||||||
Serial << " default topic is '" << topic.c_str() << "'" << endl;
|
Serial << " default topic is '" << topic.c_str() << "'" << endl;
|
||||||
Serial << endl;
|
Serial << endl;
|
||||||
@@ -655,6 +681,76 @@ void loop()
|
|||||||
Serial << "## ERROR " << retval << endl;
|
Serial << "## ERROR " << retval << endl;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void loop()
|
||||||
|
{
|
||||||
|
auto ms=millis();
|
||||||
|
int8_t out=0;
|
||||||
|
int16_t blink_bits = blink;
|
||||||
|
|
||||||
|
for(auto& every: everies)
|
||||||
|
{
|
||||||
|
if (every.ms && every.cmd.length() && ms > every.next)
|
||||||
|
{
|
||||||
|
std::string cmd(every.cmd);
|
||||||
|
eval(cmd);
|
||||||
|
every.next += every.ms;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
while(blink_bits)
|
||||||
|
{
|
||||||
|
if (blink_ms_on[out] and ms > blink_next[out])
|
||||||
|
{
|
||||||
|
if (blink_state[out])
|
||||||
|
{
|
||||||
|
blink_next[out] += blink_ms_on[out];
|
||||||
|
digitalWrite(out, LOW);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
blink_next[out] += blink_ms_off[out];
|
||||||
|
digitalWrite(abs(out), HIGH);
|
||||||
|
}
|
||||||
|
blink_state[out] = not blink_state[out];
|
||||||
|
}
|
||||||
|
blink_bits >>=1;
|
||||||
|
out++;
|
||||||
|
}
|
||||||
|
|
||||||
|
static long count;
|
||||||
|
MDNS.update();
|
||||||
|
|
||||||
|
if (MqttClient::counter != count)
|
||||||
|
{
|
||||||
|
Serial << "# " << MqttClient::counter << endl;
|
||||||
|
count = MqttClient::counter;
|
||||||
|
}
|
||||||
|
for(auto it: brokers)
|
||||||
|
it.second->loop();
|
||||||
|
|
||||||
|
for(auto it: clients)
|
||||||
|
it.second->loop();
|
||||||
|
|
||||||
|
automatic::loop();
|
||||||
|
|
||||||
|
if (Serial.available())
|
||||||
|
{
|
||||||
|
static std::string cmd;
|
||||||
|
char c=Serial.read();
|
||||||
|
|
||||||
|
if (c==10 or c==14)
|
||||||
|
{
|
||||||
|
Serial << "----------------[ " << cmd.c_str() << " ]--------------" << endl;
|
||||||
|
static std::string last_cmd;
|
||||||
|
if (cmd=="!")
|
||||||
|
cmd=last_cmd;
|
||||||
|
else
|
||||||
|
last_cmd=cmd;
|
||||||
|
|
||||||
|
if (cmd.substr(0,3)!="set") replaceVars(cmd);
|
||||||
|
eval(cmd);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|||||||
Reference in New Issue
Block a user