Fully featured I2C and SPI driver for CEVA (Hilcrest)'s BNO080 and FSM300 Inertial Measurement Units.

Dependents:   BNO080-Examples BNO080-Examples

BNO080 Driver

by Jamie Smith / USC Rocket Propulsion Lab

After lots of development, we are proud to present our driver for the Hilcrest BNO080 IMU! This driver is inspired by SparkFun and Nathan Seidle's Arduino driver for this chip, but has been substantially rewritten and adapted.

It supports the main features of the chip, such as reading rotation and acceleration data, as well as some of its more esoteric functionality, such as counting steps and detecting whether the device is being hand-held.

Features

  • Support for 15 different data reports from the IMU, from acceleration to rotation to tap detection
  • Support for reading of sensor data, and automatic checking of update rate against allowed values in metadata
  • BNO_DEBUG switch enabling verbose, detailed output about communications with the chip for ease of debugging
  • Ability to tare sensor rotation and set mounting orientation
  • Can operate in several execution modes: polling I2C, polling SPI, and threaded SPI (which handles timing-critical functions in a dedicated thread, and automatically activates when the IMU has data available)
    • Also has experimental support for using asynchronous SPI transactions, allowing other threads to execute while communication with the BNO is occurring. Note that this functionality requires a patch to Mbed OS source code due to Mbed bug #13941
  • Calibration function
  • Reasonable code size for what you get: the library uses about 4K of flash and one instance of the object uses about 1700 bytes of RAM.

Documentation

Full Doxygen documentation is available online here

Example Code

Here's a simple example:

BNO080 Rotation Vector and Acceleration

#include <mbed.h>
#include <BNO080.h>

int main()
{
	Serial pc(USBTX, USBRX);

	// Create IMU, passing in output stream, pins, I2C address, and I2C frequency
	// These pin assignments are specific to my dev setup -- you'll need to change them
	BNO080I2C imu(&pc, p28, p27, p16, p30, 0x4a, 100000); 

	pc.baud(115200);
	pc.printf("============================================================\n");

	// Tell the IMU to report rotation every 100ms and acceleration every 200ms
	imu.enableReport(BNO080::ROTATION, 100);
	imu.enableReport(BNO080::TOTAL_ACCELERATION, 200);

	while (true)
	{
		wait(.001f);
		
		// poll the IMU for new data -- this returns true if any packets were received
		if(imu.updateData())
		{
			// now check for the specific type of data that was received (can be multiple at once)
			if (imu.hasNewData(BNO080::ROTATION))
			{
				// convert quaternion to Euler degrees and print
				pc.printf("IMU Rotation Euler: ");
				TVector3 eulerRadians = imu.rotationVector.euler();
				TVector3 eulerDegrees = eulerRadians * (180.0 / M_PI);
				eulerDegrees.print(pc, true);
				pc.printf("\n");
			}
			if (imu.hasNewData(BNO080::TOTAL_ACCELERATION))
			{
				// print the acceleration vector using its builtin print() method
				pc.printf("IMU Total Acceleration: ");
				imu.totalAcceleration.print(pc, true);
				pc.printf("\n");
			}
		}
	}

}


If you want more, a comprehensive, ready-to-run set of examples is available on my BNO080-Examples repository.

Credits

This driver makes use of a lightweight, public-domain library for vectors and quaternions available here.

Changelog

Version 2.1 (Nov 24 2020)

  • Added BNO080Async, which provides a threaded implementation of the SPI driver. This should help get the best performance and remove annoying timing requirements on the code calling the driver
  • Added experimental USE_ASYNC_SPI option
  • Fixed bug in v2.0 causing calibrations to fail

Version 2.0 (Nov 18 2020)

  • Added SPI support
  • Refactored buffer system so that SPI could be implemented as a subclass. Unfortunately this does substantially increase the memory usage of the driver, but I believe that the benefits are worth it.

