From 01a5b2047595bfe2efd93161669d96f6b6a04a3e Mon Sep 17 00:00:00 2001 From: Morten Nielsen Date: Mon, 10 Feb 2014 22:19:56 -0800 Subject: [PATCH] Initial check in --- src/BTDevices.Tests/BTDevices.Tests.csproj | 155 ++++++++++++++++++ .../BTDevices.Tests_TemporaryKey.pfx | Bin 0 -> 2512 bytes .../Images/UnitTestLogo.scale-100.png | Bin 0 -> 5789 bytes .../Images/UnitTestSmallLogo.scale-100.png | Bin 0 -> 745 bytes .../Images/UnitTestSplashScreen.scale-100.png | Bin 0 -> 9381 bytes .../Images/UnitTestStoreLogo.scale-100.png | Bin 0 -> 2005 bytes src/BTDevices.Tests/NmeaMessages.cs | 41 +++++ src/BTDevices.Tests/Package.appxmanifest | 56 +++++++ .../Properties/AssemblyInfo.cs | 28 ++++ src/BTDevices.sln | 91 ++++++++++ src/BTDevices/BTDevices.WinPhone.csproj | 73 +++++++++ src/BTDevices/BTDevices.WinStore.csproj | 66 ++++++++ src/BTDevices/Device.cs | 116 +++++++++++++ src/BTDevices/Nmea/Gps/GPGGA.cs | 106 ++++++++++++ src/BTDevices/Nmea/Gps/GPRMC.cs | 73 +++++++++ src/BTDevices/Nmea/Gps/Garmin/PGRME.cs | 56 +++++++ src/BTDevices/Nmea/LaserRangeMessage.cs | 46 ++++++ .../Nmea/LaserTech/LaserRange/PLTIT.cs | 17 ++ src/BTDevices/Nmea/NmeaMessage.cs | 97 +++++++++++ .../Nmea/Trimble/LaserRange/PTNLA.cs | 17 ++ .../Nmea/Trimble/LaserRange/PTNLB.cs | 41 +++++ src/BTDevices/Nmea/UnknownMessage.cs | 16 ++ src/BTDevices/NmeaDevice.cs | 55 +++++++ src/BTDevices/Properties/AssemblyInfo.cs | 29 ++++ 24 files changed, 1179 insertions(+) create mode 100644 src/BTDevices.Tests/BTDevices.Tests.csproj create mode 100644 src/BTDevices.Tests/BTDevices.Tests_TemporaryKey.pfx create mode 100644 src/BTDevices.Tests/Images/UnitTestLogo.scale-100.png create mode 100644 src/BTDevices.Tests/Images/UnitTestSmallLogo.scale-100.png create mode 100644 src/BTDevices.Tests/Images/UnitTestSplashScreen.scale-100.png create mode 100644 src/BTDevices.Tests/Images/UnitTestStoreLogo.scale-100.png create mode 100644 src/BTDevices.Tests/NmeaMessages.cs create mode 100644 src/BTDevices.Tests/Package.appxmanifest create mode 100644 src/BTDevices.Tests/Properties/AssemblyInfo.cs create mode 100644 src/BTDevices.sln create mode 100644 src/BTDevices/BTDevices.WinPhone.csproj create mode 100644 src/BTDevices/BTDevices.WinStore.csproj create mode 100644 src/BTDevices/Device.cs create mode 100644 src/BTDevices/Nmea/Gps/GPGGA.cs create mode 100644 src/BTDevices/Nmea/Gps/GPRMC.cs create mode 100644 src/BTDevices/Nmea/Gps/Garmin/PGRME.cs create mode 100644 src/BTDevices/Nmea/LaserRangeMessage.cs create mode 100644 src/BTDevices/Nmea/LaserTech/LaserRange/PLTIT.cs create mode 100644 src/BTDevices/Nmea/NmeaMessage.cs create mode 100644 src/BTDevices/Nmea/Trimble/LaserRange/PTNLA.cs create mode 100644 src/BTDevices/Nmea/Trimble/LaserRange/PTNLB.cs create mode 100644 src/BTDevices/Nmea/UnknownMessage.cs create mode 100644 src/BTDevices/NmeaDevice.cs create mode 100644 src/BTDevices/Properties/AssemblyInfo.cs diff --git a/src/BTDevices.Tests/BTDevices.Tests.csproj b/src/BTDevices.Tests/BTDevices.Tests.csproj new file mode 100644 index 0000000..5548749 --- /dev/null +++ b/src/BTDevices.Tests/BTDevices.Tests.csproj @@ -0,0 +1,155 @@ + + + + + Debug + AnyCPU + 8.0.30703 + 2.0 + {5B5BAF9D-3FB9-47F9-AE07-B8CC43EC887C} + Library + Properties + BTDevices.Tests + BTDevices.Tests + en-US + 8.1 + 12 + 512 + {BC8A1FFA-BEE3-4634-8014-F334798102B3};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} + BTDevices.Tests_TemporaryKey.pfx + Never + + + true + full + false + bin\Debug\ + DEBUG;TRACE;NETFX_CORE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE;NETFX_CORE + prompt + 4 + + + true + bin\ARM\Debug\ + DEBUG;TRACE;NETFX_CORE + ;2008 + full + ARM + false + prompt + true + + + bin\ARM\Release\ + TRACE;NETFX_CORE + true + ;2008 + pdbonly + ARM + false + prompt + true + + + true + bin\x64\Debug\ + DEBUG;TRACE;NETFX_CORE + ;2008 + full + x64 + false + prompt + true + + + bin\x64\Release\ + TRACE;NETFX_CORE + true + ;2008 + pdbonly + x64 + false + prompt + true + + + true + bin\x86\Debug\ + DEBUG;TRACE;NETFX_CORE + ;2008 + full + x86 + false + prompt + true + + + bin\x86\Release\ + TRACE;NETFX_CORE + true + ;2008 + pdbonly + x86 + false + prompt + true + + + True + true + + + + + + + + + + + + + Designer + + + + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + + + {62a55887-10f5-40d2-9352-96246d1b11d3} + BTDevices.WinStore + + + + 12.0 + + + + \ No newline at end of file diff --git a/src/BTDevices.Tests/BTDevices.Tests_TemporaryKey.pfx b/src/BTDevices.Tests/BTDevices.Tests_TemporaryKey.pfx new file mode 100644 index 0000000000000000000000000000000000000000..527192eea9616208c99dff505fa22574ce9814bb GIT binary patch literal 2512 zcmY+Ec|6qJ7stOd#*BR#<7derTe3A1lcg*fm3=VGSToivk0nM~Vwg(E@{kr=_Eg9a zQ8HPRJ!J_`mXHux#vXoCuix)^UeCR+bM8IwbI!f@pZh^k*;~ON78I2|8p^H^YZ$x5 z4T6F4sO*;^RCYfm_C`@z*Z!4aorX|ZCzyDQX~R&?|8;S3fWUcF$R>&kSwo3IIsT8C zhx0(#EDV&+Ypret4omG1uZBe@8}s#tWc(nH zHM_cL(0hS((-&3vlr*|-;>&$YURJ>ni}~%DlJ`wz*_DBzpm_>G!58c1Q)|6P-)*!RXnXoy`iDh|Up2yvgFGMp=SB29X4dy|j=|uK zdS1=jB*Xwz^F(NS$NQs04uupafZjw&8c=DhK*-;iDfmf~g78ZTKm3tm@mG9NQN&i# z`W)*oeH41dfvyc$7njM7!fmcU0|KJ4MxpDOr?J+Y3F*>~|OkkOBi#0Ye2v^`o9My@ohS;nQc zkEe@wfAgUoEDYicCj26AyVQ1)yY8k&2$w4rTtwtITE*VZKozmR;?g(kQ|d4~7b?DB zW7kWa7&|L|528jfnR3rQZ%R6BiK#|#7|NVaHW!UcW{ZGdB{3S0(iGH1k83P6jZ{vl zb+!0GspeV7vi4bdIdJm|m~SrPm24q%bvy!3KVoD+oO)i8l|9|6H4ZpPVZ^CA#w0yV~Ub z7qMPHjeW*%?FXA*#$jbuCMKoqUrd@h=T2xlcbb43bGrOyF3f5VW?mIQGgozHl^TFSIYHSKp&$r|s?HBWTZo$jW`H-dB?t%r zf|=$CkO4^m&-A~DKX8c|VVV0dAdtxdm~jyE_&~txcb6n!@w@H{GjeBM5`?0%1pNJS z7&MQ{LSiCEFbH5SHveQm|B`y>FR72w@HQME<0%`qczgmDMv;W*g7Yz0;XV_=#u@OG*3G_ zyr5IGC^2$%bgzZ)24|}>++qrWy9s4Px^PD8=X;5SKa}{sue@1b_P#5wHH}>Ud7x>Z zpVBI1Csp)O9XYc~sHZ*dX*2@)o0(#8b)TLylIu=|*>fVrayKcY}PhnICN*@XK%|M#EB@nVUa2|I?oRK z?H?Xn*vi*3!fodqWY$8Pmo`1tJEg031c<4oBX%Mkr^QeQT#xGYPSz&Qaj6Q>pZ_N) ztLX{1fVW?xEq30_WR!d~5pI0ueMS7tRz6WB>#RrnV<`h9hI}W8uiwdaIr6oNH%0T6 z<>y`Uv!0+A!|&!Loy2@m&DS$7V%de@N~Um)Mw&`)xc-(y-(Ts)+#=#$*Ky@2seIw$ zJZEB0V6i_u_l$CXNCF}Gi(PccrK@ZWck;Xsl@_>VP#oXC=Ba`ZrwrHoGK_Mo++2ci zDTjpx_qa;;6oBkNMPZGNwZRYFyAnyhk)Hl?1s3WeS%+c$ij2eSJkn!tZdl2cWPkq9 zxZ3ch)Rr%9qYbnvzE*uxH3A!x;X>xSM5JPqt4S10FNSK{2rL8<1eT3D zaNF_Jp>B({Q--_>$_!3QDv*r3$nHTGE<_SL)g-=P^oH-!%L#u!nPf5Dfy1@ z0h9dV7th&U`SQ76iY`0JxFrRMkeFHD(V+5i9m literal 0 HcmV?d00001 diff --git a/src/BTDevices.Tests/Images/UnitTestLogo.scale-100.png b/src/BTDevices.Tests/Images/UnitTestLogo.scale-100.png new file mode 100644 index 0000000000000000000000000000000000000000..ebd735aa9352cf97bfcbe11dc4281617d570dca4 GIT binary patch literal 5789 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 literal 0 HcmV?d00001 diff --git a/src/BTDevices.Tests/Images/UnitTestSmallLogo.scale-100.png b/src/BTDevices.Tests/Images/UnitTestSmallLogo.scale-100.png new file mode 100644 index 0000000000000000000000000000000000000000..92dd1058fbfb70c4491d934fe5f60ff2bacd41e9 GIT binary patch literal 745 zcmVGVQpR4ciyoglSwB91#GhGhn{+`40 zKOYZLtJUy5M#Hz+??BTuEf5G^US9q^+F&rqWU^c?_f@o5EFKPriyn{1Bb7>Dq2Gpm zj6OIx0Dx2~HJwfYfY0ae?(T|2B8f!u{QL|62qB-(r&KC$Z*SK_*J?F}VN52|>FMcU zFfbSl3WWjytX69-my^roXJ=<#ua{)79{TC&>GAP#Z*OmVdpj13x!rDr5V@9aw;PYg zH#axi?RKlx`izXlVo|Hrs#L0EGRd+maoTJ)o6W}O^8uh-F3h|y@YSS;jQC=}8(jWHGo1n>Siolbo|pUdSMkH^GQuh+}v@;m@7 z&Jc>C4i68Hj*hr+T!t~ezP`S?y22R0k0z$q>n|=YHa0d^OdOHmY;9-&aER;zuc8|`*G;bM$g zmK6$x05F+MNKYb!91h14^s=n;`Mg%E?Q}Y^Sj_A71_A*9C=?2bL}EUktX3=67~#xX zqtR?_Z50ZIlarIdV8G+?{C+<<@8RKLe}A70Rh>@PY&O@+Iv5NhgzoO{=BuF5Xoy6j zot>Spu7XS^v$&ZilS!#ml1in7OJvMsGGeiKZ5iKgy!-omnN0R!*h(_~++zV_yx462 b>BH;~a9|}kOw?>(00000NkvXXu0mjfaI93Z literal 0 HcmV?d00001 diff --git a/src/BTDevices.Tests/Images/UnitTestSplashScreen.scale-100.png b/src/BTDevices.Tests/Images/UnitTestSplashScreen.scale-100.png new file mode 100644 index 0000000000000000000000000000000000000000..193187f108f50dd242cb5c589b02a29691b7432a GIT binary patch literal 9381 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 + + + + + + BTDevices.Tests + mort5161 + Images\UnitTestStoreLogo.png + BTDevices.Tests + + + + 6.3.0 + 6.3.0 + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/BTDevices.Tests/Properties/AssemblyInfo.cs b/src/BTDevices.Tests/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..0255b2a --- /dev/null +++ b/src/BTDevices.Tests/Properties/AssemblyInfo.cs @@ -0,0 +1,28 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("BTDevices.Tests")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("BTDevices.Tests")] +[assembly: AssemblyCopyright("Copyright © 2014")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/src/BTDevices.sln b/src/BTDevices.sln new file mode 100644 index 0000000..c0d1ed1 --- /dev/null +++ b/src/BTDevices.sln @@ -0,0 +1,91 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 2013 +VisualStudioVersion = 12.0.30110.0 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "WinPhone", "WinPhone", "{26A0F6A9-4B11-46F4-BB01-50D37D1C3CB4}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "WinStore", "WinStore", "{07131E3E-1C4E-41CB-BD14-7950AA858A23}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BTDevices.WinStore", "BTDevices\BTDevices.WinStore.csproj", "{62A55887-10F5-40D2-9352-96246D1B11D3}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BTDevices.Tests", "BTDevices.Tests\BTDevices.Tests.csproj", "{5B5BAF9D-3FB9-47F9-AE07-B8CC43EC887C}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BTDevices.WinPhone", "BTDevices\BTDevices.WinPhone.csproj", "{EA42A713-BC6E-4914-B54B-47C0891B7421}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Debug|ARM = Debug|ARM + Debug|x64 = Debug|x64 + Debug|x86 = Debug|x86 + Release|Any CPU = Release|Any CPU + Release|ARM = Release|ARM + Release|x64 = Release|x64 + Release|x86 = Release|x86 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {62A55887-10F5-40D2-9352-96246D1B11D3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {62A55887-10F5-40D2-9352-96246D1B11D3}.Debug|Any CPU.Build.0 = Debug|Any CPU + {62A55887-10F5-40D2-9352-96246D1B11D3}.Debug|ARM.ActiveCfg = Debug|Any CPU + {62A55887-10F5-40D2-9352-96246D1B11D3}.Debug|ARM.Build.0 = Debug|Any CPU + {62A55887-10F5-40D2-9352-96246D1B11D3}.Debug|x64.ActiveCfg = Debug|Any CPU + {62A55887-10F5-40D2-9352-96246D1B11D3}.Debug|x64.Build.0 = Debug|Any CPU + {62A55887-10F5-40D2-9352-96246D1B11D3}.Debug|x86.ActiveCfg = Debug|Any CPU + {62A55887-10F5-40D2-9352-96246D1B11D3}.Debug|x86.Build.0 = Debug|Any CPU + {62A55887-10F5-40D2-9352-96246D1B11D3}.Release|Any CPU.ActiveCfg = Release|Any CPU + {62A55887-10F5-40D2-9352-96246D1B11D3}.Release|Any CPU.Build.0 = Release|Any CPU + {62A55887-10F5-40D2-9352-96246D1B11D3}.Release|ARM.ActiveCfg = Release|Any CPU + {62A55887-10F5-40D2-9352-96246D1B11D3}.Release|ARM.Build.0 = Release|Any CPU + {62A55887-10F5-40D2-9352-96246D1B11D3}.Release|x64.ActiveCfg = Release|Any CPU + {62A55887-10F5-40D2-9352-96246D1B11D3}.Release|x64.Build.0 = Release|Any CPU + {62A55887-10F5-40D2-9352-96246D1B11D3}.Release|x86.ActiveCfg = Release|Any CPU + {62A55887-10F5-40D2-9352-96246D1B11D3}.Release|x86.Build.0 = Release|Any CPU + {5B5BAF9D-3FB9-47F9-AE07-B8CC43EC887C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {5B5BAF9D-3FB9-47F9-AE07-B8CC43EC887C}.Debug|Any CPU.Build.0 = Debug|Any CPU + {5B5BAF9D-3FB9-47F9-AE07-B8CC43EC887C}.Debug|Any CPU.Deploy.0 = Debug|Any CPU + {5B5BAF9D-3FB9-47F9-AE07-B8CC43EC887C}.Debug|ARM.ActiveCfg = Debug|ARM + {5B5BAF9D-3FB9-47F9-AE07-B8CC43EC887C}.Debug|ARM.Build.0 = Debug|ARM + {5B5BAF9D-3FB9-47F9-AE07-B8CC43EC887C}.Debug|ARM.Deploy.0 = Debug|ARM + {5B5BAF9D-3FB9-47F9-AE07-B8CC43EC887C}.Debug|x64.ActiveCfg = Debug|x64 + {5B5BAF9D-3FB9-47F9-AE07-B8CC43EC887C}.Debug|x64.Build.0 = Debug|x64 + {5B5BAF9D-3FB9-47F9-AE07-B8CC43EC887C}.Debug|x64.Deploy.0 = Debug|x64 + {5B5BAF9D-3FB9-47F9-AE07-B8CC43EC887C}.Debug|x86.ActiveCfg = Debug|x86 + {5B5BAF9D-3FB9-47F9-AE07-B8CC43EC887C}.Debug|x86.Build.0 = Debug|x86 + {5B5BAF9D-3FB9-47F9-AE07-B8CC43EC887C}.Debug|x86.Deploy.0 = Debug|x86 + {5B5BAF9D-3FB9-47F9-AE07-B8CC43EC887C}.Release|Any CPU.ActiveCfg = Release|Any CPU + {5B5BAF9D-3FB9-47F9-AE07-B8CC43EC887C}.Release|Any CPU.Build.0 = Release|Any CPU + {5B5BAF9D-3FB9-47F9-AE07-B8CC43EC887C}.Release|Any CPU.Deploy.0 = Release|Any CPU + {5B5BAF9D-3FB9-47F9-AE07-B8CC43EC887C}.Release|ARM.ActiveCfg = Release|ARM + {5B5BAF9D-3FB9-47F9-AE07-B8CC43EC887C}.Release|ARM.Build.0 = Release|ARM + {5B5BAF9D-3FB9-47F9-AE07-B8CC43EC887C}.Release|ARM.Deploy.0 = Release|ARM + {5B5BAF9D-3FB9-47F9-AE07-B8CC43EC887C}.Release|x64.ActiveCfg = Release|x64 + {5B5BAF9D-3FB9-47F9-AE07-B8CC43EC887C}.Release|x64.Build.0 = Release|x64 + {5B5BAF9D-3FB9-47F9-AE07-B8CC43EC887C}.Release|x64.Deploy.0 = Release|x64 + {5B5BAF9D-3FB9-47F9-AE07-B8CC43EC887C}.Release|x86.ActiveCfg = Release|x86 + {5B5BAF9D-3FB9-47F9-AE07-B8CC43EC887C}.Release|x86.Build.0 = Release|x86 + {5B5BAF9D-3FB9-47F9-AE07-B8CC43EC887C}.Release|x86.Deploy.0 = Release|x86 + {EA42A713-BC6E-4914-B54B-47C0891B7421}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {EA42A713-BC6E-4914-B54B-47C0891B7421}.Debug|Any CPU.Build.0 = Debug|Any CPU + {EA42A713-BC6E-4914-B54B-47C0891B7421}.Debug|ARM.ActiveCfg = Debug|Any CPU + {EA42A713-BC6E-4914-B54B-47C0891B7421}.Debug|ARM.Build.0 = Debug|Any CPU + {EA42A713-BC6E-4914-B54B-47C0891B7421}.Debug|x64.ActiveCfg = Debug|Any CPU + {EA42A713-BC6E-4914-B54B-47C0891B7421}.Debug|x86.ActiveCfg = Debug|Any CPU + {EA42A713-BC6E-4914-B54B-47C0891B7421}.Debug|x86.Build.0 = Debug|Any CPU + {EA42A713-BC6E-4914-B54B-47C0891B7421}.Release|Any CPU.ActiveCfg = Release|Any CPU + {EA42A713-BC6E-4914-B54B-47C0891B7421}.Release|Any CPU.Build.0 = Release|Any CPU + {EA42A713-BC6E-4914-B54B-47C0891B7421}.Release|ARM.ActiveCfg = Release|Any CPU + {EA42A713-BC6E-4914-B54B-47C0891B7421}.Release|ARM.Build.0 = Release|Any CPU + {EA42A713-BC6E-4914-B54B-47C0891B7421}.Release|x64.ActiveCfg = Release|Any CPU + {EA42A713-BC6E-4914-B54B-47C0891B7421}.Release|x86.ActiveCfg = Release|Any CPU + {EA42A713-BC6E-4914-B54B-47C0891B7421}.Release|x86.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(NestedProjects) = preSolution + {EA42A713-BC6E-4914-B54B-47C0891B7421} = {26A0F6A9-4B11-46F4-BB01-50D37D1C3CB4} + {62A55887-10F5-40D2-9352-96246D1B11D3} = {07131E3E-1C4E-41CB-BD14-7950AA858A23} + {5B5BAF9D-3FB9-47F9-AE07-B8CC43EC887C} = {07131E3E-1C4E-41CB-BD14-7950AA858A23} + EndGlobalSection +EndGlobal diff --git a/src/BTDevices/BTDevices.WinPhone.csproj b/src/BTDevices/BTDevices.WinPhone.csproj new file mode 100644 index 0000000..ce88bf3 --- /dev/null +++ b/src/BTDevices/BTDevices.WinPhone.csproj @@ -0,0 +1,73 @@ + + + + Debug + AnyCPU + 10.0.20506 + 2.0 + {EA42A713-BC6E-4914-B54B-47C0891B7421} + {C089C8C0-30E0-4E22-80C0-CE093F111A43};{fae04ec0-301f-11d3-bf4b-00c04f79efbc} + Library + Properties + BTDevices + BTDevices.WinPhone + WindowsPhone + v8.0 + $(TargetFrameworkVersion) + false + true + 11.0 + true + + + true + full + false + BinWP\Debug\ + DEBUG;TRACE;SILVERLIGHT;WINDOWS_PHONE + true + true + prompt + 4 + + + pdbonly + true + BinWP\Release\ + TRACE;SILVERLIGHT;WINDOWS_PHONE + true + true + prompt + 4 + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/BTDevices/BTDevices.WinStore.csproj b/src/BTDevices/BTDevices.WinStore.csproj new file mode 100644 index 0000000..d7e93e0 --- /dev/null +++ b/src/BTDevices/BTDevices.WinStore.csproj @@ -0,0 +1,66 @@ + + + + + Debug + AnyCPU + 8.0.30703 + 2.0 + {62A55887-10F5-40D2-9352-96246D1B11D3} + Library + Properties + BTDevices + BTDevices.WinStore + en-US + 8.1 + 12 + 512 + {BC8A1FFA-BEE3-4634-8014-F334798102B3};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} + + + true + full + false + binWS\Debug\ + DEBUG;TRACE;NETFX_CORE + prompt + 4 + + + pdbonly + true + binWS\Release\ + TRACE;NETFX_CORE + prompt + 4 + + + + + + + + + + + + + + + + + + + + + 12.0 + + + + \ No newline at end of file diff --git a/src/BTDevices/Device.cs b/src/BTDevices/Device.cs new file mode 100644 index 0000000..ba5bf10 --- /dev/null +++ b/src/BTDevices/Device.cs @@ -0,0 +1,116 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.IO; +using System.Text; +using System.Threading.Tasks; +using Windows.Networking.Sockets; +#if NETFX_CORE +using BTDevice = Windows.Devices.Bluetooth.Rfcomm.RfcommDeviceService; +using Windows.Devices.Bluetooth.Rfcomm; +using Windows.Networking.Sockets; +using System.Runtime.InteropServices.WindowsRuntime; +using Windows.Foundation; +#else +using BTDevice = Windows.Networking.Proximity.PeerInformation; +#endif + +namespace BTDevices +{ + public abstract class Device : IDisposable + { + private BTDevice m_device; + private StreamSocket socket; + System.Threading.CancellationTokenSource tcs; + public Device(BTDevice device) + { + if (device == null) + throw new ArgumentNullException("device"); +#if NETFX_CORE + if (device.ServiceId.Uuid != RfcommServiceId.SerialPort.Uuid) + throw new NotSupportedException("Only SerialPort devices supported"); +#endif + m_device = device; + } + TaskCompletionSource closeTask; + + public async Task StartAsync() + { + if (tcs != null) + return; + if (m_device == null) + throw new ObjectDisposedException("Device"); + tcs = new System.Threading.CancellationTokenSource(); + socket = new StreamSocket(); + await socket.ConnectAsync( +#if NETFX_CORE + m_device.ConnectionHostName, + m_device.ConnectionServiceName); +#else + m_device.HostName, "1"); + //socket = await Windows.Networking.Proximity.PeerFinder.ConnectAsync(m_device.HostName; +#endif + if (tcs.IsCancellationRequested) //Stop was called while opening device + { + socket.Dispose(); + socket = null; + throw new TaskCanceledException(); + } var token = tcs.Token; + var _ = Task.Run(async () => + { + var stream = socket.InputStream.AsStreamForRead(); + byte[] buffer = new byte[1024]; + while (!token.IsCancellationRequested) + { + int readCount = 0; + try + { + readCount = await stream.ReadAsync(buffer, 0, 1024, token).ConfigureAwait(false); + } + catch { } + if (token.IsCancellationRequested) + break; + if (readCount > 0) + { + OnData(buffer.Take(readCount).ToArray()); + } + await Task.Delay(10, token); + } + if(socket != null) + socket.Dispose(); + if (closeTask != null) + closeTask.SetResult(true); + }); + } + + public Task StopAsync() + { + if (tcs != null) + { + socket.Dispose(); + socket = null; + closeTask = new TaskCompletionSource(); + if(tcs != null) + tcs.Cancel(); + tcs = null; + return closeTask.Task; + } + return Task.FromResult(false); + } + + protected abstract void OnData(byte[] data); + + public void Dispose() + { + if (tcs != null) + { + tcs.Cancel(); + tcs = null; + } + m_device = null; + if(socket != null) + socket.Dispose(); + socket = null; + } + } +} diff --git a/src/BTDevices/Nmea/Gps/GPGGA.cs b/src/BTDevices/Nmea/Gps/GPGGA.cs new file mode 100644 index 0000000..2530e70 --- /dev/null +++ b/src/BTDevices/Nmea/Gps/GPGGA.cs @@ -0,0 +1,106 @@ +using System; +using System.Collections.Generic; +using System.Globalization; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace BTDevices.Nmea.Gps +{ + /// + /// Recommended Minimum + /// + [NmeaMessageType(Type = "GPGGA")] + public class Gpgga : NmeaMessage + { + public enum FixQuality : int + { + Invalid = 0, + GpsFix = 1, + DgpsFix = 2, + PpsFix = 3, + Rtk = 4, + FloatRtk = 5, + Estimated = 6, + ManualInput = 7, + Simulation = 8 + } + + protected override void LoadMessage(string[] message) + { + var time = message[0]; + Latitude = int.Parse(message[1].Substring(0, 2), CultureInfo.InvariantCulture) + double.Parse(message[1].Substring(2), CultureInfo.InvariantCulture) / 60; + if (message[2] == "S") + Latitude *= -1; + Longitude = int.Parse(message[3].Substring(0, 3), CultureInfo.InvariantCulture) + double.Parse(message[3].Substring(3), CultureInfo.InvariantCulture) / 60; + if (message[4] == "W") + Latitude *= -1; + Quality = (FixQuality)int.Parse(message[5], CultureInfo.InvariantCulture); + NumberOfSatellites = int.Parse(message[6], CultureInfo.InvariantCulture); + Hdop = double.Parse(message[7], CultureInfo.InvariantCulture); + Altitude = double.Parse(message[8], CultureInfo.InvariantCulture); + AltitudeUnits = message[9]; + HeightOfGeoid = double.Parse(message[10], CultureInfo.InvariantCulture); + HeightOfGeoidUnits = message[11]; + if (message[12].Length > 0) + TimeSinceLastDgpsUpdate = TimeSpan.FromSeconds(int.Parse(message[12], CultureInfo.InvariantCulture)); + if (message[13].Length > 0) + DgpsStationID = int.Parse(message[13], CultureInfo.InvariantCulture); + } + + /// + /// Latitude + /// + public double Latitude { get; private set; } + + /// + /// Longitude + /// + public double Longitude { get; private set; } + + /// + /// Fix Quality + /// + public FixQuality Quality { get; private set; } + + /// + /// Number of satellites being tracked + /// + public int NumberOfSatellites { get; private set; } + + /// + /// Horizontal Dilution of Precision + /// + public double Hdop { get; private set; } + + /// + /// Altitude + /// + public double Altitude { get; private set; } + + /// + /// Altitude units ('M' for Meters) + /// + public string AltitudeUnits { get; private set; } + + /// + /// Height of geoid (mean sea level) above WGS84 + /// + public double HeightOfGeoid { get; private set; } + + /// + /// Altitude units ('M' for Meters) + /// + public string HeightOfGeoidUnits { get; private set; } + + /// + /// Time since last DGPS update + /// + public TimeSpan TimeSinceLastDgpsUpdate { get; set; } + + /// + /// DGPS Station ID Number + /// + public int DgpsStationID { get; set; } + } +} diff --git a/src/BTDevices/Nmea/Gps/GPRMC.cs b/src/BTDevices/Nmea/Gps/GPRMC.cs new file mode 100644 index 0000000..1353947 --- /dev/null +++ b/src/BTDevices/Nmea/Gps/GPRMC.cs @@ -0,0 +1,73 @@ +using System; +using System.Collections.Generic; +using System.Globalization; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace BTDevices.Nmea.Gps +{ + /// + /// Recommended Minimum + /// + [NmeaMessageType(Type = "GPRMC")] + public class Gprmc : NmeaMessage + { + protected override void LoadMessage(string[] message) + { + FixTime = new DateTime(int.Parse(message[8].Substring(4, 2)) + 2000, + int.Parse(message[8].Substring(2, 2)), + int.Parse(message[8].Substring(0, 2)), + int.Parse(message[0].Substring(0, 2)), + int.Parse(message[0].Substring(2, 2)), + int.Parse(message[0].Substring(4, 2)), DateTimeKind.Utc); + Active = (message[1] == "A"); + Latitude = int.Parse(message[2].Substring(0, 2), CultureInfo.InvariantCulture) + double.Parse(message[2].Substring(2), CultureInfo.InvariantCulture) / 60; + if (message[3] == "S") + Latitude *= -1; + Longitude = int.Parse(message[4].Substring(0, 3), CultureInfo.InvariantCulture) + double.Parse(message[4].Substring(3), CultureInfo.InvariantCulture) / 60; + if (message[5] == "W") + Latitude *= -1; + Speed = double.Parse(message[6], CultureInfo.InvariantCulture); + Course = double.Parse(message[7], CultureInfo.InvariantCulture); + MagneticVariation = double.Parse(message[9], CultureInfo.InvariantCulture); + if (message[10] == "W") + MagneticVariation *= -1; + } + + /// + /// Fix Time + /// + public DateTime FixTime { get; private set; } + + /// + /// Gets a value whether the device is active + /// + public bool Active { get; private set; } + + /// + /// Latitude + /// + public double Latitude { get; private set; } + + /// + /// Longitude + /// + public double Longitude { get; private set; } + + /// + /// Speed over the ground in knots + /// + public double Speed { get; private set; } + + /// + /// Track angle in degrees True + /// + public double Course { get; private set; } + + /// + /// Magnetic Variation + /// + public double MagneticVariation { get; private set; } + } +} diff --git a/src/BTDevices/Nmea/Gps/Garmin/PGRME.cs b/src/BTDevices/Nmea/Gps/Garmin/PGRME.cs new file mode 100644 index 0000000..0baae9e --- /dev/null +++ b/src/BTDevices/Nmea/Gps/Garmin/PGRME.cs @@ -0,0 +1,56 @@ +using System; +using System.Collections.Generic; +using System.Globalization; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace BTDevices.Nmea.Gps +{ + /// + /// Recommended Minimum + /// + [NmeaMessageType(Type = "PGRME")] + public class Pgrme : NmeaMessage + { + protected override void LoadMessage(string[] message) + { + HorizontalError = double.Parse(message[0], CultureInfo.InvariantCulture); + HorizontalErrorUnits = message[1]; + VerticalError = double.Parse(message[2], CultureInfo.InvariantCulture); + VerticalErrorUnits = message[3]; + SphericalError = double.Parse(message[4], CultureInfo.InvariantCulture); + SphericalErrorUnits = message[5]; + } + + /// + /// Estimated horizontal position error in meters (HPE) + /// + public double HorizontalError { get; private set; } + + /// + /// Horizontal Error unit ('M' for Meters) + /// + public string HorizontalErrorUnits { get; private set; } + + /// + /// Estimated vertical position error in meters (VPE) + /// + public double VerticalError { get; private set; } + + /// + /// Vertical Error unit ('M' for Meters) + /// + public string VerticalErrorUnits { get; private set; } + + /// + /// Overall spherical equivalent position error + /// + public double SphericalError { get; private set; } + + /// + /// Spherical Error unit ('M' for Meters) + /// + public string SphericalErrorUnits { get; private set; } + } +} diff --git a/src/BTDevices/Nmea/LaserRangeMessage.cs b/src/BTDevices/Nmea/LaserRangeMessage.cs new file mode 100644 index 0000000..9102b21 --- /dev/null +++ b/src/BTDevices/Nmea/LaserRangeMessage.cs @@ -0,0 +1,46 @@ +using System; +using System.Collections.Generic; +using System.Globalization; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace BTDevices.Nmea +{ + /// + /// Laser Range Measurement + /// + public abstract class LaserRangeMessage : NmeaMessage + { + protected override void LoadMessage(string[] message) + { + HorizontalVector = message[0]; + HorizontalDistance = double.Parse(message[1], CultureInfo.InvariantCulture); + HorizontalDistanceUnits = message[2][0]; + HorizontalAngle = double.Parse(message[3], CultureInfo.InvariantCulture); + HorizontalAngleUnits = message[4][0]; + VerticalAngle = double.Parse(message[5], CultureInfo.InvariantCulture); + VerticalAngleUnits = message[6][0]; + SlopeDistance = double.Parse(message[7], CultureInfo.InvariantCulture); + SlopeDistanceUnits = message[8][0]; + } + + public string HorizontalVector { get; private set; } + + public double HorizontalDistance { get; private set; } + + public char HorizontalDistanceUnits { get; private set; } + + public double HorizontalAngle { get; private set; } + + public char HorizontalAngleUnits { get; private set; } + + public double VerticalAngle { get; private set; } + + public char VerticalAngleUnits { get; private set; } + + public double SlopeDistance { get; private set; } + + public char SlopeDistanceUnits { get; private set; } + } +} diff --git a/src/BTDevices/Nmea/LaserTech/LaserRange/PLTIT.cs b/src/BTDevices/Nmea/LaserTech/LaserRange/PLTIT.cs new file mode 100644 index 0000000..9e8a3f2 --- /dev/null +++ b/src/BTDevices/Nmea/LaserTech/LaserRange/PLTIT.cs @@ -0,0 +1,17 @@ +using System; +using System.Collections.Generic; +using System.Globalization; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace BTDevices.Nmea.LaserTech.LaserRange +{ + /// + /// Laser Range + /// + [NmeaMessageType(Type = "PLTIT")] + public class Pltit : LaserRangeMessage + { + } +} diff --git a/src/BTDevices/Nmea/NmeaMessage.cs b/src/BTDevices/Nmea/NmeaMessage.cs new file mode 100644 index 0000000..69bfab7 --- /dev/null +++ b/src/BTDevices/Nmea/NmeaMessage.cs @@ -0,0 +1,97 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Reflection; +using System.Text; +using System.Threading.Tasks; + +namespace BTDevices.Nmea +{ + public class NmeaMessageType : Attribute { public string Type { get; set; } } + + public abstract class NmeaMessage + { + public static NmeaMessage Parse(string message) + { + int checksum = -1; + if (message[0] != '$') + throw new ArgumentException("Invalid nmea message: Missing starting character '$'"); + var idx = message.IndexOf('*'); + if (idx >= 0) + { + checksum = Convert.ToInt32(message.Substring(idx + 1), 16); + message = message.Substring(0, message.IndexOf('*')); + } + if (checksum > -1) + { + int checksumTest = 0; + for (int i = 1; i < message.Length; i++) + { + if (i == 0) continue; + checksumTest ^= Convert.ToByte(message[i]); + } + if (checksum != checksumTest) + throw new ArgumentException("Invalid nmea message: Checksum failure"); + } + + string[] parts = message.Split(new char[] { ',' }); + string MessageType = parts[0].Substring(1); + string[] MessageParts = parts.Skip(1).ToArray(); + if(messageTypes == null) + { + LoadResponseTypes(); + } + NmeaMessage msg = null; + if (messageTypes.ContainsKey(MessageType)) + { + msg = (NmeaMessage)messageTypes[MessageType].Invoke(new object[] { }); + } + else + { + msg = new UnknownMessage(); + } + msg.MessageType = MessageType; + msg.MessageParts = MessageParts; + msg.LoadMessage(MessageParts); + return msg; + } + + private static void LoadResponseTypes() + { + messageTypes = new Dictionary(); + var typeinfo = typeof(NmeaMessage).GetTypeInfo(); + foreach (var subclass in typeinfo.Assembly.DefinedTypes.Where(t => t.IsSubclassOf(typeof(NmeaMessage)))) + { + var attr = subclass.GetCustomAttribute(false); + if (attr != null) + { + if (!subclass.IsAbstract) + { + foreach (var c in subclass.DeclaredConstructors) + { + var pinfo = c.GetParameters(); + if (pinfo.Length == 0) + { + messageTypes.Add(attr.Type, c); + break; + } + } + } + } + } + } + + private static Dictionary messageTypes; + + protected string[] MessageParts { get; private set; } + + public string MessageType { get; private set; } + + protected virtual void LoadMessage(string[] message) { MessageParts = message; } + + public override string ToString() + { + return string.Format("${0},{1}", MessageType, string.Join(",", MessageParts)); + } + } +} diff --git a/src/BTDevices/Nmea/Trimble/LaserRange/PTNLA.cs b/src/BTDevices/Nmea/Trimble/LaserRange/PTNLA.cs new file mode 100644 index 0000000..ce2f80e --- /dev/null +++ b/src/BTDevices/Nmea/Trimble/LaserRange/PTNLA.cs @@ -0,0 +1,17 @@ +using System; +using System.Collections.Generic; +using System.Globalization; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace BTDevices.Nmea.Trimble.LaserRange +{ + /// + /// Burden finder + /// + [NmeaMessageType(Type = "PTNLA")] + public class Ptnla : LaserRangeMessage + { + } +} diff --git a/src/BTDevices/Nmea/Trimble/LaserRange/PTNLB.cs b/src/BTDevices/Nmea/Trimble/LaserRange/PTNLB.cs new file mode 100644 index 0000000..31635c7 --- /dev/null +++ b/src/BTDevices/Nmea/Trimble/LaserRange/PTNLB.cs @@ -0,0 +1,41 @@ +using System; +using System.Collections.Generic; +using System.Globalization; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace BTDevices.Nmea.Trimble.LaserRange +{ + /// + /// Tree Measurement + /// + [NmeaMessageType(Type = "PTNLB")] + public class Ptnlb : NmeaMessage + { + protected override void LoadMessage(string[] message) + { + TreeHeight = message[0]; + MeasuredTreeHeight = double.Parse(message[1], CultureInfo.InvariantCulture); + MeasuredTreeHeightUnits = message[2][0]; + TreeDiameter = message[3]; + MeasuredTreeDiameter = double.Parse(message[4], CultureInfo.InvariantCulture); + MeasuredTreeDiameterUnits = message[5][0]; + } + + public string TreeHeight { get; private set; } + + public double MeasuredTreeHeight { get; private set; } + + public char MeasuredTreeHeightUnits { get; private set; } + + public string TreeDiameter { get; private set; } + + public double MeasuredTreeDiameter { get; private set; } + + public char MeasuredTreeDiameterUnits { get; private set; } + + //more to do... + + } +} diff --git a/src/BTDevices/Nmea/UnknownMessage.cs b/src/BTDevices/Nmea/UnknownMessage.cs new file mode 100644 index 0000000..cd4ada5 --- /dev/null +++ b/src/BTDevices/Nmea/UnknownMessage.cs @@ -0,0 +1,16 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace BTDevices.Nmea +{ + public class UnknownMessage : NmeaMessage + { + public string[] Values { get { return base.MessageParts; } } + protected override void LoadMessage(string[] message) + { + } + } +} diff --git a/src/BTDevices/NmeaDevice.cs b/src/BTDevices/NmeaDevice.cs new file mode 100644 index 0000000..a0b8057 --- /dev/null +++ b/src/BTDevices/NmeaDevice.cs @@ -0,0 +1,55 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +#if NETFX_CORE +using BTDevice = Windows.Devices.Bluetooth.Rfcomm.RfcommDeviceService; +using Windows.Devices.Bluetooth.Rfcomm; +#else +using BTDevice = Windows.Networking.Proximity.PeerInformation; +#endif +using Windows.Foundation; + +namespace BTDevices +{ + public class NmeaDevice : Device + { + private string message = ""; + public NmeaDevice(BTDevice device) + : base(device) + { + } + protected override void OnData(byte[] data) + { + var nmea = System.Text.Encoding.UTF8.GetString(data, 0, data.Length); + message += nmea; + var lineEnd = message.IndexOf("\n"); + if (lineEnd > -1) + { + string line = message.Substring(0, lineEnd); + message = message.Substring(lineEnd).Trim(); + ProcessMessage(line.Trim()); + } + } + + private void ProcessMessage(string p) + { + try + { + var msg = BTDevices.Nmea.NmeaMessage.Parse(p); + if (msg != null) + OnMessageReceived(msg); + } + catch { } + } + + private void OnMessageReceived(Nmea.NmeaMessage msg) + { + if (MessageReceived != null) + MessageReceived(this, msg); + } + + public event TypedEventHandler MessageReceived; + } +} diff --git a/src/BTDevices/Properties/AssemblyInfo.cs b/src/BTDevices/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..4256cd8 --- /dev/null +++ b/src/BTDevices/Properties/AssemblyInfo.cs @@ -0,0 +1,29 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("BTDevices")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("BTDevices")] +[assembly: AssemblyCopyright("Copyright © 2014")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] +[assembly: ComVisible(false)] \ No newline at end of file