mirror of
https://github.com/lumapu/ahoy.git
synced 2025-04-29 10:16:21 +02:00
commit
7d24378288
11 changed files with 226 additions and 123 deletions
|
@ -5,21 +5,16 @@ extern String setup_html;
|
|||
|
||||
//-----------------------------------------------------------------------------
|
||||
app::app() : Main() {
|
||||
uint8_t wrAddr[6];
|
||||
mRadio = new RF24(RF24_CE_PIN, RF24_CS_PIN);
|
||||
|
||||
mRadio->begin();
|
||||
mRadio->setAutoAck(false);
|
||||
mRadio->setRetries(0, 0);
|
||||
|
||||
mHoymiles = new hoymiles();
|
||||
mEep->read(ADDR_HOY_ADDR, mHoymiles->mAddrBytes, HOY_ADDR_LEN);
|
||||
mHoymiles->serial2RadioId();
|
||||
|
||||
mBufCtrl = new CircularBuffer(mBuffer, PACKET_BUFFER_SIZE);
|
||||
|
||||
mSendCnt = 0;
|
||||
mSendTicker = new Ticker();
|
||||
mFlagSend = false;
|
||||
|
||||
memset(mCmds, 0, sizeof(uint32_t));
|
||||
memset(mChannelStat, 0, sizeof(uint32_t));
|
||||
}
|
||||
|
||||
|
||||
|
@ -33,13 +28,23 @@ app::~app(void) {
|
|||
void app::setup(const char *ssid, const char *pwd, uint32_t timeout) {
|
||||
Main::setup(ssid, pwd, timeout);
|
||||
|
||||
mWeb->on("/", std::bind(&app::showIndex, this));
|
||||
mWeb->on("/setup", std::bind(&app::showSetup, this));
|
||||
mWeb->on("/save ", std::bind(&app::showSave, this));
|
||||
mWeb->on("/", std::bind(&app::showIndex, this));
|
||||
mWeb->on("/setup", std::bind(&app::showSetup, this));
|
||||
mWeb->on("/save", std::bind(&app::showSave, this));
|
||||
mWeb->on("/cmdstat", std::bind(&app::showCmdStatistics, this));
|
||||
|
||||
if(mSettingsValid)
|
||||
mEep->read(ADDR_HOY_ADDR, mHoymiles->mAddrBytes, HOY_ADDR_LEN);
|
||||
else
|
||||
memset(mHoymiles->mAddrBytes, 0, 6);
|
||||
mHoymiles->serial2RadioId();
|
||||
|
||||
initRadio();
|
||||
|
||||
mSendTicker->attach_ms(1000, std::bind(&app::sendTicker, this));
|
||||
if(mSettingsValid)
|
||||
mSendTicker->attach_ms(1000, std::bind(&app::sendTicker, this));
|
||||
else
|
||||
Serial.println("Warn: your settings are not valid! check [IP]/setup");
|
||||
}
|
||||
|
||||
|
||||
|
@ -51,22 +56,53 @@ void app::loop(void) {
|
|||
uint8_t len, rptCnt;
|
||||
NRF24_packet_t *p = mBufCtrl->getBack();
|
||||
|
||||
//mHoymiles->dumpBuf("RAW", p->packet, PACKET_BUFFER_SIZE);
|
||||
//mHoymiles->dumpBuf("RAW ", p->packet, PACKET_BUFFER_SIZE);
|
||||
|
||||
if(mHoymiles->checkCrc(p->packet, &len, &rptCnt)) {
|
||||
// process buffer only on first occurrence
|
||||
if((0 != len) && (0 == rptCnt)) {
|
||||
mHoymiles->dumpBuf("Payload", p->packet, len);
|
||||
Serial.println("CMD " + String(p->packet[11], HEX));
|
||||
mHoymiles->dumpBuf("Payload ", p->packet, len);
|
||||
// @TODO: do analysis here
|
||||
}
|
||||
}
|
||||
else {
|
||||
if(p->packetsLost != 0) {
|
||||
Serial.println("Lost packets: " + String(p->packetsLost));
|
||||
if(p->packet[11] == 0x01) mCmds[0]++;
|
||||
else if(p->packet[11] == 0x02) mCmds[1]++;
|
||||
else if(p->packet[11] == 0x03) mCmds[2]++;
|
||||
else if(p->packet[11] == 0x81) mCmds[3]++;
|
||||
else if(p->packet[11] == 0x84) mCmds[4]++;
|
||||
else mCmds[5]++;
|
||||
|
||||
if(p->sendCh == 23) mChannelStat[0]++;
|
||||
else if(p->sendCh == 40) mChannelStat[1]++;
|
||||
else if(p->sendCh == 61) mChannelStat[2]++;
|
||||
else mChannelStat[3]++;
|
||||
}
|
||||
}
|
||||
mBufCtrl->popBack();
|
||||
}
|
||||
|
||||
if(mFlagSend) {
|
||||
mFlagSend = false;
|
||||
|
||||
uint8_t size = 0;
|
||||
if((mSendCnt % 6) == 0)
|
||||
size = mHoymiles->getTimePacket(mSendBuf, mTimestamp);
|
||||
else if((mSendCnt % 6) == 1)
|
||||
size = mHoymiles->getCmdPacket(mSendBuf, 0x15, 0x81);
|
||||
else if((mSendCnt % 6) == 2)
|
||||
size = mHoymiles->getCmdPacket(mSendBuf, 0x15, 0x80);
|
||||
else if((mSendCnt % 6) == 3)
|
||||
size = mHoymiles->getCmdPacket(mSendBuf, 0x15, 0x83);
|
||||
else if((mSendCnt % 6) == 4)
|
||||
size = mHoymiles->getCmdPacket(mSendBuf, 0x15, 0x82);
|
||||
else if((mSendCnt % 6) == 5)
|
||||
size = mHoymiles->getCmdPacket(mSendBuf, 0x15, 0x84);
|
||||
|
||||
//Serial.println("sent packet: #" + String(mSendCnt));
|
||||
//dumpBuf(mSendBuf, size);
|
||||
sendPacket(mSendBuf, size);
|
||||
|
||||
mSendCnt++;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
@ -81,8 +117,7 @@ void app::handleIntr(void) {
|
|||
if(!mBufCtrl->full()) {
|
||||
p = mBufCtrl->getFront();
|
||||
memset(p->packet, 0xcc, MAX_RF_PAYLOAD_SIZE);
|
||||
p->timestamp = micros(); // Micros does not increase in interrupt, but it can be used.
|
||||
p->packetsLost = lostCnt;
|
||||
p->sendCh = mSendChannel;
|
||||
len = mRadio->getPayloadSize();
|
||||
if(len > MAX_RF_PAYLOAD_SIZE)
|
||||
len = MAX_RF_PAYLOAD_SIZE;
|
||||
|
@ -106,6 +141,12 @@ void app::handleIntr(void) {
|
|||
|
||||
//-----------------------------------------------------------------------------
|
||||
void app::initRadio(void) {
|
||||
mRadio = new RF24(RF24_CE_PIN, RF24_CS_PIN);
|
||||
|
||||
mRadio->begin();
|
||||
mRadio->setAutoAck(false);
|
||||
mRadio->setRetries(0, 0);
|
||||
|
||||
mRadio->setChannel(DEFAULT_RECV_CHANNEL);
|
||||
mRadio->setDataRate(RF24_250KBPS);
|
||||
mRadio->disableCRC();
|
||||
|
@ -123,20 +164,26 @@ void app::initRadio(void) {
|
|||
|
||||
Serial.println("Radio Config:");
|
||||
mRadio->printPrettyDetails();
|
||||
|
||||
mSendChannel = mHoymiles->getDefaultChannel();
|
||||
}
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
void app::sendPacket(uint8_t buf[], uint8_t len) {
|
||||
DISABLE_IRQ;
|
||||
|
||||
mRadio->stopListening();
|
||||
|
||||
#ifdef CHANNEL_HOP
|
||||
mRadio->setChannel(mHoymiles->getNxtChannel());
|
||||
if(mSendCnt % 6 == 0)
|
||||
mSendChannel = mHoymiles->getNxtChannel();
|
||||
else
|
||||
mSendChannel = mHoymiles->getLastChannel();
|
||||
#else
|
||||
mRadio->setChannel(mHoymiles->getDefaultChannel());
|
||||
mSendChannel = mHoymiles->getDefaultChannel();
|
||||
#endif
|
||||
mRadio->setChannel(mSendChannel);
|
||||
//Serial.println("CH: " + String(mSendChannel));
|
||||
|
||||
mRadio->openWritingPipe(mHoymiles->mRadioId);
|
||||
mRadio->setCRCLength(RF24_CRC_16);
|
||||
|
@ -147,7 +194,7 @@ void app::sendPacket(uint8_t buf[], uint8_t len) {
|
|||
mRadio->write(buf, len);
|
||||
|
||||
// Try to avoid zero payload acks (has no effect)
|
||||
mRadio->openWritingPipe(DUMMY_RADIO_ID);
|
||||
mRadio->openWritingPipe(DUMMY_RADIO_ID); // TODO: why dummy radio id?
|
||||
|
||||
mRadio->setAutoAck(false);
|
||||
mRadio->setRetries(0, 0);
|
||||
|
@ -163,25 +210,7 @@ void app::sendPacket(uint8_t buf[], uint8_t len) {
|
|||
|
||||
//-----------------------------------------------------------------------------
|
||||
void app::sendTicker(void) {
|
||||
uint8_t size = 0;
|
||||
if((mSendCnt % 6) == 0)
|
||||
size = mHoymiles->getTimePacket(mSendBuf, mTimestamp);
|
||||
else if((mSendCnt % 6) == 5)
|
||||
size = mHoymiles->getCmdPacket(mSendBuf, 0x15, 0x81);
|
||||
else if((mSendCnt % 6) == 4)
|
||||
size = mHoymiles->getCmdPacket(mSendBuf, 0x15, 0x80);
|
||||
else if((mSendCnt % 6) == 3)
|
||||
size = mHoymiles->getCmdPacket(mSendBuf, 0x15, 0x83);
|
||||
else if((mSendCnt % 6) == 2)
|
||||
size = mHoymiles->getCmdPacket(mSendBuf, 0x15, 0x82);
|
||||
else if((mSendCnt % 6) == 1)
|
||||
size = mHoymiles->getCmdPacket(mSendBuf, 0x15, 0x84);
|
||||
|
||||
Serial.println("sent packet: #" + String(mSendCnt));
|
||||
dumpBuf(mSendBuf, size);
|
||||
sendPacket(mSendBuf, size);
|
||||
|
||||
mSendCnt++;
|
||||
mFlagSend = true;
|
||||
}
|
||||
|
||||
|
||||
|
@ -220,6 +249,25 @@ void app::showSave(void) {
|
|||
}
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
void app::showCmdStatistics(void) {
|
||||
String content = "CMDs:\n";
|
||||
content += String("0x01: ") + String(mCmds[0]) + String("\n");
|
||||
content += String("0x02: ") + String(mCmds[1]) + String("\n");
|
||||
content += String("0x03: ") + String(mCmds[2]) + String("\n");
|
||||
content += String("0x81: ") + String(mCmds[3]) + String("\n");
|
||||
content += String("0x84: ") + String(mCmds[4]) + String("\n");
|
||||
content += String("other: ") + String(mCmds[5]) + String("\n");
|
||||
|
||||
content += "\nCHANNELs:\n";
|
||||
content += String("23: ") + String(mChannelStat[0]) + String("\n");
|
||||
content += String("40: ") + String(mChannelStat[1]) + String("\n");
|
||||
content += String("61: ") + String(mChannelStat[2]) + String("\n");
|
||||
content += String("75: ") + String(mChannelStat[3]) + String("\n");
|
||||
mWeb->send(200, "text/plain", content);
|
||||
}
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
void app::saveValues(bool webSend = true) {
|
||||
Main::saveValues(false); // general configuration
|
||||
|
@ -240,6 +288,7 @@ void app::saveValues(bool webSend = true) {
|
|||
|
||||
mEep->write(ADDR_HOY_ADDR, mHoymiles->mAddrBytes, HOY_ADDR_LEN);
|
||||
|
||||
updateCrc();
|
||||
if((mWeb->arg("reboot") == "on"))
|
||||
showReboot();
|
||||
else {
|
||||
|
|
|
@ -29,6 +29,7 @@ class app : public Main {
|
|||
void showIndex(void);
|
||||
void showSetup(void);
|
||||
void showSave(void);
|
||||
void showCmdStatistics(void);
|
||||
|
||||
void saveValues(bool webSend);
|
||||
void dumpBuf(uint8_t buf[], uint8_t len);
|
||||
|
@ -45,6 +46,11 @@ class app : public Main {
|
|||
Ticker *mSendTicker;
|
||||
uint32_t mSendCnt;
|
||||
uint8_t mSendBuf[MAX_RF_PAYLOAD_SIZE];
|
||||
bool mFlagSend;
|
||||
uint8_t mSendChannel;
|
||||
|
||||
uint32_t mCmds[6];
|
||||
uint32_t mChannelStat[4];
|
||||
};
|
||||
|
||||
#endif /*__APP_H__*/
|
||||
|
|
43
tools/esp8266/crc.cpp
Normal file
43
tools/esp8266/crc.cpp
Normal file
|
@ -0,0 +1,43 @@
|
|||
#include "crc.h"
|
||||
|
||||
uint8_t crc8(uint8_t buf[], uint8_t len) {
|
||||
uint8_t crc = CRC8_INIT;
|
||||
for(uint8_t i = 0; i < len; i++) {
|
||||
crc ^= buf[i];
|
||||
for(uint8_t b = 0; b < 8; b ++) {
|
||||
crc = (crc << 1) ^ ((crc & 0x80) ? CRC8_POLY : 0x00);
|
||||
}
|
||||
}
|
||||
return crc;
|
||||
}
|
||||
|
||||
uint16_t crc16(uint8_t buf[], uint8_t len) {
|
||||
uint16_t crc = 0xffff;
|
||||
uint8_t shift = 0;
|
||||
|
||||
for(uint8_t i = 0; i < len; i ++) {
|
||||
crc = crc ^ buf[i];
|
||||
for(uint8_t bit = 0; bit < 8; bit ++) {
|
||||
shift = (crc & 0x0001);
|
||||
crc = crc >> 1;
|
||||
if(shift != 0)
|
||||
crc = crc ^ 0xA001;
|
||||
}
|
||||
}
|
||||
return crc;
|
||||
}
|
||||
|
||||
uint16_t crc16nrf24(uint8_t buf[], uint16_t lenBits, uint16_t startBit, uint16_t crcIn) {
|
||||
uint16_t crc = crcIn;
|
||||
uint8_t idx, val = buf[(startBit >> 3)];
|
||||
|
||||
for(uint16_t bit = startBit; bit < lenBits; bit ++) {
|
||||
idx = bit & 0x07;
|
||||
if(0 == idx)
|
||||
val = buf[(bit >> 3)];
|
||||
crc ^= 0x8000 & (val << (8 + idx));
|
||||
crc = (crc & 0x8000) ? ((crc << 1) ^ CRC16_NRF24_POLYNOM) : (crc << 1);
|
||||
}
|
||||
|
||||
return crc;
|
||||
}
|
16
tools/esp8266/crc.h
Normal file
16
tools/esp8266/crc.h
Normal file
|
@ -0,0 +1,16 @@
|
|||
#ifndef __CRC_H__
|
||||
#define __CRC_H__
|
||||
|
||||
#include <cstdint>
|
||||
|
||||
#define CRC8_INIT 0x00
|
||||
#define CRC8_POLY 0x01
|
||||
|
||||
#define CRC16_MODBUS_POLYNOM 0xA001
|
||||
#define CRC16_NRF24_POLYNOM 0x1021
|
||||
|
||||
uint8_t crc8(uint8_t buf[], uint8_t len);
|
||||
uint16_t crc16(uint8_t buf[], uint8_t len);
|
||||
uint16_t crc16nrf24(uint8_t buf[], uint16_t lenBits, uint16_t startBit = 0, uint16_t crcIn = 0xffff);
|
||||
|
||||
#endif /*__CRC_H__*/
|
|
@ -15,7 +15,7 @@
|
|||
//-------------------------------------
|
||||
#define VERSION_MAJOR 0
|
||||
#define VERSION_MINOR 1
|
||||
#define VERSION_PATCH 7
|
||||
#define VERSION_PATCH 9
|
||||
|
||||
|
||||
//-------------------------------------
|
||||
|
@ -24,14 +24,18 @@
|
|||
#define SSID_LEN 32
|
||||
#define PWD_LEN 64
|
||||
#define DEVNAME_LEN 32
|
||||
#define CRC_LEN 2
|
||||
|
||||
#define HOY_ADDR_LEN 6
|
||||
|
||||
|
||||
#define ADDR_SSID 0 // start address
|
||||
#define ADDR_START 0
|
||||
#define ADDR_SSID ADDR_START
|
||||
#define ADDR_PWD ADDR_SSID + SSID_LEN
|
||||
#define ADDR_DEVNAME ADDR_PWD + PWD_LEN
|
||||
|
||||
#define ADDR_HOY_ADDR ADDR_DEVNAME + DEVNAME_LEN
|
||||
|
||||
#define ADDR_NEXT ADDR_HOY_ADDR + HOY_ADDR_LEN
|
||||
|
||||
#define ADDR_SETTINGS_CRC 200
|
||||
|
||||
#endif /*__DEFINES_H__*/
|
||||
|
|
|
@ -3,6 +3,7 @@
|
|||
|
||||
#include <RF24.h>
|
||||
#include <RF24_config.h>
|
||||
#include "crc.h"
|
||||
|
||||
#define CHANNEL_HOP // switch between channels or use static channel to send
|
||||
|
||||
|
@ -14,11 +15,6 @@
|
|||
#define DUMMY_RADIO_ID ((uint64_t)0xDEADBEEF01ULL)
|
||||
|
||||
#define PACKET_BUFFER_SIZE 30
|
||||
#define CRC8_INIT 0x00
|
||||
#define CRC8_POLY 0x01
|
||||
|
||||
#define CRC16_MODBUS_POLYNOM 0xA001
|
||||
#define CRC16_NRF24_POLYNOM 0x1021
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
|
@ -49,9 +45,8 @@ union uint64Bytes {
|
|||
};
|
||||
|
||||
typedef struct {
|
||||
uint32_t timestamp;
|
||||
uint8_t packetsLost;
|
||||
uint8_t packet[MAX_RF_PAYLOAD_SIZE];
|
||||
uint8_t sendCh;
|
||||
uint8_t packet[MAX_RF_PAYLOAD_SIZE];
|
||||
} NRF24_packet_t;
|
||||
|
||||
|
||||
|
@ -62,7 +57,6 @@ class hoymiles {
|
|||
serial2RadioId();
|
||||
calcDtuIdCrc();
|
||||
|
||||
mChannels = new uint8_t(4);
|
||||
mChannels[0] = 23;
|
||||
mChannels[1] = 40;
|
||||
mChannels[2] = 61;
|
||||
|
@ -76,7 +70,10 @@ class hoymiles {
|
|||
~hoymiles() {}
|
||||
|
||||
uint8_t getDefaultChannel(void) {
|
||||
return mChannels[1];
|
||||
return mChannels[2];
|
||||
}
|
||||
uint8_t getLastChannel(void) {
|
||||
return mChannels[mChanIdx];
|
||||
}
|
||||
|
||||
uint8_t getNxtChannel(void) {
|
||||
|
@ -99,12 +96,7 @@ class hoymiles {
|
|||
}
|
||||
|
||||
uint8_t getTimePacket(uint8_t buf[], uint32_t ts) {
|
||||
memset(buf, 0, MAX_RF_PAYLOAD_SIZE);
|
||||
|
||||
buf[0] = 0x15;
|
||||
CP_U32_BigEndian(&buf[1], (mRadioId >> 8));
|
||||
CP_U32_BigEndian(&buf[5], (DTU_RADIO_ID >> 8));
|
||||
buf[9] = 0x00;
|
||||
getCmdPacket(buf, 0x15, 0x80, false);
|
||||
buf[10] = 0x0b; // cid
|
||||
buf[11] = 0x00;
|
||||
CP_U32_LittleEndian(&buf[12], ts);
|
||||
|
@ -118,12 +110,14 @@ class hoymiles {
|
|||
return 27;
|
||||
}
|
||||
|
||||
uint8_t getCmdPacket(uint8_t buf[], uint8_t mid, uint8_t cmd) {
|
||||
buf[0] = mid;
|
||||
uint8_t getCmdPacket(uint8_t buf[], uint8_t mid, uint8_t cmd, bool calcCrc = true) {
|
||||
memset(buf, 0, MAX_RF_PAYLOAD_SIZE);
|
||||
buf[0] = mid; // message id
|
||||
CP_U32_BigEndian(&buf[1], (mRadioId >> 8));
|
||||
CP_U32_BigEndian(&buf[5], (DTU_RADIO_ID >> 8));
|
||||
buf[9] = cmd;
|
||||
buf[10] = crc8(buf, 10);
|
||||
buf[9] = cmd;
|
||||
if(calcCrc)
|
||||
buf[10] = crc8(buf, 10);
|
||||
|
||||
return 11;
|
||||
}
|
||||
|
@ -173,52 +167,8 @@ class hoymiles {
|
|||
mDtuIdCrc = crc16nrf24(dtuAddr, BIT_CNT(5));
|
||||
}
|
||||
|
||||
uint8_t crc8(uint8_t buf[], uint8_t len) {
|
||||
uint8_t crc = CRC8_INIT;
|
||||
for(uint8_t i = 0; i < len; i++) {
|
||||
crc ^= buf[i];
|
||||
for(uint8_t b = 0; b < 8; b ++) {
|
||||
crc = (crc << 1) ^ ((crc & 0x80) ? CRC8_POLY : 0x00);
|
||||
}
|
||||
}
|
||||
return crc;
|
||||
}
|
||||
|
||||
uint16_t crc16(uint8_t buf[], uint8_t len) {
|
||||
uint16_t crc = 0xffff;
|
||||
uint8_t lsb;
|
||||
|
||||
for(uint8_t i = 0; i < len; i++) {
|
||||
crc = crc ^ buf[i];
|
||||
for(int8_t b = 7; b >= 0; b--) {
|
||||
lsb = (crc & 0x0001);
|
||||
if(lsb == 0x01)
|
||||
crc--;
|
||||
crc = crc >> 1;
|
||||
if(lsb == 0x01)
|
||||
crc = crc ^ CRC16_MODBUS_POLYNOM;
|
||||
}
|
||||
}
|
||||
|
||||
return crc;
|
||||
}
|
||||
|
||||
uint16_t crc16nrf24(uint8_t buf[], uint16_t lenBits, uint16_t startBit = 0, uint16_t crcIn = 0xffff) {
|
||||
uint16_t crc = crcIn;
|
||||
uint8_t idx, val = buf[(startBit >> 3)];
|
||||
|
||||
for(uint16_t bit = startBit; bit < lenBits; bit ++) {
|
||||
idx = bit & 0x07;
|
||||
if(0 == idx)
|
||||
val = buf[(bit >> 3)];
|
||||
crc ^= 0x8000 & (val << (8 + idx));
|
||||
crc = (crc & 0x8000) ? ((crc << 1) ^ CRC16_NRF24_POLYNOM) : (crc << 1);
|
||||
}
|
||||
|
||||
return crc;
|
||||
}
|
||||
|
||||
uint8_t *mChannels;
|
||||
uint8_t mChannels[4];
|
||||
uint8_t mChanIdx;
|
||||
uint16_t mDtuIdCrc;
|
||||
uint16_t mLastCrc;
|
||||
|
|
|
@ -1 +1 @@
|
|||
String index_html = "<!doctype html><html><head><title>Index - {DEVICE}</title><link rel=\"stylesheet\" type=\"text/css\" href=\"style.css\"/><meta name=\"viewport\" content=\"width=device-width, initial-scale=1\"><script type=\"text/javascript\"> window.setInterval(\"getAjax('/uptime', 'uptime')\", 1000); window.setInterval(\"getAjax('/time', 'time')\", 1000); function getAjax(url, resid) { var http = null; http = new XMLHttpRequest(); if(http != null) { http.open(\"GET\", url, true); http.onreadystatechange = print; http.send(null); } function print() { if(http.readyState == 4) { document.getElementById(resid).innerHTML = http.responseText; } } } </script></head><body><h1>AHOY - {DEVICE}</h1><div id=\"content\" class=\"content\"><p><a href=\"/update\">Update</a><br/><br/><a href=\"/setup\">Setup</a><br/><a href=\"/reboot\">Reboot</a></p><p><span class=\"des\">Uptime: </span><span id=\"uptime\"></span></p><p><span class=\"des\">Time: </span><span id=\"time\"></span></p></div><div id=\"footer\"><p class=\"left\">© 2022</p><p class=\"right\">AHOY :: {VERSION}</p></div></body></html>";
|
||||
String index_html = "<!doctype html><html><head><title>Index - {DEVICE}</title><link rel=\"stylesheet\" type=\"text/css\" href=\"style.css\"/><meta name=\"viewport\" content=\"width=device-width, initial-scale=1\"><script type=\"text/javascript\"> window.setInterval(\"getAjax('/uptime', 'uptime')\", 1000); window.setInterval(\"getAjax('/time', 'time')\", 1000); window.setInterval(\"getAjax('/cmdstat', 'cmds')\", 2000); function getAjax(url, resid) { var http = null; http = new XMLHttpRequest(); if(http != null) { http.open(\"GET\", url, true); http.onreadystatechange = print; http.send(null); } function print() { if(http.readyState == 4) { document.getElementById(resid).innerHTML = http.responseText; } } } </script></head><body><h1>AHOY - {DEVICE}</h1><div id=\"content\" class=\"content\"><p><a href=\"/update\">Update</a><br/><br/><a href=\"/setup\">Setup</a><br/><a href=\"/reboot\">Reboot</a></p><p><span class=\"des\">Uptime: </span><span id=\"uptime\"></span></p><p><span class=\"des\">Time: </span><span id=\"time\"></span></p><p><span class=\"des\">Statistics: </span><pre id=\"cmds\"></pre></p></div><div id=\"footer\"><p class=\"left\">© 2022</p><p class=\"right\">AHOY :: {VERSION}</p></div></body></html>";
|
||||
|
|
|
@ -7,6 +7,7 @@
|
|||
<script type="text/javascript">
|
||||
window.setInterval("getAjax('/uptime', 'uptime')", 1000);
|
||||
window.setInterval("getAjax('/time', 'time')", 1000);
|
||||
window.setInterval("getAjax('/cmdstat', 'cmds')", 2000);
|
||||
|
||||
function getAjax(url, resid) {
|
||||
var http = null;
|
||||
|
@ -36,6 +37,7 @@
|
|||
</p>
|
||||
<p><span class="des">Uptime: </span><span id="uptime"></span></p>
|
||||
<p><span class="des">Time: </span><span id="time"></span></p>
|
||||
<p><span class="des">Statistics: </span><pre id="cmds"></pre></p>
|
||||
</div>
|
||||
<div id="footer">
|
||||
<p class="left">© 2022</p>
|
||||
|
|
|
@ -4,6 +4,8 @@
|
|||
#include "html/h/style_css.h"
|
||||
#include "html/h/setup_html.h"
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
Main::Main(void) {
|
||||
mDns = new DNSServer();
|
||||
mWeb = new ESP8266WebServer(80);
|
||||
|
@ -11,6 +13,7 @@ Main::Main(void) {
|
|||
mUdp = new WiFiUDP();
|
||||
|
||||
mApActive = true;
|
||||
mSettingsValid = false;
|
||||
|
||||
snprintf(mVersion, 12, "%d.%d.%d", VERSION_MAJOR, VERSION_MINOR, VERSION_PATCH);
|
||||
|
||||
|
@ -22,6 +25,7 @@ Main::Main(void) {
|
|||
mUptimeSecs = 0;
|
||||
mUptimeTicker = new Ticker();
|
||||
mUptimeTicker->attach(1, std::bind(&Main::uptimeTicker, this));
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
@ -70,19 +74,31 @@ void Main::loop(void) {
|
|||
//-----------------------------------------------------------------------------
|
||||
bool Main::getConfig(void) {
|
||||
bool mApActive = false;
|
||||
uint16_t crcRd, crcCheck;
|
||||
uint8_t buf[ADDR_NEXT-ADDR_START];
|
||||
|
||||
mEep->read(ADDR_SSID, mStationSsid, SSID_LEN);
|
||||
mEep->read(ADDR_PWD, mStationPwd, PWD_LEN);
|
||||
mEep->read(ADDR_DEVNAME, mDeviceName, DEVNAME_LEN);
|
||||
// check settings crc
|
||||
mEep->read(ADDR_START, buf, (ADDR_NEXT-ADDR_START));
|
||||
crcCheck = crc16(buf, (ADDR_NEXT-ADDR_START));
|
||||
mEep->read(ADDR_SETTINGS_CRC, &crcRd);
|
||||
|
||||
if(mStationSsid[0] == 0xff) { // empty memory
|
||||
if(crcCheck == crcRd)
|
||||
mSettingsValid = true;
|
||||
//else
|
||||
// Serial.println("CRC RD: " + String(crcRd, HEX) + " CRC CHECK: " + String(crcCheck, HEX));
|
||||
|
||||
|
||||
if(mSettingsValid) {
|
||||
mEep->read(ADDR_SSID, mStationSsid, SSID_LEN);
|
||||
mEep->read(ADDR_PWD, mStationPwd, PWD_LEN);
|
||||
mEep->read(ADDR_DEVNAME, mDeviceName, DEVNAME_LEN);
|
||||
}
|
||||
else {
|
||||
mApActive = true;
|
||||
memset(mStationSsid, 0, SSID_LEN);
|
||||
}
|
||||
if(mStationPwd[0] == 0xff)
|
||||
memset(mStationPwd, 0, PWD_LEN);
|
||||
if(mDeviceName[0] == 0xff)
|
||||
memset(mDeviceName, 0, DEVNAME_LEN);
|
||||
}
|
||||
|
||||
return mApActive;
|
||||
}
|
||||
|
@ -92,6 +108,8 @@ bool Main::getConfig(void) {
|
|||
void Main::setupAp(const char *ssid, const char *pwd) {
|
||||
IPAddress apIp(192, 168, 1, 1);
|
||||
|
||||
Serial.println("\n---------\nAP MODE\nSSDI: "+ String(ssid) + "\nPWD: " + String(pwd) + "\n---------\n");
|
||||
|
||||
WiFi.mode(WIFI_AP);
|
||||
WiFi.softAPConfig(apIp, apIp, IPAddress(255, 255, 255, 0));
|
||||
WiFi.softAP(ssid, pwd);
|
||||
|
@ -190,6 +208,7 @@ void Main::saveValues(bool webSend = true) {
|
|||
mEep->write(ADDR_DEVNAME, mDeviceName, DEVNAME_LEN);
|
||||
|
||||
|
||||
updateCrc();
|
||||
if(webSend) {
|
||||
if(mWeb->arg("reboot") == "on")
|
||||
showReboot();
|
||||
|
@ -201,6 +220,18 @@ void Main::saveValues(bool webSend = true) {
|
|||
}
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
void Main::updateCrc(void) {
|
||||
uint16_t crc;
|
||||
uint8_t buf[ADDR_NEXT-ADDR_START];
|
||||
|
||||
mEep->read(ADDR_START, buf, (ADDR_NEXT-ADDR_START));
|
||||
crc = crc16(buf, (ADDR_NEXT-ADDR_START));
|
||||
//Serial.println("new CRC: " + String(crc, HEX));
|
||||
mEep->write(ADDR_SETTINGS_CRC, crc);
|
||||
}
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
void Main::showUptime(void) {
|
||||
char time[20] = {0};
|
||||
|
|
|
@ -16,6 +16,7 @@
|
|||
|
||||
#include "eep.h"
|
||||
#include "defines.h"
|
||||
#include "crc.h"
|
||||
|
||||
|
||||
const byte mDnsPort = 53;
|
||||
|
@ -37,10 +38,11 @@ class Main {
|
|||
protected:
|
||||
void showReboot(void);
|
||||
virtual void saveValues(bool webSend);
|
||||
virtual void updateCrc(void);
|
||||
|
||||
char mStationSsid[SSID_LEN];
|
||||
char mStationPwd[PWD_LEN];
|
||||
bool mLinkLedActive;
|
||||
bool mSettingsValid;
|
||||
bool mApActive;
|
||||
ESP8266WebServer *mWeb;
|
||||
char mVersion[9];
|
||||
|
|
Loading…
Add table
Reference in a new issue