Version 1.3 (Jul 21 2020)

  • Fix deprecation warnings and compile errors in Mbed 6
  • Fix compile errors in Arm Compiler (why doesn't it have M_PI????)

Version 1.2 (Jan 30 2020)

  • Removed accidental IRQ change
  • Fixed hard iron offset reading incorrectly due to missing cast

Version 1.1 (Jun 14 2019)

  • Added support for changing permanent orientation
  • Add FRS writing functions
  • Removed some errant printfs

Version 1.0 (Dec 29 2018)

  • Initial Mbed OS release
Committer:
Jamie Smith
Date:
Tue Nov 24 15:06:05 2020 -0800
Revision:
9:430f5302f9e1
Implement BNO080Async

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Jamie Smith 9:430f5302f9e1 1 <?xml version="1.0" encoding="UTF-8" standalone="no"?>
Jamie Smith 9:430f5302f9e1 2 <graphml xmlns="http://graphml.graphdrawing.org/xmlns" xmlns:java="http://www.yworks.com/xml/yfiles-common/1.0/java" xmlns:sys="http://www.yworks.com/xml/yfiles-common/markup/primitives/2.0" xmlns:x="http://www.yworks.com/xml/yfiles-common/markup/2.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:y="http://www.yworks.com/xml/graphml" xmlns:yed="http://www.yworks.com/xml/yed/3" xsi:schemaLocation="http://graphml.graphdrawing.org/xmlns http://www.yworks.com/xml/schema/graphml/1.1/ygraphml.xsd">
Jamie Smith 9:430f5302f9e1 3 <!--Created by yEd 3.19.1.1-->
Jamie Smith 9:430f5302f9e1 4 <key attr.name="Description" attr.type="string" for="graph" id="d0"/>
Jamie Smith 9:430f5302f9e1 5 <key for="port" id="d1" yfiles.type="portgraphics"/>
Jamie Smith 9:430f5302f9e1 6 <key for="port" id="d2" yfiles.type="portgeometry"/>
Jamie Smith 9:430f5302f9e1 7 <key for="port" id="d3" yfiles.type="portuserdata"/>
Jamie Smith 9:430f5302f9e1 8 <key attr.name="url" attr.type="string" for="node" id="d4"/>
Jamie Smith 9:430f5302f9e1 9 <key attr.name="description" attr.type="string" for="node" id="d5"/>
Jamie Smith 9:430f5302f9e1 10 <key for="node" id="d6" yfiles.type="nodegraphics"/>
Jamie Smith 9:430f5302f9e1 11 <key for="graphml" id="d7" yfiles.type="resources"/>
Jamie Smith 9:430f5302f9e1 12 <key attr.name="url" attr.type="string" for="edge" id="d8"/>
Jamie Smith 9:430f5302f9e1 13 <key attr.name="description" attr.type="string" for="edge" id="d9"/>
Jamie Smith 9:430f5302f9e1 14 <key for="edge" id="d10" yfiles.type="edgegraphics"/>
Jamie Smith 9:430f5302f9e1 15 <graph edgedefault="directed" id="G">
Jamie Smith 9:430f5302f9e1 16 <data key="d0"/>
Jamie Smith 9:430f5302f9e1 17 <node id="n0">
Jamie Smith 9:430f5302f9e1 18 <data key="d5"/>
Jamie Smith 9:430f5302f9e1 19 <data key="d6">
Jamie Smith 9:430f5302f9e1 20 <y:ShapeNode>
Jamie Smith 9:430f5302f9e1 21 <y:Geometry height="64.39999999999998" width="102.4799999999999" x="716.0" y="253.0"/>
Jamie Smith 9:430f5302f9e1 22 <y:Fill color="#FFCC00" transparent="false"/>
Jamie Smith 9:430f5302f9e1 23 <y:BorderStyle color="#000000" raised="false" type="line" width="1.0"/>
Jamie Smith 9:430f5302f9e1 24 <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="33.40234375" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="59.37109375" x="21.55445312500001" xml:space="preserve" y="15.498828124999989">Lock data
Jamie Smith 9:430f5302f9e1 25 mutex<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
Jamie Smith 9:430f5302f9e1 26 <y:Shape type="roundrectangle"/>
Jamie Smith 9:430f5302f9e1 27 </y:ShapeNode>
Jamie Smith 9:430f5302f9e1 28 </data>
Jamie Smith 9:430f5302f9e1 29 </node>
Jamie Smith 9:430f5302f9e1 30 <node id="n1">
Jamie Smith 9:430f5302f9e1 31 <data key="d5"/>
Jamie Smith 9:430f5302f9e1 32 <data key="d6">
Jamie Smith 9:430f5302f9e1 33 <y:ShapeNode>
Jamie Smith 9:430f5302f9e1 34 <y:Geometry height="64.39999999999998" width="109.48800000000006" x="1135.976" y="253.0"/>
Jamie Smith 9:430f5302f9e1 35 <y:Fill color="#FFCC00" transparent="false"/>
Jamie Smith 9:430f5302f9e1 36 <y:BorderStyle color="#000000" raised="false" type="line" width="1.0"/>
Jamie Smith 9:430f5302f9e1 37 <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="33.40234375" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="83.376953125" x="13.055523437500142" xml:space="preserve" y="15.498828124999989">Start SPI Send
Jamie Smith 9:430f5302f9e1 38 Transaction<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
Jamie Smith 9:430f5302f9e1 39 <y:Shape type="roundrectangle"/>
Jamie Smith 9:430f5302f9e1 40 </y:ShapeNode>
Jamie Smith 9:430f5302f9e1 41 </data>
Jamie Smith 9:430f5302f9e1 42 </node>
Jamie Smith 9:430f5302f9e1 43 <node id="n2">
Jamie Smith 9:430f5302f9e1 44 <data key="d5"/>
Jamie Smith 9:430f5302f9e1 45 <data key="d6">
Jamie Smith 9:430f5302f9e1 46 <y:ShapeNode>
Jamie Smith 9:430f5302f9e1 47 <y:Geometry height="92.72000000000003" width="94.0" x="933.4279999999998" y="238.83999999999997"/>
Jamie Smith 9:430f5302f9e1 48 <y:Fill color="#FFCC00" transparent="false"/>
Jamie Smith 9:430f5302f9e1 49 <y:BorderStyle color="#000000" raised="false" type="line" width="1.0"/>
Jamie Smith 9:430f5302f9e1 50 <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="33.40234375" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="67.36328125" x="13.318359375" xml:space="preserve" y="29.658828125000014">Has packet
Jamie Smith 9:430f5302f9e1 51 to send?<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
Jamie Smith 9:430f5302f9e1 52 <y:Shape type="diamond"/>
Jamie Smith 9:430f5302f9e1 53 </y:ShapeNode>
Jamie Smith 9:430f5302f9e1 54 </data>
Jamie Smith 9:430f5302f9e1 55 </node>
Jamie Smith 9:430f5302f9e1 56 <node id="n3">
Jamie Smith 9:430f5302f9e1 57 <data key="d5"/>
Jamie Smith 9:430f5302f9e1 58 <data key="d6">
Jamie Smith 9:430f5302f9e1 59 <y:ShapeNode>
Jamie Smith 9:430f5302f9e1 60 <y:Geometry height="119.856" width="121.5106125970664" x="1329.1693874029331" y="225.272"/>
Jamie Smith 9:430f5302f9e1 61 <y:Fill color="#FFCC00" transparent="false"/>
Jamie Smith 9:430f5302f9e1 62 <y:BorderStyle color="#000000" raised="false" type="line" width="1.0"/>
Jamie Smith 9:430f5302f9e1 63 <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="33.40234375" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="90.712890625" x="15.398860986033242" xml:space="preserve" y="43.226828125">Received an RX
Jamie Smith 9:430f5302f9e1 64 packet header?<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
Jamie Smith 9:430f5302f9e1 65 <y:Shape type="diamond"/>
Jamie Smith 9:430f5302f9e1 66 </y:ShapeNode>
Jamie Smith 9:430f5302f9e1 67 </data>
Jamie Smith 9:430f5302f9e1 68 </node>
Jamie Smith 9:430f5302f9e1 69 <node id="n4">
Jamie Smith 9:430f5302f9e1 70 <data key="d5"/>
Jamie Smith 9:430f5302f9e1 71 <data key="d6">
Jamie Smith 9:430f5302f9e1 72 <y:ShapeNode>
Jamie Smith 9:430f5302f9e1 73 <y:Geometry height="64.39999999999998" width="121.51061259706637" x="1072.4493874029338" y="384.088"/>
Jamie Smith 9:430f5302f9e1 74 <y:Fill color="#FFCC00" transparent="false"/>
Jamie Smith 9:430f5302f9e1 75 <y:BorderStyle color="#000000" raised="false" type="line" width="1.0"/>
Jamie Smith 9:430f5302f9e1 76 <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="33.40234375" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="109.38671875" x="6.061946923533242" xml:space="preserve" y="15.498828124999989">Start SPI Read
Jamie Smith 9:430f5302f9e1 77 Header Transaction<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
Jamie Smith 9:430f5302f9e1 78 <y:Shape type="roundrectangle"/>
Jamie Smith 9:430f5302f9e1 79 </y:ShapeNode>
Jamie Smith 9:430f5302f9e1 80 </data>
Jamie Smith 9:430f5302f9e1 81 </node>
Jamie Smith 9:430f5302f9e1 82 <node id="n5">
Jamie Smith 9:430f5302f9e1 83 <data key="d5"/>
Jamie Smith 9:430f5302f9e1 84 <data key="d6">
Jamie Smith 9:430f5302f9e1 85 <y:ShapeNode>
Jamie Smith 9:430f5302f9e1 86 <y:Geometry height="64.39999999999998" width="109.48800000000006" x="1279.7120000000002" y="384.088"/>
Jamie Smith 9:430f5302f9e1 87 <y:Fill color="#FFCC00" transparent="false"/>
Jamie Smith 9:430f5302f9e1 88 <y:BorderStyle color="#000000" raised="false" type="line" width="1.0"/>
Jamie Smith 9:430f5302f9e1 89 <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="48.103515625" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="106.720703125" x="1.3836484374999145" xml:space="preserve" y="8.148242187499989">Read remainder of
Jamie Smith 9:430f5302f9e1 90 packet contained
Jamie Smith 9:430f5302f9e1 91 in header<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
Jamie Smith 9:430f5302f9e1 92 <y:Shape type="roundrectangle"/>
Jamie Smith 9:430f5302f9e1 93 </y:ShapeNode>
Jamie Smith 9:430f5302f9e1 94 </data>
Jamie Smith 9:430f5302f9e1 95 </node>
Jamie Smith 9:430f5302f9e1 96 <node id="n6">
Jamie Smith 9:430f5302f9e1 97 <data key="d5"/>
Jamie Smith 9:430f5302f9e1 98 <data key="d6">
Jamie Smith 9:430f5302f9e1 99 <y:ShapeNode>
Jamie Smith 9:430f5302f9e1 100 <y:Geometry height="64.39999999999998" width="102.4799999999999" x="716.0000000000001" y="384.088"/>
Jamie Smith 9:430f5302f9e1 101 <y:Fill color="#FFCC00" transparent="false"/>
Jamie Smith 9:430f5302f9e1 102 <y:BorderStyle color="#000000" raised="false" type="line" width="1.0"/>
Jamie Smith 9:430f5302f9e1 103 <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.701171875" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="23.34765625" x="39.56617187500001" xml:space="preserve" y="22.84941406249999">Idle<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
Jamie Smith 9:430f5302f9e1 104 <y:Shape type="roundrectangle"/>
Jamie Smith 9:430f5302f9e1 105 </y:ShapeNode>
Jamie Smith 9:430f5302f9e1 106 </data>
Jamie Smith 9:430f5302f9e1 107 </node>
Jamie Smith 9:430f5302f9e1 108 <node id="n7">
Jamie Smith 9:430f5302f9e1 109 <data key="d5"/>
Jamie Smith 9:430f5302f9e1 110 <data key="d6">
Jamie Smith 9:430f5302f9e1 111 <y:ShapeNode>
Jamie Smith 9:430f5302f9e1 112 <y:Geometry height="64.39999999999998" width="121.51061259706637" x="1072.4493874029338" y="485.976"/>
Jamie Smith 9:430f5302f9e1 113 <y:Fill color="#FFCC00" transparent="false"/>
Jamie Smith 9:430f5302f9e1 114 <y:BorderStyle color="#000000" raised="false" type="line" width="1.0"/>
Jamie Smith 9:430f5302f9e1 115 <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.701171875" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="86.037109375" x="17.73675161103324" xml:space="preserve" y="22.849414062499932">Process packet<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
Jamie Smith 9:430f5302f9e1 116 <y:Shape type="roundrectangle"/>
Jamie Smith 9:430f5302f9e1 117 </y:ShapeNode>
Jamie Smith 9:430f5302f9e1 118 </data>
Jamie Smith 9:430f5302f9e1 119 </node>
Jamie Smith 9:430f5302f9e1 120 <node id="n8">
Jamie Smith 9:430f5302f9e1 121 <data key="d5"/>
Jamie Smith 9:430f5302f9e1 122 <data key="d6">
Jamie Smith 9:430f5302f9e1 123 <y:ShapeNode>
Jamie Smith 9:430f5302f9e1 124 <y:Geometry height="64.39999999999998" width="109.48800000000006" x="712.496" y="485.97599999999994"/>
Jamie Smith 9:430f5302f9e1 125 <y:Fill color="#FFCC00" transparent="false"/>
Jamie Smith 9:430f5302f9e1 126 <y:BorderStyle color="#000000" raised="false" type="line" width="1.0"/>
Jamie Smith 9:430f5302f9e1 127 <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="33.40234375" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="67.369140625" x="21.059429687500028" xml:space="preserve" y="15.498828124999989">Unlock data
Jamie Smith 9:430f5302f9e1 128 mutex<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
Jamie Smith 9:430f5302f9e1 129 <y:Shape type="roundrectangle"/>
Jamie Smith 9:430f5302f9e1 130 </y:ShapeNode>
Jamie Smith 9:430f5302f9e1 131 </data>
Jamie Smith 9:430f5302f9e1 132 </node>
Jamie Smith 9:430f5302f9e1 133 <edge id="e0" source="n0" target="n2">
Jamie Smith 9:430f5302f9e1 134 <data key="d9"/>
Jamie Smith 9:430f5302f9e1 135 <data key="d10">
Jamie Smith 9:430f5302f9e1 136 <y:PolyLineEdge>
Jamie Smith 9:430f5302f9e1 137 <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
Jamie Smith 9:430f5302f9e1 138 <y:LineStyle color="#000000" type="line" width="1.0"/>
Jamie Smith 9:430f5302f9e1 139 <y:Arrows source="none" target="standard"/>
Jamie Smith 9:430f5302f9e1 140 <y:EdgeLabel alignment="center" configuration="AutoFlippingLabel" distance="1.0" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.701171875" horizontalTextPosition="center" iconTextGap="4" modelName="custom" preferredPlacement="anywhere" ratio="0.5" textColor="#000000" verticalTextPosition="bottom" visible="true" width="50.705078125" x="16.817358320994458" xml:space="preserve" y="-19.67059814453097">_int == 0<y:LabelModel><y:SmartEdgeLabelModel autoRotationEnabled="false" defaultAngle="0.0" defaultDistance="10.0"/></y:LabelModel><y:ModelParameter><y:SmartEdgeLabelModelParameter angle="6.283185307179586" distance="0.9694140624996893" distanceToCenter="false" position="left" ratio="0.2178809335704373" segment="-1"/></y:ModelParameter><y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow"/></y:EdgeLabel>
Jamie Smith 9:430f5302f9e1 141 <y:BendStyle smoothed="false"/>
Jamie Smith 9:430f5302f9e1 142 </y:PolyLineEdge>
Jamie Smith 9:430f5302f9e1 143 </data>
Jamie Smith 9:430f5302f9e1 144 </edge>
Jamie Smith 9:430f5302f9e1 145 <edge id="e1" source="n2" target="n1">
Jamie Smith 9:430f5302f9e1 146 <data key="d9"/>
Jamie Smith 9:430f5302f9e1 147 <data key="d10">
Jamie Smith 9:430f5302f9e1 148 <y:PolyLineEdge>
Jamie Smith 9:430f5302f9e1 149 <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
Jamie Smith 9:430f5302f9e1 150 <y:LineStyle color="#000000" type="line" width="1.0"/>
Jamie Smith 9:430f5302f9e1 151 <y:Arrows source="none" target="standard"/>
Jamie Smith 9:430f5302f9e1 152 <y:EdgeLabel alignment="center" configuration="AutoFlippingLabel" distance="2.0" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.701171875" horizontalTextPosition="center" iconTextGap="4" modelName="custom" preferredPlacement="anywhere" ratio="0.5" textColor="#000000" verticalTextPosition="bottom" visible="true" width="24.677734375" x="4.997458007812384" xml:space="preserve" y="-23.894598144531244">Yes<y:LabelModel><y:SmartEdgeLabelModel autoRotationEnabled="false" defaultAngle="0.0" defaultDistance="10.0"/></y:LabelModel><y:ModelParameter><y:SmartEdgeLabelModelParameter angle="6.283185307179586" distance="14.543999999999967" distanceToCenter="true" position="left" ratio="0.0" segment="0"/></y:ModelParameter><y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow"/></y:EdgeLabel>
Jamie Smith 9:430f5302f9e1 153 <y:BendStyle smoothed="false"/>
Jamie Smith 9:430f5302f9e1 154 </y:PolyLineEdge>
Jamie Smith 9:430f5302f9e1 155 </data>
Jamie Smith 9:430f5302f9e1 156 </edge>
Jamie Smith 9:430f5302f9e1 157 <edge id="e2" source="n1" target="n3">
Jamie Smith 9:430f5302f9e1 158 <data key="d9"/>
Jamie Smith 9:430f5302f9e1 159 <data key="d10">
Jamie Smith 9:430f5302f9e1 160 <y:PolyLineEdge>
Jamie Smith 9:430f5302f9e1 161 <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
Jamie Smith 9:430f5302f9e1 162 <y:LineStyle color="#000000" type="line" width="1.0"/>
Jamie Smith 9:430f5302f9e1 163 <y:Arrows source="none" target="standard"/>
Jamie Smith 9:430f5302f9e1 164 <y:BendStyle smoothed="false"/>
Jamie Smith 9:430f5302f9e1 165 </y:PolyLineEdge>
Jamie Smith 9:430f5302f9e1 166 </data>
Jamie Smith 9:430f5302f9e1 167 </edge>
Jamie Smith 9:430f5302f9e1 168 <edge id="e3" source="n3" target="n0">
Jamie Smith 9:430f5302f9e1 169 <data key="d9"/>
Jamie Smith 9:430f5302f9e1 170 <data key="d10">
Jamie Smith 9:430f5302f9e1 171 <y:ArcEdge>
Jamie Smith 9:430f5302f9e1 172 <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0">
Jamie Smith 9:430f5302f9e1 173 <y:Point x="1078.582275390625" y="196.39117431640625"/>
Jamie Smith 9:430f5302f9e1 174 </y:Path>
Jamie Smith 9:430f5302f9e1 175 <y:LineStyle color="#000000" type="line" width="1.0"/>
Jamie Smith 9:430f5302f9e1 176 <y:Arrows source="none" target="standard"/>
Jamie Smith 9:430f5302f9e1 177 <y:EdgeLabel alignment="center" configuration="AutoFlippingLabel" distance="2.0" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.701171875" horizontalTextPosition="center" iconTextGap="4" modelName="custom" preferredPlacement="anywhere" ratio="0.5" textColor="#000000" verticalTextPosition="bottom" visible="true" width="19.33984375" x="-18.803273729879265" xml:space="preserve" y="-33.501677974926224">No<y:LabelModel><y:SmartEdgeLabelModel autoRotationEnabled="false" defaultAngle="0.0" defaultDistance="10.0"/></y:LabelModel><y:ModelParameter><y:SmartEdgeLabelModelParameter angle="6.283185307179586" distance="18.500571197434994" distanceToCenter="false" position="right" ratio="-27.95215815939211" segment="0"/></y:ModelParameter><y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow"/></y:EdgeLabel>
Jamie Smith 9:430f5302f9e1 178 <y:Arc height="-88.80883026123047" ratio="-0.5704898834228516" type="fixedRatio"/>
Jamie Smith 9:430f5302f9e1 179 </y:ArcEdge>
Jamie Smith 9:430f5302f9e1 180 </data>
Jamie Smith 9:430f5302f9e1 181 </edge>
Jamie Smith 9:430f5302f9e1 182 <edge id="e4" source="n2" target="n4">
Jamie Smith 9:430f5302f9e1 183 <data key="d9"/>
Jamie Smith 9:430f5302f9e1 184 <data key="d10">
Jamie Smith 9:430f5302f9e1 185 <y:PolyLineEdge>
Jamie Smith 9:430f5302f9e1 186 <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0">
Jamie Smith 9:430f5302f9e1 187 <y:Point x="980.4279999999998" y="416.288"/>
Jamie Smith 9:430f5302f9e1 188 </y:Path>
Jamie Smith 9:430f5302f9e1 189 <y:LineStyle color="#000000" type="line" width="1.0"/>
Jamie Smith 9:430f5302f9e1 190 <y:Arrows source="none" target="standard"/>
Jamie Smith 9:430f5302f9e1 191 <y:EdgeLabel alignment="center" configuration="AutoFlippingLabel" distance="2.0" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.701171875" horizontalTextPosition="center" iconTextGap="4" modelName="custom" preferredPlacement="anywhere" ratio="0.5" textColor="#000000" verticalTextPosition="bottom" visible="true" width="19.33984375" x="1.2900996093746926" xml:space="preserve" y="2.4150375976562373">No<y:LabelModel><y:SmartEdgeLabelModel autoRotationEnabled="false" defaultAngle="0.0" defaultDistance="10.0"/></y:LabelModel><y:ModelParameter><y:SmartEdgeLabelModelParameter angle="6.283185307179586" distance="10.959999999999923" distanceToCenter="true" position="left" ratio="-2.571292968750015" segment="0"/></y:ModelParameter><y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow"/></y:EdgeLabel>
Jamie Smith 9:430f5302f9e1 192 <y:BendStyle smoothed="false"/>
Jamie Smith 9:430f5302f9e1 193 </y:PolyLineEdge>
Jamie Smith 9:430f5302f9e1 194 </data>
Jamie Smith 9:430f5302f9e1 195 </edge>
Jamie Smith 9:430f5302f9e1 196 <edge id="e5" source="n3" target="n5">
Jamie Smith 9:430f5302f9e1 197 <data key="d9"/>
Jamie Smith 9:430f5302f9e1 198 <data key="d10">
Jamie Smith 9:430f5302f9e1 199 <y:PolyLineEdge>
Jamie Smith 9:430f5302f9e1 200 <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
Jamie Smith 9:430f5302f9e1 201 <y:LineStyle color="#000000" type="line" width="1.0"/>
Jamie Smith 9:430f5302f9e1 202 <y:Arrows source="none" target="standard"/>
Jamie Smith 9:430f5302f9e1 203 <y:EdgeLabel alignment="center" configuration="AutoFlippingLabel" distance="2.0" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.701171875" horizontalTextPosition="center" iconTextGap="4" modelName="custom" preferredPlacement="anywhere" ratio="0.5" textColor="#000000" verticalTextPosition="bottom" visible="true" width="24.677734375" x="-33.63749023543505" xml:space="preserve" y="-3.0204011714885155">Yes<y:LabelModel><y:SmartEdgeLabelModel autoRotationEnabled="false" defaultAngle="0.0" defaultDistance="10.0"/></y:LabelModel><y:ModelParameter><y:SmartEdgeLabelModelParameter angle="6.283185307179586" distance="17.148047352204344" distanceToCenter="true" position="right" ratio="-26.188525325283035" segment="-1"/></y:ModelParameter><y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow"/></y:EdgeLabel>
Jamie Smith 9:430f5302f9e1 204 <y:BendStyle smoothed="false"/>
Jamie Smith 9:430f5302f9e1 205 </y:PolyLineEdge>
Jamie Smith 9:430f5302f9e1 206 </data>
Jamie Smith 9:430f5302f9e1 207 </edge>
Jamie Smith 9:430f5302f9e1 208 <edge id="e6" source="n4" target="n5">
Jamie Smith 9:430f5302f9e1 209 <data key="d9"/>
Jamie Smith 9:430f5302f9e1 210 <data key="d10">
Jamie Smith 9:430f5302f9e1 211 <y:PolyLineEdge>
Jamie Smith 9:430f5302f9e1 212 <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
Jamie Smith 9:430f5302f9e1 213 <y:LineStyle color="#000000" type="line" width="1.0"/>
Jamie Smith 9:430f5302f9e1 214 <y:Arrows source="none" target="standard"/>
Jamie Smith 9:430f5302f9e1 215 <y:BendStyle smoothed="false"/>
Jamie Smith 9:430f5302f9e1 216 </y:PolyLineEdge>
Jamie Smith 9:430f5302f9e1 217 </data>
Jamie Smith 9:430f5302f9e1 218 </edge>
Jamie Smith 9:430f5302f9e1 219 <edge id="e7" source="n6" target="n0">
Jamie Smith 9:430f5302f9e1 220 <data key="d9"/>
Jamie Smith 9:430f5302f9e1 221 <data key="d10">
Jamie Smith 9:430f5302f9e1 222 <y:PolyLineEdge>
Jamie Smith 9:430f5302f9e1 223 <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
Jamie Smith 9:430f5302f9e1 224 <y:LineStyle color="#000000" type="line" width="1.0"/>
Jamie Smith 9:430f5302f9e1 225 <y:Arrows source="none" target="standard"/>
Jamie Smith 9:430f5302f9e1 226 <y:BendStyle smoothed="false"/>
Jamie Smith 9:430f5302f9e1 227 </y:PolyLineEdge>
Jamie Smith 9:430f5302f9e1 228 </data>
Jamie Smith 9:430f5302f9e1 229 </edge>
Jamie Smith 9:430f5302f9e1 230 <edge id="e8" source="n5" target="n7">
Jamie Smith 9:430f5302f9e1 231 <data key="d9"/>
Jamie Smith 9:430f5302f9e1 232 <data key="d10">
Jamie Smith 9:430f5302f9e1 233 <y:PolyLineEdge>
Jamie Smith 9:430f5302f9e1 234 <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0">
Jamie Smith 9:430f5302f9e1 235 <y:Point x="1334.4560000000001" y="518.1759999999999"/>
Jamie Smith 9:430f5302f9e1 236 </y:Path>
Jamie Smith 9:430f5302f9e1 237 <y:LineStyle color="#000000" type="line" width="1.0"/>
Jamie Smith 9:430f5302f9e1 238 <y:Arrows source="none" target="standard"/>
Jamie Smith 9:430f5302f9e1 239 <y:BendStyle smoothed="false"/>
Jamie Smith 9:430f5302f9e1 240 </y:PolyLineEdge>
Jamie Smith 9:430f5302f9e1 241 </data>
Jamie Smith 9:430f5302f9e1 242 </edge>
Jamie Smith 9:430f5302f9e1 243 <edge id="e9" source="n7" target="n8">
Jamie Smith 9:430f5302f9e1 244 <data key="d9"/>
Jamie Smith 9:430f5302f9e1 245 <data key="d10">
Jamie Smith 9:430f5302f9e1 246 <y:PolyLineEdge>
Jamie Smith 9:430f5302f9e1 247 <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
Jamie Smith 9:430f5302f9e1 248 <y:LineStyle color="#000000" type="line" width="1.0"/>
Jamie Smith 9:430f5302f9e1 249 <y:Arrows source="none" target="standard"/>
Jamie Smith 9:430f5302f9e1 250 <y:BendStyle smoothed="false"/>
Jamie Smith 9:430f5302f9e1 251 </y:PolyLineEdge>
Jamie Smith 9:430f5302f9e1 252 </data>
Jamie Smith 9:430f5302f9e1 253 </edge>
Jamie Smith 9:430f5302f9e1 254 <edge id="e10" source="n8" target="n6">
Jamie Smith 9:430f5302f9e1 255 <data key="d9"/>
Jamie Smith 9:430f5302f9e1 256 <data key="d10">
Jamie Smith 9:430f5302f9e1 257 <y:PolyLineEdge>
Jamie Smith 9:430f5302f9e1 258 <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
Jamie Smith 9:430f5302f9e1 259 <y:LineStyle color="#000000" type="line" width="1.0"/>
Jamie Smith 9:430f5302f9e1 260 <y:Arrows source="none" target="standard"/>
Jamie Smith 9:430f5302f9e1 261 <y:BendStyle smoothed="false"/>
Jamie Smith 9:430f5302f9e1 262 </y:PolyLineEdge>
Jamie Smith 9:430f5302f9e1 263 </data>
Jamie Smith 9:430f5302f9e1 264 </edge>
Jamie Smith 9:430f5302f9e1 265 </graph>
Jamie Smith 9:430f5302f9e1 266 <data key="d7">
Jamie Smith 9:430f5302f9e1 267 <y:Resources/>
Jamie Smith 9:430f5302f9e1 268 </data>
Jamie Smith 9:430f5302f9e1 269 </graphml>