Advertisement
Guest User

Untitled

a guest
Mar 2nd, 2015
66
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. // File: arduinotcp.js
  2. // Author: Mikael Kindborg
  3. // Functions for scripting the Arduino board from JavaScript.
  4.  
  5. if (!window.evothings) { window.evothings = {} }
  6.  
  7. /**
  8.  * Readable names for parameter values. (Having these as
  9.  * globals is a bit ugly but makes for shorter names in
  10.  * the application code.)
  11.  */
  12. var OUTPUT = 1
  13. var INPUT = 2
  14. var HIGH = true
  15. var LOW = false
  16.  
  17. evothings.arduinotcp = (function()
  18. {
  19.     /**
  20.      * Library object.
  21.      */
  22.     var arduino = {}
  23.  
  24.     /**
  25.      * Holder of internal library functions.
  26.      */
  27.     arduino.internal = {}
  28.  
  29.     /**
  30.      * Internal arrays for timer intervals and timeouts.
  31.      */
  32.     arduino.internal.timerTimeouts = []
  33.     arduino.internal.timerIntervals = []
  34.  
  35.     /**
  36.      * Start timeout timer. This function makes it easier to
  37.      * use timeouts in Arduino scripts.
  38.      */
  39.     arduino.setTimeout = function(fun, ms)
  40.     {
  41.         arduino.internal.timerTimeouts.push(
  42.             setTimeout(fun, ms))
  43.     }
  44.  
  45.     /**
  46.      * Start interval timer. This function makes it easier to
  47.      * use timer intervals in Arduino scripts.
  48.      */
  49.     arduino.setInterval = function(fun, ms)
  50.     {
  51.         arduino.internal.timerIntervals.push(
  52.             setInterval(fun, ms))
  53.     }
  54.  
  55.     /**
  56.      * Clear all timers.
  57.      */
  58.     arduino.clearAllTimers = function()
  59.     {
  60.         for (var i = 0; i < arduino.internal.timerTimeouts.length; ++i)
  61.         {
  62.             clearTimeout(arduino.internal.timerTimeouts[i])
  63.         }
  64.         for (var i = 0; i < arduino.internal.timerIntervals.length; ++i)
  65.         {
  66.             clearInterval(arduino.internal.timerIntervals[i])
  67.         }
  68.         arduino.internal.timerTimeouts = []
  69.         arduino.internal.timerIntervals = []
  70.     }
  71.  
  72.     /**
  73.      * The IP address of the Arduino board.
  74.      */
  75.     arduino.ipAddress = ''
  76.  
  77.     /**
  78.      * The port number used by the Arduino server.
  79.      */
  80.     arduino.port = 0
  81.  
  82.     arduino.getIpAddress = function()
  83.     {
  84.         return arduino.ipAddress
  85.     }
  86.  
  87.     /**
  88.      * Write a digital output value.
  89.      * @param pinNumber - pin number to read
  90.      * @param value - HIGH or LOW
  91.      */
  92.     arduino.digitalWrite = function(pinNumber, value)
  93.     {
  94.         if (value == HIGH)
  95.         {
  96.             arduino.internal.sendRequest('H' + pinNumber, arduino.internal.callbackFun)
  97.         }
  98.         else if (value == LOW)
  99.         {
  100.             arduino.internal.sendRequest('L' + pinNumber, arduino.internal.callbackFun)
  101.         }
  102.     }
  103.  
  104.     /**
  105.      * Write a digital output value.
  106.      * @param pinNumber - pin number to read
  107.      * @param mode - OUTPUT or INPUT
  108.      */
  109.     arduino.pinMode = function(pinNumber, mode)
  110.     {
  111.         if (mode == OUTPUT)
  112.         {
  113.             arduino.internal.sendRequest('O' + pinNumber, arduino.internal.callbackFun)
  114.         }
  115.         else if (mode == INPUT)
  116.         {
  117.             arduino.internal.sendRequest('I' + pinNumber, arduino.internal.callbackFun)
  118.         }
  119.     }
  120.  
  121.     /**
  122.      * Read a digital input value, callback is called with the value
  123.      * 'H' or 'L' corresponding to the result of the Arduino function
  124.      * digitalRead().
  125.      * @param pinNumber - pin number to read
  126.      * @param callback - format callback(value) where value is 'H' or 'L',
  127.      * or null on error.
  128.      */
  129.     arduino.digitalRead = function(pinNumber, callback)
  130.     {
  131.         arduino.internal.sendRequest(
  132.             'R' + pinNumber,
  133.             function(result)
  134.             {
  135.                 if (result)
  136.                 {
  137.                     arduino.internal.readServerResult(function(data)
  138.                     {
  139.                         callback(data)
  140.                     })
  141.                 }
  142.                 else
  143.                 {
  144.                     callback(null)
  145.                 }
  146.             }
  147.         )
  148.     }
  149.  
  150.     /**
  151.      * Read an analog input value, callback is called with the value of
  152.      * the Arduino function analogRead().
  153.      */
  154.     arduino.analogRead = function(pinNumber, callback)
  155.     {
  156.         arduino.internal.sendRequest(
  157.             'A' + pinNumber,
  158.             function(result)
  159.             {
  160.                 if (result)
  161.                 {
  162.                     arduino.internal.readServerResult(function(data)
  163.                     {
  164.                         callback(data)
  165.                     })
  166.                 }
  167.                 else
  168.                 {
  169.                     callback(null)
  170.                 }
  171.             }
  172.         )
  173.     }
  174.  
  175.     /**
  176.      * Connect to a server.
  177.      * Format: callback(successFlag)
  178.      */
  179.     arduino.connect = function(hostname, port, callback)
  180.     {
  181.         arduino.disconnect()
  182.  
  183.         chrome.socket.create('tcp', {}, function(createInfo)
  184.         {
  185.             arduino.internal.socketId = createInfo.socketId
  186.             chrome.socket.connect(
  187.                 createInfo.socketId,
  188.                 hostname,
  189.                 port,
  190.                 function(resultCode)
  191.                 {
  192.                     arduino.internal.connected = (0 === resultCode)
  193.                     callback(arduino.internal.connected)
  194.                 }
  195.             )
  196.         })
  197.     }
  198.  
  199.     arduino.disconnect = function()
  200.     {
  201.         if (arduino.internal.connected)
  202.         {
  203.             chrome.socket.disconnect(arduino.internal.socketId)
  204.             arduino.internal.connected = false
  205.         }
  206.     }
  207.  
  208.     /**
  209.      * Internal connected flag.
  210.      */
  211.     arduino.internal.connected = false
  212.  
  213.     /**
  214.      * Send a request to the Arduino.
  215.      * @param command - the command string
  216.      * @callback - function on the format: callback(successFlag)
  217.      */
  218.     arduino.internal.sendRequest = function(command, callback)
  219.     {
  220.         if (arduino.internal.connected)
  221.         {
  222.             arduino.internal.write(
  223.                 arduino.internal.socketId,
  224.                 command + '\n', // Here a newline is added to the end of the request.
  225.                 function(bytesWritten)
  226.                 {
  227.                     // Command length is +1 due to the added newline.
  228.                     callback(bytesWritten === command.length + 1)
  229.                 }
  230.             )
  231.         }
  232.     }
  233.  
  234.     /**
  235.      * Write data.
  236.      * Format: callback(bytesWritten)
  237.      */
  238.     arduino.internal.write = function(socketId, string, callback)
  239.     {
  240.         chrome.socket.write(
  241.             socketId,
  242.             arduino.internal.stringToBuffer(string),
  243.             function(writeInfo)
  244.             {
  245.                 callback(writeInfo.bytesWritten)
  246.             }
  247.         )
  248.     }
  249.  
  250.     /**
  251.      * Array for the callback queue.
  252.      */
  253.     arduino.internal.resultCallbackQueue = []
  254.  
  255.     /**
  256.      * Data being read from the server.
  257.      */
  258.     arduino.internal.resultData = ''
  259.  
  260.     /**
  261.      * Read result from server, calling the callback function
  262.      * with the result.
  263.      * Format: callback(data) where data is a string
  264.      */
  265.     arduino.internal.readServerResult = function(callback)
  266.     {
  267.         // Add callback to queue.
  268.         arduino.internal.resultCallbackQueue.push(callback)
  269.  
  270.         // If this is the only callback there is no read operation
  271.         // in progress, so start reading.
  272.         if (arduino.internal.resultCallbackQueue.length == 1)
  273.         {
  274.             arduino.internal.resultData = ''
  275.             arduino.internal.readNext()
  276.         }
  277.     }
  278.  
  279.     /**
  280.      * Read data from server, when a result is read (reading up to next
  281.      * newline char) the first function in the callback queue is called.
  282.      */
  283.     arduino.internal.readNext = function()
  284.     {
  285.         console.log('arduino.internal.readNext: ' + arduino.internal.resultData)
  286.         chrome.socket.read(
  287.             arduino.internal.socketId,
  288.             1,
  289.             function(readInfo)
  290.             {
  291.                 if (1 == readInfo.resultCode)
  292.                 {
  293.                     var data = arduino.internal.bufferToString(readInfo.data)
  294.                     if (data == '\n')
  295.                     {
  296.                         console.log('  end of data: ' + data)
  297.                         // We have read all data, call next result callback with result.
  298.                         var callback = arduino.internal.resultCallbackQueue.shift()
  299.                         callback(arduino.internal.resultData)
  300.  
  301.                         // If there are callbacks waiting, continue reading
  302.                         // the next result.
  303.                         if (arduino.internal.resultCallbackQueue.length > 0)
  304.                         {
  305.                             arduino.internal.resultData = ''
  306.                             arduino.internal.readNext()
  307.                         }
  308.                     }
  309.                     else
  310.                     {
  311.                         console.log('  got data: ' + data)
  312.                         // We got more data, continue to read.
  313.                         arduino.internal.resultData += data
  314.                         arduino.internal.readNext()
  315.                     }
  316.                 }
  317.                 else
  318.                 {
  319.                     console.log('  no data')
  320.                     // We did not get any data, read again.
  321.                     arduino.internal.readNext()
  322.                 }
  323.             }
  324.         )
  325.     }
  326.  
  327.     arduino.internal.callbackFun = function(result)
  328.     {
  329.         if (result == false)
  330.         {
  331.             alert('Failed to send the command to the Arduino.')
  332.         }
  333.     }
  334.  
  335.     arduino.internal.bufferToString = function(buffer)
  336.     {
  337.         return String.fromCharCode.apply(null, new Uint8Array(buffer))
  338.     }
  339.  
  340.     arduino.internal.stringToBuffer = function(string)
  341.     {
  342.         var buffer = new ArrayBuffer(string.length)
  343.         var bufferView = new Uint8Array(buffer);
  344.         for (var i = 0; i < string.length; ++i)
  345.         {
  346.             bufferView[i] = string.charCodeAt(i) //string[i]
  347.         }
  348.         return buffer
  349.     }
  350.  
  351.     /**
  352.      * For debugging.
  353.      */
  354.     arduino.printObject = function (obj, level)
  355.     {
  356.         if (!level) { level = '' }
  357.         for (prop in obj)
  358.         {
  359.             if (obj.hasOwnProperty(prop))
  360.             {
  361.                 var value = obj[prop]
  362.                 if (typeof value === 'object')
  363.                 {
  364.                     console.log(level + prop + ':')
  365.                     arduino.printObject(value, level + '  ')
  366.                 }
  367.                 else
  368.                 {
  369.                     console.log(level + prop + ': ' +value)
  370.                 }
  371.             }
  372.         }
  373.     }
  374.  
  375.     // Return arduino object.
  376.     return arduino
  377. })()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement