/*---------------- FILE HEADER --------------------------------------- This file is part of Geoide. Copyright (C) 2005-2006 by: IDgis B.V. http://www.idgis.nl This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Contact: Herman Assink IDgis bv P.O. Box 15 7450 AA Holten The Netherlands E-Mail: herman.assink@idgis.nl * @version 1.4.0 * @author IDgis team * ------------------------------------------------------------------------*/ import XMLSocket; import nl.idgis.giclient.geoma.Point; import nl.idgis.giclient.util.XMLTools; import mx.utils.Delegate; import nl.idgis.giclient.gps.GPSListener; import nl.idgis.giclient.framework.FrameWork; /** * @author Herman Assink, based on code from Michael Thomas thomasma@us.ibm.com or michael@michael-thomas.com */ class nl.idgis.giclient.gps.GPSconnector { private var objXMLSocket:XMLSocket = null; private var blnXmlSocketConnected:Boolean = false; private var currentFix:Boolean = null; private var currentPosition:Point = null; private var currentSpeed:Number = null; private var currentTrack:Number = null; private var previousFix:Boolean = null; private var previousPosition:Point = null; private var previousSpeed:Number = null; private var previousTrack:Number = null; private static var instance:GPSconnector = null; static var gpsSettings:SharedObject = null; private var gpsListeners:Array = null; static function getInstance():GPSconnector { if (instance == null) { instance = new GPSconnector(); gpsSettings = SharedObject.getLocal("GeoideGPSSettings", "/", false); if (gpsSettings == null) { trace("GPS-error: unable to crete of read settings"); return null; } //trace("gpsSettings.data.tcpport = " + gpsSettings.data.tcpport); if ( gpsSettings.data.tcpport == undefined ) gpsSettings.data.tcpport = "16872"; if ( gpsSettings.data.comport == undefined ) gpsSettings.data.comport = "COM6:"; if ( gpsSettings.data.baud == undefined ) gpsSettings.data.baud = "4800"; if ( gpsSettings.data.converter == undefined ) gpsSettings.data.converter = "RD"; gpsSettings.flush(0); //trace("gpsSettings.flush(0) = " + gpsSettings.flush(0)); } return instance; } function getConnected():Boolean { return blnXmlSocketConnected; } function GPSconnector() { this.objXMLSocket = new XMLSocket(); this.gpsListeners = new Array(); } function getPosition():Point { //trace("currentPosition = " + currentPosition); if (this.currentFix) { return currentPosition; } else { FrameWork(_root.frameWork).message("no GPS fix, x = " + currentPosition.getX() + " y = " + currentPosition.getY()); return currentPosition; } } function getTrack():Number { if (this.currentFix) { return this.currentTrack; } else { return null; } } function getSpeed():Number { if (this.currentFix) { return this.currentSpeed; } else { return null; } } function connectXmlSocket():Void { //trace("###In: connectXmlSocket("+strHostname+", "+strPort+") \n"); var strHostname:String = "localhost"; var strPort:String = gpsSettings.data.tcpport; var intPort:Number = parseInt(strPort); objXMLSocket.onConnect = Delegate.create(this, handleConnect); objXMLSocket.onClose = Delegate.create(this, handleClose); objXMLSocket.onXML = Delegate.create(this, handleIncoming); System.security.loadPolicyFile("xmlsocket://" + strHostname + ":" + strPort); //trace("Before: objXMLSocket.connect("+strHostname+", "+intPort+")\n"); if ( ! objXMLSocket.connect(strHostname, intPort) ) { trace("Error while trying to connect to XMLSocket, maybe trying to connect across hosts.\n"); blnXmlSocketConnected = false; } else { //trace("Trying to connect to socket.\n"); } } function closeXmlSocket():Void { trace("###In: closeXmlSocket()\n"); trace("Before: objXMLSocket.close();\n"); objXMLSocket.close(); blnXmlSocketConnected = false; trace("After: objXMLSocket.close();\n"); } private function handleConnect (blnSuccess:Boolean):Void { //trace("###In: _handleConnect(" + blnSuccess + ")\n"); if( blnSuccess ) { //trace("Connection Successful\n"); blnXmlSocketConnected = true; this.connectGPS(); } else { trace("Connection to GPS XMLSocket Failed\n"); blnXmlSocketConnected = false; } } private function handleClose():Void { trace("GPSProxy warning: connection closed\n"); blnXmlSocketConnected = false; this.currentFix = false; dispatchGPSevent(); } private function handleIncoming(objXml:XML):Void { //trace("###In: _handleIncoming(objXMl)\n"); //Success //trace("XML received: \n"); //trace("toString()=" + objXml.toString()+"\n"); var objChild:XMLNode = objXml.firstChild; if (objChild.nodeName == "location") { this.previousFix = this.currentFix; this.previousPosition = this.currentPosition; this.previousSpeed = this.currentSpeed; this.previousTrack = this.currentTrack; this.currentFix = XMLTools.getBooleanValue("fix", objChild); var x:Number = XMLTools.getNumberValue("x", objChild); var y:Number = XMLTools.getNumberValue("y", objChild); var z:Number = XMLTools.getNumberValue("altitude", objChild); this.currentPosition = new Point("EPSG:28992", x, y); this.currentSpeed = XMLTools.getNumberValue("speed", objChild); this.currentTrack = XMLTools.getNumberValue("track", objChild); dispatchGPSevent(); } } function connectGPS():Void { var objXml:XML = new XML(); var connectElement:XMLNode = objXml.createElement("connect"); objXml.appendChild(connectElement); /* var portElement:XMLNode = objXml.createElement("port"); connectElement.appendChild(portElement); var portTextElement:XMLNode = objXml.createTextNode(gpsSettings.data.comport); portElement.appendChild(portTextElement); var baudElement:XMLNode = objXml.createElement("baud"); connectElement.appendChild(baudElement); var baudTextElement:XMLNode = objXml.createTextNode(gpsSettings.data.baud); baudElement.appendChild(baudTextElement); */ var convElement:XMLNode = objXml.createElement("converter"); connectElement.appendChild(convElement); var convTextElement:XMLNode = objXml.createTextNode(gpsSettings.data.converter); convElement.appendChild(convTextElement); //trace("XML toString(): " + objXml.toString() + "\n"); if (blnXmlSocketConnected) { //trace("Before: objXMLSocket.send(objXml)\n"); objXMLSocket.send(objXml); //trace("After: objXMLSocket.send(objXml)\n"); } else { trace("Error: Not connected to a socket.\n"); } } function addGPSListener(gpsListener:GPSListener):Void { gpsListeners.push(gpsListener); } function removeGPSListener(gpsListener:GPSListener):Void { for (var i:Number = 0; i < gpsListeners.length; i++) { if (gpsListener == gpsListeners[i]) { gpsListeners.splice(i, 1); } } } private function dispatchGPSevent():Void { for (var i:Number = 0; i < gpsListeners.length; i++) { GPSListener(gpsListeners[i]).onGPSevent(); } } }