16 changed files with 463 additions and 49 deletions
@ -0,0 +1,114 @@ |
|||
/*
|
|||
* web_interface.cpp |
|||
* |
|||
* Created on: Aug 6, 2017 |
|||
* Author: Elmar |
|||
*/ |
|||
|
|||
#include "web_interface.h" |
|||
#include <SmingCore/SmingCore.h> |
|||
|
|||
//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<ads::ads_sample_t, int32_t> & adc, |
|||
cDoubleBuffer<ads::ads_sample_t>& 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<int16_t>(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<uint32_t>& adcBuffer) { |
|||
} |
|||
|
|||
cWebInterface::~cWebInterface() { |
|||
// TODO Auto-generated destructor stub
|
|||
} |
|||
|
|||
} /* namespace rijnfel */ |
@ -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 <SmingCore/SmingCore.h> |
|||
|
|||
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<ads::ads_sample_t, int32_t> & adc, |
|||
cDoubleBuffer<ads::ads_sample_t> & adcBuffer); |
|||
void UpdateTemp(cDoubleBuffer<uint32_t> & 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_ */ |
Binary file not shown.
@ -0,0 +1,69 @@ |
|||
<!DOCTYPE html> |
|||
<html lang="en"> |
|||
<head> |
|||
<meta charset="utf-8"> |
|||
<meta http-equiv="X-UA-Compatible" content="IE=edge"> |
|||
<meta name="viewport" content="width=device-width, initial-scale=1"> |
|||
|
|||
<title>TyTherm configuration</title> |
|||
|
|||
<!-- Bootstrap core --> |
|||
<link href="bootstrap.min.css" rel="stylesheet"> |
|||
<script src="jquery-2.1.4.min.js"></script> |
|||
<style> |
|||
.main { font-size: 63px; } |
|||
</style> |
|||
|
|||
</head> |
|||
<script src="config.js"></script> |
|||
<body> |
|||
|
|||
<div class="container"> |
|||
<div class="header"> |
|||
<nav> |
|||
<ul class="nav nav-pills pull-right"> |
|||
<li role="presentation"><a href="/">Status</a></li> |
|||
<li role="presentation" class="active"><a href="/config">Configuration</a></li> |
|||
</ul> |
|||
</nav> |
|||
<h3 class="text-muted">TyTherm</h3> |
|||
</div> |
|||
|
|||
<div class="row"> |
|||
<h2> </h2> |
|||
<div class="col-xs-offset-2 col-xs-8"> |
|||
<!-- Network config --> |
|||
<div> |
|||
<div class="panel panel-default"> |
|||
<div class="panel-heading"> |
|||
<h3 class="panel-title">Network</h3> |
|||
</div> |
|||
<div class="panel-body"> |
|||
<form id="form_netcfg" method="POST"> |
|||
<div class="form-group"> |
|||
<label for="StaSSID">Name</label> |
|||
<input type="text" id="StaSSID" name="StaSSID" class="form-control" placeholder="Enter SSID" value="{StaSSID}"> |
|||
</div> |
|||
<div class="form-group"> |
|||
<label for="Password">Password</label> |
|||
<input type="password" id="StaPassword" name="StaPassword" class="form-control" placeholder="Password"> |
|||
</div> |
|||
<div class="form-group"> |
|||
<label for="StaEnable">Enable WIFI Client</label> |
|||
<input type="checkbox" id="StaEnable" name="StaEnable" class="form-control"> |
|||
</div> |
|||
<button type="submit" class="btn btn-success">Save network</button> |
|||
<button type="button" id="netcfg_cancel" class="btn btn-link">Cancel</button> |
|||
</form> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
|
|||
<!-- TyTherm adjustment config --> |
|||
|
|||
</div> <!-- /col --> |
|||
</div> <!-- /row --> |
|||
|
|||
</div> <!-- /container --> |
|||
</body> |
|||
</html> |
@ -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); |
|||
}); |
@ -0,0 +1,88 @@ |
|||
<!DOCTYPE html> |
|||
<html lang="en"> |
|||
<head> |
|||
<meta charset="utf-8"> |
|||
<meta http-equiv="X-UA-Compatible" content="IE=edge"> |
|||
<meta name="viewport" content="width=device-width, initial-scale=1"> |
|||
|
|||
<title>TyTherm Status</title> |
|||
|
|||
<!-- Bootstrap core --> |
|||
<link href="bootstrap.min.css" rel="stylesheet"> |
|||
<script src="jquery-2.1.4.min.js"></script> |
|||
<style> |
|||
.main { font-size: 63px; } |
|||
</style> |
|||
|
|||
</head> |
|||
<script src="index.js"></script> |
|||
<body> |
|||
|
|||
<div class="container"> |
|||
<div class="header"> |
|||
<nav> |
|||
<ul class="nav nav-pills pull-right"> |
|||
<li role="presentation" class="active"><a href="/">Status</a></li> |
|||
<li role="presentation"><a href="/config">Configuration</a></li> |
|||
</ul> |
|||
</nav> |
|||
<h3 class="text-muted">TyTherm</h3> |
|||
</div> |
|||
|
|||
<div class="row"> |
|||
<h2> </h2> |
|||
<div class="col-xs-offset-2"> |
|||
<div class="col-xs-10 col-md-5"> |
|||
<div class="panel panel-default"> |
|||
<div class="panel-heading"> |
|||
<h3 class="panel-title">Channel 0</h3> |
|||
</div> |
|||
<div class="panel-body"> |
|||
<h1 id="adc_0" class="text-center main">{adc_0}</h1> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
</div> <!-- /col --> |
|||
<div class="col-xs-offset-2"> |
|||
<div class="col-xs-10 col-md-5"> |
|||
<div class="panel panel-default"> |
|||
<div class="panel-heading"> |
|||
<h3 class="panel-title">Channel 1</h3> |
|||
</div> |
|||
<div class="panel-body"> |
|||
<h1 id="adc_1" class="text-center main">{adc_1}</h1> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
</div> <!-- /col --> |
|||
</div> <!-- /row --> |
|||
<div class="row"> |
|||
<div class="col-xs-offset-2"> |
|||
<div class="col-xs-10 col-md-5"> |
|||
<div class="panel panel-default"> |
|||
<div class="panel-heading"> |
|||
<h3 class="panel-title">Channel 2</h3> |
|||
</div> |
|||
<div class="panel-body"> |
|||
<h1 id="adc_2" class="text-center main">{adc_2}</h1> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
</div> <!-- /col --> |
|||
<div class="col-xs-offset-2"> |
|||
<div class="col-xs-10 col-md-5"> |
|||
<div class="panel panel-default"> |
|||
<div class="panel-heading"> |
|||
<h3 class="panel-title">Channel 3</h3> |
|||
</div> |
|||
<div class="panel-body"> |
|||
<h1 id="adc_3" class="text-center main">{adc_3}</h1> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
</div> <!-- /col --> |
|||
</div> <!-- /row --> |
|||
|
|||
</div> <!-- /container --> |
|||
</body> |
|||
</html> |
@ -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); |
|||
}); |
|||
})(); |
|||
}); |
Binary file not shown.
Loading…
Reference in new issue