parent
ff1c09d9f8
commit
23883ef582
@ -1 +1 @@ |
|||||||
Subproject commit 7c43fd3e1a147d24cde05a7ecd3d155e293caa89 |
Subproject commit 6df0fcacd8bc23d2af86df4d5c5c2c624938eeb4 |
@ -0,0 +1,72 @@ |
|||||||
|
#include <esp8266.h> |
||||||
|
#include <httpd.h> |
||||||
|
#include "page_home.h" |
||||||
|
#include "uptime.h" |
||||||
|
|
||||||
|
|
||||||
|
/** System Status page */ |
||||||
|
int FLASH_FN tplHome(HttpdConnData *connData, char *token, void **arg) |
||||||
|
{ |
||||||
|
// arg is unused
|
||||||
|
(void)arg; |
||||||
|
|
||||||
|
struct station_config stconf; |
||||||
|
char buff[128]; |
||||||
|
u8 mac[6]; |
||||||
|
|
||||||
|
// empty string if no token matches
|
||||||
|
buff[0] = 0; |
||||||
|
|
||||||
|
if (token == NULL) return HTTPD_CGI_DONE; |
||||||
|
|
||||||
|
if (strcmp(token, "uptime") == 0) { |
||||||
|
// Uptime
|
||||||
|
uptime_str(buff); |
||||||
|
|
||||||
|
} else if (strcmp(token, "heap") == 0) { |
||||||
|
// Free heap
|
||||||
|
sprintf(buff, "%u", system_get_free_heap_size()); |
||||||
|
|
||||||
|
} else if (strcmp(token, "wifiMode") == 0) { |
||||||
|
// WiFi mode
|
||||||
|
switch (wifi_get_opmode()) { |
||||||
|
case STATION_MODE: strcpy(buff, "Client"); break; |
||||||
|
case SOFTAP_MODE: strcpy(buff, "SoftAP"); break; |
||||||
|
case STATIONAP_MODE: strcpy(buff, "STA+AP"); break; |
||||||
|
default: strcpy(buff, "Unknown"); |
||||||
|
} |
||||||
|
|
||||||
|
} else if (strcmp(token, "staSSID") == 0) { |
||||||
|
// Station SSID (if in station mode)
|
||||||
|
int opmode = wifi_get_opmode(); |
||||||
|
if (opmode != STATION_MODE && opmode != STATIONAP_MODE) { |
||||||
|
strcpy(buff, "N/A"); // no SSID in AP-only mode
|
||||||
|
} else { |
||||||
|
wifi_station_get_config(&stconf); |
||||||
|
strcpy(buff, (char*)stconf.ssid); |
||||||
|
} |
||||||
|
|
||||||
|
} else if (strcmp(token, "staRSSI") == 0) { |
||||||
|
// Signal strength if in Station mode
|
||||||
|
int rssi = wifi_station_get_rssi(); |
||||||
|
sprintf(buff, "%d", rssi); |
||||||
|
|
||||||
|
} else if (strcmp(token, "staMAC") == 0) { |
||||||
|
// Station MAC addr
|
||||||
|
wifi_get_macaddr(STATION_IF, mac); |
||||||
|
sprintf(buff, MACSTR, MAC2STR(mac)); |
||||||
|
|
||||||
|
} else if (strcmp(token, "apMAC") == 0) { |
||||||
|
// SoftAP MAC addr
|
||||||
|
wifi_get_macaddr(SOFTAP_IF, mac); |
||||||
|
sprintf(buff, MACSTR, MAC2STR(mac)); |
||||||
|
|
||||||
|
} else if (strcmp(token, "chipID") == 0) { |
||||||
|
// Chip serial number
|
||||||
|
sprintf(buff, "%08x", system_get_chip_id()); |
||||||
|
} |
||||||
|
|
||||||
|
httpdSend(connData, buff, -1); |
||||||
|
|
||||||
|
return HTTPD_CGI_DONE; |
||||||
|
} |
@ -0,0 +1,8 @@ |
|||||||
|
#ifndef PAGE_HOME_H |
||||||
|
#define PAGE_HOME_H |
||||||
|
|
||||||
|
#include <httpd.h> |
||||||
|
|
||||||
|
int tplHome(HttpdConnData *connData, char *token, void **arg); |
||||||
|
|
||||||
|
#endif // PAGE_HOME_H
|
@ -0,0 +1,180 @@ |
|||||||
|
#include <esp8266.h> |
||||||
|
#include <sbmp.h> |
||||||
|
|
||||||
|
#include "datalink.h" |
||||||
|
#include "sampling.h" |
||||||
|
|
||||||
|
// The buffer is big enough for 256 data bytes - 4*64
|
||||||
|
|
||||||
|
// number of 32-bit vars in the chunk
|
||||||
|
#define CHUNK_LEN_32 64 |
||||||
|
|
||||||
|
// chunk size for bulk transfer - 64 floats
|
||||||
|
#define CHUNK_LEN (CHUNK_LEN_32*4) |
||||||
|
|
||||||
|
|
||||||
|
static bool acquire_pending = false; |
||||||
|
static uint16_t acquire_session; |
||||||
|
|
||||||
|
|
||||||
|
static ETSTimer prSampleAbortTimer; |
||||||
|
|
||||||
|
static void FLASH_FN prSampleAbortTimerCb(void *arg) { |
||||||
|
warn("Sampling aborted due to timeout."); |
||||||
|
acquire_pending = false; |
||||||
|
|
||||||
|
// free the data obj if not NULL
|
||||||
|
sbmp_ep_free_listener_obj(dlnk_ep, acquire_session); |
||||||
|
// release the slot
|
||||||
|
sbmp_ep_remove_listener(dlnk_ep, acquire_session); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
typedef struct { |
||||||
|
uint32_t pos; |
||||||
|
uint32_t total; |
||||||
|
} DataReadState; |
||||||
|
|
||||||
|
static void FLASH_FN request_data_sesn_listener(SBMP_Endpoint *ep, SBMP_Datagram *dg, void **obj) |
||||||
|
{ |
||||||
|
dbg("Received msg in session %d, dg type %d", dg->session, dg->type); |
||||||
|
|
||||||
|
DataReadState *state = *obj; |
||||||
|
|
||||||
|
// allocate the state struct
|
||||||
|
if (state == NULL) { |
||||||
|
state = malloc(sizeof(DataReadState)); |
||||||
|
*obj = state; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
PayloadParser pp; |
||||||
|
switch (dg->type) { |
||||||
|
case DG_BULK_OFFER:// Data ready notification
|
||||||
|
info("--- Data offered for bulk transfer ---"); |
||||||
|
|
||||||
|
// data is ready to be read
|
||||||
|
pp = pp_start(dg->payload, dg->length); |
||||||
|
|
||||||
|
state->pos = 0; |
||||||
|
state->total = pp_u32(&pp); |
||||||
|
|
||||||
|
dbg("Total bytes: %d", state->total); |
||||||
|
|
||||||
|
sbmp_bulk_request(ep, state->pos, CHUNK_LEN, dg->session); // 64 floats in one message
|
||||||
|
break; |
||||||
|
|
||||||
|
case DG_BULK_DATA: // data received
|
||||||
|
info("--- Received a chunk ---"); |
||||||
|
|
||||||
|
// Process the received data
|
||||||
|
pp = pp_start(dg->payload, dg->length); |
||||||
|
for (int i = 0; i < dg->length/4; i++) { |
||||||
|
float f = pp_float(&pp); |
||||||
|
dbg("Rx %.2f", f); |
||||||
|
} |
||||||
|
|
||||||
|
// and ask for more
|
||||||
|
state->pos += dg->length; |
||||||
|
|
||||||
|
if (state->pos >= state->total) { |
||||||
|
dbg("Transfer is complete."); |
||||||
|
// transfer complete
|
||||||
|
|
||||||
|
// make sure the peer has freed the buffer
|
||||||
|
// (may be waiting for us if we wanted to re-read something)
|
||||||
|
sbmp_bulk_abort(ep, dg->session); |
||||||
|
goto cleanup; |
||||||
|
} else { |
||||||
|
// read next part
|
||||||
|
sbmp_bulk_request(ep, state->pos, CHUNK_LEN, dg->session); |
||||||
|
} |
||||||
|
break; |
||||||
|
|
||||||
|
case DG_BULK_ABORT: // Peer resets the readout
|
||||||
|
// this is unlikely
|
||||||
|
warn("Bulk transfer aborted by peer."); |
||||||
|
goto cleanup; |
||||||
|
} |
||||||
|
|
||||||
|
return; |
||||||
|
|
||||||
|
cleanup: |
||||||
|
// free the obj
|
||||||
|
free(state); |
||||||
|
// remove the listener
|
||||||
|
sbmp_ep_remove_listener(ep, dg->session); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
static bool FLASH_FN meas_request_data(uint16_t count) |
||||||
|
{ |
||||||
|
info("Requesting data capture - %d samples.", count); |
||||||
|
|
||||||
|
if (acquire_pending) { |
||||||
|
error("Acquire request already in progress."); |
||||||
|
return false; |
||||||
|
} |
||||||
|
|
||||||
|
if (sbmp_ep_handshake_status(dlnk_ep) != SBMP_HSK_SUCCESS) { |
||||||
|
error("Hsk status not SUCCESS, can't request data."); |
||||||
|
return false; |
||||||
|
} |
||||||
|
|
||||||
|
// start the abort timer - timeout
|
||||||
|
os_timer_disarm(&prSampleAbortTimer); |
||||||
|
os_timer_setfn(&prSampleAbortTimer, prSampleAbortTimerCb, NULL); |
||||||
|
os_timer_arm(&prSampleAbortTimer, 5000, 0); // 5 seconds, no repeat
|
||||||
|
|
||||||
|
|
||||||
|
// start a message
|
||||||
|
uint16_t sesn; |
||||||
|
bool suc = sbmp_ep_start_message(dlnk_ep, DG_REQUEST_CAPTURE, sizeof(uint16_t), &sesn); |
||||||
|
if (!suc) return false; |
||||||
|
|
||||||
|
// register the session listener
|
||||||
|
sbmp_ep_add_listener(dlnk_ep, sesn, request_data_sesn_listener, NULL); |
||||||
|
|
||||||
|
// request N values
|
||||||
|
sbmp_ep_send_u16(dlnk_ep, count); |
||||||
|
|
||||||
|
dbg("Request sent, session nr %d", sesn); |
||||||
|
|
||||||
|
acquire_session = sesn; |
||||||
|
|
||||||
|
return true; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
// ------ C G I ---------
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
int FLASH_FN cgiReadSamples(HttpdConnData *connData) |
||||||
|
{ |
||||||
|
char buff[128]; |
||||||
|
|
||||||
|
if (connData->conn == NULL) { |
||||||
|
//Connection aborted. Clean up.
|
||||||
|
return HTTPD_CGI_DONE; |
||||||
|
} |
||||||
|
|
||||||
|
uint16_t count = 1; |
||||||
|
int len = httpdFindArg(connData->getArgs, "n", buff, sizeof(buff)); |
||||||
|
if (len != -1) { |
||||||
|
count = (uint16_t)atoi(buff); |
||||||
|
} |
||||||
|
|
||||||
|
dbg("User wants %d samples.", count); |
||||||
|
|
||||||
|
meas_request_data(count); |
||||||
|
|
||||||
|
httpdStartResponse(connData, 200); |
||||||
|
httpdHeader(connData, "Content-Type", "text/plain"); |
||||||
|
httpdEndHeaders(connData); |
||||||
|
|
||||||
|
// body
|
||||||
|
httpdSend(connData, "OK.", -1); |
||||||
|
|
||||||
|
return HTTPD_CGI_DONE; |
||||||
|
} |
@ -0,0 +1,10 @@ |
|||||||
|
#ifndef SAMPLING_H |
||||||
|
#define SAMPLING_H |
||||||
|
|
||||||
|
#include <esp8266.h> |
||||||
|
#include <httpd.h> |
||||||
|
|
||||||
|
// temporary func to nread samples
|
||||||
|
int cgiReadSamples(HttpdConnData *connData); |
||||||
|
|
||||||
|
#endif // SAMPLING_H
|
Loading…
Reference in new issue