JSActionsでGPSから座標を取得してGoogleMapsに反映
Tombloo + JSActionsでWSHを実行するコードは下ページからのコピペです。凄い簡単にFirefoxからWSHが使える。
http://d.hatena.ne.jp/brazil/20090102/1230876349
GPSからデータを取得する
GPSからデータを取得するのに自作コンポーネントを使ってますが、MSCommを使ったりとか、そもそもWSHを使わないとか、色々方法はありますんでその辺は適当に。
自作コンポーネントはこんなの: http://d.hatena.ne.jp/arikui/20071212/1197453931
GoogleMapsを用意する
window.map = new GMap2(document.getElementById("map"));
みたいに、外からGoogleMapsのAPIが使えるやつ。
コード
JSActionsのコードからwindow.mapを参照できなかったので、javascriptスキームで座標を指定してます。
var T = Components.classes['@brasil.to/tombloo-service;1'].getService().wrappedJSObject; (function(times){ var data = ""; var count = 1; var timer = setInterval(function(){ data += getGpsData(); var coord = getCoordinates(); if(coord) window.location.href = "javascript:window.map.setCenter(new GLatLng("+coord+"));void(0);" if(++count > times) clearInterval(timer); }, 1000); function getCoordinates(){ var _data = data.split("\n"); var match = null; while(_data.length){ if(match = /\$GPGGA.{12}(.{9}).{3}(.{10})/.exec(_data.pop())){ data = _data.join("\n"); var coord = [ parseInt(match[1].substr(0, 2), 10) + match[1].substr(2) / 60, parseInt(match[2].substr(0, 3), 10) + match[2].substr(3) / 60, ]; if(coord[0] && coord[1]) return coord; else return null; } } return null; } })(5); function getGpsData(){ return executeWSH(function(){ var gps = WSH.CreateObject("CommPort.Comm"); gps.port = 23; gps.BaudRate = 4800; gps.Open(); var s = gps.Input(); WSH.Sleep(1000); s += gps.Input(); gps.Close(); return s; }); } // http://d.hatena.ne.jp/brazil/20090102/1230876349 function executeWSH(func, args){ args = args || []; with(T){ var bat = getTempFile('bat'); var script = getTempFile(); var out = new LocalFile(script.path + '.out'); putContents(bat, [ 'cscript //E:JScript //Nologo', script.path.quote(), '>', out.path.quote()].join(' ')); putContents(script, args.map(function(a, i){return 'var ARG_' + i + ' = ' + uneval(a) + ';'}).join('\n') + 'WScript.echo(' + func.toSource() + '(' + args.map(function(a, i){return 'ARG_' + i}).join(',') + '));'); new Process(bat).run(true, [], 0); var res = getContents(out).replace(/\s+$/, ''); bat.remove(false); script.remove(false); out.remove(false); return res; } }