Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7,629 changes: 348 additions & 7,281 deletions Loom/extras/WeatherChimes/02.SensorsIntro.maxpat

Large diffs are not rendered by default.

7,140 changes: 3,668 additions & 3,472 deletions Loom/extras/WeatherChimes/03.MongoDBDataPlotter.maxpat

Large diffs are not rendered by default.

268 changes: 122 additions & 146 deletions Loom/javascript/Sensor.js
Original file line number Diff line number Diff line change
Expand Up @@ -9,184 +9,160 @@ outlets = 0;
var data = {};

var last_device_number = -1
var menu_updated = false
var menu_updated = false

var last_module = null

// Upon new data
function json(j)
{
data = JSON.parse(j); // js object

// Check if ranges should be updated
curr_module = this.patcher.getnamed("module_selection").getvalueof()
if(last_module == null || last_module != curr_module) {
update_range()
last_module = curr_module
}

// Check device instance number

if (menu_updated && device_changed() ) {
menu_updated = false
this.patcher.getnamed("gate_open").message("bang")
post("Resetting")
post()

var param_menu = this.patcher.getnamed("parameter_selection");
var module_menu = this.patcher.getnamed("module_selection");

param_menu.clear()
module_menu.clear()
}

if (!menu_updated) {
update_UI_module_menu()
update_UI_parameter_menu()

if (data["ID"] && (data["ID"]["instance"]!=null)) {
last_device_number = data["ID"]["instance"]
}

menu_updated = true

load_saved_selection()
}

update_UI_parameter_value()
data = JSON.parse(j); // js object
// Check if ranges should be updated
curr_module = this.patcher.getnamed("module_selection").getvalueof()
if(last_module == null || last_module != curr_module) {
update_range()
last_module = curr_module
}
// Check device instance number
if (menu_updated && device_changed() ) {
menu_updated = false
this.patcher.getnamed("gate_open").message("bang")
post("Resetting")
post()
var param_menu = this.patcher.getnamed("parameter_selection");
var module_menu = this.patcher.getnamed("module_selection");
param_menu.clear()
module_menu.clear()
}
if (!menu_updated) {
update_UI_module_menu()
update_UI_parameter_menu()
if (data["ID"] && (data["ID"]["instance"]!=null)) {
last_device_number = data["ID"]["instance"]
}
menu_updated = true
load_saved_selection()
}

update_UI_parameter_value()
}

// Parse sensorRanges.json
function parse_ranges() {
// Credit to https://cycling74.com/forums/sharing-is-fun-example-write-and-read-json-in-javascript
memstr = ""
maxchars = 800
var f = new File("sensorRanges.json","read");
f.open();
if (f.isopen) {
while(f.position<f.eof) {
memstr+=f.readstring(maxchars);
}
f.close();
ranges = JSON.parse(memstr);
} else {
post("Error Reading Default Ranges\n");
}

// Credit to https://cycling74.com/forums/sharing-is-fun-example-write-and-read-json-in-javascript
memstr = ""
maxchars = 800
var f = new File("sensorRanges.json","read");
f.open();
if (f.isopen) {
while(f.position<f.eof) {
memstr+=f.readstring(maxchars);
}
f.close();
ranges = JSON.parse(memstr);
} else {
post("Error Reading Default Ranges\n");
}
}

// Set the scroller min/max to different values based on menu. Either default range or range specified in sensorRanges.json
function update_range() {
if(ranges != null){
var scroller = this.patcher.getnamed("scroller");
var param_menu = this.patcher.getnamed("parameter_selection").getvalueof();
var module_menu = this.patcher.getnamed("module_selection").getvalueof();
// Only changes the range if there is some scroller object
if(scroller) {
// The default range for a sensor (it will be the range if the sensor is not in sensorRanges.json)
var min = -1000
var max = 1000
if(ranges["ranges"][module_menu]) {
// Certain sensors require different ranges for different modules
if(ranges["ranges"][module_menu][param_menu]) {
sensmin = ranges["ranges"][module_menu][param_menu]["min"]
sensmax = ranges["ranges"][module_menu][param_menu]["max"]
if(typeof sensmax !== 'undefined'){
max = sensmax
}
if(typeof sensmin !== 'undefined'){
min = sensmin
}
// Some sensors only require one range
} else {
sensmin = ranges["ranges"][module_menu]["min"]
sensmax = ranges["ranges"][module_menu]["max"]
if(typeof sensmax !== 'undefined'){
max = sensmax
}
if(typeof sensmin !== 'undefined'){
min = sensmin
}
}
}
scroller.setmin(min)
scroller.setmax(max)
}
}
if(ranges != null){
var scroller = this.patcher.getnamed("scroller");
var param_menu = this.patcher.getnamed("parameter_selection").getvalueof();
var module_menu = this.patcher.getnamed("module_selection").getvalueof();
// Only changes the range if there is some scroller object
if(scroller) {
// The default range for a sensor (it will be the range if the sensor is not in sensorRanges.json)
var min = -1000
var max = 1000
if(ranges["ranges"][module_menu]) {
// Certain sensors require different ranges for different modules
if(ranges["ranges"][module_menu][param_menu]) {
sensmin = ranges["ranges"][module_menu][param_menu]["min"]
sensmax = ranges["ranges"][module_menu][param_menu]["max"]
if(typeof sensmax !== 'undefined'){
max = sensmax
}
if(typeof sensmin !== 'undefined'){
min = sensmin
}
// Some sensors only require one range
} else {
sensmin = ranges["ranges"][module_menu]["min"]
sensmax = ranges["ranges"][module_menu]["max"]
if(typeof sensmax !== 'undefined'){
max = sensmax
}
if(typeof sensmin !== 'undefined'){
min = sensmin
}
}
}
scroller.setmin(min)
scroller.setmax(max)
}
}
}

function update_UI_module_menu()
{
// Get module menu element
var module_menu = this.patcher.getnamed("module_selection");

// Get current selection
module_menu.message("pattrmode", 1);
var prev = module_menu.getvalueof();
module_menu.clear();

// Update menu with modules
Object.keys(data)
.filter( function (val) { return val != "ID" } ) // Remove ID key
.forEach( function (key) { module_menu.append( key ) } ); // Add to menu

module_menu.set(prev);
// Get module menu element
var module_menu = this.patcher.getnamed("module_selection");
// Get current selection
module_menu.message("pattrmode", 1);
var prev = module_menu.getvalueof();
module_menu.clear();
// Update menu with modules
Object.keys(data)
.filter( function (val) { return val != "ID" } ) // Remove ID key
.forEach( function (key) { module_menu.append( key ) } ); // Add to menu

module_menu.set(prev);
}

function update_UI_parameter_menu()
{
// Get module menu element
var param_menu = this.patcher.getnamed("parameter_selection");
var module_menu = this.patcher.getnamed("module_selection");

// Get current selection
param_menu.message("pattrmode", 1);
module_menu.message("pattrmode", 1);
var curr_module = module_menu.getvalueof();
var prev = param_menu.getvalueof();
param_menu.clear();

// Update menu with module's data
Object.keys( data[curr_module] )
.forEach( function (key) { param_menu.append( key ) } ); // Add to menu


param_menu.set(prev);
var param_view = this.patcher.getnamed("param_view");

var val = data[module_menu.getvalueof()][param_menu.getvalueof()];

param_view.set(val);
param_view.message("bang");
// Get module menu element
var param_menu = this.patcher.getnamed("parameter_selection");
var module_menu = this.patcher.getnamed("module_selection");

// Get current selection
param_menu.message("pattrmode", 1);
module_menu.message("pattrmode", 1);
var curr_module = module_menu.getvalueof();
var prev = param_menu.getvalueof();
param_menu.clear();
// Update menu with module's data
Object.keys( data[curr_module] )
.forEach( function (key) { param_menu.append( key ) } ); // Add to menu

param_menu.set(prev);
var param_view = this.patcher.getnamed("param_view");

var val = data[module_menu.getvalueof()][param_menu.getvalueof()];
param_view.set(val);
param_view.message("bang");
}


