Here is the supplied sample .INO
char * sSketch = "ESMexample.ino";
#include "_esm4.h"
char sESMbuffer[50];
char * psESMname = "";
char * psESMvalue = "";
#define mBLINK 1
#define mDRAW 2
#define mHIST 3
#define mIMU 4
#define mLCD 5
#define mLOG 6
#define mSTOP 7
#define mSWP 8
#define mXY 9
int iInterval = 500;
int iMode;
long lCount = 0;
float fPitch = 0.0;
float fRoll = 0.0;
char sTime[8];
long lTime;
long lHr;
long lMin;
long lSec;
long lLastHr = -1;
long lLastMin = -1;
long lLastSec = -1;
char * sResetMsg = "#esm~run~demo\\ESMresetDemo.script.txt";
//--------------------------------------------------------------------------------------
void setup() { //FN
pinMode(LED_BUILTIN, OUTPUT);
ESMbegin(250000);
ESM("#esm~title~%s", sSketch);
ESM("#log~Demo sketch started");
ESM("#data~set~baud~{BAUD}");
ESM("#data~set~port~{PORT}");
ESM(sResetMsg);
iMode = mSTOP;
return;
}
//--------------------------------------------------------------------------------------
void loop() { //FN
static long lM = millis();
vReadSerial();
if (millis() - lM > iInterval) {
lM = millis();
lCount++;
if (lCount > 1000) lCount = 0;
switch (iMode) {
case mIMU: doIMU(); break;
case mBLINK: doBLINK(); break;
case mDRAW: doDRAW(); break;
case mHIST: doHIST(); break;
case mLCD: doLCD(); break;
case mLOG: doLOG(); break;
case mSTOP: break;
case mSWP: doSWP(); break;
case mXY: doXY(); break;
}
}
}
//--------------------------------------------------------------------------------------
void doBLINK() { // FN
static bool bOn = true;
if (bOn) digitalWrite(LED_BUILTIN, HIGH);
else digitalWrite(LED_BUILTIN, LOW);
ESM("#log~Blink:%s", bOn ? "on": "off");
bOn = bOn ? false : true;
}
//--------------------------------------------------------------------------------------
void vCalcTime() { //FN
long lNow;
lNow = lTime + int(millis()/1000);
lSec = lNow%60;
lNow /= 60;
lMin = lNow%60;
lNow /= 60;
lHr = lNow%60;
}
//--------------------------------------------------------------------------------------
void doDRAW() { // FN
static int iRot = 0;
static long lM = millis();
if (millis() - lM >= 1000) {
lM = millis();
ESM("#draw~frectangle~1~360~200~75~20");
//ESM("#draw~text~0~365~210~{TIME}");
ESM("#draw~text~0~365~210~%d:%d:%d", (int)lHr, (int)lMin, (int)lSec);
}
vCalcTime();
lHr = lHr%12;
if (lLastHr != lHr) {
if (lHr == 0) {
ESM("draw~fellipse~6~400~100~102~102");
}
else {
ESM("#draw~fpie~3~400~100~100~100~0~%s", ESM0(lHr * 30));
}
lLastHr = lHr;
}
if (lLastMin != lMin) {
if (lMin == 0) {
ESM("draw~fellipse~6~400~100~102~102");
ESM("#draw~fpie~3~400~100~100~100~0~%s", ESM0(lHr * 30));
}
else {
ESM("#draw~fpie~4~400~100~80~80~0~%s", ESM0(lMin * 6));
}
lLastMin = lMin;
}
if (lLastSec != lSec) {
lLastSec = lSec;
if (lSec == 0) {
ESM("#draw~fellipse~6~400~100~102~102");
ESM("#draw~fpie~3~400~100~100~100~0~%s", ESM0(lHr * 30));
ESM("#draw~fpie~4~400~100~80~80~0~%s", ESM0(lMin * 6));
lLastHr = lLastMin = -1;
}
else {
ESM("#draw~fpie~2~400~100~60~60~0~%s", ESM0(lSec * 6));
}
}
iRot += 6;
if (iRot > 360) {
iRot = 0;
ESM("#draw~fellipse~6~400~180~32~32");
}
else {
ESM("#draw~fpie~1~400~180~30~30~0~%d", iRot);
}
ESM("#draw~fellipse~%s~%d~%d~%d~%d",
ESM0(lCount), int(random(350, 451)), int(random(350, 451)), int(random(5, 30)), int(random(5, 30)));
}
//--------------------------------------------------------------------------------------
void doHIST() { //FN
float fValue = float(random(-1100, 1200)/100.0);
ESM("#hist~%s", ESM2(fValue));
fValue = float(random(-18, 18)/10.0);
ESM("#hist~%s", ESM2(fValue));
}
//--------------------------------------------------------------------------------------
void doIMU() { // FN
fPitch = fPitch + float(random(-20, 20)/10.0);
fRoll = fRoll + float(random(-20, 20)/10.0);
ESM("#imu~%s~%s", ESM1(fPitch), ESM1(fRoll));
if (lCount%100 == 0) {
fPitch = fRoll = 0.0;
ESM("#imu~reset");
}
}
//--------------------------------------------------------------------------------------
void doLCD() { //FN
ESM("#lcd~1~45~{NOW} {PORT} @ {BAUD}");
ESM("#lcd~2~45~Interval = %d mS ~{BLUE}~{WHITE}", iInterval);
ESM("#lcd~%d~%d~ ~%d~%d", int(random(15, 21)), int(random(65, 76)), int(lCount), int(lCount));
}
//--------------------------------------------------------------------------------------
void doLOG() { //FN
ESM("#log~Logged at {TIME}");
}
//--------------------------------------------------------------------------------------
void doSWP() { // FN
static float fSmooth = 0.0;
float f = float(random(0, 5000)/100000.0);
fSmooth = (f + (9.0 * fSmooth))/10.0;
ESM("#swp~%s~%s~%s~%s~%s",
ESM3(float(random(20000, 30000)/1000.0)),
ESM3(float(random(20000, 30000)/10.0)),
ESM4(f),
ESM4(fSmooth),
ESMf2s(f, 6));
}
//--------------------------------------------------------------------------------------
void doXY() { // FN
ESM("#xy~%d~%d~%d", int(lCount), int(random(0, 501)), int(random(0, 501)));
}
//--------------------------------------------------------------------------------------
#define CMD(x) strcmp(x, psESMname) == 0
#define VALUE(x) strcmp(x, psESMvalue) == 0
void vReadSerial() { //FN
int iParamCount = ESMread(sESMbuffer, sizeof(sESMbuffer));
if (iParamCount) {
//ESM("#log~Params:%d", iParamCount);
//for (int n = 0; n < iParamCount; n++) {
// ESM("#log~Param%d:%s", n, ESMparam(sESMbuffer, n));
//}
}
else {
return;
}
psESMname = ESMparam(sESMbuffer, 0); ESMupper(psESMname);
psESMvalue = ESMparam(sESMbuffer, 1); ESMupper(psESMvalue);
ESM("#data~set~cmd~%s", psESMname);
ESM("#data~set~millis~%s", ESM0(millis()));
if (CMD("STOP")) {
iMode = mSTOP;
}
else if (CMD("TIME")) {
strcpy(sTime, psESMvalue);
ESM("#log~time received %s", sTime);
sTime[2] = 0;
sTime[5] = 0;
lHr = atoi(&sTime[0]);
lMin = atoi(&sTime[3]);
lSec = atoi(&sTime[6]);
lTime = (3600 * lHr) + (60 * lMin) + lSec - int(millis()/1000);
}
else if (CMD("INT")) {
iInterval = constrain(atoi(psESMvalue), 1, 2500);
ESM("#log~Interval = %d mS", iInterval);
}
else if (CMD("RESTART")) {
ESM(sResetMsg);
delay(1000);
asm volatile(" jmp 0");
}
else if (CMD("CLOSE")) {
ESM(sResetMsg);
ESM("#esm~close");
delay(1000);
}
else if (CMD("REOPEN")) {
ESM(sResetMsg);
ESM("#esm~reopen");
delay(1000);
}
else if (CMD("BLINK")) {
iMode = mBLINK;
ESM("#log~Blink every %d mS on pin %d",
iInterval, LED_BUILTIN);
}
else if (CMD("DRAW")) {
iMode = mDRAW;
lLastHr = lLastMin = lLastSec = -1;
ESM("#esm~run~demo\\ESMdrawDemo.script.txt");
}
else if (CMD("HIST")) {
iMode = mHIST;
ESM("#esm~run~demo\\ESMhistDemo.script.txt");
}
else if (CMD("IMU")) {
iMode = mIMU;
ESM("#esm~run~demo\\ESMimuDemo.script.txt");
fPitch = fRoll = 0.0;
}
else if (CMD("LCD")) {
iMode = mLCD;
ESM("#esm~run~demo\\ESMlcdDemo.script.txt");
}
else if (CMD("LOG")) {
iMode = mLOG;
ESM(sResetMsg);
}
else if (CMD("SWP")) {
iMode = mSWP;
ESM("#esm~run~demo\\ESMswpDemo.script.txt");
}
else if (CMD("XY")) {
iMode = mXY;
ESM("#esm~run~demo\\ESMxyDemo.script.txt");
}
else if (CMD("OUTPUT")) {
if (VALUE("ON")) ESMoutput(true);
else if (VALUE("OFF")) ESMoutput(false);
}
ESM("#data~set~int~%s", ESM0(iInterval));
int iModeOutput;
iModeOutput = ESMoutput();
ESMoutput(true);
ESM("#data~set~output~%s", iModeOutput ? "ON" : "OFF");
ESMoutput(iModeOutput);
ESM("#log~%s @ %s", psESMname, "{TIME}");
}
//--------------------------------------------------------------------------------------