www/js/mon_fermenter.js

Thu, 19 Mar 2020 13:42:59 +0100

author
Michiel Broek <mbroek@mbse.eu>
date
Thu, 19 Mar 2020 13:42:59 +0100
changeset 645
3b1510050c9b
parent 548
c67cd0d9249b
child 679
48f8f3fce7c0
permissions
-rw-r--r--

Changed the last dropdown lists events to select

/*****************************************************************************
 * Copyright (C) 2019-2020
 *
 * Michiel Broek <mbroek at mbse dot eu>
 *
 * This file is part of BMS
 *
 * This is free software; you can redistribute it and/or modify it
 * under the terms of the GNU General Public License as published by the
 * Free Software Foundation; either version 2, or (at your option) any
 * later version.
 *
 * Brewery Management System istributed in the hope that it will be useful, but
 * WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with ThermFerm; see the file COPYING.  If not, write to the Free
 * Software Foundation, 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
 *****************************************************************************/

function createAbortElements() {
 $('#eventWindow').jqxWindow({
  theme: theme,
  position: { x: 440, y: 210 },
  width: 400,
  height: 200,
  resizable: false,
  isModal: true,
  modalOpacity: 0.4,
  okButton: $('#delOk'),
  cancelButton: $('#delCancel'),
  initContent: function() {
   $('#delOk').jqxButton({ template: 'danger', width: '65px', theme: theme });
   $('#delCancel').jqxButton({ template: 'success', width: '65px', theme: theme });
   $('#delCancel').focus();
  }
 });
 $('#eventWindow').jqxWindow('hide');
}


