Though I have little experience on implementing Lisp/Scheme, I managed to run TCPServer
which works like REPL thingy.
Are there any reference or example code for parsing S-Expression which I can apply to
photon (.ino code)?
Thanks you in advance.
Though I have little experience on implementing Lisp/Scheme, I managed to run TCPServer
which works like REPL thingy.
Are there any reference or example code for parsing S-Expression which I can apply to
photon (.ino code)?
Thanks you in advance.
My current test code. If anyone might have interest on implementing telnet like code.
#define SERVER_PORT 23
#define BUFSIZ 1024
#define PROMPT "[NeXT] "
#define RECVHDR " << "
#define ERR_MSG_BUFSIZ " << BUFFER SIZE ERROR"
TCPServer server = TCPServer(SERVER_PORT);
TCPClient client;
int nRead = 0;
char bufRead[BUFSIZ];
char ipStr[24];
void
setup () {
IPAddress myIP = WiFi.localIP();
sprintf(ipStr, "%d.%d.%d.%d", myIP[0], myIP[1], myIP[2], myIP[3]);
pinMode(D7, OUTPUT);
Particle.variable("ip", ipStr);
server.begin();
}
void
loop () {
if (client.connected()) {
digitalWrite(D7, HIGH);
while (client.available()) {
char ch = client.read();
if (ch == '\n') {
processRequest();
prepareNextRequest();
} else {
if (nRead < BUFSIZ) {
bufRead[nRead] = ch;
nRead++;
} else {
server.println(ERR_MSG_BUFSIZ);
processRequest();
prepareNextRequest();
}
}
}
} else {
digitalWrite(D7, LOW);
nRead = 0;
bufRead[nRead] = '\0';
client = server.available();
client.flush();
server.print(PROMPT);
}
}
void
prepareNextRequest () {
server.println("");
server.print(PROMPT);
nRead = 0;
bufRead[nRead] = '\0';
}
void
displayRECVHDR () {
char buf[16];
size_t n = sprintf(buf, RECVHDR);
server.write((uint8_t *)buf, n);
}
void
processRequest () {
if ((nRead >= 1) && (bufRead[nRead - 1] == '\r')) {
nRead--;
}
if (nRead > 0) {
displayRECVHDR();
parseRequest();
}
}
void
parseRequest () {
#define WIFI_LOCALIP_CMD "wifi localIP"
#define WIFI_SSID_CMD "wifi ssid"
#define WIFI_SCAN_CMD "wifi scan"
#define EXIT_CMD "exit"
if (CMD(WIFI_LOCALIP_CMD)) {
IPAddress myIP = WiFi.localIP();
sprintf(ipStr, "%d.%d.%d.%d", myIP[0], myIP[1], myIP[2], myIP[3]);
server.print(ipStr);
Particle.variable("ip", ipStr);
} else if (CMD(WIFI_SSID_CMD)) {
server.print(WiFi.SSID());
} else if (CMD(WIFI_SCAN_CMD)) {
server.print("scanning...");
WiFiAccessPoint aps[10];
int nFound = WiFi.scan(aps, 10);
server.println("");
for (int i = 0; i < nFound; i++) {
WiFiAccessPoint& ap = aps[i];
server.print(" [");
server.print(i);
server.print("] SSID: "); server.println(ap.ssid);
server.print(" SECU: ");
switch (ap.security) {
case UNSEC:
server.println("OPEN");
break;
case WEP:
server.println("WEP");
break;
case WPA:
server.println("WPA");
break;
case WPA2:
server.println("WPA2");
break;
}
server.print(" CHNL: "); server.println(ap.channel);
if (i == (nFound - 1)) {
server.print(" RSSI: "); server.print(ap.rssi);
} else {
server.print(" RSSI: "); server.println(ap.rssi);
}
}
} else if (CMD(EXIT_CMD)) {
server.print("bye");
client.stop();
} else {
server.print("invalid command: ");
server.write((uint8_t *)bufRead, nRead);
}
}
bool
CMD (char *cmd) {
int nCmd = strlen(cmd);
return ((nRead >= nCmd) && !strncmp(bufRead, cmd, nCmd));
}