<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DZone Snippets: Ejot's Code Snippets</title>
    <link>http://snippets.dzone.com/posts</link>
    <pubDate>Fri, 25 Jul 2008 00:47:45 GMT</pubDate>
    <description>DZone Snippets: Ejot's Code Snippets</description>
    <item>
      <title>Python: NMEA GPGGA parser</title>
      <link>http://snippets.dzone.com/posts/show/4782</link>
      <description>Not tested extensivly, use with caution! I used an LD-1W and it seems to work alright with this parser.&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;class GPGGAParser(object):&lt;br /&gt;	import logging&lt;br /&gt;	&lt;br /&gt;	def __init__(self, sentance):&lt;br /&gt;		import time, logging&lt;br /&gt;		&lt;br /&gt;		logging.debug("GPPGAParser started")&lt;br /&gt;		logging.debug("Trying to parse: "+sentance)&lt;br /&gt;		(self.format,&lt;br /&gt;		 self.utc,&lt;br /&gt;		 self.latitude, &lt;br /&gt;		 self.northsouth, &lt;br /&gt;		 self.longitude, &lt;br /&gt;		 self.eastwest, &lt;br /&gt;		 self.quality, &lt;br /&gt;		 self.number_of_satellites_in_use, &lt;br /&gt;		 self.horizontal_dilution, &lt;br /&gt;		 self.altitude, &lt;br /&gt;		 self.above_sea_unit, &lt;br /&gt;		 self.geoidal_separation, &lt;br /&gt;		 self.geoidal_separation_unit, &lt;br /&gt;		 self.data_age, &lt;br /&gt;		 self.diff_ref_stationID) = sentance.split(",")&lt;br /&gt;&lt;br /&gt;		latitude_in=float(self.latitude)&lt;br /&gt;		longitude_in=float(self.longitude)&lt;br /&gt;		if self.northsouth == 'S':&lt;br /&gt;			latitude_in = -latitude_in&lt;br /&gt;		if self.eastwest == 'W':&lt;br /&gt;			longitude_in = -longitude_in&lt;br /&gt;&lt;br /&gt;		latitude_degrees = int(latitude_in/100)&lt;br /&gt;		latitude_minutes = latitude_in - latitude_degrees*100&lt;br /&gt;		&lt;br /&gt;		longitude_degrees = int(longitude_in/100)&lt;br /&gt;		longitude_minutes = longitude_in - longitude_degrees*100&lt;br /&gt;		&lt;br /&gt;		self.latitude = latitude_degrees + (latitude_minutes/60)&lt;br /&gt;		self.longitude = longitude_degrees + (longitude_minutes/60)&lt;br /&gt;		&lt;br /&gt;		self.timeOfFix = time.strftime("%H:%M:%S", time.strptime(self.utc.split(".")[0],"%H%M%S"))&lt;br /&gt;		self.altitude = float(self.altitude)&lt;br /&gt;		logging.debug("GPPGAParser finished")&lt;br /&gt;&lt;/code&gt;</description>
      <pubDate>Fri, 16 Nov 2007 14:12:36 GMT</pubDate>
      <guid>http://snippets.dzone.com/posts/show/4782</guid>
      <author>ejot (Magnus Persson)</author>
    </item>
    <item>
      <title>PyS60: Bluetooth GPS polling class</title>
      <link>http://snippets.dzone.com/posts/show/4781</link>
      <description>Threaded approach for reading NMEA data from a bluetooth GPS.&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;import thread, socket&lt;br /&gt;&lt;br /&gt;class BTGPSPoller(object):&lt;br /&gt;	def __init__(self, address):&lt;br /&gt;		address, services = socket.bt_discover(address)&lt;br /&gt;		self.target = (address, services.values()[0])&lt;br /&gt;		self.active = True&lt;br /&gt;		self.connected = False&lt;br /&gt;		self.lock = thread.allocate_lock()&lt;br /&gt;		self.sentances = list()&lt;br /&gt;		&lt;br /&gt;	def connect(self):&lt;br /&gt;		if not self.connected:&lt;br /&gt;			thread.start_new_thread(self.run, ())&lt;br /&gt;&lt;br /&gt;	def run(self):&lt;br /&gt;		print "BTGPSPoller thread activated"&lt;br /&gt;		try:&lt;br /&gt;			conn = socket.socket(socket.AF_BT, socket.SOCK_STREAM)&lt;br /&gt;			conn.connect(self.target)&lt;br /&gt;			self.connected = True&lt;br /&gt;		except:&lt;br /&gt;			print "Unable to connect"&lt;br /&gt;		&lt;br /&gt;		if self.connected:&lt;br /&gt;			try:&lt;br /&gt;				to_gps = conn.makefile("r", 0)&lt;br /&gt;			except:&lt;br /&gt;				print "Failure calling conn.makefile()"&lt;br /&gt;			while self.active:&lt;br /&gt;				#e32.ao_sleep(1)&lt;br /&gt;				msg = None&lt;br /&gt;				try:&lt;br /&gt;					msg = to_gps.readline()&lt;br /&gt;					if not msg == None and msg.startswith("$GPGGA"):&lt;br /&gt;						gps_data = msg.split(",")&lt;br /&gt;						if not gps_data[2] == "":&lt;br /&gt;							self.lock.acquire()&lt;br /&gt;							self.sentances.append(msg)&lt;br /&gt;							if len(self.sentances) &gt; 10:&lt;br /&gt;								self.sentances.pop(0)&lt;br /&gt;							self.lock.release()&lt;br /&gt;				except:&lt;br /&gt;					self.active = False&lt;br /&gt;&lt;br /&gt;			try:&lt;br /&gt;				to_gps.close()&lt;br /&gt;				conn.close()&lt;br /&gt;				self.connected = False&lt;br /&gt;				print "Closed and disconnected"&lt;br /&gt;			except:&lt;br /&gt;				self.connected = False&lt;br /&gt;				print "Unable to close"&lt;br /&gt;&lt;br /&gt;	def disconnect(self):&lt;br /&gt;		self.active = False&lt;br /&gt;		print "Disconnecting from GPS"&lt;br /&gt;&lt;br /&gt;	def getSentances(self):&lt;br /&gt;		self.lock.acquire()&lt;br /&gt;		l = self.sentances[:]&lt;br /&gt;		self.lock.release()&lt;br /&gt;		return l&lt;br /&gt;&lt;/code&gt;</description>
      <pubDate>Fri, 16 Nov 2007 14:09:19 GMT</pubDate>
      <guid>http://snippets.dzone.com/posts/show/4781</guid>
      <author>ejot (Magnus Persson)</author>
    </item>
    <item>
      <title>Python: Transmitter. A convenience class to simplify HTTP POST handling.</title>
      <link>http://snippets.dzone.com/posts/show/4780</link>
      <description>I make no claims for quality of code :)&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;import httplib&lt;br /&gt;try:&lt;br /&gt;	import logging&lt;br /&gt;	LOGGINGENABLED = True&lt;br /&gt;except ImportError:&lt;br /&gt;	LOGGINGENABLED = False&lt;br /&gt;&lt;br /&gt;DOLOGGING = True&lt;br /&gt;&lt;br /&gt;def log(s):&lt;br /&gt;	if DOLOGGING:&lt;br /&gt;		if LOGGINGENABLED:&lt;br /&gt;			logging.info(s)&lt;br /&gt;		else:&lt;br /&gt;			print unicode(s)&lt;br /&gt;&lt;br /&gt;class BaseTransmitter(object):&lt;br /&gt;	"""Base class for all transmitters.&lt;br /&gt;	&lt;br /&gt;		By itself, it does nothing. Subclass this and use inherited addItem to inject parameters.&lt;br /&gt;		Call transmit() when done.&lt;br /&gt;		&lt;br /&gt;		See classes BasicParam and BinaryParam, which are used with addItem"""&lt;br /&gt;		&lt;br /&gt;	def __init__(self):&lt;br /&gt;		super(BaseTransmitter, self).__init__()&lt;br /&gt;		self.items = []&lt;br /&gt;		self.boundary = '------------ThIs_Is_tHe_bouNdaRY_$' # Kudos!&lt;br /&gt;&lt;br /&gt;	def addItem(self, item):&lt;br /&gt;		"""Adds an parameter to be sent in the request.&lt;br /&gt;		&lt;br /&gt;			The added item _must_ define a property 'part' that is a list of strings&lt;br /&gt;			ending with a CRLF (\r\n). Do not include the boundary marker (handled&lt;br /&gt;			in BaseTransmitter.transmit())&lt;br /&gt;			&lt;br /&gt;			See BasicParam and FileParam for supported use."""&lt;br /&gt;			&lt;br /&gt;		self.items.append(item)&lt;br /&gt;&lt;br /&gt;	def transmit(self, host, selector, port=80):&lt;br /&gt;		"""Sends request to specified host/selector on default port 80.&lt;br /&gt;		&lt;br /&gt;			Checks that there are items to send, otherwise raises an ValueError exception.&lt;br /&gt;			&lt;br /&gt;			Returns a tuple consisting of:&lt;br /&gt;			- Returned document&lt;br /&gt;			- server response code (e.g. '200' if all goes well)&lt;br /&gt;			- server response string corresponding to response code&lt;br /&gt;			- any RFC822 headers in the response from the server"""&lt;br /&gt;			&lt;br /&gt;		if len(self.items) &lt; 1:&lt;br /&gt;			raise ValueError, "Transmitter contains no items, will not send empty request."&lt;br /&gt;		&lt;br /&gt;		l = []&lt;br /&gt;		CRLF = "\r\n"&lt;br /&gt;		for item in self.items:&lt;br /&gt;			l.append("--" + self.boundary + CRLF)&lt;br /&gt;			l.extend(item.part)&lt;br /&gt;		l.append("--" + self.boundary + CRLF)&lt;br /&gt;		l.append('' + CRLF)&lt;br /&gt;		body = ''.join(l)&lt;br /&gt;		h = httplib.HTTP(host, port)&lt;br /&gt;		h.putrequest('POST', selector)&lt;br /&gt;		h.putheader('content-type', 'multipart/form-data; boundary=%s' % self.boundary)&lt;br /&gt;		h.putheader('content-length', str(len(body)))&lt;br /&gt;		h.putheader('host', host)&lt;br /&gt;		h.endheaders()&lt;br /&gt;&lt;br /&gt;		log("Transmitting to %s:%s %s" % (host, port, selector))&lt;br /&gt;		h.send(body)&lt;br /&gt;		errcode, errmsg, headers = h.getreply()&lt;br /&gt;&lt;br /&gt;		return h.file.read(), errcode, errmsg, headers&lt;br /&gt;&lt;br /&gt;class BasicParam(object):&lt;br /&gt;	"""A basic parameter, i.e. key/value pair"""&lt;br /&gt;	def __init__(self, key, value):&lt;br /&gt;		super(BasicParam, self).__init__()&lt;br /&gt;		&lt;br /&gt;		if not value:&lt;br /&gt;			value=""&lt;br /&gt;		&lt;br /&gt;		L=[]&lt;br /&gt;		L.append('Content-Disposition: form-data; name="%s"' % key.encode("iso-8859-1"))&lt;br /&gt;		L.append('')&lt;br /&gt;		L.append(value.encode("iso-8859-1"))&lt;br /&gt;		L.append('')&lt;br /&gt;		self.part = '\r\n'.join(L)&lt;br /&gt;		log("BasicParam %s added" % key)&lt;br /&gt;&lt;br /&gt;class FileParam(object):&lt;br /&gt;	"""A file parameter&lt;br /&gt;	&lt;br /&gt;		Specify the key used in the request, the absolute path to the file and optional&lt;br /&gt;		content type for the fragment.&lt;br /&gt;		&lt;br /&gt;		Checks that the file exists and is actually a file, or raises an IOError."""&lt;br /&gt;		&lt;br /&gt;	def __init__(self, key, absolutefile, contentType="application/octet-stream"):&lt;br /&gt;		import os.path&lt;br /&gt;		super(FileParam, self).__init__()&lt;br /&gt;		if not os.path.exists(absolutefile):&lt;br /&gt;			raise IOError, 'Referenced file "%s" is invalid/nonexistent' % absolutefile&lt;br /&gt;		if not os.path.isfile(absolutefile):&lt;br /&gt;			raise IOError, 'Path does not point to a file (directory?)'&lt;br /&gt;&lt;br /&gt;		import os.path&lt;br /&gt;		f = open(absolutefile,'rb')&lt;br /&gt;		L=[]&lt;br /&gt;		L.append('Content-Disposition: form-data; name="%s"; filename="%s"' % (key.encode("iso-8859-1"), os.path.basename(absolutefile).encode("iso-8859-1")))&lt;br /&gt;		L.append('Content-Type: ' + contentType)&lt;br /&gt;		L.append('')&lt;br /&gt;		L.append(f.read())&lt;br /&gt;		L.append('')&lt;br /&gt;		self.part = '\r\n'.join(L)&lt;br /&gt;		log("FileParam %s added" % key)&lt;br /&gt;&lt;br /&gt;class Base64Param(object):&lt;br /&gt;	"""A base64 parameter contained in value. This will NOT be sent as a 'file'"""&lt;br /&gt;	def __init__(self, key, value):&lt;br /&gt;		import base64&lt;br /&gt;		&lt;br /&gt;		super(Base64Param, self).__init__()&lt;br /&gt;		L=[]&lt;br /&gt;		L.append('Content-Disposition: form-data; name="%s"' % key.encode("iso-8859-1"))&lt;br /&gt;		L.append('')&lt;br /&gt;		L.append(base64.encodestring(value))&lt;br /&gt;		L.append('')&lt;br /&gt;		self.part = '\r\n'.join(L)&lt;br /&gt;		log("Base64Param %s added" % key)&lt;br /&gt;&lt;br /&gt;class BinaryParam(object):&lt;br /&gt;	"""A binary parameter which is contained in value. Filename will be set to YYYYMMDD_HHMMSS"""&lt;br /&gt;	def __init__(self, key, value, contentType="application/octet-stream"):	&lt;br /&gt;		import time&lt;br /&gt;		&lt;br /&gt;		super(BinaryParam, self).__init__()&lt;br /&gt;		L=[]&lt;br /&gt;		L.append('Content-Disposition: form-data; name="%s"; filename="%s"' % (key.encode("iso-8859-1"),time.strftime("%Y%m%d_%H%M%S")))&lt;br /&gt;		L.append('Content-Type: ' + contentType)&lt;br /&gt;		L.append('')&lt;br /&gt;		L.append(value)&lt;br /&gt;		L.append('')&lt;br /&gt;		self.part = '\r\n'.join(L)&lt;br /&gt;		log("BinaryParam %s added" % key)&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Simple usage:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;#!/usr/bin/python&lt;br /&gt;from Transmitter import *&lt;br /&gt;&lt;br /&gt;class LogTransmitter(BaseTransmitter):&lt;br /&gt;	def __init__(self, host, paramName, paramValue, port=80):&lt;br /&gt;		super(LogTransmitter, self).__init__()&lt;br /&gt;		self.host = host&lt;br /&gt;		self.selector = "/endpoint/"&lt;br /&gt;		self.port = port&lt;br /&gt;&lt;br /&gt;		self.addItem(BasicParam(paramName, paramValue ))&lt;br /&gt;&lt;br /&gt;	def transmit(self):&lt;br /&gt;		return super(LogTransmitter, self).transmit(self.host, self.selector, self.port)&lt;br /&gt;&lt;br /&gt;t = LogTransmitter("domain.net", "myParam", "myValue")&lt;br /&gt;print repr(t.transmit())&lt;br /&gt;&lt;/code&gt;</description>
      <pubDate>Fri, 16 Nov 2007 14:01:33 GMT</pubDate>
      <guid>http://snippets.dzone.com/posts/show/4780</guid>
      <author>ejot (Magnus Persson)</author>
    </item>
  </channel>
</rss>
