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