Skip to content
Snippets Groups Projects
Select Git revision
  • 832f9ee73407d7334c4adb51724868b4c90a0a60
  • master default
  • neil
  • hpgl
  • sw-shawn-liu
  • ppa
  • fran
  • trotec-port
  • fs-hotfix
  • jake
  • ml-mods
  • fabmo-app
12 results

deviceserver.js

Blame
  • deviceserver.js 3.31 KiB
    //
    // deviceserver.js
    //    WebSocket device server
    //
    // Neil Gershenfeld 
    // (c) Massachusetts Institute of Technology 2019
    // 
    // This work may be reproduced, modified, distributed, performed, and 
    // displayed for any purpose, but must acknowledge the mods
    // project. Copyright is retained and must be preserved. The work is 
    // provided as is; no warranty is provided, and users accept all 
    // liability.
    //
    // check command line
    //
    if (process.argv.length < 4) {
       console.log("command line: node deviceserver.js client_address server_port")
       process.exit(-1)
       }
    //
    // start server
    //
    var client_address = process.argv[2]
    var server_port = process.argv[3]
    console.log("listening for connection from client address "+client_address+" on server port "+server_port)
    var fs = require("fs")
    var WebSocketServer = require('ws').Server
    wss = new WebSocketServer({port:server_port})
    //
    // handle connection
    //
    wss.on('connection',function(ws) {
       //
       // check address
       //
       if (ws._socket.remoteAddress != client_address) {
          console.log("connection rejected from "+ws._socket.remoteAddress)
          ws.send('socket closed')
          ws.close()
          }
       else {
          console.log("connection accepted from "+ws._socket.remoteAddress)
          }
       //
       // handle messages
       //
       var cancel
       ws.on("message",function(msg) {
          //
          // cancel job
          //
          if (msg == 'cancel') {
             cancel = true
             }
          //
          // start job
          //
          else {
             var count = 0
             var file
             var job = JSON.parse(msg)
             console.log('writing '+job.name+' (length '+job.contents.length+') to /dev/'+job.device)
             cancel = false
             fs.open('/dev/'+job.device,'w',function(err,fd) {
                if (err) {
                   console.log('error: '+err)
                   ws.send('error: '+err)
                   }
                else {
                   file = fd
                   write_char()
                   }
                })
             //
             // character writer
             //
             function write_char() {
                //
                // cancel
                //
                if (cancel) {
                   console.log('cancel')
                   ws.send('cancel')
                   fs.close(file)
                   }
                //
                // continue
                //
                else {
                   fs.write(file,job.contents[count],function(err,written,string) {
                      if (err) {
                         console.log('error '+err+' count '+count)
                         ws.send('error '+err+' count '+count)
                         }
                      else {
                         ws.send((count+1)+'/'+job.contents.length)
                         count += 1
                         if (count < job.contents.length)
                            write_char()
                         else {
                            console.log('done')
                            ws.send('done')
                            fs.close(file,function(err) {
                               if (err) {
                                  console.log('error: '+err)
                                  ws.send('error: '+err)
                                  }
                               })
                            }
                         }
                      })
                   }
                }
             }
          })
       //
       // close
       //
       ws.on("close",function() {
          console.log("connection closed")
          })
       })