//var last_param = "";
function update_UI_parameter_value()
{
var param_view = this.patcher.getnamed("param_view");
var param_menu = this.patcher.getnamed("parameter_selection");
var module_menu = this.patcher.getnamed("module_selection");

var scroller = this.patcher.getnamed("scroller");
var val = data[module_menu.getvalueof()][param_menu.getvalueof()];

param_view.set(val);
param_view.message("bang");
}

function reset_to_default()
{

var param_view = this.patcher.getnamed("param_view");
var param_menu = this.patcher.getnamed("parameter_selection");
var module_menu = this.patcher.getnamed("module_selection");
var scroller = this.patcher.getnamed("scroller");
var val = data[module_menu.getvalueof()][param_menu.getvalueof()];
param_view.set(val);
param_view.message("bang");
}

function device_changed()
{
return !(data["ID"] && (data["ID"]["instance"]!=null) && data["ID"]["instance"] == last_device_number )

return !(data["ID"] && (data["ID"]["instance"]!=null) && data["ID"]["instance"] == last_device_number )
}

function load_saved_selection()
{
this.patcher.getnamed("load_saved").message("bang")
}
this.patcher.getnamed("load_saved").message("bang")
}
45 changes: 16 additions & 29 deletions Loom/javascript/Timestamp.js
Original file line number Diff line number Diff line change
Expand Up @@ -6,22 +6,18 @@
inlets = 1
outlets = 6

//Assembles the user input into an ISO UTC Timestamp
function assembleTimeStamp(year,month,day,hour,min,sec)
{
var t = year.toString()
.concat("-")
.concat(month.toString())
.concat("-")
.concat(day.toString())
.concat(" ")
.concat(hour.toString())
.concat(":")
.concat(min.toString())
.concat(":")
.concat(sec.toString());
t = fixTimeStamp(t);
outlet(0,t)
function assembleTimeStamp(year, month, day, hour, min, sec) {
// Helper function to ensure each component has leading zero if needed
function pad(n) {
return n < 10 ? '0' + n : n.toString();
}

// Assemble the timestamp in ISO 8601 UTC format using concatenation
var t = year.toString() + "-" + pad(month) + "-" + pad(day) +
"T" + hour + ":" + min + ":" + sec + "Z";

outlet(0, t); // Output the formatted timestamp
post("assembled time: " + t);
}

/*
Expand All @@ -42,7 +38,7 @@ function fixTimeStamp(t)
if(t.substr(18,1) == "Z"){t = t.substr(0,17).concat("0").concat(t.substr(17))}

t = t.slice(0, -1)

outlet(0,t);
return t;
}
Expand All @@ -55,6 +51,8 @@ function fixTimeStamp(t)
*/
function findSamplingPeriod(t1, t2)
{
post("t1: " + t1 + " t2: " + t2 + "\n")

t1 = fixTimeStamp(t1);
t2 = fixTimeStamp(t2);

Expand Down Expand Up @@ -134,7 +132,6 @@ function trimZeros(num){
return num;
}
function convertToDBTimestamp(from, to){

var year = from.substr(0,4);
var month = trimZeros(from.substr(5,2));
var day = trimZeros(from.substr(8,2));
Expand All @@ -156,14 +153,4 @@ function convertToDBTimestamp(from, to){
to = year.concat("-").concat(month).concat("-").concat(day).concat("T")
.concat(hour).concat(":").concat(min).concat(":").concat(sec);
outlet(1, to)
}










}
Loading