Bugfixing, move ISR code to IRAM, store crashdump
This commit is contained in:
parent
cda0209f98
commit
e7957af627
@ -16,3 +16,4 @@ lib_deps =
|
|||||||
ottowinter/ESPAsyncWebServer-esphome@^1.2.7
|
ottowinter/ESPAsyncWebServer-esphome@^1.2.7
|
||||||
bblanchon/ArduinoJson@^6.17.2
|
bblanchon/ArduinoJson@^6.17.2
|
||||||
ayushsharma82/AsyncElegantOTA@^2.2.5
|
ayushsharma82/AsyncElegantOTA@^2.2.5
|
||||||
|
krzychb/EspSaveCrash@^1.2.0
|
||||||
|
@ -20,7 +20,7 @@
|
|||||||
* #define readUInt16(arr, index) word(arr[index], arr[index + 1])
|
* #define readUInt16(arr, index) word(arr[index], arr[index + 1])
|
||||||
* #define readCRC(arr, length) word(arr[(length - MODBUS_CRC_LENGTH) + 1], arr[length - MODBUS_CRC_LENGTH])
|
* #define readCRC(arr, length) word(arr[(length - MODBUS_CRC_LENGTH) + 1], arr[length - MODBUS_CRC_LENGTH])
|
||||||
*/
|
*/
|
||||||
uint16_t calculateCRC(uint8_t *buffer, int length)
|
uint16_t ICACHE_RAM_ATTR calculateCRC(uint8_t *buffer, int length)
|
||||||
{
|
{
|
||||||
int i, j;
|
int i, j;
|
||||||
uint16_t crc = 0xFFFF;
|
uint16_t crc = 0xFFFF;
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
* modified/reduced to provide HCP Modbus low level functions
|
* ISR Code to emulate the modbus rtu protocol for hoermann HCP2
|
||||||
*
|
*
|
||||||
|
* code based on https://github.com/juhovh/esp-uart
|
||||||
* The MIT License (MIT)
|
* The MIT License (MIT)
|
||||||
*
|
*
|
||||||
* Copyright (c) 2016 Juho Vähä-Herttua (juhovh@iki.fi)
|
* Copyright (c) 2016 Juho Vähä-Herttua (juhovh@iki.fi)
|
||||||
@ -136,7 +137,7 @@ SHCIState* getHCIState(){
|
|||||||
|
|
||||||
const unsigned char ResponseTemplate_Fcn17_Cmd03_L08 []= {0x02,0x17,0x10,0x3E,0x00,0x03,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x74,0x1B};
|
const unsigned char ResponseTemplate_Fcn17_Cmd03_L08 []= {0x02,0x17,0x10,0x3E,0x00,0x03,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x74,0x1B};
|
||||||
const unsigned char ResponseTemplate_Fcn17_Cmd04_L02 []= {0x02,0x17,0x04,0x0F,0x00,0x04,0xFD,0x0A,0x72};
|
const unsigned char ResponseTemplate_Fcn17_Cmd04_L02 []= {0x02,0x17,0x04,0x0F,0x00,0x04,0xFD,0x0A,0x72};
|
||||||
static void processDeviceStatusFrame(){
|
static void ICACHE_RAM_ATTR processDeviceStatusFrame(){
|
||||||
if(rxlen==0x11){
|
if(rxlen==0x11){
|
||||||
unsigned char counter = rxbuffer[11];
|
unsigned char counter = rxbuffer[11];
|
||||||
unsigned char cmd = rxbuffer[12];
|
unsigned char cmd = rxbuffer[12];
|
||||||
@ -267,7 +268,7 @@ static void processDeviceStatusFrame(){
|
|||||||
}
|
}
|
||||||
|
|
||||||
const unsigned char ResponseTemplate_Fcn17_Cmd02_L05 []= {0x02,0x17,0x0a,0x00,0x00,0x02,0x05,0x04,0x30,0x10,0xff,0xa8,0x45,0x0e,0xdf};
|
const unsigned char ResponseTemplate_Fcn17_Cmd02_L05 []= {0x02,0x17,0x0a,0x00,0x00,0x02,0x05,0x04,0x30,0x10,0xff,0xa8,0x45,0x0e,0xdf};
|
||||||
static void processDeviceBusScanFrame(){
|
static void ICACHE_RAM_ATTR processDeviceBusScanFrame(){
|
||||||
// 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16
|
// 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16
|
||||||
//0013: 02 17 9C B9 00 05 9C 41 00 03 06 00 02 00 00 01 02 f8 35
|
//0013: 02 17 9C B9 00 05 9C 41 00 03 06 00 02 00 00 01 02 f8 35
|
||||||
//res=> 02 17 0a 00 00 02 05 04 30 10 ff a8 45 0e df
|
//res=> 02 17 0a 00 00 02 05 04 30 10 ff a8 45 0e df
|
||||||
@ -282,7 +283,7 @@ static void processDeviceBusScanFrame(){
|
|||||||
//Log(LL_INFO,"Busscan received");
|
//Log(LL_INFO,"Busscan received");
|
||||||
}
|
}
|
||||||
|
|
||||||
static void processBroadcastStatusFrame(){
|
static void ICACHE_RAM_ATTR processBroadcastStatusFrame(){
|
||||||
//001B: 00 10 9D 31 00 09 12 64 00 00 00 40 60 00 00 00 00 00 00 00 00 00 01 00 00 CA 22
|
//001B: 00 10 9D 31 00 09 12 64 00 00 00 40 60 00 00 00 00 00 00 00 00 00 01 00 00 CA 22
|
||||||
bool hasStateChanged = false;
|
bool hasStateChanged = false;
|
||||||
CHECKCHANGEDSET(state.lampOn,rxbuffer[20] == 0x14,hasStateChanged);
|
CHECKCHANGEDSET(state.lampOn,rxbuffer[20] == 0x14,hasStateChanged);
|
||||||
@ -293,8 +294,7 @@ static void processBroadcastStatusFrame(){
|
|||||||
CHECKCHANGEDSET(state.valid, true,hasStateChanged);
|
CHECKCHANGEDSET(state.valid, true,hasStateChanged);
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool processFrame(){
|
static bool ICACHE_RAM_ATTR processFrame(){
|
||||||
|
|
||||||
switch (rxlen)
|
switch (rxlen)
|
||||||
{
|
{
|
||||||
case 0x1b:
|
case 0x1b:
|
||||||
@ -355,8 +355,7 @@ static bool processFrame(){
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static void ICACHE_RAM_ATTR processMessage (){
|
||||||
static void processMessage (){
|
|
||||||
// check frame, process frame
|
// check frame, process frame
|
||||||
if(statemachine!= WAITING && lastStateTime+2000<millis()){
|
if(statemachine!= WAITING && lastStateTime+2000<millis()){
|
||||||
statemachine = WAITING;
|
statemachine = WAITING;
|
||||||
@ -382,9 +381,7 @@ static void processMessage (){
|
|||||||
|
|
||||||
//--------------------------------------------------------------
|
//--------------------------------------------------------------
|
||||||
|
|
||||||
static uint16
|
static uint16 ICACHE_RAM_ATTR uart0_receive(){
|
||||||
uart0_receive()
|
|
||||||
{
|
|
||||||
uint16 i;
|
uint16 i;
|
||||||
uint16 uart0_rxfifo_len = UART_RXFIFO_LEN(UART0);
|
uint16 uart0_rxfifo_len = UART_RXFIFO_LEN(UART0);
|
||||||
|
|
||||||
@ -413,9 +410,7 @@ uart0_receive()
|
|||||||
return i;
|
return i;
|
||||||
}
|
}
|
||||||
|
|
||||||
static uint16
|
static uint16 ICACHE_RAM_ATTR uart0_send(){
|
||||||
uart0_send()
|
|
||||||
{
|
|
||||||
uint16 i;
|
uint16 i;
|
||||||
for (i=UART_TXFIFO_LEN(UART0); i<UART_TXFIFO_SIZE; i++) {
|
for (i=UART_TXFIFO_LEN(UART0); i<UART_TXFIFO_SIZE; i++) {
|
||||||
if (txpos==txlen) {
|
if (txpos==txlen) {
|
||||||
@ -430,9 +425,7 @@ uart0_send()
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static void
|
static void ICACHE_RAM_ATTR uart0_intr_handler(void *arg){
|
||||||
uart0_intr_handler(void *arg)
|
|
||||||
{
|
|
||||||
uint32 uart0_status;
|
uint32 uart0_status;
|
||||||
uart0_status = READ_PERI_REG(UART_INT_ST(UART0));
|
uart0_status = READ_PERI_REG(UART_INT_ST(UART0));
|
||||||
if (uart0_status & UART_RXFIFO_TOUT_INT_ST) {
|
if (uart0_status & UART_RXFIFO_TOUT_INT_ST) {
|
||||||
@ -454,8 +447,7 @@ uart0_intr_handler(void *arg)
|
|||||||
}
|
}
|
||||||
|
|
||||||
void ICACHE_FLASH_ATTR
|
void ICACHE_FLASH_ATTR
|
||||||
uart0_open(uint32 baud_rate, uint32 flags)
|
uart0_open(uint32 baud_rate, uint32 flags){
|
||||||
{
|
|
||||||
uint32 clkdiv;
|
uint32 clkdiv;
|
||||||
|
|
||||||
ETS_UART_INTR_DISABLE();
|
ETS_UART_INTR_DISABLE();
|
||||||
@ -480,8 +472,7 @@ uart0_open(uint32 baud_rate, uint32 flags)
|
|||||||
}
|
}
|
||||||
|
|
||||||
void ICACHE_FLASH_ATTR
|
void ICACHE_FLASH_ATTR
|
||||||
uart0_reset()
|
uart0_reset(){
|
||||||
{
|
|
||||||
// Disable interrupts while resetting UART0
|
// Disable interrupts while resetting UART0
|
||||||
ETS_UART_INTR_DISABLE();
|
ETS_UART_INTR_DISABLE();
|
||||||
|
|
||||||
|
@ -1,4 +1,7 @@
|
|||||||
/* modified/reduced to provide HCP Modbus low level functions
|
/*
|
||||||
|
* ISR Code to emulate the modbus rtu protocol for hoermann HCP2
|
||||||
|
*
|
||||||
|
* code based on https://github.com/juhovh/esp-uart
|
||||||
* The MIT License (MIT)
|
* The MIT License (MIT)
|
||||||
*
|
*
|
||||||
* Copyright (c) 2016 Juho Vähä-Herttua (juhovh@iki.fi)
|
* Copyright (c) 2016 Juho Vähä-Herttua (juhovh@iki.fi)
|
||||||
|
@ -1,4 +1,5 @@
|
|||||||
#include <Arduino.h>
|
#include <Arduino.h>
|
||||||
|
#include "EspSaveCrash.h"
|
||||||
#include <ESPAsyncWebServer.h>
|
#include <ESPAsyncWebServer.h>
|
||||||
#include <AsyncElegantOTA.h>
|
#include <AsyncElegantOTA.h>
|
||||||
#include <AsyncJson.h>
|
#include <AsyncJson.h>
|
||||||
@ -29,6 +30,9 @@
|
|||||||
#define ESP8266_GPIO5 5 // Optocoupler input.
|
#define ESP8266_GPIO5 5 // Optocoupler input.
|
||||||
#define LED_PIN ESP8266_GPIO2
|
#define LED_PIN ESP8266_GPIO2
|
||||||
|
|
||||||
|
EspSaveCrash SaveCrash;
|
||||||
|
// the buffer to put the Crash log to
|
||||||
|
char *_debugOutputBuffer;
|
||||||
|
|
||||||
// webserver on port 80
|
// webserver on port 80
|
||||||
AsyncWebServer server(80);
|
AsyncWebServer server(80);
|
||||||
@ -70,6 +74,8 @@ void setup(){
|
|||||||
// Hörmann HCP2 based on modbus rtu @57.6kB 8E1
|
// Hörmann HCP2 based on modbus rtu @57.6kB 8E1
|
||||||
uart0_open(57600,UART_FLAGS_8E1);
|
uart0_open(57600,UART_FLAGS_8E1);
|
||||||
|
|
||||||
|
_debugOutputBuffer = (char *) calloc(2048, sizeof(char));
|
||||||
|
|
||||||
//setup wifi
|
//setup wifi
|
||||||
WiFi.mode(WIFI_STA);
|
WiFi.mode(WIFI_STA);
|
||||||
WiFi.begin(ssid, password);
|
WiFi.begin(ssid, password);
|
||||||
@ -89,7 +95,7 @@ void setup(){
|
|||||||
SHCIState *doorstate = getHCIState();
|
SHCIState *doorstate = getHCIState();
|
||||||
AsyncResponseStream *response = request->beginResponseStream("application/json");
|
AsyncResponseStream *response = request->beginResponseStream("application/json");
|
||||||
DynamicJsonDocument root(1024);
|
DynamicJsonDocument root(1024);
|
||||||
root["valid"] = doorstate->valid;
|
root["valid"] = doorstate->valid && (getMessageAge()/1000)<3000;
|
||||||
root["doorstate"] = doorstate->doorState;
|
root["doorstate"] = doorstate->doorState;
|
||||||
root["doorposition"] = doorstate->doorCurrentPosition;
|
root["doorposition"] = doorstate->doorCurrentPosition;
|
||||||
root["doortarget"] = doorstate->doorTargetPosition;
|
root["doortarget"] = doorstate->doorTargetPosition;
|
||||||
@ -129,29 +135,33 @@ void setup(){
|
|||||||
request->send(200, "text/plain", "OK");
|
request->send(200, "text/plain", "OK");
|
||||||
});
|
});
|
||||||
|
|
||||||
server.on("/sysinfo", HTTP_GET, [] (AsyncWebServerRequest *request) {
|
server.on("/crashinfo", HTTP_GET, [] (AsyncWebServerRequest *request){
|
||||||
String freemem;
|
strcpy(_debugOutputBuffer, "");
|
||||||
String ResetReason;
|
SaveCrash.print(_debugOutputBuffer,2048);
|
||||||
freemem = ESP.getFreeHeap();
|
if (request->hasParam("clear")) {
|
||||||
|
SaveCrash.clear();
|
||||||
|
}
|
||||||
|
request->send(200, "text/plain", _debugOutputBuffer);
|
||||||
|
});
|
||||||
|
|
||||||
|
server.on("/sysinfo", HTTP_GET, [] (AsyncWebServerRequest *request) {
|
||||||
|
char buffer[150];
|
||||||
rst_info* rinfo = ESP.getResetInfoPtr();
|
rst_info* rinfo = ESP.getResetInfoPtr();
|
||||||
|
|
||||||
//JSONencoder["uptimed"] = Day2;
|
|
||||||
//JSONencoder["uptimeh"] = Hour2;
|
|
||||||
//JSONencoder["uptimem"] = Minute2;
|
|
||||||
//JSONencoder["uptimes"] = Second2;
|
|
||||||
|
|
||||||
AsyncResponseStream *response = request->beginResponseStream("application/json");
|
AsyncResponseStream *response = request->beginResponseStream("application/json");
|
||||||
DynamicJsonDocument root(1024);
|
DynamicJsonDocument root(1024);
|
||||||
root["freemem"] = freemem;
|
root["freemem"] = ESP.getFreeHeap();
|
||||||
ResetReason += String(rinfo->reason);
|
root["hostname"] = WiFi.hostname();
|
||||||
ResetReason += String(" - ");
|
root["ip"] = WiFi.localIP().toString();
|
||||||
ResetReason += String(ESP.getResetReason().c_str());
|
|
||||||
root["hostname"] = String(WiFi.hostname());
|
|
||||||
root["dsdd"] = WiFi.localIP().toString();
|
|
||||||
root["ssid"] = String(ssid);
|
root["ssid"] = String(ssid);
|
||||||
root["wifistatus"] = String(WiFi.status());
|
root["wifistatus"] = WiFi.status();
|
||||||
root["resetreason"] =ResetReason;
|
root["resetreason"] =ESP.getResetReason();
|
||||||
root["errors"] = rinfo->exccause;
|
root["errors"] = rinfo->exccause;
|
||||||
|
|
||||||
|
//The address of the last crash is printed, which is used to
|
||||||
|
sprintf(buffer, "epc1=0x%08x, epc2=0x%08x, epc3=0x%08x, excvaddr=0x%08x, depc=0x%08x, exccause=0x%x, reason=0x%x",
|
||||||
|
rinfo->epc1, rinfo->epc2, rinfo->epc3, rinfo->excvaddr, rinfo->depc, rinfo->exccause, rinfo->reason);
|
||||||
|
root["rstinfo"] = buffer;
|
||||||
serializeJson(root,*response);
|
serializeJson(root,*response);
|
||||||
|
|
||||||
request->send(response);
|
request->send(response);
|
||||||
|
Loading…
Reference in New Issue
Block a user