$(document).ready(function() {

 var record = {},
 blank = {},
 ppayload = '',
 newBase = false,
 newProduct = false,
 newSwitch = false,
 newProfile = false,
 schedule = 0,
 yl = 12, // Normal yeast temp range
 yh = 24,

 productSource = {
  datatype: 'json',
  cache: false,
  datafields: [
   { name: 'code', type: 'string' },
   { name: 'name', type: 'string' },
   { name: 'uuid', type: 'string' },
   { name: 'stage', type: 'int' },
   { name: 'yeast_lo', type: 'float' },
   { name: 'yeast_hi', type: 'float' }
  ],
  id: 'code',
  url: 'includes/db_product.php?select=ferment'
 },
 productlist = new $.jqx.dataAdapter(productSource, {
  beforeLoadComplete: function(records) {
   var row, i, data = new Array();
   // Create a dummy beer on top to store in idle fermenters.
   blank['code'] = 'Free';  // Will override this later.
   blank['name'] = 'Dummy';
   blank['uuid'] = '66ecccbf-e942-4a35-af49-8b02314561a5';
   blank['stage'] = 10;
   blank['yeast_lo'] = 12.0;
   blank['yeast_hi'] = 24.0;
   data.push(blank);
   for (i = 0; i < records.length; i++) {
    row = records[i];
    data.push(row);
   }
   return data;
  },
  loadError: function(jqXHR, status, error) {
   $('#err').text(status + ' ' + error);
  },
 }),
 profileSource = {
  datatype: 'json',
  cache: false,
  datafields: [
   { name: 'record', type: 'int' },
   { name: 'uuid', type: 'string' },
   { name: 'name', type: 'string' },
   { name: 'inittemp_lo', type: 'float' },
   { name: 'inittemp_hi', type: 'float' },
   { name: 'fridgemode', type: 'int' },
   { name: 'totalsteps', type: 'int' },
   { name: 'duration', type: 'int' },
   { name: 'steps', type: 'array' }
  ],
  id: 'record',
  url: 'includes/db_profile_fermentation.php'
 },
 profilelist = new $.jqx.dataAdapter(profileSource, {
  beforeLoadComplete: function(records) {
   var data = new Array(),
   empty = {}, i, row;
   // Create a dummy profile on top of the list.
   empty['record'] = -1;
   empty['uuid'] = '';
   empty['name'] = 'Wis profiel';
   empty['inittemp_lo'] = 20;
   empty['inittemp_hi'] = 20;
   empty['fridgemode'] = 0;
   empty['totalsteps'] = 0;
   empty['duration'] = 0;
   empty['steps'] = '[]';
   data.push(empty);
   for (i = 0; i < records.length; i++) {
    row = records[i];
    data.push(row);
   }
   return data;
  },
  loadError: function(jqXHR, status, error) {
   $('#err').text(status + ' ' + error);
  },
 }),
 gaugeoptions = {
  min: 0, max: 45, width: 375, height: 375,
  ranges: [{ startValue: 0, endValue: yl, style: { fill: '#3399FF', stroke: '#3399FF' }, endWidth: 10, startWidth: 10 },
           { startValue: yl, endValue: yh, style: { fill: '#00CC33', stroke: '#00CC33' }, endWidth: 10, startWidth: 10 },
           { startValue: yh, endValue: 45, style: { fill: '#FC6A6A', stroke: '#FC6A6A' }, endWidth: 10, startWidth: 10 }],
  ticksMinor: { interval: 1, size: '5%' },
  ticksMajor: { interval: 5, size: '9%' },
  labels: { interval: 5 },
  style: { fill: '#eeeeee', stroke: '#666666' },
  value: 0,
  colorScheme: 'scheme05'
 },
 gaugeSmalloptions = {
  min: -15, max: 25, width: 190, height: 190,
  ranges: [{ startValue: -15, endValue: 0, startWidth: 5, endWidth: 5, style: { fill: '#3399FF', stroke: '#3399FF' }},
           { startValue: 0, endValue: 10, startWidth: 5, endWidth: 5, style: { fill: '#00CC33', stroke: '#00CC33' }},
           { startValue: 10, endValue: 25, startWidth: 5, endWidth: 5, style: { fill: '#FC6A6A', stroke: '#FC6A6A' }}],
  ticksMinor: { interval: 1, size: '5%' },
  ticksMajor: { interval: 5, size: '9%' },
  labels: { interval: 5 },
  style: { fill: '#eeeeee', stroke: '#666666' },
  value: 0,
  colorScheme: 'scheme05',
  caption: { value: 'Koeler', position: 'bottom', offset: [0, 10] }
 },
 switchoptions = {
  height: 68,
  width: 35,
  onLabel: 'AAN',
  offLabel: 'UIT',
  theme: theme,
  thumbSize: '50%',
  orientation: 'vertical'
 },
 targetoptions = { inputMode: 'simple', theme: theme, width: 70, min: 0, max: 45, decimalDigits: 1, spinButtons: true },
 url = 'getfermenter.php?uuid="' + my_uuid + '"',
 source = {
  datatype: 'json',
  datafields: [
   { name: 'record', type: 'int' },
   { name: 'uuid', type: 'string' },
   { name: 'alias', type: 'string' },
   { name: 'node', type: 'string' },
   { name: 'online', type: 'int' },
   { name: 'beercode', type: 'string' },
   { name: 'beername', type: 'string' },
   { name: 'air_state', type: 'string' },
   { name: 'air_temperature', type: 'float' },
   { name: 'beer_state', type: 'string' },
   { name: 'beer_temperature', type: 'float' },
   { name: 'chiller_state', type: 'string' },
   { name: 'chiller_temperature', type: 'float' },
   { name: 'heater_state', type: 'int' },
   { name: 'heater_usage', type: 'int' },
   { name: 'cooler_state', type: 'int' },
   { name: 'cooler_usage', type: 'int' },
   { name: 'fan_state', type: 'int' },
   { name: 'fan_usage', type: 'int' },
   { name: 'light_address', type: 'string' },
   { name: 'light_state', type: 'int' },
   { name: 'light_usage', type: 'int' },
   { name: 'door_address', type: 'string' },
   { name: 'door_state', type: 'int' },
   { name: 'psu_address', type: 'string' },
   { name: 'psu_state', type: 'int' },
   { name: 'mode', type: 'string' },
   { name: 'alarm', type: 'int' },
   { name: 'setpoint_high', type: 'float' },
   { name: 'setpoint_low', type: 'float' },
   { name: 'profile_uuid', type: 'string' },
   { name: 'profile_name', type: 'string' },
   { name: 'profile_state', type: 'string' },
   { name: 'profile_percent', type: 'int' },
   { name: 'profile_inittemp_high', type: 'float' },
   { name: 'profile_inittemp_low', type: 'float' },
   { name: 'profile_steps', type: 'string' },
   { name: 'stage', type: 'string' },
   { name: 'beeruuid', type: 'string' },
   { name: 'yeast_lo', type: 'float' },
   { name: 'yeast_hi', type: 'float' },
   { name: 'webcam_url', type: 'string' },
   { name: 'webcam_light', type: 'int' }
  ],
  id: 'record',
  url: url
 },
 dataAdapter = new $.jqx.dataAdapter(source, {
  loadComplete: function(records) {
   record = dataAdapter.records[0];
   var range, oline = (record.online) ? 'On-line' : 'Off-line';
   $('#info_uuid').html(record.uuid);
   $('#info_system').html(record.node + '/' + record.alias);
   $('#info_online').html(oline);
   $('#info_beer').html(record.beercode + ' - ' + record.beername);
   $('#info_mode').jqxDropDownList('selectItem', record.mode);
   $('#info_stage').jqxDropDownList('selectItem', record.stage);
   $('#info_profile').html(record.profile_name);
   blank['name'] = record.alias;
   blank['code'] = record.alias.toUpperCase();
   blank['uuid'] = record.uuid;
   if (record.profile_name == '')
    $('#info_mode').jqxDropDownList('disableItem', 'PROFILE');
   else
    $('#info_mode').jqxDropDownList('enableItem', 'PROFILE');
   $('#target_lo').val(record.setpoint_low);
   $('#target_hi').val(record.setpoint_high);
   if (record.online && ((record.mode == 'FRIDGE') || (record.mode == 'BEER'))) {
    $('#target_lo').jqxNumberInput({ readOnly: false, Width: 70, spinButtons: true });
    $('#target_hi').jqxNumberInput({ readOnly: false, Width: 70, spinButtons: true });
   } else {
    $('#target_lo').jqxNumberInput({ readOnly: true, Width: 50, spinButtons: false });
    $('#target_hi').jqxNumberInput({ readOnly: true, Width: 50, spinButtons: false });
   }

   if (record.online && record.door_address && (record.door_state != '0')) {
    $('#fermenter_doorled').html('<div class="LEDyellow_on"></div>Door');
   } else {
    $('#fermenter_doorled').html('<div class="LEDyellow_off"></div>Door');
   }
   if (record.online && record.light_address && (record.light_state != '0')) {
    $('#fermenter_lightled').html('<div class="LEDyellow_on"></div>Light');
   } else {
    $('#fermenter_lightled').html('<div class="LEDyellow_off"></div>Light');
   }

   if (record.online && (record.mode != 'OFF')) {
    $('#fermenter_powerled').html('<div class="LEDblue_on"></div>Power');
    $('#select_beer').jqxDropDownList({ disabled: true });
    $('#select_beer').jqxDropDownList('clearSelection');
    $('#select_beer').hide();
   } else {
    $('#fermenter_powerled').html('<div class="LEDblue_off"></div>Power');
    $('#select_beer').show();
    $('#select_beer').jqxDropDownList({ disabled: false });
   }
   if (record.online && (record.alarm != '0')) {
    $('#fermenter_alarmled').html('<div class="LEDred_on"></div>Alarm');
   } else {
    $('#fermenter_alarmled').html('<div class="LEDred_off"></div>Alarm');
   }

   if (record.online && (record.heater_state != '0')) {
    $('#fermenter_led1').html('<div class="LEDgreen_on"></div>Heat');
   } else {
    $('#fermenter_led1').html('<div class="LEDgreen_off"></div>Heat');
   }
   if (record.online && (record.cooler_state != '0')) {
    $('#fermenter_led2').html('<div class="LEDgreen_on"></div>Cool');
   } else {
    $('#fermenter_led2').html('<div class="LEDgreen_off"></div>Cool');
   }
   if (record.online && (record.fan_state != '0')) {
    $('#fermenter_led3').html('<div class="LEDgreen_on"></div>Fan');
   } else {
    $('#fermenter_led3').html('<div class="LEDgreen_off"></div>Fan');
   }
   if (record.online && (record.mode == 'NONE')) {
    $('#fermenter_toggle1').jqxSwitchButton('enable');
    $('#fermenter_toggle2').jqxSwitchButton('enable');
    $('#fermenter_toggle3').jqxSwitchButton('enable');
   } else {
    $('#fermenter_toggle1').jqxSwitchButton('disable');
    $('#fermenter_toggle2').jqxSwitchButton('disable');
    $('#fermenter_toggle3').jqxSwitchButton('disable');
    $('#fermenter_toggle1').val(record.heater_state != '0');
    $('#fermenter_toggle2').val(record.cooler_state != '0');
    $('#fermenter_toggle3').val(record.fan_state != '0');
   }

   if (record.online && (record.mode == 'PROFILE')) {
    if (record.profile_state == 'OFF') {
     $('#select_profile').show();
     $('#select_profile').jqxDropDownList({ disabled: false });
     $('#info_mode').jqxDropDownList({ disabled: false });
     $('#Profile1').jqxButton({ template: 'success', value: 'Starten' });
     $('#Profile1').show();
     $('#Profile2').hide();
     $('#status_profile').html('');
    } else if (record.profile_state == 'RUN') {
     $('#select_profile').jqxDropDownList({ disabled: true });
     $('#select_profile').hide();
     $('#info_mode').jqxDropDownList({ disabled: true });
     $('#Profile1').jqxButton({ template: 'danger', value: 'Afbreken' });
     $('#Profile2').jqxButton({ template: 'primary', value: 'Pauze' });
     $('#Profile1').show();
     $('#Profile2').show();
     $('#status_profile').html('Profiel actief, ' + record.profile_percent + '% gereed');
    } else if (record.profile_state == 'PAUSE') {
     $('#select_profile').jqxDropDownList({ disabled: true });
     $('#select_profile').hide();
     $('#info_mode').jqxDropDownList({ disabled: true });
     $('#Profile1').jqxButton({ template: 'danger', value: 'Afbreken' });
     $('#Profile2').jqxButton({ template: 'success', value: 'Doorgaan' });
     $('#Profile1').show();
     $('#Profile2').show();
     $('#status_profile').html('Profiel pauze, ' + record.profile_percent + '% gereed');
    } else if (record.profile_state == 'DONE') {
     $('#select_profile').jqxDropDownList({ disabled: true });
     $('#select_profile').hide();
     $('#info_mode').jqxDropDownList({ disabled: true });
     $('#Profile1').jqxButton({ template: 'primary', value: 'Profiel Ok' });
     $('#Profile1').show();
     $('#Profile2').hide();
     $('#status_profile').html('Profiel is gereed');
    }
   } else {
    $('#select_profile').show();
    $('#select_profile').jqxDropDownList({ disabled: false });
    $('#info_mode').jqxDropDownList({ disabled: false });
    $('#Profile1').hide();
    $('#Profile2').hide();
    $('#status_profile').html('');
   }
   if (record.online && (record.webcam_url != '')) {
    $('#Camera').show();
   } else {
    $('#Camera').hide();
   }

   yl = record.yeast_lo;
   yh = record.yeast_hi;
   range = { ranges: [{ startValue: 0, endValue: yl, style: { fill: '#3399FF', stroke: '#3399FF' }, endWidth: 10, startWidth: 10 },
                      { startValue: yl, endValue: yh, style: { fill: '#00CC33', stroke: '#00CC33' }, endWidth: 10, startWidth: 10 },
                      { startValue: yh, endValue: 45, style: { fill: '#FC6A6A', stroke: '#FC6A6A' }, endWidth: 10, startWidth: 10 }]};
   $('#gaugeContainer_air').jqxGauge(range);
   $('#gaugeContainer_beer').jqxGauge(range);

   $('#gaugeContainer_air').jqxGauge({ caption: { value: 'Lucht: ' + record.air_temperature.toFixed(3) }});
   $('#gaugeContainer_air').jqxGauge({ value: record.air_temperature });
   if (record.air_state == 'OK') {
    $('#gaugeContainer_air').jqxGauge({ disabled: false });
   } else {
    $('#gaugeContainer_air').jqxGauge({ disabled: true });
   }
   $('#gaugeContainer_beer').jqxGauge({ caption: { value: 'Bier: ' + record.beer_temperature.toFixed(3) }});
   $('#gaugeContainer_beer').jqxGauge({ value: record.beer_temperature });
   if (record.beer_state == 'OK') {
    $('#gaugeContainer_beer').jqxGauge({ disabled: false });
   } else {
    $('#gaugeContainer_beer').jqxGauge({ disabled: true });
   }
   $('#gaugeContainer_chiller').jqxGauge({ value: record.chiller_temperature });
   if (record.chiller_state == 'OK') {
    $('#gaugeContainer_chiller').jqxGauge({ disabled: false });
   } else {
    $('#gaugeContainer_chiller').jqxGauge({ disabled: true });
   }
  }
 });

 $('#select_beer').jqxDropDownList({
  placeHolder: 'Kies bier:',
  theme: theme,
  source: productlist,
  displayMember: 'code',
  width: 150,
  height: 24,
  dropDownWidth: 500,
  autoDropDownHeight: true,
  renderer: function(index, label, value) {
   var datarecord = productlist.records[index];
   return datarecord.code + ' - ' + datarecord.name;
  }
 });
 $('#select_profile').jqxDropDownList({
  placeHolder: 'Kies profiel:',
  theme: theme,
  source: profilelist,
  displayMember: 'name',
  width: 150,
  height: 24,
  dropDownWidth: 500,
  autoDropDownHeight: true,
 });

 $('#gaugeContainer_air').jqxGauge(gaugeoptions);
 $('#gaugeContainer_air').jqxGauge({ caption: { value: 'Lucht: 00.000' }});
 $('#gaugeContainer_beer').jqxGauge(gaugeoptions);
 $('#gaugeContainer_beer').jqxGauge({ caption: { value: 'Bier: 00.000' }});
 $('#gaugeContainer_chiller').jqxGauge(gaugeSmalloptions);

 $('#fermenter_toggle1').jqxSwitchButton(switchoptions);
 $('#fermenter_toggle2').jqxSwitchButton(switchoptions);
 $('#fermenter_toggle3').jqxSwitchButton(switchoptions);

 srcMode = ['OFF', 'NONE', 'FRIDGE', 'BEER', 'PROFILE'];
 srcStage = ['PRIMARY', 'SECONDARY', 'TERTIARY', 'CARBONATION'];
 $('#info_mode').jqxDropDownList({ theme: theme, source: srcMode, width: 100, height: 24, dropDownHeight: 156 });
 $('#info_stage').jqxDropDownList({ theme: theme, source: srcStage, width: 150, height: 24, dropDownHeight: 125 });

 $('#target_lo').jqxNumberInput(targetoptions);
 $('#target_hi').jqxNumberInput(targetoptions);

 $('#Profile1').jqxButton({ template: 'info', width: '150px', height: 24, theme: theme });
 $('#Profile2').jqxButton({ template: 'info', width: '150px', height: 24, theme: theme });
 $('#Profile1').hide(); // Hide these until they are needed.
 $('#Profile2').hide();

 function sendBase(stage, mode, tlo, thi) {

  console.log('sendBase(' + stage + ', ' + mode + ', ' + tlo + ', ' + thi + ')');
  var data = 'node=' + record.node + '&alias=' + record.alias + '&payload={"stage":"' + stage;
  data += '","mode":"' + mode + '","setpoint":{"low":' + tlo + ',"high":' + thi + '}}';
  $.ajax({
   url: 'cmd_fermenter.php',
   data: data,
   type: 'POST',
   success: function(data) {},
   error: function(jqXHR, textStatus, errorThrown) { console.log('sendBase() error'); }
  });
 }

 function sendSwitch(sw1, sw2, sw3, sw4) {

  console.log('sendSwitch(' + sw1 + ', ' + sw2 + ', ' + sw3 + ', ' + sw4 + ')');
  var data = 'node=' + record.node + '&alias=' + record.alias + '&payload=';
  data += '{"heater":{"state":' + sw1 + '},"cooler":{"state":' + sw2 + '},"fan":{"state":' + sw3 + '},"light":{"state":' + sw4 + '}}';
  $.ajax({
   url: 'cmd_fermenter.php',
   data: data,
   type: 'POST',
   success: function(data) {},
   error: function(jqXHR, textStatus, errorThrown) { console.log('sendSwitch() error'); }
  });
 }

 function sendProduct(code, name, uuid, yeast_lo, yeast_hi) {

  console.log('sendProduct(' + code + ', ' + name + ', ' + uuid + ', ' + yeast_lo + ', ' + yeast_hi + ')');
  var data = 'node=' + record.node + '&alias=' + record.alias + '&payload=';
  data += '{"product":{"code":"' + code + '","name":"' + name + '","uuid":"' + uuid + '","yeast_lo":' + yeast_lo + ',"yeast_hi":' + yeast_hi + '}}';
  $.ajax({
   url: 'cmd_fermenter.php',
   data: data,
   type: 'POST',
   success: function(data) {},
   error: function(jqXHR, textStatus, errorThrown) { console.log('sendProduct() error'); }
  });
 }

 function sendProfile(payload) {

  console.log('sendProfile(' + payload + ')');
  var data = 'node=' + record.node + '&alias=' + record.alias + '&payload=' + payload;
  $.ajax({
   url: 'cmd_fermenter.php',
   data: data,
   type: 'POST',
   success: function(data) {},
   error: function(jqXHR, textStatus, errorThrown) { console.log('sendProfile() error'); }
  });
 }


 // Get the data immediatly and then at regular intervals to refresh.
 dataAdapter.dataBind();
 setInterval(function() {
  var skip = false;
  if (newBase) {
   sendBase(record.stage, record.mode, record.setpoint_low, record.setpoint_high);
   newBase = false;
   skip = true;
  }
  if (newSwitch) {
   sendSwitch(record.heater_state, record.cooler_state, record.fan_state, record.light_state);
   newSwitch = false;
   skip = true;
  }
  if (newProduct) {
   sendProduct(record.beercode, record.beername, record.beeruuid, record.yeast_lo, record.yeast_hi);
   newProduct = false;
   skip = true;
  }
  if (newProfile) {
   sendProfile(ppayload);
   newProfile = false;
   skip = true;
  }
  if (skip) {
   schedule = 4; // 2 seconds wait to get the results
  } else {
   if (schedule > 0)
    schedule--;
  }

  if (schedule <= 0) {
   dataAdapter.dataBind();
   schedule = 20;
  }
 }, 500);

 $('#info_mode').on('select', function(event) {
  var args = event.args;
  if (args) {
   record.mode = args.item.value;
   $('#fermenter_toggle1').val(0);
   $('#fermenter_toggle2').val(0);
   $('#fermenter_toggle3').val(0);
  }
  newBase = true;
 });
 $('#info_stage').on('select', function(event) {
  var args = event.args;
  if (args)
   record.stage = args.item.value;
  newBase = true;
 });
 $('#select_beer').on('select', function(event) {
  if (event.args) {
   var index = event.args.index,
   datarecord = productlist.records[index];
   record.beercode = datarecord.code;
   record.beername = datarecord.name;
   record.beeruuid = datarecord.uuid;
   record.yeast_lo = datarecord.yeast_lo;
   record.yeast_hi = datarecord.yeast_hi;
   newProduct = true;
  }
 });
 $('#select_profile').on('select', function(event) {
  if (event.args) {
   var index = event.args.index,
   datarecord = profilelist.records[index],
   row, i;
   if (datarecord.record == -1) {
    ppayload = '{"profile":null}';
   } else {
    ppayload = '{"profile":{"uuid":"' + datarecord.uuid + '","name":"' + datarecord.name + '",';
    ppayload += '"inittemp":{"low":' + datarecord.inittemp_lo + ',"high":' + datarecord.inittemp_hi + '},';
    ppayload += '"fridgemode":' + datarecord.fridgemode + ',"steps":[';
    for (i = 0; i < datarecord.steps.length; i++) {
     row = datarecord.steps[i];
     if (i > 0)
      ppayload += ',';
     ppayload += '{"steptime":' + row['steptime'] + ',"resttime":' + row['resttime'];
     ppayload += ',"target_lo":' + row['target_lo'] + ',"target_hi":' + row['target_hi'];
     ppayload += ',"fridgemode":' + row['fridgemode'] + ',"name":"' + row['name'] + '"}';
    }
    ppayload += ']}}';
   }
   newProfile = true;
  }
 });

 $('#target_lo').on('change', function(event) {
  record.setpoint_low = parseFloat(event.args.value);
  // Keep the high target above the low.
  if (record.setpoint_low > record.setpoint_high) {
   record.setpoint_high = record.setpoint_low;
   $('#target_hi').val(record.setpoint_high);
  }
  newBase = true;
 });
 $('#target_hi').on('change', function(event) {
  record.setpoint_high = parseFloat(event.args.value);
  // Keep the low target below the high.
  if (record.setpoint_high < record.setpoint_low) {
   record.setpoint_low = record.setpoint_high;
   $('#target_lo').val(record.setpoint_low);
  }
  newBase = true;
 });

 $('#fermenter_toggle1').on('checked', function(event) {
  if (record.mode == 'NONE') {
   record.heater_state = 0;
   newSwitch = true;
  }
 });
 $('#fermenter_toggle1').on('unchecked', function(event) {
  if (record.mode == 'NONE') {
   record.heater_state = 100;
   record.cooler_state = 0;
   $('#fermenter_toggle2').val(0);
   newSwitch = true;
  }
 });
 $('#fermenter_toggle2').on('checked', function(event) {
  if (record.mode == 'NONE') {
   record.cooler_state = 0;
   newSwitch = true;
  }
 });
 $('#fermenter_toggle2').on('unchecked', function(event) {
  if (record.mode == 'NONE') {
   record.cooler_state = 100;
   record.heater_state = 0;
   $('#fermenter_toggle1').val(0);
   newSwitch = true;
  }
 });
 $('#fermenter_toggle3').on('checked', function(event) {
  if (record.mode == 'NONE') {
   record.fan_state = 0;
   newSwitch = true;
  }
 });
 $('#fermenter_toggle3').on('unchecked', function(event) {
  if (record.mode == 'NONE') {
   record.fan_state = 100;
   newSwitch = true;
  }
 });
 $('#Profile1').click(function() {
  if (record.mode == 'PROFILE') {
   if (record.profile_state == 'OFF') {
    ppayload = '{"profile":{"command":"start"}}';
    newProfile = true;
   } else if ((record.profile_state == 'RUN') || (record.profile_state == 'PAUSE')) {
    // Open a popup to confirm this action.
    $('#eventWindow').jqxWindow('open');
    $('#delOk').click(function() {
     ppayload = '{"profile":{"command":"abort"}}';
     newProfile = true;
    });
   } else if (record.profile_state == 'DONE') {
    ppayload = '{"profile":{"command":"done"}}';
    newProfile = true;
   }
  }
 });
 $('#Profile2').click(function() {
  if (record.mode == 'PROFILE') {
   if ((record.profile_state == 'RUN') || (record.profile_state == 'PAUSE')) {
    ppayload = '{"profile":{"command":"pause"}}';
    newProfile = true;
   }
  }
 });

 // The chart button.
 $('#FLog').jqxButton({ template: 'primary', width: '150px', theme: theme });
 $('#FLog').click(function() {
  window.open('log_fermentation.php?code=' + record.beercode + '&name=' + record.beername);
 });
 $('#Camera').jqxButton({ template: 'primary', width: '150px', theme: theme });
 $('#Camera').click(function() {
  record.light_state = 100;
  newSwitch = true;
  window.open(record.webcam_url);
 });
 createAbortElements();
});

mercurial