years ago...
This commit is contained in:
parent
f8088c7b94
commit
835a2e97cb
8 changed files with 255 additions and 3 deletions
31
nodemcu/http/outputbuff.lua
Normal file
31
nodemcu/http/outputbuff.lua
Normal file
|
@ -0,0 +1,31 @@
|
||||||
|
return function (connection, req, args)
|
||||||
|
connection:send("HTTP/1.0 200 OK\r\nContent-Type: text/html\r\nCache-Control: private, no-store\r\n\r\n")
|
||||||
|
connection:send('<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><title>Reprogram</title></head>')
|
||||||
|
connection:send('<body>')
|
||||||
|
connection:send('<h1>Arguments</h1>')
|
||||||
|
|
||||||
|
local form = [===[
|
||||||
|
<form method="POST">
|
||||||
|
<textarea name="program"></textarea>
|
||||||
|
<input type="submit" value="Submit">
|
||||||
|
</form>
|
||||||
|
]===]
|
||||||
|
|
||||||
|
if req.method == "GET" then
|
||||||
|
connection:send(form)
|
||||||
|
elseif req.method == "POST" then
|
||||||
|
local rd = req.getRequestData()
|
||||||
|
-- connection:send(cjson.encode(rd))
|
||||||
|
connection:send('<h2>Received the following values:</h2>')
|
||||||
|
connection:send("<ul>\n")
|
||||||
|
for name, value in pairs(rd) do
|
||||||
|
connection:send('<li><b>' .. name .. ':</b> ' .. tostring(value) .. "<br></li>\n")
|
||||||
|
end
|
||||||
|
|
||||||
|
connection:send("</ul>\n")
|
||||||
|
else
|
||||||
|
connection:send("NOT IMPLEMENTED")
|
||||||
|
end
|
||||||
|
|
||||||
|
connection:send('</body></html>')
|
||||||
|
end
|
31
nodemcu/http/reprog.lua
Normal file
31
nodemcu/http/reprog.lua
Normal file
|
@ -0,0 +1,31 @@
|
||||||
|
return function (connection, req, args)
|
||||||
|
connection:send("HTTP/1.0 200 OK\r\nContent-Type: text/html\r\nCache-Control: private, no-store\r\n\r\n")
|
||||||
|
connection:send('<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><title>Reprogram</title></head>')
|
||||||
|
connection:send('<body>')
|
||||||
|
connection:send('<h1>Arguments</h1>')
|
||||||
|
|
||||||
|
local form = [===[
|
||||||
|
<form method="POST">
|
||||||
|
<textarea name="program"></textarea>
|
||||||
|
<input type="submit" value="Submit">
|
||||||
|
</form>
|
||||||
|
]===]
|
||||||
|
|
||||||
|
if req.method == "GET" then
|
||||||
|
connection:send(form)
|
||||||
|
elseif req.method == "POST" then
|
||||||
|
local rd = req.getRequestData()
|
||||||
|
-- connection:send(cjson.encode(rd))
|
||||||
|
connection:send('<h2>Received the following values:</h2>')
|
||||||
|
connection:send("<ul>\n")
|
||||||
|
for name, value in pairs(rd) do
|
||||||
|
connection:send('<li><b>' .. name .. ':</b> ' .. tostring(value) .. "<br></li>\n")
|
||||||
|
end
|
||||||
|
|
||||||
|
connection:send("</ul>\n")
|
||||||
|
else
|
||||||
|
connection:send("NOT IMPLEMENTED")
|
||||||
|
end
|
||||||
|
|
||||||
|
connection:send('</body></html>')
|
||||||
|
end
|
|
@ -16,6 +16,20 @@ end
|
||||||
|
|
||||||
connection:send("SSID: "..staConfig.ssid)
|
connection:send("SSID: "..staConfig.ssid)
|
||||||
connection:send("\nPassword: "..staConfig.pwd)
|
connection:send("\nPassword: "..staConfig.pwd)
|
||||||
|
connection:send("\nSTA IP: "..wifi.sta.getip())
|
||||||
|
connection:send("\nMAC: "..wifi.sta.getmac())
|
||||||
|
connection:send("\nstatus: "..wifi.sta.status())
|
||||||
|
connection:send([===[
|
||||||
|
|
||||||
|
Statuses:
|
||||||
|
0: IDLE
|
||||||
|
1: CONNECTING
|
||||||
|
2: WRONG_PASSWORD
|
||||||
|
3: NO AP FOUND
|
||||||
|
4: CONNECT FAIL
|
||||||
|
5: GOT IP/CONNECTED
|
||||||
|
|
||||||
|
]===])
|
||||||
|
|
||||||
connection:send('</pre><br />')
|
connection:send('</pre><br />')
|
||||||
|
|
||||||
|
|
165
teensy/comms.cpp
Normal file
165
teensy/comms.cpp
Normal file
|
@ -0,0 +1,165 @@
|
||||||
|
#include <Arduino.h>
|
||||||
|
#include "log.h"
|
||||||
|
#include "comms.h"
|
||||||
|
#include "lua.hpp"
|
||||||
|
|
||||||
|
#define HWS Serial2
|
||||||
|
|
||||||
|
#define PACK_OVERHEAD 5
|
||||||
|
#define BUFF_SIZE 128
|
||||||
|
|
||||||
|
uint8_t buff[BUFF_SIZE + 1]; // makes it easier to handle a trailing null
|
||||||
|
|
||||||
|
int maybe_packet(uint8_t *p) {
|
||||||
|
uint8_t type = p[0];
|
||||||
|
|
||||||
|
if (type < 32)
|
||||||
|
return 1;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint16_t packet_length(uint8_t *p) {
|
||||||
|
if (!maybe_packet(p)) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint16_t l = p[1] << 8 + p[2];
|
||||||
|
return l;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint16_t crc16(uint8_t *p, int l) {
|
||||||
|
return 1; // TODO actually make this generate crcs
|
||||||
|
}
|
||||||
|
|
||||||
|
// takes in a max size, how many bytes are received and how many should be
|
||||||
|
int read_pack(uint8_t *p, uint16_t max, uint16_t recv_len, uint16_t pack_len) {
|
||||||
|
if (pack_len == 0) // quick shortcut
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
if (recv_len < pack_len) { // if we haven't received everything, we should try
|
||||||
|
if (pack_len > max) { // packet is too large to fit in buffer, return -1
|
||||||
|
return -1; // say we can't handle this with the buffer provided
|
||||||
|
} else {
|
||||||
|
uint16_t i = pack_len - recv_len; // off by one?
|
||||||
|
uint16_t q = 0;
|
||||||
|
while(i > 0) {
|
||||||
|
if (HWS.available()) {
|
||||||
|
*p++ = HWS.read();
|
||||||
|
i--;
|
||||||
|
q++;
|
||||||
|
} else {
|
||||||
|
delayMicroseconds(1); // short delay
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return q; // we read some data
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0; // nothing to read
|
||||||
|
}
|
||||||
|
|
||||||
|
int parse_packet(uint8_t *p, uint16_t recv_len) {
|
||||||
|
if (maybe_packet(p)) {
|
||||||
|
uint16_t pack_len = packet_length(p);
|
||||||
|
|
||||||
|
// TODO CRC check on smaller packets
|
||||||
|
|
||||||
|
switch(p[0]) {
|
||||||
|
case 1:
|
||||||
|
// otherwise we'll need to load it ourselves into the program buffer
|
||||||
|
if (recv_len == pack_len) {
|
||||||
|
p[PACK_OVERHEAD + pack_len + 1] = 0;
|
||||||
|
lua_start(p + PACK_OVERHEAD); // load it directly from our buffer
|
||||||
|
} else {
|
||||||
|
int t = read_pack(l_prog_buff, MAX_PRGMSIZE - 1, 0, pack_len);
|
||||||
|
|
||||||
|
if (t < 0) { // program too big.
|
||||||
|
// all programs should have no values that are valid packet starts, so we'll just let the rest of the code skip them. might be a bug later TODO
|
||||||
|
HWS.write(0x03);
|
||||||
|
HWS.write(0x00);
|
||||||
|
HWS.write(38);
|
||||||
|
HWS.write(0);
|
||||||
|
HWS.write(0);
|
||||||
|
HWS.print("Program too big, reduce the total size");
|
||||||
|
} else {
|
||||||
|
l_prog_buff[t+1] = 0; // null byte
|
||||||
|
lua_start(l_prog_buff);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 5: // send the output log
|
||||||
|
HWS.write(0x06); // send packet header
|
||||||
|
HWS.write(LOG_RINGSIZE >> 8);
|
||||||
|
HWS.write(LOG_RINGSIZE & 0xFF);
|
||||||
|
HWS.write(0);
|
||||||
|
HWS.write(0);
|
||||||
|
|
||||||
|
char *rb_p = log_curpos+1;
|
||||||
|
if (rb_p - log_ringbuffer >= LOG_RINGSIZE)
|
||||||
|
rb_p = log_ringbuffer;
|
||||||
|
|
||||||
|
while(rb_p != log_curpos) {
|
||||||
|
if (*rb_p)
|
||||||
|
HWS.write(*rb_p);
|
||||||
|
rb_p++;
|
||||||
|
if (rb_p - log_ringbuffer >= LOG_RINGSIZE)
|
||||||
|
rb_p = log_ringbuffer;
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 8:
|
||||||
|
// TODO recv bitmap
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 10: // KV data for lua
|
||||||
|
// TODO call lua func for this
|
||||||
|
break;
|
||||||
|
case 11: // set brightness. Do not honor currently.
|
||||||
|
// TODO
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 9: // req KV data
|
||||||
|
case 7: // we should never get this, we send request for bitmap
|
||||||
|
case 6: // we should never get this, we send output log
|
||||||
|
case 4: // we should never get this, we send PRGMACK
|
||||||
|
case 3: // we should never get this, we send error
|
||||||
|
case 2: // we should never get this, we send it
|
||||||
|
case 0: // null packet, do nothing
|
||||||
|
default:
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
} else {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void setup_comms() {
|
||||||
|
HWS.begin(115200);
|
||||||
|
}
|
||||||
|
|
||||||
|
void loop_comms() {
|
||||||
|
if (HWS.available() >= 5) {
|
||||||
|
uint c = 5;
|
||||||
|
|
||||||
|
buff[0] = HWS.read();
|
||||||
|
if (!maybe_packet(buff))
|
||||||
|
return; // skip this byte, we'll check on the next loop
|
||||||
|
|
||||||
|
uint16_t pack_len = packet_length(buff);
|
||||||
|
|
||||||
|
int len = read_pack(buff + PACK_OVERHEAD, BUFF_SIZE - PACK_OVERHEAD, 0, pack_len);
|
||||||
|
|
||||||
|
// we read the rest of the packet, tell parser
|
||||||
|
if (len > 0) {
|
||||||
|
c+ = len;
|
||||||
|
}
|
||||||
|
|
||||||
|
parse_packet(buff, c);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
11
teensy/comms.h
Normal file
11
teensy/comms.h
Normal file
|
@ -0,0 +1,11 @@
|
||||||
|
#ifndef __LUALIGHTS_COMMS_H
|
||||||
|
#define __LUALIGHTS_COMMS_H
|
||||||
|
|
||||||
|
#include <Adafruit_GFX.h>
|
||||||
|
#include <RGBmatrixPanel.h>
|
||||||
|
#include <Fonts/TomThumb.h>
|
||||||
|
|
||||||
|
void setup_comms();
|
||||||
|
void loop_comms();
|
||||||
|
|
||||||
|
#endif
|
|
@ -5,7 +5,7 @@
|
||||||
// usb_serial_class LogOut = Serial;
|
// usb_serial_class LogOut = Serial;
|
||||||
#include "HardwareSerial.h"
|
#include "HardwareSerial.h"
|
||||||
#define LogOut Serial3
|
#define LogOut Serial3
|
||||||
#define LOG_RINGSIZE 4096
|
#define LOG_RINGSIZE 1024
|
||||||
|
|
||||||
extern char log_ringbuffer[LOG_RINGSIZE + 1]; // ring buffer for the output log
|
extern char log_ringbuffer[LOG_RINGSIZE + 1]; // ring buffer for the output log
|
||||||
extern char *log_curpos;
|
extern char *log_curpos;
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
#define __LUALIGHTS_LUA_ALLOC_H
|
#define __LUALIGHTS_LUA_ALLOC_H
|
||||||
|
|
||||||
// 24K seems to be an ok amount for now. Might need to expand it
|
// 24K seems to be an ok amount for now. Might need to expand it
|
||||||
#define LL_ARENA_SIZE 24576
|
#define LL_ARENA_SIZE 32768
|
||||||
|
|
||||||
|
|
||||||
typedef size_t malloc_size_t;
|
typedef size_t malloc_size_t;
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
#ifndef __LUALIGHTS_LUA_H
|
#ifndef __LUALIGHTS_LUA_H
|
||||||
#define __LUALIGHTS_LUA_H
|
#define __LUALIGHTS_LUA_H
|
||||||
|
|
||||||
#define MAX_PRGMSIZE 8192
|
#define MAX_PRGMSIZE 12288
|
||||||
extern char l_prog_buff[MAX_PRGMSIZE];
|
extern char l_prog_buff[MAX_PRGMSIZE];
|
||||||
|
|
||||||
void l_init();
|
void l_init();
|
||||||
|
|
Loading…
Add table
Reference in a new issue