1
2
3 __version__ = '$Revision: 4791 $'.split()[1]
4 __date__ = '$Date: 2007-02-18 $'.split()[1]
5 __author__ = 'xmlbinmsg'
6
7 __doc__='''
8
9 Autogenerated python functions to serialize/deserialize binary messages.
10
11 Generated by: ./aisxmlbinmsg2py.py
12
13 Need to then wrap these functions with the outer AIS packet and then
14 convert the whole binary blob to a NMEA string. Those functions are
15 not currently provided in this file.
16
17 serialize: python to ais binary
18 deserialize: ais binary to python
19
20 The generated code uses translators.py, binary.py, and aisstring.py
21 which should be packaged with the resulting files.
22
23
24 @requires: U{epydoc<http://epydoc.sourceforge.net/>} > 3.0alpha3
25 @requires: U{BitVector<http://cheeseshop.python.org/pypi/BitVector>}
26
27 @author: '''+__author__+'''
28 @version: ''' + __version__ +'''
29 @var __date__: Date of last svn commit
30 @undocumented: __version__ __author__ __doc__ parser
31 @status: under development
32 @license: Generated code has no license
33 @todo: FIX: put in a description of the message here with fields and types.
34 '''
35
36 import sys
37 from decimal import Decimal
38 from BitVector import BitVector
39
40 import binary, aisstring
41
42
43 TrueBV = BitVector(bitstring="1")
44 "Why always rebuild the True bit? This should speed things up a bunch"
45 FalseBV = BitVector(bitstring="0")
46 "Why always rebuild the False bit? This should speed things up a bunch"
47
48
49 fieldList = (
50 'time_month',
51 'time_day',
52 'time_hour',
53 'time_min',
54 'stationid',
55 'pos_longitude',
56 'pos_latitude',
57 'flow',
58 'reserved',
59 )
60
61 fieldListPostgres = (
62 'time_month',
63 'time_day',
64 'time_hour',
65 'time_min',
66 'stationid',
67 'pos_longitude',
68 'pos_latitude',
69 'flow',
70 'reserved',
71 )
72
73 toPgFields = {
74 }
75 '''
76 Go to the Postgis field names from the straight field name
77 '''
78
79 fromPgFields = {
80 }
81 '''
82 Go from the Postgis field names to the straight field name
83 '''
84
85 pgTypes = {
86 }
87 '''
88 Lookup table for each postgis field name to get its type.
89 '''
90
91 -def encode(params, validate=False):
92 '''Create a sls_wind binary message payload to pack into an AIS Msg sls_wind.
93
94 Fields in params:
95 - time_month(uint): Time tag of measurement month 1..12
96 - time_day(uint): Time tag of measurement day of the month 1..31
97 - time_hour(uint): Time tag of measurement UTC hours 0..23
98 - time_min(uint): Time tag of measurement minutes
99 - stationid(aisstr6): Character identifier of the station
100 - pos_longitude(decimal): Location of measurement East West location
101 - pos_latitude(decimal): Location of measurement North South location
102 - flow(uint): Water flow
103 - reserved(uint): Reserved bits for future use (field automatically set to "0")
104 @param params: Dictionary of field names/values. Throws a ValueError exception if required is missing
105 @param validate: Set to true to cause checking to occur. Runs slower. FIX: not implemented.
106 @rtype: BitVector
107 @return: encoded binary message (for binary messages, this needs to be wrapped in a msg 8
108 @note: The returned bits may not be 6 bit aligned. It is up to you to pad out the bits.
109 '''
110
111 bvList = []
112 bvList.append(binary.setBitVectorSize(BitVector(intVal=params['time_month']),4))
113 bvList.append(binary.setBitVectorSize(BitVector(intVal=params['time_day']),5))
114 bvList.append(binary.setBitVectorSize(BitVector(intVal=params['time_hour']),5))
115 bvList.append(binary.setBitVectorSize(BitVector(intVal=params['time_min']),6))
116 if 'stationid' in params:
117 bvList.append(aisstring.encode(params['stationid'],42))
118 else:
119 bvList.append(aisstring.encode('@@@@@@@',42))
120 if 'pos_longitude' in params:
121 bvList.append(binary.bvFromSignedInt(int(Decimal(params['pos_longitude'])*Decimal('60000')),25))
122 else:
123 bvList.append(binary.bvFromSignedInt(10860000,25))
124 if 'pos_latitude' in params:
125 bvList.append(binary.bvFromSignedInt(int(Decimal(params['pos_latitude'])*Decimal('60000')),24))
126 else:
127 bvList.append(binary.bvFromSignedInt(5460000,24))
128 if 'flow' in params:
129 bvList.append(binary.setBitVectorSize(BitVector(intVal=params['flow']),10))
130 else:
131 bvList.append(binary.setBitVectorSize(BitVector(intVal=16383),10))
132 bvList.append(binary.setBitVectorSize(BitVector(intVal=0),19))
133
134 return binary.joinBV(bvList)
135
136 -def decode(bv, validate=False):
137 '''Unpack a sls_wind message
138
139 Fields in params:
140 - time_month(uint): Time tag of measurement month 1..12
141 - time_day(uint): Time tag of measurement day of the month 1..31
142 - time_hour(uint): Time tag of measurement UTC hours 0..23
143 - time_min(uint): Time tag of measurement minutes
144 - stationid(aisstr6): Character identifier of the station
145 - pos_longitude(decimal): Location of measurement East West location
146 - pos_latitude(decimal): Location of measurement North South location
147 - flow(uint): Water flow
148 - reserved(uint): Reserved bits for future use (field automatically set to "0")
149 @type bv: BitVector
150 @param bv: Bits defining a message
151 @param validate: Set to true to cause checking to occur. Runs slower. FIX: not implemented.
152 @rtype: dict
153 @return: params
154 '''
155
156
157
158
159 r = {}
160 r['time_month']=int(bv[0:4])
161 r['time_day']=int(bv[4:9])
162 r['time_hour']=int(bv[9:14])
163 r['time_min']=int(bv[14:20])
164 r['stationid']=aisstring.decode(bv[20:62])
165 r['pos_longitude']=Decimal(binary.signedIntFromBV(bv[62:87]))/Decimal('60000')
166 r['pos_latitude']=Decimal(binary.signedIntFromBV(bv[87:111]))/Decimal('60000')
167 r['flow']=int(bv[111:121])
168 r['reserved']=0
169 return r
170
173
176
179
181 return int(bv[14:20])
182
185
188
191
193 return int(bv[111:121])
194
196 return 0
197
198
200 out.write("<h3>sls_wind<h3>\n")
201 out.write("<table border=\"1\">\n")
202 out.write("<tr bgcolor=\"orange\">\n")
203 out.write("<th align=\"left\">Field Name</th>\n")
204 out.write("<th align=\"left\">Type</th>\n")
205 out.write("<th align=\"left\">Value</th>\n")
206 out.write("<th align=\"left\">Value in Lookup Table</th>\n")
207 out.write("<th align=\"left\">Units</th>\n")
208 out.write("\n")
209 out.write("<tr>\n")
210 out.write("<td>time_month</td>\n")
211 out.write("<td>uint</td>\n")
212 if 'time_month' in params:
213 out.write(" <td>"+str(params['time_month'])+"</td>\n")
214 out.write(" <td>"+str(params['time_month'])+"</td>\n")
215 out.write("</tr>\n")
216 out.write("\n")
217 out.write("<tr>\n")
218 out.write("<td>time_day</td>\n")
219 out.write("<td>uint</td>\n")
220 if 'time_day' in params:
221 out.write(" <td>"+str(params['time_day'])+"</td>\n")
222 out.write(" <td>"+str(params['time_day'])+"</td>\n")
223 out.write("</tr>\n")
224 out.write("\n")
225 out.write("<tr>\n")
226 out.write("<td>time_hour</td>\n")
227 out.write("<td>uint</td>\n")
228 if 'time_hour' in params:
229 out.write(" <td>"+str(params['time_hour'])+"</td>\n")
230 out.write(" <td>"+str(params['time_hour'])+"</td>\n")
231 out.write("</tr>\n")
232 out.write("\n")
233 out.write("<tr>\n")
234 out.write("<td>time_min</td>\n")
235 out.write("<td>uint</td>\n")
236 if 'time_min' in params:
237 out.write(" <td>"+str(params['time_min'])+"</td>\n")
238 out.write(" <td>"+str(params['time_min'])+"</td>\n")
239 out.write("</tr>\n")
240 out.write("\n")
241 out.write("<tr>\n")
242 out.write("<td>stationid</td>\n")
243 out.write("<td>aisstr6</td>\n")
244 if 'stationid' in params:
245 out.write(" <td>"+str(params['stationid'])+"</td>\n")
246 out.write(" <td>"+str(params['stationid'])+"</td>\n")
247 out.write("</tr>\n")
248 out.write("\n")
249 out.write("<tr>\n")
250 out.write("<td>pos_longitude</td>\n")
251 out.write("<td>decimal</td>\n")
252 if 'pos_longitude' in params:
253 out.write(" <td>"+str(params['pos_longitude'])+"</td>\n")
254 out.write(" <td>"+str(params['pos_longitude'])+"</td>\n")
255 out.write("<td>degrees</td>\n")
256 out.write("</tr>\n")
257 out.write("\n")
258 out.write("<tr>\n")
259 out.write("<td>pos_latitude</td>\n")
260 out.write("<td>decimal</td>\n")
261 if 'pos_latitude' in params:
262 out.write(" <td>"+str(params['pos_latitude'])+"</td>\n")
263 out.write(" <td>"+str(params['pos_latitude'])+"</td>\n")
264 out.write("<td>degrees</td>\n")
265 out.write("</tr>\n")
266 out.write("\n")
267 out.write("<tr>\n")
268 out.write("<td>flow</td>\n")
269 out.write("<td>uint</td>\n")
270 if 'flow' in params:
271 out.write(" <td>"+str(params['flow'])+"</td>\n")
272 out.write(" <td>"+str(params['flow'])+"</td>\n")
273 out.write("<td>m^3/s</td>\n")
274 out.write("</tr>\n")
275 out.write("\n")
276 out.write("<tr>\n")
277 out.write("<td>reserved</td>\n")
278 out.write("<td>uint</td>\n")
279 if 'reserved' in params:
280 out.write(" <td>"+str(params['reserved'])+"</td>\n")
281 out.write(" <td>"+str(params['reserved'])+"</td>\n")
282 out.write("</tr>\n")
283 out.write("</table>\n")
284
285
287 '''KML (Keyhole Markup Language) for Google Earth, but without the header/footer'''
288 out.write("\ <Placemark>\n")
289 out.write("\t <name>"+str(params['stationid'])+"</name>\n")
290 out.write("\t\t<description>\n")
291 import StringIO
292 buf = StringIO.StringIO()
293 printHtml(params,buf)
294 import cgi
295 out.write(cgi.escape(buf.getvalue()))
296 out.write("\t\t</description>\n")
297 out.write("\t\t<styleUrl>#m_ylw-pushpin_copy0</styleUrl>\n")
298 out.write("\t\t<Point>\n")
299 out.write("\t\t\t<coordinates>")
300 out.write(str(params['pos_longitude']))
301 out.write(',')
302 out.write(str(params['pos_latitude']))
303 out.write(",0</coordinates>\n")
304 out.write("\t\t</Point>\n")
305 out.write("\t</Placemark>\n")
306
307 -def printFields(params, out=sys.stdout, format='std', fieldList=None, dbType='postgres'):
308 '''Print a sls_wind message to stdout.
309
310 Fields in params:
311 - time_month(uint): Time tag of measurement month 1..12
312 - time_day(uint): Time tag of measurement day of the month 1..31
313 - time_hour(uint): Time tag of measurement UTC hours 0..23
314 - time_min(uint): Time tag of measurement minutes
315 - stationid(aisstr6): Character identifier of the station
316 - pos_longitude(decimal): Location of measurement East West location
317 - pos_latitude(decimal): Location of measurement North South location
318 - flow(uint): Water flow
319 - reserved(uint): Reserved bits for future use (field automatically set to "0")
320 @param params: Dictionary of field names/values.
321 @param out: File like object to write to
322 @rtype: stdout
323 @return: text to out
324 '''
325
326 if 'std'==format:
327 out.write("sls_wind:\n")
328 if 'time_month' in params: out.write(" time_month: "+str(params['time_month'])+"\n")
329 if 'time_day' in params: out.write(" time_day: "+str(params['time_day'])+"\n")
330 if 'time_hour' in params: out.write(" time_hour: "+str(params['time_hour'])+"\n")
331 if 'time_min' in params: out.write(" time_min: "+str(params['time_min'])+"\n")
332 if 'stationid' in params: out.write(" stationid: "+str(params['stationid'])+"\n")
333 if 'pos_longitude' in params: out.write(" pos_longitude: "+str(params['pos_longitude'])+"\n")
334 if 'pos_latitude' in params: out.write(" pos_latitude: "+str(params['pos_latitude'])+"\n")
335 if 'flow' in params: out.write(" flow: "+str(params['flow'])+"\n")
336 if 'reserved' in params: out.write(" reserved: "+str(params['reserved'])+"\n")
337 elif 'csv'==format:
338 if None == options.fieldList:
339 options.fieldList = fieldList
340 needComma = False;
341 for field in fieldList:
342 if needComma: out.write(',')
343 needComma = True
344 if field in params:
345 out.write(str(params[field]))
346
347 out.write("\n")
348 elif 'html'==format:
349 printHtml(params,out)
350 elif 'sql'==format:
351 sqlInsertStr(params,out,dbType=dbType)
352 elif 'kml'==format:
353 printKml(params,out)
354 elif 'kml-full'==format:
355 out.write("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n")
356 out.write("<kml xmlns=\"http://earth.google.com/kml/2.1\">\n")
357 out.write("<Document>\n")
358 out.write(" <name>sls_wind</name>\n")
359 printKml(params,out)
360 out.write("</Document>\n")
361 out.write("</kml>\n")
362 else:
363 print "ERROR: unknown format:",format
364 assert False
365
366 return
367
368
369
370
371
372 -def sqlCreateStr(outfile=sys.stdout, fields=None, extraFields=None
373 ,addCoastGuardFields=True
374 ,dbType='postgres'
375 ):
376 '''
377 Return the SQL CREATE command for this message type
378 @param outfile: file like object to print to.
379 @param fields: which fields to put in the create. Defaults to all.
380 @param extraFields: A sequence of tuples containing (name,sql type) for additional fields
381 @param addCoastGuardFields: Add the extra fields that come after the NMEA check some from the USCG N-AIS format
382 @param dbType: Which flavor of database we are using so that the create is tailored ('sqlite' or 'postgres')
383 @type addCoastGuardFields: bool
384 @return: sql create string
385 @rtype: str
386
387 @see: sqlCreate
388 '''
389 outfile.write(str(sqlCreate(fields,extraFields,addCoastGuardFields,dbType=dbType)))
390
391 -def sqlCreate(fields=None, extraFields=None, addCoastGuardFields=True, dbType='postgres'):
392 '''
393 Return the sqlhelp object to create the table.
394
395 @param fields: which fields to put in the create. Defaults to all.
396 @param extraFields: A sequence of tuples containing (name,sql type) for additional fields
397 @param addCoastGuardFields: Add the extra fields that come after the NMEA check some from the USCG N-AIS format
398 @type addCoastGuardFields: bool
399 @param dbType: Which flavor of database we are using so that the create is tailored ('sqlite' or 'postgres')
400 @return: An object that can be used to generate a return
401 @rtype: sqlhelp.create
402 '''
403 if None == fields: fields = fieldList
404 import sqlhelp
405 c = sqlhelp.create('sls_wind',dbType=dbType)
406 c.addPrimaryKey()
407 if 'time_month' in fields: c.addInt ('time_month')
408 if 'time_day' in fields: c.addInt ('time_day')
409 if 'time_hour' in fields: c.addInt ('time_hour')
410 if 'time_min' in fields: c.addInt ('time_min')
411 if 'stationid' in fields: c.addVarChar('stationid',7)
412 if 'pos_longitude' in fields: c.addDecimal('pos_longitude',7,4)
413 if 'pos_latitude' in fields: c.addDecimal('pos_latitude',7,4)
414 if 'flow' in fields: c.addInt ('flow')
415 if 'reserved' in fields: c.addInt ('reserved')
416
417 if addCoastGuardFields:
418
419
420
421
422
423 c.addVarChar('cg_r',15)
424 c.addInt('cg_sec')
425
426 c.addTimestamp('cg_timestamp')
427
428 return c
429
430 -def sqlInsertStr(params, outfile=sys.stdout, extraParams=None, dbType='postgres'):
431 '''
432 Return the SQL INSERT command for this message type
433 @param params: dictionary of values keyed by field name
434 @param outfile: file like object to print to.
435 @param extraParams: A sequence of tuples containing (name,sql type) for additional fields
436 @return: sql create string
437 @rtype: str
438
439 @see: sqlCreate
440 '''
441 outfile.write(str(sqlInsert(params,extraParams,dbType=dbType)))
442
443
444 -def sqlInsert(params,extraParams=None,dbType='postgres'):
445 '''
446 Give the SQL INSERT statement
447 @param params: dict keyed by field name of values
448 @param extraParams: any extra fields that you have created beyond the normal ais message fields
449 @rtype: sqlhelp.insert
450 @return: insert class instance
451 @todo: allow optional type checking of params?
452 @warning: this will take invalid keys happily and do what???
453 '''
454 import sqlhelp
455 i = sqlhelp.insert('sls_wind',dbType=dbType)
456
457 if dbType=='postgres':
458 finished = []
459 for key in params:
460 if key in finished:
461 continue
462
463 if key not in toPgFields and key not in fromPgFields:
464 if type(params[key])==Decimal: i.add(key,float(params[key]))
465 else: i.add(key,params[key])
466 else:
467 if key in fromPgFields:
468 val = params[key]
469
470 i.addPostGIS(key,val)
471 finished.append(key)
472 else:
473
474 pgName = toPgFields[key]
475
476 valStr=pgTypes[pgName]+'('
477 vals = []
478 for nonPgKey in fromPgFields[pgName]:
479 vals.append(str(params[nonPgKey]))
480 finished.append(nonPgKey)
481 valStr+=' '.join(vals)+')'
482 i.addPostGIS(pgName,valStr)
483 else:
484 for key in params:
485 if type(params[key])==Decimal: i.add(key,float(params[key]))
486 else: i.add(key,params[key])
487
488 if None != extraParams:
489 for key in extraParams:
490 i.add(key,extraParams[key])
491
492 return i
493
494
495
496
497
498 import unittest
500 '''Return a params file base on the testvalue tags.
501 @rtype: dict
502 @return: params based on testvalue tags
503 '''
504 params = {}
505 params['time_month'] = 2
506 params['time_day'] = 28
507 params['time_hour'] = 23
508 params['time_min'] = 45
509 params['stationid'] = 'A345678'
510 params['pos_longitude'] = Decimal('-122.16328')
511 params['pos_latitude'] = Decimal('37.42446')
512 params['flow'] = 43
513 params['reserved'] = 0
514
515 return params
516
518 '''Use testvalue tag text from each type to build test case the sls_wind message'''
520
521 params = testParams()
522 bits = encode(params)
523 r = decode(bits)
524
525
526 self.failUnlessEqual(r['time_month'],params['time_month'])
527 self.failUnlessEqual(r['time_day'],params['time_day'])
528 self.failUnlessEqual(r['time_hour'],params['time_hour'])
529 self.failUnlessEqual(r['time_min'],params['time_min'])
530 self.failUnlessEqual(r['stationid'],params['stationid'])
531 self.failUnlessAlmostEqual(r['pos_longitude'],params['pos_longitude'],4)
532 self.failUnlessAlmostEqual(r['pos_latitude'],params['pos_latitude'],4)
533 self.failUnlessEqual(r['flow'],params['flow'])
534 self.failUnlessEqual(r['reserved'],params['reserved'])
535
537 parser.add_option('-d','--decode',dest='doDecode',default=False,action='store_true',
538 help='decode a "sls_wind" AIS message')
539 parser.add_option('-e','--encode',dest='doEncode',default=False,action='store_true',
540 help='encode a "sls_wind" AIS message')
541 parser.add_option('--time_month-field', dest='time_monthField',metavar='uint',type='int'
542 ,help='Field parameter value [default: %default]')
543 parser.add_option('--time_day-field', dest='time_dayField',metavar='uint',type='int'
544 ,help='Field parameter value [default: %default]')
545 parser.add_option('--time_hour-field', dest='time_hourField',metavar='uint',type='int'
546 ,help='Field parameter value [default: %default]')
547 parser.add_option('--time_min-field', dest='time_minField',metavar='uint',type='int'
548 ,help='Field parameter value [default: %default]')
549 parser.add_option('--stationid-field', dest='stationidField',default='@@@@@@@',metavar='aisstr6',type='string'
550 ,help='Field parameter value [default: %default]')
551 parser.add_option('--pos_longitude-field', dest='pos_longitudeField',default=Decimal('181'),metavar='decimal',type='string'
552 ,help='Field parameter value [default: %default]')
553 parser.add_option('--pos_latitude-field', dest='pos_latitudeField',default=Decimal('91'),metavar='decimal',type='string'
554 ,help='Field parameter value [default: %default]')
555 parser.add_option('--flow-field', dest='flowField',default=16383,metavar='uint',type='int'
556 ,help='Field parameter value [default: %default]')
557
558
559 if __name__=='__main__':
560
561 from optparse import OptionParser
562 parser = OptionParser(usage="%prog [options]",
563 version="%prog "+__version__)
564
565 parser.add_option('--doc-test',dest='doctest',default=False,action='store_true',
566 help='run the documentation tests')
567 parser.add_option('--unit-test',dest='unittest',default=False,action='store_true',
568 help='run the unit tests')
569 parser.add_option('-v','--verbose',dest='verbose',default=False,action='store_true',
570 help='Make the test output verbose')
571
572
573
574 typeChoices = ('binary','nmeapayload','nmea')
575 parser.add_option('-t','--type',choices=typeChoices,type='choice',dest='ioType'
576 ,default='nmeapayload'
577 ,help='What kind of string to write for encoding ('+', '.join(typeChoices)+') [default: %default]')
578
579
580 outputChoices = ('std','html','csv','sql' , 'kml','kml-full')
581 parser.add_option('-T','--output-type',choices=outputChoices,type='choice',dest='outputType'
582 ,default='std'
583 ,help='What kind of string to output ('+', '.join(outputChoices)+') [default: %default]')
584
585 parser.add_option('-o','--output',dest='outputFileName',default=None,
586 help='Name of the python file to write [default: stdout]')
587
588 parser.add_option('-f','--fields',dest='fieldList',default=None, action='append',
589 choices=fieldList,
590 help='Which fields to include in the output. Currently only for csv output [default: all]')
591
592 parser.add_option('-p','--print-csv-field-list',dest='printCsvfieldList',default=False,action='store_true',
593 help='Print the field name for csv')
594
595 parser.add_option('-c','--sql-create',dest='sqlCreate',default=False,action='store_true',
596 help='Print out an sql create command for the table.')
597
598 dbChoices = ('sqlite','postgres')
599 parser.add_option('-D','--db-type',dest='dbType',default='postgres'
600 ,choices=dbChoices,type='choice'
601 ,help='What kind of database ('+', '.join(dbChoices)+') [default: %default]')
602
603 addMsgOptions(parser)
604
605 (options,args) = parser.parse_args()
606 success=True
607
608 if options.doctest:
609 import os; print os.path.basename(sys.argv[0]), 'doctests ...',
610 sys.argv= [sys.argv[0]]
611 if options.verbose: sys.argv.append('-v')
612 import doctest
613 numfail,numtests=doctest.testmod()
614 if numfail==0: print 'ok'
615 else:
616 print 'FAILED'
617 success=False
618
619 if not success: sys.exit('Something Failed')
620 del success
621
622 if options.unittest:
623 sys.argv = [sys.argv[0]]
624 if options.verbose: sys.argv.append('-v')
625 unittest.main()
626
627 outfile = sys.stdout
628 if None!=options.outputFileName:
629 outfile = file(options.outputFileName,'w')
630
631
632 if options.doEncode:
633
634 if None==options.time_monthField: parser.error("missing value for time_monthField")
635 if None==options.time_dayField: parser.error("missing value for time_dayField")
636 if None==options.time_hourField: parser.error("missing value for time_hourField")
637 if None==options.time_minField: parser.error("missing value for time_minField")
638 if None==options.stationidField: parser.error("missing value for stationidField")
639 if None==options.pos_longitudeField: parser.error("missing value for pos_longitudeField")
640 if None==options.pos_latitudeField: parser.error("missing value for pos_latitudeField")
641 if None==options.flowField: parser.error("missing value for flowField")
642 msgDict={
643 'time_month': options.time_monthField,
644 'time_day': options.time_dayField,
645 'time_hour': options.time_hourField,
646 'time_min': options.time_minField,
647 'stationid': options.stationidField,
648 'pos_longitude': options.pos_longitudeField,
649 'pos_latitude': options.pos_latitudeField,
650 'flow': options.flowField,
651 'reserved': '0',
652 }
653
654 bits = encode(msgDict)
655 if 'binary'==options.ioType: print str(bits)
656 elif 'nmeapayload'==options.ioType:
657
658 print "bitLen",len(bits)
659 bitLen=len(bits)
660 if bitLen%6!=0:
661 bits = bits + BitVector(size=(6 - (bitLen%6)))
662 print "result:",binary.bitvectoais6(bits)[0]
663
664
665
666 elif 'nmea'==options.ioType: sys.exit("FIX: need to implement this capability")
667 else: sys.exit('ERROR: unknown ioType. Help!')
668
669
670 if options.sqlCreate:
671 sqlCreateStr(outfile,options.fieldList,dbType=options.dbType)
672
673 if options.printCsvfieldList:
674
675 if None == options.fieldList: options.fieldList = fieldList
676 import StringIO
677 buf = StringIO.StringIO()
678 for field in options.fieldList:
679 buf.write(field+',')
680 result = buf.getvalue()
681 if result[-1] == ',': print result[:-1]
682 else: print result
683
684 if options.doDecode:
685 for msg in args:
686 bv = None
687
688 if msg[0] in ('$','!') and msg[3:6] in ('VDM','VDO'):
689
690
691 bv = binary.ais6tobitvec(msg.split(',')[5])
692 else:
693
694 binaryMsg=True
695 for c in msg:
696 if c not in ('0','1'):
697 binaryMsg=False
698 break
699 if binaryMsg:
700 bv = BitVector(bitstring=msg)
701 else:
702 bv = binary.ais6tobitvec(msg)
703
704 printFields(decode(bv)
705 ,out=outfile
706 ,format=options.outputType
707 ,fieldList=options.fieldList
708 ,dbType=options.dbType
709 )
710