/* Copyright 2012-2013 Eric Ptak - trouch.com Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ var _gaq = _gaq || []; var _webiopi; function w() { if (_webiopi == undefined) { _webiopi = new WebIOPi(); } return _webiopi; } function webiopi() { return w(); } function isMobileUserAgent(a) { if (/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows (ce|phone)|xda|xiino/i.test(a)||/1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test(a.substr(0,4))) return true } var _isMobile = undefined; function isMobile() { if (_isMobile == undefined) { _isMobile = ((navigator.userAgent != undefined && isMobileUserAgent(navigator.userAgent)) || (navigator.vendor != undefined && isMobileUserAgent(navigator.vendor)) || (window.opera != undefined && isMobileUserAgent(window.opera))) } return _isMobile } function WebIOPi() { this.readyCallback = null; this.context = "/"; this.GPIO = Array(54); this.PINS = Array(27); this.TYPE = { DNC: {value: 0, style: "DNC", label: "--"}, GND: {value: 1, style: "GND", label: "GROUND"}, V33: {value: 2, style: "V33", label: "3.3V"}, V50: {value: 3, style: "V50", label: "5.0V"}, GPIO: {value: 4, style: "GPIO", label: "GPIO"} }; this.ALT = { I2C: {name: "I2C", enabled: false, gpios: []}, SPI: {name: "SPI", enabled: false, gpios: []}, UART: {name: "UART", enabled: false, gpios: []}, ONEWIRE: {name: "ONEWIRE", enabled: false, gpios: []} }; // init GPIOs for (var i=0; i 1)) { script = scripts[i]; this.context = res[1]; } } var head = document.getElementsByTagName('head')[0]; var jquery = document.createElement('script'); jquery.type = 'text/javascript'; jquery.src = '/jquery.js'; if (!isMobile()) { jquery.onload = function() { w().init(); }; } head.appendChild(jquery); if (isMobile()) { console.log("load jquery mobile"); var mobile = document.createElement('script'); mobile.type = 'text/javascript'; mobile.src = '/jquery-mobile.js'; mobile.onload = function() { w().initMobile() }; head.appendChild(mobile); } // GA _gaq.push(['_setAccount', 'UA-33979593-2']); _gaq.push(['_trackPageview']); var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = false; ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js'; head.appendChild(ga); var style = document.createElement('link'); style.rel = "stylesheet"; style.type = 'text/css'; style.href = '/webiopi.css'; head.appendChild(style); if (isMobile()) { var style = document.createElement('link'); style.rel = "stylesheet"; style.type = 'text/css'; style.href = '/jquery-mobile.css'; head.appendChild(style); } // init ALTs this.addALT(this.ALT.I2C, 0, "SDA"); this.addALT(this.ALT.I2C, 1, "SCL"); this.addALT(this.ALT.I2C, 2, "SDA"); this.addALT(this.ALT.I2C, 3, "SCL"); this.addALT(this.ALT.SPI, 7, "CE1"); this.addALT(this.ALT.SPI, 8, "CE0"); this.addALT(this.ALT.SPI, 9, "MISO"); this.addALT(this.ALT.SPI, 10, "MOSI"); this.addALT(this.ALT.SPI, 11, "SCLK"); this.addALT(this.ALT.UART, 14, "TX"); this.addALT(this.ALT.UART, 15, "RX"); this.addALT(this.ALT.ONEWIRE, 4, ""); } WebIOPi.prototype.init = function() { $.getJSON(w().context + "map", function(data) { var count = w().PINS.length; for (i = 0; ic[i]) { // updated = true; // } // } // if (updated || (n.length > c.length)) { // var div = $(''); // $("body").append(div); // } // }); }); } WebIOPi.prototype.digitalRead = function (gpio, callback) { if (callback != undefined) { $.get(w().context + 'GPIO/' + gpio + "/value", function(data) { w().updateValue(gpio, data); callback(gpio, data); }); } return w().GPIO[gpio].value; } WebIOPi.prototype.digitalWrite = function (gpio, value, callback) { if (w().GPIO[gpio].func.toUpperCase()=="OUT") { $.post(w().context + 'GPIO/' + gpio + "/value/" + value, function(data) { w().updateValue(gpio, data); if (callback != undefined) { callback(gpio, data); } }); } else { //console.log(w().GPIO[gpio].func); } } WebIOPi.prototype.getFunction = function (gpio, callback) { if (callback != undefined) { $.get(w().context + 'GPIO/' + gpio + "/function", function(data) { w().updateFunction(gpio, data); callback(gpio, data); }); } return w().GPIO[gpio].func; } WebIOPi.prototype.setFunction = function (gpio, func, callback) { $.post(w().context + 'GPIO/' + gpio + "/function/" + func, function(data) { w().updateFunction(gpio, data); if (callback != undefined) { callback(gpio, data); } }); } WebIOPi.prototype.toggleValue = function (gpio) { var value = (w().GPIO[gpio].value == 1) ? 0 : 1; w().digitalWrite(gpio, value); } WebIOPi.prototype.toggleFunction = function (gpio) { var value = (w().GPIO[gpio].func == "IN") ? "OUT" : "IN"; w().setFunction(gpio, value) } WebIOPi.prototype.outputSequence = function (gpio, period, sequence, callback) { $.post(w().context + 'GPIO/' + gpio + "/sequence/" + period + "," + sequence, function(data) { w().updateValue(gpio, data); if (callback != undefined) { callback(gpio, data); } }); } WebIOPi.prototype.callMacro = function (macro, args, callback) { if (args == undefined) { args = ""; } $.post(w().context + 'macros/' + macro + "/" + args, function(data) { if (callback != undefined) { callback(macro, args, data); } }); } WebIOPi.prototype.enablePWM = function(gpio, callback) { $.post(w().context + 'GPIO/' + gpio + "/pwm/enable", function(data) { if (callback != undefined) { callback(gpio, data); } }); } WebIOPi.prototype.disablePWM = function(gpio, callback) { $.post(w().context + 'GPIO/' + gpio + "/pwm/disable", function(data) { if (callback != undefined) { callback(gpio, data); } }); } WebIOPi.prototype.pulse = function(gpio, callback) { $.post(w().context + 'GPIO/' + gpio + "/pulse/", function(data) { if (callback != undefined) { callback(gpio, data); } }); } WebIOPi.prototype.pulseRatio = function(gpio, ratio, callback) { $.post(w().context + 'GPIO/' + gpio + "/pulseRatio/" + ratio, function(data) { if (callback != undefined) { callback(gpio, data); } }); } WebIOPi.prototype.pulseAngle = function(gpio, angle, callback) { $.post(w().context + 'GPIO/' + gpio + "/pulseAngle/" + angle, function(data) { if (callback != undefined) { callback(gpio, data); } }); } WebIOPi.prototype.setLabel = function (id, label) { $("#" + id).val(label); $("#" + id).text(label); } WebIOPi.prototype.setClass = function (id, cssClass) { $("#" + id).attr("class", cssClass); } WebIOPi.prototype.createButton = function (id, label, callback, callbackUp) { var button = $('