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