Advertisement
peter9477

MagTest to parse magnetometer data on PlayBook v1.0.7

Nov 2nd, 2011
265
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. // Magnetometer access from raw AS3 for the PlayBook
  2. // Copyright 2011 Peter Hansen
  3. // Use under MIT License: see http://www.opensource.org/licenses/mit-license.php
  4.  
  5. package {
  6.     import flash.desktop.NativeApplication;
  7.     import flash.display.Sprite;
  8.     import flash.display.StageAlign;
  9.     import flash.display.StageScaleMode;
  10.  
  11.     import flash.events.Event;
  12.     import flash.events.IOErrorEvent;
  13.     import flash.events.ProgressEvent;
  14.  
  15.     import flash.filesystem.File;
  16.     import flash.filesystem.FileMode;
  17.     import flash.filesystem.FileStream;
  18.  
  19.     import flash.text.TextFieldAutoSize;
  20.     import flash.text.TextFormat;
  21.     import flash.utils.*;
  22.     import flash.utils.ByteArray;
  23.  
  24.     import mx.utils.ObjectUtil;
  25.  
  26.     import qnx.system.QNXSystem;
  27.     import qnx.system.QNXSystemPowerMode;
  28.     import qnx.ui.text.Label;
  29.  
  30.  
  31.     [SWF(backgroundColor="#cccccc")]
  32.     public class MagTest extends Sprite {
  33.         private var label:Label = new Label();
  34.  
  35.         private var base_time:int = getTimer();
  36.  
  37.         private var path:File = new File('/dev/sensor/mag');
  38.         private var file:FileStream;
  39.  
  40.         public function MagTest() {
  41.             stage.align = StageAlign.TOP_LEFT;
  42.             stage.scaleMode = StageScaleMode.NO_SCALE;
  43.  
  44.             QNXSystem.system.inactivePowerMode = QNXSystemPowerMode.THROTTLED;
  45.  
  46.             var fmt:TextFormat = new TextFormat();
  47.             fmt.font = 'Courier New';
  48.             fmt.size = 24;
  49.  
  50.             label.format = fmt;
  51.             label.autoSize = TextFieldAutoSize.LEFT;
  52.             label.multiline = true;
  53.             label.x = 10;
  54.             label.y = 10;
  55.             label.width = 1000;
  56.             label.height = 500;
  57.             label.text = 'Go west, young man.';
  58.             addChild(label);
  59.  
  60.             NativeApplication.nativeApplication.addEventListener(Event.EXITING, onExiting);
  61.  
  62.             trace(getTimer(), 'starting');
  63.  
  64.             file = new FileStream();
  65.             file.addEventListener(IOErrorEvent.IO_ERROR, onIOErrorEvent);
  66.             file.addEventListener(ProgressEvent.PROGRESS, onProgressEvent);
  67.             file.openAsync(path, FileMode.READ);
  68.  
  69.             var hexdigits:String = '0123456789abcdef';
  70.             for (var i:int = 0; i < 16; i++)
  71.                 for (var j:int = 0; j < 16; j++) {
  72.                     bin2hex[i * 16 + j] = hexdigits.charAt(i) + hexdigits.charAt(j);
  73.                 }
  74.         }
  75.  
  76.         public var bin2hex:Array = [];
  77.  
  78.         private function onExiting(e:Event):void {
  79.             trace(getTimer(), 'exiting');
  80.             file.close();
  81.         }
  82.  
  83.  
  84.         private function onIOErrorEvent(e:IOErrorEvent):void {
  85.             trace(getTimer(), 'io error', e.toString());
  86.             label.text = e.toString();
  87.         }
  88.  
  89.         public var buffer:ByteArray = new ByteArray();
  90.         public var packet_count:int;
  91.         public var parser:Parser = new Parser();
  92.  
  93.         // generally getting 8192 bytes per event, but don't assume anything yet
  94.         // about how big a block we get
  95.         private function onProgressEvent(e:ProgressEvent):void {
  96.             // buffer all available data from file
  97.             buffer.length = 0;
  98.             file.readBytes(buffer, 0, file.bytesAvailable);
  99.  
  100.             // consume buffer, one packet at a time
  101.             var packet:Object;
  102.             while (parser.feed(buffer)) {
  103.                 packet_count++;
  104.                 packet = parser.getPacket();
  105.  
  106.                 if (buffer.position >= buffer.length)
  107.                     break;
  108.             }
  109.  
  110.             // display last packet...
  111.             if (packet) {
  112.                 label.text = formatPacket(packet);
  113.                 trace('data', packet.time.toFixed(3), packet.x.toFixed(3), packet.y.toFixed(3), packet.z.toFixed(3));
  114.             }
  115.         }
  116.  
  117.  
  118.         public function formatPacket(packet:Object):String {
  119.             var rows:Array = [];
  120.             rows.push('time: ' + packet.time.toFixed(9));
  121.             rows.push('x: ' + packet.x.toFixed(3));
  122.             rows.push('y: ' + packet.y.toFixed(3));
  123.             rows.push('z: ' + packet.z.toFixed(3));
  124.  
  125.             var header:String = (getTimer() / 1000).toFixed(3);
  126.             var rate:Number = packet_count / (getTimer() - base_time) * 1000.0;
  127.             header += ': ' + rate.toFixed(1) + ' Hz';
  128.  
  129.             var msg:String = rows.join('\n');
  130.             return header + ':\n' + msg;
  131.         }
  132.     }
  133. }
  134.  
  135.  
  136. import flash.utils.ByteArray;
  137.  
  138. class Parser {
  139.     private var length:int;
  140.     private var data:ByteArray = new ByteArray();
  141.  
  142.     public function Parser() {
  143.         data.endian = 'littleEndian'; // default is bigEndian
  144.     }
  145.  
  146.     public function feed(buffer:ByteArray):Boolean {
  147.         if (!length) {
  148.             length = buffer.readByte();
  149.             if (!length)
  150.                 throw new Error('parse error, length cannot be 0');
  151.  
  152.             data.length = 0;
  153.             data.writeByte(length);
  154.         }
  155.  
  156.         var to_read:int = length - data.length;
  157.         var avail:int = buffer.length - buffer.position;
  158.         if (to_read > avail)
  159.             to_read = avail;
  160.  
  161.         buffer.readBytes(data, data.length, to_read);
  162.  
  163.         if (data.length >= length) {
  164.             length = 0; // ready for next packet
  165.             return true;
  166.         }
  167.         else
  168.             return false;
  169.     }
  170.  
  171.     // disassemble a full packet
  172.     //~ 00000000: 6000000001000000 0000000002000000 `...............
  173.     //~ 00000010: 621d20e2aaa00000 628833c19a01a3c1 b.......b.3.....
  174.     //~ 00000020: 52653fc200000000 0000000000000000 Re?.............
  175.     //~ 00000030: 0000000000000000 0000000000000000 ................
  176.     //~ 00000040: 0000000000000000 0000000000000000 ................
  177.     //~ 00000050: 0000000000000000 0000000000000000 ................
  178.     public function getPacket():Object {
  179.         var obj:Object = {length: data.length};
  180.  
  181.         data.position = 0x10;
  182.         var loword:Number = data.readUnsignedInt();
  183.         var hiword:Number = data.readUnsignedInt();
  184.         obj.time = (hiword * 0x100000000 + loword) / 1e9;
  185.  
  186.         // no idea if these are really x, y, or z, or in this order
  187.         obj.x = data.readFloat();
  188.         obj.y = data.readFloat();
  189.         obj.z = data.readFloat();
  190.  
  191.         return obj;
  192.     }
  193. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement