From d4e3d24002f8662e3014662ef8adf9cd7d17f4bf Mon Sep 17 00:00:00 2001 From: elamre Date: Tue, 8 Aug 2017 01:51:45 +0200 Subject: [PATCH] Added a web interface, with strange behavior? Tomorrow fixing the bugs --- software/Basic_Blink/Makefile-user.mk | 3 +- software/Basic_Blink/app/ads101x.cpp | 2 + software/Basic_Blink/app/ads101x.h | 2 +- software/Basic_Blink/app/application.cpp | 88 ++++++++------ software/Basic_Blink/app/double_buffer.h | 21 +++- software/Basic_Blink/app/sensor_hub.cpp | 8 ++ software/Basic_Blink/app/sensor_hub.h | 1 + software/Basic_Blink/app/sensor_settings.h | 14 ++- software/Basic_Blink/app/web_interface.cpp | 114 ++++++++++++++++++ software/Basic_Blink/app/web_interface.h | 51 ++++++++ .../Basic_Blink/files/bootstrap.min.css.gz | Bin 0 -> 19765 bytes software/Basic_Blink/files/config.html | 69 +++++++++++ software/Basic_Blink/files/config.js | 38 ++++++ software/Basic_Blink/files/index.html | 88 ++++++++++++++ software/Basic_Blink/files/index.js | 13 ++ .../Basic_Blink/files/jquery-2.1.4.min.js.gz | Bin 0 -> 29589 bytes 16 files changed, 463 insertions(+), 49 deletions(-) create mode 100644 software/Basic_Blink/app/web_interface.cpp create mode 100644 software/Basic_Blink/app/web_interface.h create mode 100644 software/Basic_Blink/files/bootstrap.min.css.gz create mode 100644 software/Basic_Blink/files/config.html create mode 100644 software/Basic_Blink/files/config.js create mode 100644 software/Basic_Blink/files/index.html create mode 100644 software/Basic_Blink/files/index.js create mode 100644 software/Basic_Blink/files/jquery-2.1.4.min.js.gz diff --git a/software/Basic_Blink/Makefile-user.mk b/software/Basic_Blink/Makefile-user.mk index 07057cf..556dbe7 100644 --- a/software/Basic_Blink/Makefile-user.mk +++ b/software/Basic_Blink/Makefile-user.mk @@ -34,6 +34,7 @@ COM_SPEED = 460800 # SPI_MODE = dio ## SPIFFS options -DISABLE_SPIFFS = 1 +# DISABLE_SPIFFS = 1 # SPIFF_FILES = files +SPIFF_SIZE = 196608 diff --git a/software/Basic_Blink/app/ads101x.cpp b/software/Basic_Blink/app/ads101x.cpp index 9b2d88a..9eb5d73 100644 --- a/software/Basic_Blink/app/ads101x.cpp +++ b/software/Basic_Blink/app/ads101x.cpp @@ -8,6 +8,8 @@ #include "ads101x.h" #include +#include + namespace rijnfel { namespace ads { diff --git a/software/Basic_Blink/app/ads101x.h b/software/Basic_Blink/app/ads101x.h index 0e2d738..f8730d8 100644 --- a/software/Basic_Blink/app/ads101x.h +++ b/software/Basic_Blink/app/ads101x.h @@ -34,7 +34,7 @@ struct ads_sample_t { enum eGainAmplifier gain; }; -class cADS101x: cADC { +class cADS101x: public cADC { public: cADS101x(uint8_t i_address = 0x48); diff --git a/software/Basic_Blink/app/application.cpp b/software/Basic_Blink/app/application.cpp index 6413cc8..e95832d 100644 --- a/software/Basic_Blink/app/application.cpp +++ b/software/Basic_Blink/app/application.cpp @@ -2,65 +2,77 @@ #include #include #include "ads101x.h" +#include "sensor_hub.h" +#include "sensor_settings.h" +#include "double_buffer.h" +#include "web_interface.h" #define LED_PIN 2 // GPIO2 using namespace rijnfel; + +void STADisconnect(String ssid, uint8_t ssid_len, uint8_t bssid[6], + uint8_t reason); +void STAGotIP(IPAddress ip, IPAddress mask, IPAddress gateway); + Timer procTimer; ads::cADS101x adc; -bool state = true; -uint16_t sampless = 1; uint8_t channel = 0; -unsigned int average[4]; -void readAdc() { - //while (adc.IsReady()) { +cSensorHub hub(5); +int test = 0; +void updateSensorHub() { + hub.Update(); +} + +void adcCallback(cDoubleBuffer & buffer) { + cWebInterface::GetInstance()->UpdateAdc(adc, buffer); adc.SetMux(static_cast(ads::eInputMux::AIN_0 + channel)); channel++; if (channel > 3) { channel = 0; } - uint16_t settings = adc.GetSettings(); - Serial.printf("Settings = %d;\n\r", settings); - - if (false) { - adc.SetMux( - static_cast(ads::eInputMux::AIN_0 + channel)); - ads::ads_sample_t sample = adc.RawSample(); - average[channel] += adc.ConvertSample(sample) / 1000; //want it in mv - channel++; - if (channel > 3) { - channel = 0; - sampless++; - if (sampless > 3300) { - for (uint8_t i = 0; i < 4; i++) { - Serial.printf("C[%d] = %d; ", i, average[i] / sampless); - average[i] = 0; - } - Serial.printf("\n\r"); - sampless = 0; - } - } - } - WDT.alive(); - //} - //Serial.printf("Not ready anymore\n\r"); -} - -void blink() { - readAdc(); } void init() { + spiffs_mount(); Serial.begin(460800); - Wire.pins(5, 4); - + Wire.pins(4, 5); Wire.begin(); //SET higher CPU freq & disable wifi sleep system_update_cpu_freq(SYS_CPU_160MHZ); - WDT.enable(false); + wifi_set_sleep_type(NONE_SLEEP_T); + //WDT.enable(false); pinMode(LED_PIN, OUTPUT); adc.SetMux(ads::eInputMux::AIN_0); adc.SetSampleSpeed(ads::eSampleSpeed::SPS_3300); - procTimer.initializeMs(500, readAdc).start(); + hub.SetAdc(&adc); + + cSensorSettings * adcSettings; + adcSettings = new cSensorSettings(&adcCallback, 250, 5); + hub.SetAdcSettings(adcSettings); + + WifiEvents.onStationDisconnect(STADisconnect); + WifiEvents.onStationGotIP(STAGotIP); +/* WifiAccessPoint.setIP(IPAddress(10, 0, 0, 1)); //TODO + WifiAccessPoint.config("Sensus", "", AUTH_OPEN, false, 3);*/ + cWebInterface::GetInstance()->Start(); + + procTimer.initializeMs(100, updateSensorHub).start(); +} + +void STADisconnect(String ssid, uint8_t ssid_len, uint8_t bssid[6], + uint8_t reason) { + if (!WifiAccessPoint.isEnabled()) { + WifiStation.disconnect(); + WifiAccessPoint.enable(true); + WifiStation.connect(); + } +} + +void STAGotIP(IPAddress ip, IPAddress mask, IPAddress gateway) { + if (WifiAccessPoint.isEnabled()) { + WifiAccessPoint.enable(false); + } + // Add commands to be executed after successfully connecting to AP and got IP from it } diff --git a/software/Basic_Blink/app/double_buffer.h b/software/Basic_Blink/app/double_buffer.h index ffa1d06..5bb0e3b 100644 --- a/software/Basic_Blink/app/double_buffer.h +++ b/software/Basic_Blink/app/double_buffer.h @@ -9,6 +9,7 @@ #define APP_DOUBLE_BUFFER_H_ #include +#include namespace rijnfel { @@ -25,7 +26,11 @@ public: } void Resize(int i_newSize) { - + m_size = i_newSize; + delete m_buf[0]; + delete m_buf[1]; + m_buf[0] = new BufferType[m_size]; + m_buf[1] = new BufferType[m_size]; } bool AddValue(BufferType i_val) { @@ -39,14 +44,22 @@ public: return false; } + BufferType * GetReadyBuffer() { + return m_buf[(m_bufferIndex == 0) ? 1 : 0]; + } + BufferType * GetBuffer(int i_index) { return m_buf[i_index]; } + int GetSize() { + return m_size; + } + virtual ~cDoubleBuffer() { - delete m_buf[0]; - delete m_buf[1]; - delete m_buf; + delete[] m_buf[0]; + delete[] m_buf[1]; + delete[] m_buf; } private: int m_size; diff --git a/software/Basic_Blink/app/sensor_hub.cpp b/software/Basic_Blink/app/sensor_hub.cpp index 9adce3d..c70b926 100644 --- a/software/Basic_Blink/app/sensor_hub.cpp +++ b/software/Basic_Blink/app/sensor_hub.cpp @@ -27,6 +27,13 @@ void cSensorHub::Update() { } } +void cSensorHub::SetAdc(ads::cADS101x* i_adc) { + if (m_adc != NULL) { + delete m_adc; + } + m_adc = i_adc; +} + void cSensorHub::SetAdcSettings( cSensorSettings * i_adcSettings) { m_adcSettings = i_adcSettings; @@ -45,3 +52,4 @@ cSensorHub::~cSensorHub() { } } /* namespace rijnfel */ + diff --git a/software/Basic_Blink/app/sensor_hub.h b/software/Basic_Blink/app/sensor_hub.h index be91fc4..14db4c6 100644 --- a/software/Basic_Blink/app/sensor_hub.h +++ b/software/Basic_Blink/app/sensor_hub.h @@ -17,6 +17,7 @@ class cSensorHub { public: //in milliseconds cSensorHub(uint32_t i_updatePeriod); + void SetAdc(ads::cADS101x * i_adc); void SetAdcSettings(cSensorSettings * i_adcSettings); void SetTempSettings(cSensorSettings * i_tempSettings); void Update(); diff --git a/software/Basic_Blink/app/sensor_settings.h b/software/Basic_Blink/app/sensor_settings.h index 5abc6e0..9387d0b 100644 --- a/software/Basic_Blink/app/sensor_settings.h +++ b/software/Basic_Blink/app/sensor_settings.h @@ -11,16 +11,19 @@ #include "double_buffer.h" namespace rijnfel { - +//timebase, in miliseconds. +//Example, period = 10 (ms) timebase = 250(ms) +//Callback will be called after 250/10 = 25 samples template class cSensorSettings { public: cSensorSettings(void (*i_callback)(cDoubleBuffer & buffer), - uint32_t i_periodTimer, uint32_t i_period) : - m_callback(i_callback), m_periodTimer(i_periodTimer), m_period( - i_period) { - m_buffer(1000 / m_period); + uint32_t i_timeBase, uint32_t i_period) : + m_callback(i_callback), m_periodTimer(0), m_period(i_period), m_buffer( + 0) { + m_buffer.Resize((int) (i_timeBase / m_period)); } + bool ShouldSample(uint32_t i_updatePeriod) { m_periodTimer += i_updatePeriod; if (m_periodTimer >= m_period) { @@ -29,6 +32,7 @@ public: } return false; } + cDoubleBuffer m_buffer; void (*m_callback)(cDoubleBuffer & buffer); private: diff --git a/software/Basic_Blink/app/web_interface.cpp b/software/Basic_Blink/app/web_interface.cpp new file mode 100644 index 0000000..f1a94ea --- /dev/null +++ b/software/Basic_Blink/app/web_interface.cpp @@ -0,0 +1,114 @@ +/* + * web_interface.cpp + * + * Created on: Aug 6, 2017 + * Author: Elmar + */ + +#include "web_interface.h" +#include + +//TODO remove this +#include "ads101x.h" + +namespace rijnfel { + +cWebInterface *cWebInterface::s_instance = 0; + +static void onIndex(HttpRequest &request, HttpResponse &response) { + cWebInterface::GetInstance()->OnIndex(request, response); +} + +static void onRefresh(HttpRequest &request, HttpResponse &response) { + cWebInterface::GetInstance()->OnRefresh(request, response); +} + +cWebInterface::cWebInterface() : + m_serverStarted(false) { + for (int i = 0; i < 4; i++) { + m_adc_value[i] = 0; + } + // TODO Auto-generated constructor stub + +} + +void onFile(HttpRequest &request, HttpResponse &response) { + String file = request.getPath(); + if (file[0] == '/') + file = file.substring(1); + + if (file[0] == '.') + response.forbidden(); + else { + response.setCache(86400, true); // It's important to use cache for better performance. + response.sendFile(file); + } +} + +void cWebInterface::Start() { + if (m_serverStarted) + return; + server.addPath("/", onIndex); + server.addPath("/state", onRefresh); + server.setDefaultHandler(onFile); + server.listen(80); +} + +void cWebInterface::Stop() { + if (!m_serverStarted) + return; + m_serverStarted = false; +} + +void cWebInterface::OnIndex(HttpRequest &request, HttpResponse &response) { + response.setCache(86400, true); // It's important to use cache for better performance. + response.sendFile("index.html"); +} + +void cWebInterface::OnRefresh(HttpRequest &request, HttpResponse &response) { + JsonObjectStream* stream = new JsonObjectStream(); + JsonObject& json = stream->getRoot(); + + json["adc_0"] = m_adc_value[0]; + json["adc_1"] = m_adc_value[1]; + json["adc_2"] = m_adc_value[2]; + json["adc_3"] = m_adc_value[3]; + + response.sendJsonObject(stream); +} + +void cWebInterface::UpdateAdc(cADC & adc, + cDoubleBuffer& adcBuffer) { + ads::ads_sample_t * buf = &adcBuffer.GetReadyBuffer()[0]; + if (buf != NULL) { + ads::ads_sample_t averageSample; + averageSample.gain = buf->gain; + averageSample.mux = buf->mux; + int64_t average = 0; + + int size = adcBuffer.GetSize(); + for (int i = 0; i < size; i++) { + average += buf[i].rawSample; + } + + if (size != 0) { + average /= size; + } + + averageSample.rawSample = static_cast(average); + int pos = averageSample.mux - ads::eInputMux::AIN_0; + m_adc_value[pos] = adc.ConvertSample(averageSample); + Serial.printf("Current mux: %d pos: %d \n\r", averageSample.mux, pos); + Serial.printf("%d %d %d %d\n\r", m_adc_value[0], m_adc_value[1], + m_adc_value[2], m_adc_value[3]); + } +} + +void cWebInterface::UpdateTemp(cDoubleBuffer& adcBuffer) { +} + +cWebInterface::~cWebInterface() { + // TODO Auto-generated destructor stub +} + +} /* namespace rijnfel */ diff --git a/software/Basic_Blink/app/web_interface.h b/software/Basic_Blink/app/web_interface.h new file mode 100644 index 0000000..341b6a8 --- /dev/null +++ b/software/Basic_Blink/app/web_interface.h @@ -0,0 +1,51 @@ +/* + * web_interface.h + * + * Created on: Aug 6, 2017 + * Author: Elmar + */ + +#ifndef APP_WEB_INTERFACE_H_ +#define APP_WEB_INTERFACE_H_ + +#include "adc.h" +#include "ads101x.h" +#include "double_buffer.h" +#include + +namespace rijnfel { + +class cWebInterface { +public: + static cWebInterface *s_instance; + static cWebInterface *GetInstance() { + if (cWebInterface::s_instance == NULL) + cWebInterface::s_instance = new cWebInterface(); + return cWebInterface::s_instance; + } +public: + cWebInterface(); + cWebInterface(cWebInterface const&) { + m_serverStarted = false; + } + cWebInterface& operator=(cWebInterface const&) { + } + void Start(); + void Stop(); + void UpdateAdc(cADC & adc, + cDoubleBuffer & adcBuffer); + void UpdateTemp(cDoubleBuffer & adcBuffer); + virtual ~cWebInterface(); +public: + void OnIndex(HttpRequest &request, HttpResponse &response); + void OnRefresh(HttpRequest &request, HttpResponse &response); +private: + bool m_serverStarted; + int16_t m_adc_value[4]; + HttpServer server; + +}; + +} /* namespace rijnfel */ + +#endif /* APP_WEB_INTERFACE_H_ */ diff --git a/software/Basic_Blink/files/bootstrap.min.css.gz b/software/Basic_Blink/files/bootstrap.min.css.gz new file mode 100644 index 0000000000000000000000000000000000000000..80c9946433d9d8a65ad9ef89f7abbcbf22acca39 GIT binary patch literal 19765 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 literal 0 HcmV?d00001 diff --git a/software/Basic_Blink/files/config.html b/software/Basic_Blink/files/config.html new file mode 100644 index 0000000..6a93eb7 --- /dev/null +++ b/software/Basic_Blink/files/config.html @@ -0,0 +1,69 @@ + + + + + + + + TyTherm configuration + + + + + + + + + + +
+
+ +

TyTherm

+
+ +
+

 

+
+ +
+
+
+

Network

+
+
+
+
+ + +
+
+ + +
+
+ + +
+ + +
+
+
+
+ + + +
+
+ +
+ + \ No newline at end of file diff --git a/software/Basic_Blink/files/config.js b/software/Basic_Blink/files/config.js new file mode 100644 index 0000000..2ff2d1e --- /dev/null +++ b/software/Basic_Blink/files/config.js @@ -0,0 +1,38 @@ +function get_config() { + $.getJSON('/config.json', + function(data) { + $.each(data, function(key, value){ + document.getElementById(key).value = value; + if (data.StaEnable == 1) { + document.getElementById('StaEnable').checked = true; + } + else + document.getElementById('StaEnable').checked = false; + }); + }); +} + + +function post_netcfg(event) { + event.preventDefault(); + var formData = { + 'StaSSID' : document.getElementById('StaSSID').value, + 'StaPassword' : document.getElementById('StaPassword').value, + 'StaEnable' : (document.getElementById('StaEnable').checked ? 1 : 0) + }; + $.ajax({ + type : 'POST', + url : '/config', + contentType : 'application/json; charset=utf-8', + data : JSON.stringify(formData), + dataType : 'json' + }) +} + + +$( document ).ready(function() { + get_config(); + + document.getElementById('form_netcfg').addEventListener('submit', post_netcfg); + document.getElementById('netcfg_cancel').addEventListener('click', get_config); +}); \ No newline at end of file diff --git a/software/Basic_Blink/files/index.html b/software/Basic_Blink/files/index.html new file mode 100644 index 0000000..8b9a876 --- /dev/null +++ b/software/Basic_Blink/files/index.html @@ -0,0 +1,88 @@ + + + + + + + + TyTherm Status + + + + + + + + + + +
+
+ +

