|
@@ -0,0 +1,270 @@
|
|
|
|
+import { Component, ViewChild, ChangeDetectorRef } from '@angular/core';
|
|
|
|
+
|
|
|
|
+import { NavController, NavParams, Platform, Content } from 'ionic-angular';
|
|
|
|
+
|
|
|
|
+import { Chart } from 'chart.js';
|
|
|
|
+
|
|
|
|
+import { SettingBasePage } from '../setting-base/setting-base';
|
|
|
|
+
|
|
|
|
+import { MeBaristaService } from '../../providers/me-barista-service';
|
|
|
|
+
|
|
|
|
+// import { Gauge } from 'svg-gauge';
|
|
|
|
+import Gauge from 'svg-gauge';
|
|
|
|
+
|
|
|
|
+@Component({
|
|
|
|
+ selector: 'page-home',
|
|
|
|
+ templateUrl: 'home.html'
|
|
|
|
+})
|
|
|
|
+export class Home extends SettingBasePage {
|
|
|
|
+
|
|
|
|
+ @ViewChild(Content) content: Content; // was allemaal class 'Content'
|
|
|
|
+ @ViewChild('lineCanvas') lineCanvas;
|
|
|
|
+ @ViewChild('powerGauge') powergauge_canvas;
|
|
|
|
+ @ViewChild('timerGauge') shottimer_canvas;
|
|
|
|
+ @ViewChild('spinner') spinner;
|
|
|
|
+
|
|
|
|
+ lineChart: any;
|
|
|
|
+ powergauge: any;
|
|
|
|
+ shottimer: any;
|
|
|
|
+
|
|
|
|
+ temperature: any;
|
|
|
|
+ target_temperature: any;
|
|
|
|
+
|
|
|
|
+ sub_l: any;
|
|
|
|
+ shottimer_show: any;
|
|
|
|
+ shottimer_hide_timeout: any;
|
|
|
|
+ green_gradient: any;
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+ constructor(public navCtrl: NavController, public navParams: NavParams, public platform: Platform, public cdr: ChangeDetectorRef, public abc: MeBaristaService) {
|
|
|
|
+ super(navCtrl, navParams, cdr, abc);
|
|
|
|
+ this.shottimer_show = false;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ ionViewDidLoad() {
|
|
|
|
+ Chart.defaults.global.legend.display = false;
|
|
|
|
+ Chart.defaults.global.tooltips.enabled = false;
|
|
|
|
+
|
|
|
|
+ var line_ctx = this.lineCanvas.nativeElement.getContext('2d')
|
|
|
|
+
|
|
|
|
+ let green_gradient = line_ctx.createLinearGradient(0, 0, 0, 150)
|
|
|
|
+ green_gradient.addColorStop(0, 'rgba(46, 204, 113, 0.2)')
|
|
|
|
+ green_gradient.addColorStop(0.4, 'rgba(46, 204, 113, 0.1)')
|
|
|
|
+ green_gradient.addColorStop(1, 'rgba(46, 204, 113, 0)')
|
|
|
|
+
|
|
|
|
+ let gray_gradient = line_ctx.createLinearGradient(0, 0, 0, 200)
|
|
|
|
+ gray_gradient.addColorStop(0, 'rgba(240,240,240, 1.0)')
|
|
|
|
+ gray_gradient.addColorStop(0.5, 'rgba(240,240,240, 0.25)')
|
|
|
|
+ gray_gradient.addColorStop(1, 'rgba(240,240,240, 0)')
|
|
|
|
+
|
|
|
|
+ this.lineChart = new Chart(this.lineCanvas.nativeElement, {
|
|
|
|
+ animation: true,
|
|
|
|
+ type: 'line',
|
|
|
|
+ options: {
|
|
|
|
+ maintainAspectRatio: false,
|
|
|
|
+ scales: {
|
|
|
|
+ xAxes: [{
|
|
|
|
+ autoSkip: true,
|
|
|
|
+ display: false,
|
|
|
|
+ type: 'time',
|
|
|
|
+ ticks: {
|
|
|
|
+ fontFamily: "Noto Sans"
|
|
|
|
+ }
|
|
|
|
+ }],
|
|
|
|
+ yAxes: [{
|
|
|
|
+ gridLines: {
|
|
|
|
+ drawBorder: false,
|
|
|
|
+ drawOnChartArea: false,
|
|
|
|
+ drawTicks: false
|
|
|
|
+ },
|
|
|
|
+ ticks: {
|
|
|
|
+ fontFamily: '-apple-system, sans-serif',
|
|
|
|
+ mirror: true,
|
|
|
|
+ autoSkip: true,
|
|
|
|
+ callback: function (value, index, values) {
|
|
|
|
+ return value + ' °C';
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }]
|
|
|
|
+ }
|
|
|
|
+ },
|
|
|
|
+ data: {
|
|
|
|
+ labels: this.abc.graph_data['label'],
|
|
|
|
+ datasets: [
|
|
|
|
+ {
|
|
|
|
+ label: "Sensor 1",
|
|
|
|
+ data: this.abc.graph_data['sensor1'],
|
|
|
|
+ fill: false,
|
|
|
|
+ borderColor: "rgba(144, 12, 63, 0.4)",
|
|
|
|
+ cubicInterpolationMode: "default",
|
|
|
|
+ borderWidth: 2,
|
|
|
|
+ pointRadius: 0,
|
|
|
|
+ lineTension: 1
|
|
|
|
+ },
|
|
|
|
+ {
|
|
|
|
+ label: "Setpoint",
|
|
|
|
+ data: this.abc.graph_data['setpoint'],
|
|
|
|
+ fill: 'origin',
|
|
|
|
+ borderColor: "rgba(46, 204, 113, 0.4)",
|
|
|
|
+ backgroundColor: green_gradient,
|
|
|
|
+ borderWidth: 1,
|
|
|
|
+ pointRadius: 0
|
|
|
|
+ }
|
|
|
|
+ ]
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ });
|
|
|
|
+
|
|
|
|
+ this.updateData();
|
|
|
|
+
|
|
|
|
+ if (this.powergauge == null) {
|
|
|
|
+ this.powergauge = Gauge(this.powergauge_canvas.nativeElement,
|
|
|
|
+ {
|
|
|
|
+ max: 100,
|
|
|
|
+ dialStartAngle: 180,
|
|
|
|
+ dialEndAngle: 0,
|
|
|
|
+ value: 0,
|
|
|
|
+ title: "Power",
|
|
|
|
+ label: function (value) {
|
|
|
|
+ return Math.round(value) + " %";
|
|
|
|
+ }
|
|
|
|
+ });
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+ if (this.shottimer == null) {
|
|
|
|
+ this.shottimer = Gauge(this.shottimer_canvas.nativeElement,
|
|
|
|
+ {
|
|
|
|
+ max: 100,
|
|
|
|
+ dialStartAngle: 180,
|
|
|
|
+ dialEndAngle: 0,
|
|
|
|
+ value: 50,
|
|
|
|
+ title: "Shot",
|
|
|
|
+ label: function (value) {
|
|
|
|
+ return Math.round(value) + " s";
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ });
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ this.powergauge.setValue(0);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ updateData() {
|
|
|
|
+
|
|
|
|
+ //var tmax = Math.max.apply(Math, this.abc.graph_data['sensor1']);
|
|
|
|
+ var tmin = 0 //Math.min.apply(Math, this.abc.graph_data['sensor1']);
|
|
|
|
+ var setpoint = Math.max.apply(Math, this.abc.graph_data['setpoint']);
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+ this.lineChart.options.scales.yAxes[0].ticks.max = Math.round((setpoint + 15) / 5) * 5;
|
|
|
|
+ this.lineChart.options.scales.yAxes[0].ticks.min = tmin; //Math.round((tmin - 15) / 5) * 5;
|
|
|
|
+
|
|
|
|
+ var diff = this.abc.graph_data['setpoint'].slice(-1) - this.abc.graph_data['sensor1'].slice(-1);
|
|
|
|
+ let color = { bg: null, border: null }
|
|
|
|
+
|
|
|
|
+ if(diff > 20) {
|
|
|
|
+ color.bg = "rgba(144, 12, 63, 0.3)"
|
|
|
|
+ color.border = "rgba(144, 12, 63, 0.75)"
|
|
|
|
+ } else if (diff > 5){
|
|
|
|
+ color.bg = "rgba(255, 195, 0, 0.3)"
|
|
|
|
+ color.border = "rgba(255, 195, 0, 0.75)"
|
|
|
|
+ } else {
|
|
|
|
+ color.bg = "rgba(22, 160, 133, 0.3)"
|
|
|
|
+ color.border = "rgba(22, 160, 133, 0.75)"
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ this.lineChart.data.datasets[0].borderColor = color.border
|
|
|
|
+ this.lineChart.options.scales.xAxes[0].time.min = this.abc.graph_data['label'].slice(-200)[0];
|
|
|
|
+ this.lineChart.options.scales.xAxes[0].time.max = this.abc.graph_data['label'].slice(-1)[0];
|
|
|
|
+
|
|
|
|
+ this.lineChart.update();
|
|
|
|
+
|
|
|
|
+ this.temperature = this.formatTemperature(this.abc.temperature);
|
|
|
|
+ this.target_temperature = this.formatTemperature(setpoint);
|
|
|
|
+ this.spinner_show = !this.abc.connected;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ formatTemperature(temp) {
|
|
|
|
+ return temp.toFixed(1) + ' °C';
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ ionViewWillEnter() {
|
|
|
|
+ var f: any;
|
|
|
|
+
|
|
|
|
+ //console.log('view-enter');
|
|
|
|
+
|
|
|
|
+ // super.ionViewWillEnter( );
|
|
|
|
+
|
|
|
|
+ this.sub_l = this.abc.temperature_s1.subscribe(data => {
|
|
|
|
+ //console.log('sub ' + this.abc.temperature);
|
|
|
|
+ this.powergauge.setValue(this.abc.pid.power);
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+ // show shot timer when shot has started
|
|
|
|
+ if (this.abc.shottimer_started)
|
|
|
|
+ this.shottimer_show = true;
|
|
|
|
+
|
|
|
|
+ // update timer with current time as long as it running
|
|
|
|
+ // TODO: this does not work for the DEMO
|
|
|
|
+
|
|
|
|
+ if (this.abc.shottimer_started) {
|
|
|
|
+
|
|
|
|
+ f = new Date();
|
|
|
|
+ this.shottimer.setValue((f - this.abc.shottimer_started) / 1000 * this.abc.speed);
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ // when the shot is done, show shot time from meCoffee
|
|
|
|
+ // and start timer to hide shot timer
|
|
|
|
+ if (this.abc.shottimer_duration) {
|
|
|
|
+
|
|
|
|
+ this.shottimer.setValue(this.abc.shottimer_duration / 1000);
|
|
|
|
+
|
|
|
|
+ // We have consumed, clear it ( not nice )
|
|
|
|
+ this.abc.shottimer_duration = 0;
|
|
|
|
+
|
|
|
|
+ if (this.shottimer_hide_timeout)
|
|
|
|
+ clearTimeout(this.shottimer_hide_timeout);
|
|
|
|
+
|
|
|
|
+ this.shottimer_hide_timeout = setTimeout(() => { this.shottimer_show = false; this.shottimer_hide_timeout = null; }, 30 * 1000 / this.abc.speed);
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ this.cdr.detectChanges();
|
|
|
|
+
|
|
|
|
+ this.updateData();
|
|
|
|
+ });
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ ionViewWillLeave() {
|
|
|
|
+
|
|
|
|
+ // super.ionViewWillLeave( );
|
|
|
|
+
|
|
|
|
+ // this.abc.temperature_s1.unsubscribe();
|
|
|
|
+ this.sub_l.unsubscribe();
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ changeOrientation(event: any) {
|
|
|
|
+ //console.log( "changeOrientation " + event );
|
|
|
|
+
|
|
|
|
+ // this.content.resize();
|
|
|
|
+ this.ionViewDidLoad(); // fix iOS orientation issues with ChartJS canvas
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+ // import { Storage, SqlStorage } from 'ionic-framework/ionic';
|
|
|
|
+
|
|
|
|
+ // this.storage = new Storage(SqlStorage);
|
|
|
|
+
|
|
|
|
+ // this.storage.get('questionnaires').then((data) => {
|
|
|
|
+ // if (data != null) this.questionnaires = JSON.parse(data);
|
|
|
|
+ // else this.loadDefaultQuestions();
|
|
|
|
+ // And to store Objects, use JSON.stringify(myObject) to store and JSON.parse(...) to turn back
|
|
|
|
+
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+
|