From 3b428ef0e3d532e3e6d0fb2501df11c416349044 Mon Sep 17 00:00:00 2001 From: OpenAcousticDevices Date: Mon, 31 Jul 2017 15:10:47 +0100 Subject: [PATCH] Initial commit --- about.html | 18 ++ about.js | 25 +++ app.js | 267 ++++++++++++++++++++++++++ beautify_and_jslint.sh | 8 + build/128x128.png | Bin 0 -> 4398 bytes build/icon.icns | Bin 0 -> 222781 bytes build/icon.ico | Bin 0 -> 370070 bytes icon-128.png | Bin 0 -> 4398 bytes index.html | 200 +++++++++++++++++++ lifeDisplay.js | 143 ++++++++++++++ main.js | 102 ++++++++++ package.json | 58 ++++++ saveLoad.js | 200 +++++++++++++++++++ timePeriods.js | 237 +++++++++++++++++++++++ ui.css | 5 + ui.js | 423 +++++++++++++++++++++++++++++++++++++++++ 16 files changed, 1686 insertions(+) create mode 100644 about.html create mode 100644 about.js create mode 100644 app.js create mode 100644 beautify_and_jslint.sh create mode 100644 build/128x128.png create mode 100644 build/icon.icns create mode 100644 build/icon.ico create mode 100644 icon-128.png create mode 100644 index.html create mode 100644 lifeDisplay.js create mode 100644 main.js create mode 100644 package.json create mode 100644 saveLoad.js create mode 100644 timePeriods.js create mode 100644 ui.css create mode 100644 ui.js diff --git a/about.html b/about.html new file mode 100644 index 0000000..04a4831 --- /dev/null +++ b/about.html @@ -0,0 +1,18 @@ + + + + + About AudioMoth + + +
+
+
AudioMoth configuration app
+
Version 1.0
+
Running on Electron version 1.0
+
AudioMoth-HID module 1.0.0
+ +
+ + + \ No newline at end of file diff --git a/about.js b/about.js new file mode 100644 index 0000000..f39b122 --- /dev/null +++ b/about.js @@ -0,0 +1,25 @@ +/**************************************************************************** + * about.js + * openacousticdevices.info + * June 2017 + *****************************************************************************/ + +'use strict'; + +/*global document */ + +var electron = require('electron'); +var audiomoth = require('audiomoth-hid'); + +var versionDisplay = document.getElementById('version-display'); +var electronVersionDisplay = document.getElementById('electron-version-display'); +var audiomothHidVersionDisplay = document.getElementById('audiomoth-hid-version-display'); +var websiteLink = document.getElementById('website-link'); + +versionDisplay.textContent = "Version " + electron.remote.app.getVersion(); +electronVersionDisplay.textContent = "Running on Electron version " + electron.remote.process.versions.electron; +audiomothHidVersionDisplay.textContent = "AudioMoth-HID module " + audiomoth.version; + +websiteLink.addEventListener('click', function () { + electron.shell.openExternal("https://openacousticdevices.info"); +}); \ No newline at end of file diff --git a/app.js b/app.js new file mode 100644 index 0000000..087f87f --- /dev/null +++ b/app.js @@ -0,0 +1,267 @@ +/**************************************************************************** + * app.js + * openacousticdevices.info + * June 2017 + *****************************************************************************/ + +'use strict'; + +/*global document, Uint8Array*/ +/*jslint bitwise: true*/ + +var audiomoth = require('audiomoth-hid'); + +var ui = require('./ui.js'); +var timeHandler = require('./timePeriods.js'); +var saveLoad = require('./saveLoad.js'); +var lifeDisplay = require('./lifeDisplay.js'); + +var electron = require('electron'); +var dialog = electron.remote.dialog; + +/* UI components */ + +var ledCheckbox = document.getElementById('led-checkbox'); + +var recordingDurationInput = document.getElementById('recording-duration-input'); +var sleepDurationInput = document.getElementById('sleep-duration-input'); + +var configureButton = document.getElementById('configure-button'); + +var startTimeInput = document.getElementById('start-time-input'); +var endTimeInput = document.getElementById('end-time-input'); + +/* Setting parameters */ + +var AM_HFRCO_21MHZ = 4; +var AM_HFRCO_28MHZ = 5; +var AM_HFXO = 6; + +var configurations = [{ + sampleRate: 8000, + clockBand: AM_HFRCO_21MHZ, + clockDivider: 2, + acquisitionCycles: 8, + oversampleRate: 64, + current: 5.6 +}, { + sampleRate: 16000, + clockBand: AM_HFRCO_21MHZ, + clockDivider: 2, + acquisitionCycles: 8, + oversampleRate: 32, + current: 6.1 +}, { + sampleRate: 32000, + clockBand: AM_HFRCO_21MHZ, + clockDivider: 2, + acquisitionCycles: 8, + oversampleRate: 16, + current: 7.1 +}, { + sampleRate: 48000, + clockBand: AM_HFRCO_21MHZ, + clockDivider: 2, + acquisitionCycles: 2, + oversampleRate: 16, + current: 7.6 +}, { + sampleRate: 96000, + clockBand: AM_HFRCO_21MHZ, + clockDivider: 2, + acquisitionCycles: 1, + oversampleRate: 8, + current: 10.4 +}, { + sampleRate: 192000, + clockBand: AM_HFRCO_21MHZ, + clockDivider: 2, + acquisitionCycles: 1, + oversampleRate: 4, + current: 18.1 +}]; + +function errorOccurred(err) { + + console.error(err); + + ui.disableDisplay(); + +} + +/* Request, receive and handle AudioMoth information packet */ + +function getAudioMothPacket() { + + var id, date, batteryState; + + audiomoth.getPacket(function (err, packet) { + + if (err) { + + errorOccurred(err); + + } else if (packet === null) { + + ui.disableDisplay(); + + } else { + + date = audiomoth.convertFourBytesFromBufferToDate(packet, 1); + + id = audiomoth.convertEightBytesFromBufferToID(packet, 1 + 4); + + batteryState = audiomoth.convertOneByteFromBufferToBatteryState(packet, 1 + 4 + 8); + + ui.enableDisplayAndShowTime(date); + + ui.updateIdDisplay(id); + + ui.updateBatteryDisplay(batteryState); + + } + + setTimeout(getAudioMothPacket, 1000); + + }); + +} + +/* Write bytes into a buffer for transmission */ + +function writeLittleEndianBytes(buffer, start, byteCount, value) { + var i; + + for (i = 0; i < byteCount; i += 1) { + buffer[start + i] = (value >> (i * 8)) & 255; + } +} + +/* Submit configuration packet and configure device */ + +function configureDevice() { + + var packet, index, date, configuration, i, timePeriods; + + /* Build configuration packet */ + + packet = new Uint8Array(62); + index = 0; + + date = new Date(); + writeLittleEndianBytes(packet, index, 4, date.valueOf() / 1000); + index += 4; + + packet[index] = parseInt(ui.getSelectedRadioValue("gain-radio"), 10); + index += 1; + + configuration = configurations[parseInt(ui.getSelectedRadioValue("sample-rate-radio"), 10)]; + + packet[index] = configuration.clockBand; + index += 1; + packet[index] = configuration.clockDivider; + index += 1; + packet[index] = configuration.acquisitionCycles; + index += 1; + packet[index] = configuration.oversampleRate; + index += 1; + writeLittleEndianBytes(packet, index, 4, configuration.sampleRate); + index += 4; + + writeLittleEndianBytes(packet, index, 2, sleepDurationInput.value); + index += 2; + writeLittleEndianBytes(packet, index, 2, recordingDurationInput.value); + index += 2; + + if (ledCheckbox.checked) { + + packet[index] = 0x01; + + } else { + + packet[index] = 0x00; + + } + index += 1; + + timePeriods = timeHandler.getTimePeriods(); + packet[index] = timePeriods.length; + index += 1; + + for (i = 0; i < timePeriods.length; i += 1) { + + writeLittleEndianBytes(packet, index, 2, timePeriods[i].startMins); + index += 2; + writeLittleEndianBytes(packet, index, 2, timePeriods[i].endMins); + index += 2; + + } + + /* Send packet to device */ + + audiomoth.setPacket(packet, function (err, data) { + + var j, matches, showError; + + showError = function () { + dialog.showErrorBox("Configuration failed.", "Configuration was not applied to AudioMoth\nPlease reconnect device and try again."); + }; + + if (err || data === null || data.length === 0) { + + showError(); + + } else { + + matches = true; + + for (j = 0; j < Math.min(packet.length, data.length - 1); j += 1) { + if (packet[j] !== data[j + 1]) { + console.log(packet[j] + ' - ' + data[j + 1]); + matches = false; + break; + } + } + + if (matches) { + + configureButton.style.color = "green"; + setTimeout(function () { + configureButton.style.color = ""; + }, 1000); + + } else { + + showError(); + + } + + } + + }); + +} + +/* Initiliase lifeDisplay configuration data */ + +lifeDisplay.setConfigurationData(configurations); + +/* Initialise UI elements */ + +ui.drawTimeLabels(); + +timeHandler.updateTimeList(); + +ui.updateCanvasTimer(); + +ui.disableDisplay(); + +ui.initialiseDisplay(); + +ui.addRadioButtonListeners(); + +setTimeout(getAudioMothPacket, 1000); + +configureButton.addEventListener('click', function () { + ui.checkInputs(configureDevice); +}); \ No newline at end of file diff --git a/beautify_and_jslint.sh b/beautify_and_jslint.sh new file mode 100644 index 0000000..34bf334 --- /dev/null +++ b/beautify_and_jslint.sh @@ -0,0 +1,8 @@ +#!/bin/bash + +for f in ./*.js; +do + js-beautify -j -f $f -o $f; + jslint $f; +done + diff --git a/build/128x128.png b/build/128x128.png new file mode 100644 index 0000000000000000000000000000000000000000..873025b3a6583bf8eba5b0f18ca794cb5260430f GIT binary patch literal 4398 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 literal 0 HcmV?d00001 diff --git a/build/icon.icns b/build/icon.icns new file mode 100644 index 0000000000000000000000000000000000000000..4e94565066a5b2399ce5ec3c2dd73131551dae6d GIT binary patch literal 222781 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