TyTherm

+
+ +
+

 

+
+
+
+
+

Channel 0

+
+
+

{adc_0}

+
+
+
+
+
+
+
+
+

Channel 1

+
+
+

{adc_1}

+
+
+
+
+
+
+
+
+
+
+

Channel 2

+
+
+

{adc_2}

+
+
+
+
+
+
+
+
+

Channel 3

+
+
+

{adc_3}

+
+
+
+
+
+ +
+ + \ No newline at end of file diff --git a/software/Basic_Blink/files/index.js b/software/Basic_Blink/files/index.js new file mode 100644 index 0000000..036f4ae --- /dev/null +++ b/software/Basic_Blink/files/index.js @@ -0,0 +1,13 @@ +$( document ).ready(function() { + + (function worker() { + $.getJSON('/state', function(data) { + document.getElementById('adc_0').textContent = data.adc_0; + document.getElementById('adc_1').textContent = data.adc_1; + document.getElementById('adc_2').textContent = data.adc_2; + document.getElementById('adc_3').textContent = data.adc_3; + + setTimeout(worker, 5000); + }); + })(); +}); \ No newline at end of file diff --git a/software/Basic_Blink/files/jquery-2.1.4.min.js.gz b/software/Basic_Blink/files/jquery-2.1.4.min.js.gz new file mode 100644 index 0000000000000000000000000000000000000000..bc77dafe10a74996013f936a0e8efaef0f799589 GIT binary patch literal 29589 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 Q?DQ}H1rifD%y~%x0KwiIB>(^b literal 0 HcmV?d00001