Incoming_Message.cs 90 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881
  1. using Edge.Core.IndustryStandardInterface.ATG;
  2. using Edge.Core.Parser.BinaryParser.Util;
  3. using Microsoft.VisualStudio.TestTools.UnitTesting;
  4. using System;
  5. using System.Collections.Generic;
  6. using System.Linq;
  7. using System.Text;
  8. using VeederRoot_ATG_Console.MessageEntity.Incoming;
  9. using VeederRoot_ATG_Console.MessageEntity.Outgoing;
  10. using static VeederRoot_ATG_Console.MessageEntity.Incoming.QueryInTankInventoryReportResponse.InventoryData;
  11. using static VeederRoot_ATG_Console.MessageEntity.MessageBase;
  12. namespace VeederRoot_Test
  13. {
  14. [TestClass]
  15. public class Incoming_Message
  16. {
  17. public static bool ValueEquals(IEnumerable<byte> array1, IEnumerable<byte> array2)
  18. {
  19. if (array1 == null && array2 == null)
  20. {
  21. return true;
  22. }
  23. if ((array1 == null) || (array2 == null))
  24. {
  25. return false;
  26. }
  27. if (array1.Count() != array2.Count())
  28. {
  29. return false;
  30. }
  31. if (array1.Equals(array2))
  32. {
  33. return true;
  34. }
  35. else
  36. {
  37. for (int Index = 0; Index < array1.Count(); Index++)
  38. {
  39. if (!Equals(array1.ElementAt(Index), array2.ElementAt(Index)))
  40. {
  41. return false;
  42. }
  43. }
  44. }
  45. return true;
  46. }
  47. #region QueryInTankInventoryReportResponse
  48. [TestMethod]
  49. public void QueryInTankInventoryReportResponse_TestMethod1()
  50. {
  51. var raw = new byte[] {
  52. //SOH
  53. 0x01,
  54. //Function Code (4 bytes) + TT (2 bytes)
  55. 0x69, 0x32, 0x30, 0x31, 0x30, 0x30,
  56. //Current Date and Time
  57. 0x31, 0x38, 0x30, 0x35, 0x31, 0x30, 0x30, 0x36, 0x30, 0x33,
  58. //Tank Number (Decimal, 00=all)
  59. 0x30, 0x31,
  60. //Product Code (one ASCII character [20h-7Eh])
  61. 0x31,
  62. //Tank Status Bits
  63. 0x30, 0x30, 0x30, 0x39,
  64. //Number of eight character Data Fields to follow (Hex), here value is 7
  65. 0x30, 0x37,
  66. //1. Volume
  67. 0x34, 0x34, 0x46, 0x41, 0x30, 0x30, 0x30, 0x30,
  68. //2. TC Volume
  69. 0x34, 0x34, 0x46, 0x38, 0x41, 0x32, 0x45, 0x36,
  70. //3. Ullage
  71. 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,
  72. //4. Height
  73. 0x34, 0x34, 0x45, 0x34, 0x32, 0x46, 0x38, 0x37,
  74. //5. Water
  75. 0x34, 0x32, 0x38, 0x30, 0x30, 0x30, 0x46, 0x30,
  76. //6. Temperature
  77. 0x34, 0x31, 0x42, 0x41, 0x43, 0x38, 0x43, 0x37,
  78. //7. Water Volume
  79. 0x34, 0x32, 0x32, 0x30, 0x43, 0x30, 0x35, 0x39,
  80. //&& - Data Termination Flag
  81. 0x26, 0x26,
  82. //CCCC - Message Checksum
  83. 0x45, 0x45, 0x41, 0x39,
  84. //ETX
  85. 0x03 };
  86. var request = new QueryInTankInventoryReportResponse();
  87. var p = new VeederRoot_ATG_Console.Parser();
  88. var actual = p.Deserialize(raw.ToArray()) as QueryInTankInventoryReportResponse;
  89. Assert.AreEqual(true, actual != null);
  90. Assert.AreEqual(true, actual.TankNumberInFunctionCode == 0);
  91. Assert.AreEqual(true, actual.InventoryDatas != null);
  92. Assert.AreEqual(true, actual.InventoryDatas.Count == 1);
  93. foreach (var oneTankData in actual.InventoryDatas)
  94. {
  95. Assert.AreEqual(true, oneTankData.TankNumber == 1);
  96. Assert.AreEqual(true, oneTankData.ProductCode == '1');
  97. Assert.AreEqual(true, oneTankData.States != null);
  98. Assert.AreEqual(true, oneTankData.States.Count == 1);
  99. Assert.AreEqual(true, oneTankData.States.First()
  100. == QueryInTankInventoryReportResponse.InventoryData.TankState.DeliveryInProgress_LSB);
  101. Assert.AreEqual(true, oneTankData.NumberOfEightCharDataFieldsToFollow == 7);
  102. Assert.AreEqual(true, oneTankData.TankReadingDatas != null);
  103. Assert.AreEqual(true, oneTankData.TankReadingDatas.Count == 7);
  104. Assert.AreEqual(true,
  105. oneTankData.TankReadingDatas.TryGetValue(
  106. TankReadingDataName.Volume,
  107. out double volumeRead));
  108. Assert.AreEqual(true, volumeRead == VeederRoot_ATG_Console.Util.ConvertIEEEWith4BytesToDouble(new byte[] { 0x44, 0xFA, 0x00, 0x00 }));
  109. Assert.AreEqual(true,
  110. oneTankData.TankReadingDatas.TryGetValue(
  111. TankReadingDataName.TC_Volume,
  112. out double tcVolumeRead));
  113. Assert.AreEqual(true, tcVolumeRead == VeederRoot_ATG_Console.Util.ConvertIEEEWith4BytesToDouble(new byte[] { 0x44, 0xF8, 0xA2, 0xE6 }));
  114. Assert.AreEqual(true,
  115. oneTankData.TankReadingDatas.TryGetValue(
  116. TankReadingDataName.WaterVolume,
  117. out double waterVolumeRead));
  118. Assert.AreEqual(true, waterVolumeRead == VeederRoot_ATG_Console.Util.ConvertIEEEWith4BytesToDouble(new byte[] { 0x42, 0x20, 0xC0, 0x59 }));
  119. foreach (var oneReading in oneTankData.TankReadingDatas)
  120. {
  121. }
  122. }
  123. }
  124. [TestMethod]
  125. public void QueryInTankInventoryReportResponse_TestMethod2()
  126. {
  127. var raw = new byte[] {
  128. //SOH
  129. 0x01,
  130. //Function Code (4 bytes) + TT (2 bytes)
  131. 0x69, 0x32, 0x30, 0x31, 0x30, 0x30,
  132. //Current Date and Time
  133. 0x31, 0x38, 0x30, 0x35, 0x31, 0x30, 0x30, 0x36, 0x30, 0x33,
  134. //Tank Number (Decimal, 00=all)
  135. 0x30, 0x31,
  136. //Product Code (one ASCII character [20h-7Eh])
  137. 0x31,
  138. //Tank Status Bits
  139. 0x30, 0x30, 0x30, 0x34,
  140. //Number of eight character Data Fields to follow (Hex), here value is 7
  141. 0x30, 0x37,
  142. //1. Volume
  143. 0x34, 0x34, 0x46, 0x41, 0x30, 0x30, 0x30, 0x30,
  144. //2. TC Volume
  145. 0x34, 0x34, 0x46, 0x38, 0x41, 0x32, 0x45, 0x36,
  146. //3. Ullage
  147. 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,
  148. //4. Height
  149. 0x34, 0x34, 0x45, 0x34, 0x32, 0x46, 0x38, 0x37,
  150. //5. Water
  151. 0x34, 0x32, 0x38, 0x30, 0x30, 0x30, 0x46, 0x30,
  152. //6. Temperature
  153. 0x34, 0x31, 0x42, 0x41, 0x43, 0x38, 0x43, 0x37,
  154. //7. Water Volume
  155. 0x34, 0x32, 0x32, 0x30, 0x43, 0x30, 0x35, 0x39,
  156. //Tank Number (Decimal, 00=all)
  157. 0x30, 0x32,
  158. //Product Code (one ASCII character [20h-7Eh])
  159. 0x32,
  160. //Tank Status Bits
  161. 0x30, 0x30, 0x30, 0x34,
  162. //Number of eight character Data Fields to follow (Hex), here value is 7
  163. 0x30, 0x37,
  164. //1. Volume
  165. 0x34, 0x34, 0x46, 0x41, 0x30, 0x30, 0x30, 0x30,
  166. //2. TC Volume
  167. 0x34, 0x34, 0x46, 0x38, 0x41, 0x32, 0x45, 0x36,
  168. //3. Ullage
  169. 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,
  170. //4. Height
  171. 0x34, 0x34, 0x45, 0x34, 0x32, 0x46, 0x38, 0x37,
  172. //5. Water
  173. 0x34, 0x32, 0x38, 0x30, 0x30, 0x30, 0x46, 0x30,
  174. //6. Temperature
  175. 0x34, 0x31, 0x42, 0x41, 0x43, 0x38, 0x43, 0x37,
  176. //7. Water Volume
  177. 0x34, 0x32, 0x32, 0x30, 0x43, 0x30, 0x35, 0x39,
  178. //&& - Data Termination Flag
  179. 0x26, 0x26,
  180. //CCCC - Message Checksum
  181. 0x45, 0x45, 0x41, 0x39,
  182. //ETX
  183. 0x03 };
  184. var request = new QueryInTankInventoryReportResponse();
  185. var p = new VeederRoot_ATG_Console.Parser();
  186. var actual = p.Deserialize(raw.ToArray()) as QueryInTankInventoryReportResponse;
  187. Assert.AreEqual(true, actual != null);
  188. Assert.AreEqual(true, actual.TankNumberInFunctionCode == 0);
  189. Assert.AreEqual(true, actual.InventoryDatas != null);
  190. Assert.AreEqual(true, actual.InventoryDatas.Count == 2);
  191. for (int i = 0; i < actual.InventoryDatas.Count; i++)
  192. {
  193. var oneTankData = actual.InventoryDatas[i];
  194. Assert.AreEqual(true, oneTankData.TankNumber == i + 1);
  195. Assert.AreEqual(true, oneTankData.ProductCode == char.Parse((i + 1).ToString()));
  196. Assert.AreEqual(true, oneTankData.States != null);
  197. Assert.AreEqual(true, oneTankData.States.Count == 1);
  198. Assert.AreEqual(true, oneTankData.States.First()
  199. == QueryInTankInventoryReportResponse.InventoryData.TankState.InvalidFuelHeighAlarm_MagProbesOnly);
  200. Assert.AreEqual(true, oneTankData.NumberOfEightCharDataFieldsToFollow == 7);
  201. Assert.AreEqual(true, oneTankData.TankReadingDatas != null);
  202. Assert.AreEqual(true, oneTankData.TankReadingDatas.Count == 7);
  203. Assert.AreEqual(true,
  204. oneTankData.TankReadingDatas.TryGetValue(
  205. TankReadingDataName.Volume,
  206. out double volumeRead));
  207. Assert.AreEqual(true, volumeRead == VeederRoot_ATG_Console.Util.ConvertIEEEWith4BytesToDouble(new byte[] { 0x44, 0xFA, 0x00, 0x00 }));
  208. Assert.AreEqual(true,
  209. oneTankData.TankReadingDatas.TryGetValue(
  210. TankReadingDataName.TC_Volume,
  211. out double tcVolumeRead));
  212. Assert.AreEqual(true, tcVolumeRead == VeederRoot_ATG_Console.Util.ConvertIEEEWith4BytesToDouble(new byte[] { 0x44, 0xF8, 0xA2, 0xE6 }));
  213. Assert.AreEqual(true,
  214. oneTankData.TankReadingDatas.TryGetValue(
  215. TankReadingDataName.WaterVolume,
  216. out double waterVolumeRead));
  217. Assert.AreEqual(true, waterVolumeRead == VeederRoot_ATG_Console.Util.ConvertIEEEWith4BytesToDouble(new byte[] { 0x42, 0x20, 0xC0, 0x59 }));
  218. foreach (var oneReading in oneTankData.TankReadingDatas)
  219. {
  220. }
  221. }
  222. }
  223. [TestMethod]
  224. public void QueryInTankInventoryReportResponse_TestMethod3()
  225. {
  226. var raw = new byte[] {
  227. //SOH
  228. 0x01,
  229. //Function Code (4 bytes) + TT (2 bytes)
  230. 0x69, 0x32, 0x30, 0x31, 0x30, 0x30,
  231. //Current Date and Time
  232. 0x31, 0x38, 0x30, 0x35, 0x31, 0x30, 0x30, 0x36, 0x30, 0x33,
  233. //Tank Number (Decimal, 00=all)
  234. 0x30, 0x31,
  235. //Product Code (one ASCII character [20h-7Eh])
  236. 0x31,
  237. //Tank Status Bits
  238. 0x30, 0x30, 0x30, 0x34,
  239. //Number of eight character Data Fields to follow (Hex), here value is 7
  240. 0x30, 0x37,
  241. //1. Volume
  242. 0x34, 0x34, 0x46, 0x41, 0x30, 0x30, 0x30, 0x30,
  243. //2. TC Volume
  244. 0x34, 0x34, 0x46, 0x38, 0x41, 0x32, 0x45, 0x36,
  245. //3. Ullage
  246. 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,
  247. //4. Height
  248. 0x34, 0x34, 0x45, 0x34, 0x32, 0x46, 0x38, 0x37,
  249. //5. Water
  250. 0x34, 0x32, 0x38, 0x30, 0x30, 0x30, 0x46, 0x30,
  251. //6. Temperature
  252. 0x34, 0x31, 0x42, 0x41, 0x43, 0x38, 0x43, 0x37,
  253. //7. Water Volume
  254. 0x34, 0x32, 0x32, 0x30, 0x43, 0x30, 0x35, 0x39,
  255. //Tank Number (Decimal, 00=all)
  256. 0x30, 0x32,
  257. //Product Code (one ASCII character [20h-7Eh])
  258. 0x32,
  259. //Tank Status Bits
  260. 0x30, 0x30, 0x30, 0x34,
  261. //Number of eight character Data Fields to follow (Hex), here value is 7
  262. 0x30, 0x37,
  263. //1. Volume
  264. 0x34, 0x34, 0x46, 0x41, 0x30, 0x30, 0x30, 0x30,
  265. //2. TC Volume
  266. 0x34, 0x34, 0x46, 0x38, 0x41, 0x32, 0x45, 0x36,
  267. //3. Ullage
  268. 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,
  269. //4. Height
  270. 0x34, 0x34, 0x45, 0x34, 0x32, 0x46, 0x38, 0x37,
  271. //5. Water
  272. 0x34, 0x32, 0x38, 0x30, 0x30, 0x30, 0x46, 0x30,
  273. //6. Temperature
  274. 0x34, 0x31, 0x42, 0x41, 0x43, 0x38, 0x43, 0x37,
  275. //7. Water Volume
  276. 0x34, 0x32, 0x32, 0x30, 0x43, 0x30, 0x35, 0x39,
  277. //Tank Number (Decimal, 00=all)
  278. 0x30, 0x33,
  279. //Product Code (one ASCII character [20h-7Eh])
  280. 0x33,
  281. //Tank Status Bits
  282. 0x30, 0x30, 0x30, 0x34,
  283. //Number of eight character Data Fields to follow (Hex), here value is 7
  284. 0x30, 0x37,
  285. //1. Volume
  286. 0x34, 0x34, 0x46, 0x41, 0x30, 0x30, 0x30, 0x30,
  287. //2. TC Volume
  288. 0x34, 0x34, 0x46, 0x38, 0x41, 0x32, 0x45, 0x36,
  289. //3. Ullage
  290. 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,
  291. //4. Height
  292. 0x34, 0x34, 0x45, 0x34, 0x32, 0x46, 0x38, 0x37,
  293. //5. Water
  294. 0x34, 0x32, 0x38, 0x30, 0x30, 0x30, 0x46, 0x30,
  295. //6. Temperature
  296. 0x34, 0x31, 0x42, 0x41, 0x43, 0x38, 0x43, 0x37,
  297. //7. Water Volume
  298. 0x34, 0x32, 0x32, 0x30, 0x43, 0x30, 0x35, 0x39,
  299. //Tank Number (Decimal, 00=all)
  300. 0x30, 0x34,
  301. //Product Code (one ASCII character [20h-7Eh])
  302. 0x34,
  303. //Tank Status Bits
  304. 0x30, 0x30, 0x30, 0x34,
  305. //Number of eight character Data Fields to follow (Hex), here value is 7
  306. 0x30, 0x37,
  307. //1. Volume
  308. 0x34, 0x34, 0x46, 0x41, 0x30, 0x30, 0x30, 0x30,
  309. //2. TC Volume
  310. 0x34, 0x34, 0x46, 0x38, 0x41, 0x32, 0x45, 0x36,
  311. //3. Ullage
  312. 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,
  313. //4. Height
  314. 0x34, 0x34, 0x45, 0x34, 0x32, 0x46, 0x38, 0x37,
  315. //5. Water
  316. 0x34, 0x32, 0x38, 0x30, 0x30, 0x30, 0x46, 0x30,
  317. //6. Temperature
  318. 0x34, 0x31, 0x42, 0x41, 0x43, 0x38, 0x43, 0x37,
  319. //7. Water Volume
  320. 0x34, 0x32, 0x32, 0x30, 0x43, 0x30, 0x35, 0x39,
  321. //Tank Number (Decimal, 00=all)
  322. 0x30, 0x35,
  323. //Product Code (one ASCII character [20h-7Eh])
  324. 0x35,
  325. //Tank Status Bits
  326. 0x30, 0x30, 0x30, 0x34,
  327. //Number of eight character Data Fields to follow (Hex), here value is 7
  328. 0x30, 0x37,
  329. //1. Volume
  330. 0x34, 0x34, 0x46, 0x41, 0x30, 0x30, 0x30, 0x30,
  331. //2. TC Volume
  332. 0x34, 0x34, 0x46, 0x38, 0x41, 0x32, 0x45, 0x36,
  333. //3. Ullage
  334. 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,
  335. //4. Height
  336. 0x34, 0x34, 0x45, 0x34, 0x32, 0x46, 0x38, 0x37,
  337. //5. Water
  338. 0x34, 0x32, 0x38, 0x30, 0x30, 0x30, 0x46, 0x30,
  339. //6. Temperature
  340. 0x34, 0x31, 0x42, 0x41, 0x43, 0x38, 0x43, 0x37,
  341. //7. Water Volume
  342. 0x34, 0x32, 0x32, 0x30, 0x43, 0x30, 0x35, 0x39,
  343. //Tank Number (Decimal, 00=all)
  344. 0x30, 0x36,
  345. //Product Code (one ASCII character [20h-7Eh])
  346. 0x36,
  347. //Tank Status Bits
  348. 0x30, 0x30, 0x30, 0x34,
  349. //Number of eight character Data Fields to follow (Hex), here value is 7
  350. 0x30, 0x37,
  351. //1. Volume
  352. 0x34, 0x34, 0x46, 0x41, 0x30, 0x30, 0x30, 0x30,
  353. //2. TC Volume
  354. 0x34, 0x34, 0x46, 0x38, 0x41, 0x32, 0x45, 0x36,
  355. //3. Ullage
  356. 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,
  357. //4. Height
  358. 0x34, 0x34, 0x45, 0x34, 0x32, 0x46, 0x38, 0x37,
  359. //5. Water
  360. 0x34, 0x32, 0x38, 0x30, 0x30, 0x30, 0x46, 0x30,
  361. //6. Temperature
  362. 0x34, 0x31, 0x42, 0x41, 0x43, 0x38, 0x43, 0x37,
  363. //7. Water Volume
  364. 0x34, 0x32, 0x32, 0x30, 0x43, 0x30, 0x35, 0x39,
  365. //Tank Number (Decimal, 00=all)
  366. 0x30, 0x37,
  367. //Product Code (one ASCII character [20h-7Eh])
  368. 0x37,
  369. //Tank Status Bits
  370. 0x30, 0x30, 0x30, 0x34,
  371. //Number of eight character Data Fields to follow (Hex), here value is 7
  372. 0x30, 0x37,
  373. //1. Volume
  374. 0x34, 0x34, 0x46, 0x41, 0x30, 0x30, 0x30, 0x30,
  375. //2. TC Volume
  376. 0x34, 0x34, 0x46, 0x38, 0x41, 0x32, 0x45, 0x36,
  377. //3. Ullage
  378. 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,
  379. //4. Height
  380. 0x34, 0x34, 0x45, 0x34, 0x32, 0x46, 0x38, 0x37,
  381. //5. Water
  382. 0x34, 0x32, 0x38, 0x30, 0x30, 0x30, 0x46, 0x30,
  383. //6. Temperature
  384. 0x34, 0x31, 0x42, 0x41, 0x43, 0x38, 0x43, 0x37,
  385. //7. Water Volume
  386. 0x34, 0x32, 0x32, 0x30, 0x43, 0x30, 0x35, 0x39,
  387. //Tank Number (Decimal, 00=all)
  388. 0x30, 0x38,
  389. //Product Code (one ASCII character [20h-7Eh])
  390. 0x38,
  391. //Tank Status Bits
  392. 0x30, 0x30, 0x30, 0x34,
  393. //Number of eight character Data Fields to follow (Hex), here value is 7
  394. 0x30, 0x37,
  395. //1. Volume
  396. 0x34, 0x34, 0x46, 0x41, 0x30, 0x30, 0x30, 0x30,
  397. //2. TC Volume
  398. 0x34, 0x34, 0x46, 0x38, 0x41, 0x32, 0x45, 0x36,
  399. //3. Ullage
  400. 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,
  401. //4. Height
  402. 0x34, 0x34, 0x45, 0x34, 0x32, 0x46, 0x38, 0x37,
  403. //5. Water
  404. 0x34, 0x32, 0x38, 0x30, 0x30, 0x30, 0x46, 0x30,
  405. //6. Temperature
  406. 0x34, 0x31, 0x42, 0x41, 0x43, 0x38, 0x43, 0x37,
  407. //7. Water Volume
  408. 0x34, 0x32, 0x32, 0x30, 0x43, 0x30, 0x35, 0x39,
  409. //&& - Data Termination Flag
  410. 0x26, 0x26,
  411. //CCCC - Message Checksum
  412. 0x45, 0x45, 0x41, 0x39,
  413. //ETX
  414. 0x03 };
  415. var request = new QueryInTankInventoryReportResponse();
  416. var p = new VeederRoot_ATG_Console.Parser();
  417. var actual = p.Deserialize(raw.ToArray()) as QueryInTankInventoryReportResponse;
  418. Assert.AreEqual(true, actual != null);
  419. Assert.AreEqual(true, actual.TankNumberInFunctionCode == 0);
  420. Assert.AreEqual(true, actual.InventoryDatas != null);
  421. Assert.AreEqual(true, actual.InventoryDatas.Count == 8);
  422. for (int i = 0; i < actual.InventoryDatas.Count; i++)
  423. {
  424. var oneTankData = actual.InventoryDatas[i];
  425. Assert.AreEqual(true, oneTankData.TankNumber == i + 1);
  426. Assert.AreEqual(true, oneTankData.ProductCode == char.Parse((i + 1).ToString()));
  427. Assert.AreEqual(true, oneTankData.States != null);
  428. Assert.AreEqual(true, oneTankData.States.Count == 1);
  429. Assert.AreEqual(true, oneTankData.States.First()
  430. == QueryInTankInventoryReportResponse.InventoryData.TankState.InvalidFuelHeighAlarm_MagProbesOnly);
  431. Assert.AreEqual(true, oneTankData.NumberOfEightCharDataFieldsToFollow == 7);
  432. Assert.AreEqual(true, oneTankData.TankReadingDatas != null);
  433. Assert.AreEqual(true, oneTankData.TankReadingDatas.Count == 7);
  434. Assert.AreEqual(true,
  435. oneTankData.TankReadingDatas.TryGetValue(
  436. TankReadingDataName.Volume,
  437. out double volumeRead));
  438. Assert.AreEqual(true, volumeRead == VeederRoot_ATG_Console.Util.ConvertIEEEWith4BytesToDouble(new byte[] { 0x44, 0xFA, 0x00, 0x00 }));
  439. Assert.AreEqual(true,
  440. oneTankData.TankReadingDatas.TryGetValue(
  441. TankReadingDataName.TC_Volume,
  442. out double tcVolumeRead));
  443. Assert.AreEqual(true, tcVolumeRead == VeederRoot_ATG_Console.Util.ConvertIEEEWith4BytesToDouble(new byte[] { 0x44, 0xF8, 0xA2, 0xE6 }));
  444. Assert.AreEqual(true,
  445. oneTankData.TankReadingDatas.TryGetValue(
  446. TankReadingDataName.WaterVolume,
  447. out double waterVolumeRead));
  448. Assert.AreEqual(true, waterVolumeRead == VeederRoot_ATG_Console.Util.ConvertIEEEWith4BytesToDouble(new byte[] { 0x42, 0x20, 0xC0, 0x59 }));
  449. foreach (var oneReading in oneTankData.TankReadingDatas)
  450. {
  451. }
  452. }
  453. }
  454. #endregion
  455. [TestMethod]
  456. public void QueryInTankMostRecentDeliveryReportResponse_TestMethod0()
  457. {
  458. var raw = "01 69 32 30 43 31 32 32 31 30 34 31 35 31 34 34 39 31 32 36 30 31 32 30 31 32 31 31 31 39 35 34 32 30 31 32 31 31 32 30 34 39 31 30 34 36 43 45 34 46 46 42 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 34 31 42 36 41 37 35 39 34 37 33 42 42 39 38 41 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 34 31 42 41 37 46 45 30 34 34 42 33 39 39 39 31 34 35 31 42 44 34 30 38 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 26 26 44 44 31 45 03".ToBytes();
  459. var p = new VeederRoot_ATG_Console.Parser();
  460. var actual = p.Deserialize(raw.ToArray()) as QueryInTankMostRecentDeliveryReportResponse;
  461. Assert.AreEqual(true, actual != null);
  462. Assert.AreEqual(true, actual.TankNumberInFunctionCode == 12);
  463. Assert.AreEqual(true, actual.DeliveriesForTanks != null);
  464. Assert.AreEqual(true, actual.DeliveriesForTanks.Count == 1);
  465. Assert.AreEqual(true, actual.DeliveriesForTanks.First().TankNumber == 12);
  466. }
  467. [TestMethod]
  468. public void QueryInTankMostRecentDeliveryReportResponse_TestMethod1()
  469. {
  470. var raw = new byte[] {
  471. //SOH
  472. 0x01,
  473. //Function Code (4 bytes) + TT (2 bytes)
  474. 0x69, 0x32, 0x30, 0x43, 0x30, 0x30,
  475. //Current Date and Time
  476. 0x31, 0x38, 0x30, 0x35, 0x31, 0x30, 0x30, 0x36, 0x30, 0x33,
  477. //Tank Number (Decimal, 00=all)
  478. 0x30, 0x31,
  479. //Product Code (one ASCII character [20h-7Eh])
  480. 0x31,
  481. //Number of Deliveries to follow (Decimal, 00 if no data available for this tank)
  482. 0x30,0x31,
  483. //Starting Date/Time
  484. 0x32,0x30,0x30,0x31,0x30,0x36,0x31,0x34,0x31,0x39,
  485. //Ending Date/Time
  486. 0x32,0x30,0x30,0x31,0x30,0x36,0x31,0x34,0x32,0x31,
  487. //Number of eight character Data Fields to follow (Hex)
  488. 0x31,0x30,
  489. 0x34,0x34,0x44,0x44,0x39,0x37,0x44,0x45,
  490. 0x34,0x34,0x44,0x43,0x32,0x45,0x44,0x42,
  491. 0x34,0x33,0x44,0x42,0x38,0x39,0x42,0x45,
  492. 0x34,0x31,0x43,0x35,0x32,0x43,0x42,0x41,
  493. 0x34,0x34,0x46,0x41,0x30,0x30,0x30,0x30,
  494. 0x34,0x34,0x46,0x38,0x36,0x38,0x41,0x45,
  495. 0x34,0x33,0x46,0x45,0x41,0x43,0x37,0x46,
  496. 0x34,0x31,0x43,0x35,0x32,0x45,0x32,0x35,
  497. 0x34,0x34,0x37,0x43,0x42,0x32,0x38,0x46,
  498. 0x34,0x34,0x42,0x38,0x38,0x36,0x46,0x41,
  499. 0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,
  500. 0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,
  501. 0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,
  502. 0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,
  503. 0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,
  504. 0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,
  505. //&& - Data Termination Flag
  506. 0x26, 0x26,
  507. //CCCC - Message Checksum
  508. 0x45, 0x45, 0x41, 0x39,
  509. //ETX
  510. 0x03 };
  511. var response = new QueryInTankMostRecentDeliveryReportResponse();
  512. var p = new VeederRoot_ATG_Console.Parser();
  513. var actual = p.Deserialize(raw.ToArray()) as QueryInTankMostRecentDeliveryReportResponse;
  514. Assert.AreEqual(true, actual != null);
  515. Assert.AreEqual(true, actual.TankNumberInFunctionCode == 0);
  516. Assert.AreEqual(true, actual.DeliveriesForTanks != null);
  517. Assert.AreEqual(true, actual.DeliveriesForTanks.Count == 1);
  518. foreach (var deliveriesForOneTank in actual.DeliveriesForTanks)
  519. {
  520. Assert.AreEqual(true, deliveriesForOneTank.TankNumber == 1);
  521. Assert.AreEqual(true, deliveriesForOneTank.ProductCode == '1');
  522. Assert.AreEqual(true, deliveriesForOneTank.Deliveries != null);
  523. Assert.AreEqual(true, deliveriesForOneTank.Deliveries.Count == 1);
  524. foreach (var delivery in deliveriesForOneTank.Deliveries)
  525. {
  526. //foreach (var deliveryReadingDataName in delivery.Datas.Keys)
  527. //{
  528. // var _ = delivery.Datas[deliveryReadingDataName];
  529. //}
  530. Assert.AreEqual(true,
  531. delivery.Datas.TryGetValue(
  532. Edge.Core.IndustryStandardInterface.ATG.DeliveryReadingDataName.StartingVolume,
  533. out double startingVolumeRead));
  534. Assert.AreEqual(true, startingVolumeRead
  535. == VeederRoot_ATG_Console.Util.ConvertIEEEWith4BytesToDouble(
  536. new byte[] {
  537. //0x34,0x34,0x44,0x44,0x39,0x37,0x44,0x45,
  538. 0x44, 0xDD, 0x97, 0xDE }));
  539. Assert.AreEqual(true,
  540. delivery.Datas.TryGetValue(
  541. Edge.Core.IndustryStandardInterface.ATG.DeliveryReadingDataName.StartingTcVolume,
  542. out double startingTcVolumeRead));
  543. Assert.AreEqual(true, startingTcVolumeRead
  544. == VeederRoot_ATG_Console.Util.ConvertIEEEWith4BytesToDouble(
  545. new byte[] {
  546. //0x34,0x34,0x44,0x43,0x32,0x45,0x44,0x42,
  547. 0x44, 0xDC, 0x2E, 0xDB }));
  548. Assert.AreEqual(true,
  549. delivery.Datas.TryGetValue(
  550. Edge.Core.IndustryStandardInterface.ATG.DeliveryReadingDataName.StartingHeight,
  551. out double startingHeightRead));
  552. Assert.AreEqual(true, startingHeightRead
  553. == VeederRoot_ATG_Console.Util.ConvertIEEEWith4BytesToDouble(
  554. new byte[] {
  555. //0x34,0x34,0x37,0x43,0x42,0x32,0x38,0x46,
  556. 0x44, 0x7C, 0xB2, 0x8F }));
  557. Assert.AreEqual(true,
  558. delivery.Datas.TryGetValue(
  559. Edge.Core.IndustryStandardInterface.ATG.DeliveryReadingDataName.EndingHeight,
  560. out double endingHeightRead));
  561. Assert.AreEqual(true, endingHeightRead
  562. == VeederRoot_ATG_Console.Util.ConvertIEEEWith4BytesToDouble(
  563. new byte[] {
  564. //0x34,0x34,0x42,0x38,0x38,0x36,0x46,0x41,
  565. 0x44, 0xB8, 0x86, 0xFA }));
  566. }
  567. }
  568. }
  569. [TestMethod]
  570. public void QueryInTankMostRecentDeliveryReportResponse_TestMethod2()
  571. {
  572. var raw = new byte[] {
  573. //SOH
  574. 0x01,
  575. //Function Code (4 bytes) + TT (2 bytes)
  576. 0x69, 0x32, 0x30, 0x43, 0x30, 0x30,
  577. //Current Date and Time
  578. 0x31, 0x38, 0x30, 0x35, 0x31, 0x30, 0x30, 0x36, 0x30, 0x33,
  579. //================================================
  580. //Tank Number (Decimal, 00=all)
  581. 0x30, 0x31,
  582. //Product Code (one ASCII character [20h-7Eh])
  583. 0x31,
  584. //Number of Deliveries to follow (Decimal, 00 if no data available for this tank)
  585. 0x30,0x31,
  586. //Starting Date/Time
  587. 0x32,0x30,0x30,0x31,0x30,0x36,0x31,0x34,0x31,0x39,
  588. //Ending Date/Time
  589. 0x32,0x30,0x30,0x31,0x30,0x36,0x31,0x34,0x32,0x31,
  590. //Number of eight character Data Fields to follow (Hex)
  591. 0x31,0x30,
  592. 0x34,0x34,0x44,0x44,0x39,0x37,0x44,0x45,
  593. 0x34,0x34,0x44,0x43,0x32,0x45,0x44,0x42,
  594. 0x34,0x33,0x44,0x42,0x38,0x39,0x42,0x45,
  595. 0x34,0x31,0x43,0x35,0x32,0x43,0x42,0x41,
  596. 0x34,0x34,0x46,0x41,0x30,0x30,0x30,0x30,
  597. 0x34,0x34,0x46,0x38,0x36,0x38,0x41,0x45,
  598. 0x34,0x33,0x46,0x45,0x41,0x43,0x37,0x46,
  599. 0x34,0x31,0x43,0x35,0x32,0x45,0x32,0x35,
  600. 0x34,0x34,0x37,0x43,0x42,0x32,0x38,0x46,
  601. 0x34,0x34,0x42,0x38,0x38,0x36,0x46,0x41,
  602. 0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,
  603. 0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,
  604. 0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,
  605. 0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,
  606. 0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,
  607. 0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,
  608. //================================================
  609. //Tank Number (Decimal, 00=all)
  610. 0x30, 0x32,
  611. //Product Code (one ASCII character [20h-7Eh])
  612. 0x32,
  613. //Number of Deliveries to follow (Decimal, 00 if no data available for this tank)
  614. 0x30,0x31,
  615. //Starting Date/Time
  616. 0x32,0x30,0x30,0x31,0x30,0x36,0x31,0x34,0x31,0x39,
  617. //Ending Date/Time
  618. 0x32,0x30,0x30,0x31,0x30,0x36,0x31,0x34,0x32,0x31,
  619. //Number of eight character Data Fields to follow (Hex)
  620. 0x31,0x30,
  621. 0x34,0x34,0x44,0x44,0x39,0x37,0x44,0x45,
  622. 0x34,0x34,0x44,0x43,0x32,0x45,0x44,0x42,
  623. 0x34,0x33,0x44,0x42,0x38,0x39,0x42,0x45,
  624. 0x34,0x31,0x43,0x35,0x32,0x43,0x42,0x41,
  625. 0x34,0x34,0x46,0x41,0x30,0x30,0x30,0x30,
  626. 0x34,0x34,0x46,0x38,0x36,0x38,0x41,0x45,
  627. 0x34,0x33,0x46,0x45,0x41,0x43,0x37,0x46,
  628. 0x34,0x31,0x43,0x35,0x32,0x45,0x32,0x35,
  629. 0x34,0x34,0x37,0x43,0x42,0x32,0x38,0x46,
  630. 0x34,0x34,0x42,0x38,0x38,0x36,0x46,0x41,
  631. 0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,
  632. 0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,
  633. 0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,
  634. 0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,
  635. 0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,
  636. 0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,
  637. //================================================
  638. //Tank Number (Decimal, 00=all)
  639. 0x30, 0x33,
  640. //Product Code (one ASCII character [20h-7Eh])
  641. 0x33,
  642. //Number of Deliveries to follow (Decimal, 00 if no data available for this tank)
  643. 0x30,0x31,
  644. //Starting Date/Time
  645. 0x32,0x30,0x30,0x31,0x30,0x36,0x31,0x34,0x31,0x39,
  646. //Ending Date/Time
  647. 0x32,0x30,0x30,0x31,0x30,0x36,0x31,0x34,0x32,0x31,
  648. //Number of eight character Data Fields to follow (Hex)
  649. 0x31,0x30,
  650. 0x34,0x34,0x44,0x44,0x39,0x37,0x44,0x45,
  651. 0x34,0x34,0x44,0x43,0x32,0x45,0x44,0x42,
  652. 0x34,0x33,0x44,0x42,0x38,0x39,0x42,0x45,
  653. 0x34,0x31,0x43,0x35,0x32,0x43,0x42,0x41,
  654. 0x34,0x34,0x46,0x41,0x30,0x30,0x30,0x30,
  655. 0x34,0x34,0x46,0x38,0x36,0x38,0x41,0x45,
  656. 0x34,0x33,0x46,0x45,0x41,0x43,0x37,0x46,
  657. 0x34,0x31,0x43,0x35,0x32,0x45,0x32,0x35,
  658. 0x34,0x34,0x37,0x43,0x42,0x32,0x38,0x46,
  659. 0x34,0x34,0x42,0x38,0x38,0x36,0x46,0x41,
  660. 0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,
  661. 0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,
  662. 0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,
  663. 0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,
  664. 0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,
  665. 0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,
  666. //================================================
  667. //Tank Number (Decimal, 00=all)
  668. 0x30, 0x34,
  669. //Product Code (one ASCII character [20h-7Eh])
  670. 0x34,
  671. //Number of Deliveries to follow (Decimal, 00 if no data available for this tank)
  672. 0x30,0x31,
  673. //Starting Date/Time
  674. 0x32,0x30,0x30,0x31,0x30,0x36,0x31,0x34,0x31,0x39,
  675. //Ending Date/Time
  676. 0x32,0x30,0x30,0x31,0x30,0x36,0x31,0x34,0x32,0x31,
  677. //Number of eight character Data Fields to follow (Hex)
  678. 0x31,0x30,
  679. 0x34,0x34,0x44,0x44,0x39,0x37,0x44,0x45,
  680. 0x34,0x34,0x44,0x43,0x32,0x45,0x44,0x42,
  681. 0x34,0x33,0x44,0x42,0x38,0x39,0x42,0x45,
  682. 0x34,0x31,0x43,0x35,0x32,0x43,0x42,0x41,
  683. 0x34,0x34,0x46,0x41,0x30,0x30,0x30,0x30,
  684. 0x34,0x34,0x46,0x38,0x36,0x38,0x41,0x45,
  685. 0x34,0x33,0x46,0x45,0x41,0x43,0x37,0x46,
  686. 0x34,0x31,0x43,0x35,0x32,0x45,0x32,0x35,
  687. 0x34,0x34,0x37,0x43,0x42,0x32,0x38,0x46,
  688. 0x34,0x34,0x42,0x38,0x38,0x36,0x46,0x41,
  689. 0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,
  690. 0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,
  691. 0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,
  692. 0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,
  693. 0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,
  694. 0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,
  695. //&& - Data Termination Flag
  696. 0x26, 0x26,
  697. //CCCC - Message Checksum
  698. 0x45, 0x45, 0x41, 0x39,
  699. //ETX
  700. 0x03 };
  701. var response = new QueryInTankMostRecentDeliveryReportResponse();
  702. var p = new VeederRoot_ATG_Console.Parser();
  703. var actual = p.Deserialize(raw.ToArray()) as QueryInTankMostRecentDeliveryReportResponse;
  704. Assert.AreEqual(true, actual != null);
  705. Assert.AreEqual(true, actual.TankNumberInFunctionCode == 0);
  706. Assert.AreEqual(true, actual.DeliveriesForTanks != null);
  707. Assert.AreEqual(true, actual.DeliveriesForTanks.Count == 4);
  708. for (int i = 0; i < actual.DeliveriesForTanks.Count; i++)
  709. {
  710. var deliveriesForOneTank = actual.DeliveriesForTanks[i];
  711. Assert.AreEqual(true, deliveriesForOneTank.TankNumber == i + 1);
  712. Assert.AreEqual(true, deliveriesForOneTank.ProductCode == char.Parse((i + 1).ToString()));
  713. Assert.AreEqual(true, deliveriesForOneTank.Deliveries != null);
  714. Assert.AreEqual(true, deliveriesForOneTank.Deliveries.Count == 1);
  715. foreach (var delivery in deliveriesForOneTank.Deliveries)
  716. {
  717. //foreach (var deliveryReadingDataName in delivery.Datas.Keys)
  718. //{
  719. // var _ = delivery.Datas[deliveryReadingDataName];
  720. //}
  721. Assert.AreEqual(true,
  722. delivery.Datas.TryGetValue(
  723. Edge.Core.IndustryStandardInterface.ATG.DeliveryReadingDataName.StartingVolume,
  724. out double startingVolumeRead));
  725. Assert.AreEqual(true, startingVolumeRead
  726. == VeederRoot_ATG_Console.Util.ConvertIEEEWith4BytesToDouble(
  727. new byte[] {
  728. //0x34,0x34,0x44,0x44,0x39,0x37,0x44,0x45,
  729. 0x44, 0xDD, 0x97, 0xDE }));
  730. Assert.AreEqual(true,
  731. delivery.Datas.TryGetValue(
  732. Edge.Core.IndustryStandardInterface.ATG.DeliveryReadingDataName.StartingTcVolume,
  733. out double startingTcVolumeRead));
  734. Assert.AreEqual(true, startingTcVolumeRead
  735. == VeederRoot_ATG_Console.Util.ConvertIEEEWith4BytesToDouble(
  736. new byte[] {
  737. //0x34,0x34,0x44,0x43,0x32,0x45,0x44,0x42,
  738. 0x44, 0xDC, 0x2E, 0xDB }));
  739. Assert.AreEqual(true,
  740. delivery.Datas.TryGetValue(
  741. Edge.Core.IndustryStandardInterface.ATG.DeliveryReadingDataName.StartingHeight,
  742. out double startingHeightRead));
  743. Assert.AreEqual(true, startingHeightRead
  744. == VeederRoot_ATG_Console.Util.ConvertIEEEWith4BytesToDouble(
  745. new byte[] {
  746. //0x34,0x34,0x37,0x43,0x42,0x32,0x38,0x46,
  747. 0x44, 0x7C, 0xB2, 0x8F }));
  748. Assert.AreEqual(true,
  749. delivery.Datas.TryGetValue(
  750. Edge.Core.IndustryStandardInterface.ATG.DeliveryReadingDataName.EndingHeight,
  751. out double endingHeightRead));
  752. Assert.AreEqual(true, endingHeightRead
  753. == VeederRoot_ATG_Console.Util.ConvertIEEEWith4BytesToDouble(
  754. new byte[] {
  755. //0x34,0x34,0x42,0x38,0x38,0x36,0x46,0x41,
  756. 0x44, 0xB8, 0x86, 0xFA }));
  757. }
  758. }
  759. }
  760. [TestMethod]
  761. public void QueryInTankMostRecentDeliveryReportResponse_TestMethod3()
  762. {
  763. var raw = new byte[] {
  764. //SOH
  765. 0x01,
  766. //Function Code (4 bytes) + TT (2 bytes)
  767. 0x69, 0x32, 0x30, 0x43, 0x30, 0x30,
  768. //Current Date and Time
  769. 0x31, 0x38, 0x30, 0x35, 0x31, 0x30, 0x30, 0x36, 0x30, 0x33,
  770. //================================================
  771. //Tank Number (Decimal, 00=all)
  772. 0x30, 0x31,
  773. //Product Code (one ASCII character [20h-7Eh])
  774. 0x31,
  775. //Number of Deliveries to follow (Decimal, 00 if no data available for this tank)
  776. 0x30,0x32,
  777. //Starting Date/Time
  778. 0x32,0x30,0x30,0x31,0x30,0x36,0x31,0x34,0x31,0x39,
  779. //Ending Date/Time
  780. 0x32,0x30,0x30,0x31,0x30,0x36,0x31,0x34,0x32,0x31,
  781. //Number of eight character Data Fields to follow (Hex)
  782. 0x31,0x30,
  783. 0x34,0x34,0x44,0x44,0x39,0x37,0x44,0x45,
  784. 0x34,0x34,0x44,0x43,0x32,0x45,0x44,0x42,
  785. 0x34,0x33,0x44,0x42,0x38,0x39,0x42,0x45,
  786. 0x34,0x31,0x43,0x35,0x32,0x43,0x42,0x41,
  787. 0x34,0x34,0x46,0x41,0x30,0x30,0x30,0x30,
  788. 0x34,0x34,0x46,0x38,0x36,0x38,0x41,0x45,
  789. 0x34,0x33,0x46,0x45,0x41,0x43,0x37,0x46,
  790. 0x34,0x31,0x43,0x35,0x32,0x45,0x32,0x35,
  791. 0x34,0x34,0x37,0x43,0x42,0x32,0x38,0x46,
  792. 0x34,0x34,0x42,0x38,0x38,0x36,0x46,0x41,
  793. 0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,
  794. 0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,
  795. 0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,
  796. 0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,
  797. 0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,
  798. 0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,
  799. //Starting Date/Time
  800. 0x32,0x30,0x30,0x31,0x30,0x36,0x31,0x34,0x31,0x39,
  801. //Ending Date/Time
  802. 0x32,0x30,0x30,0x31,0x30,0x36,0x31,0x34,0x32,0x31,
  803. //Number of eight character Data Fields to follow (Hex)
  804. 0x31,0x30,
  805. 0x34,0x34,0x44,0x44,0x39,0x37,0x44,0x45,
  806. 0x34,0x34,0x44,0x43,0x32,0x45,0x44,0x42,
  807. 0x34,0x33,0x44,0x42,0x38,0x39,0x42,0x45,
  808. 0x34,0x31,0x43,0x35,0x32,0x43,0x42,0x41,
  809. 0x34,0x34,0x46,0x41,0x30,0x30,0x30,0x30,
  810. 0x34,0x34,0x46,0x38,0x36,0x38,0x41,0x45,
  811. 0x34,0x33,0x46,0x45,0x41,0x43,0x37,0x46,
  812. 0x34,0x31,0x43,0x35,0x32,0x45,0x32,0x35,
  813. 0x34,0x34,0x37,0x43,0x42,0x32,0x38,0x46,
  814. 0x34,0x34,0x42,0x38,0x38,0x36,0x46,0x41,
  815. 0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,
  816. 0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,
  817. 0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,
  818. 0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,
  819. 0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,
  820. 0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,
  821. //================================================
  822. //Tank Number (Decimal, 00=all)
  823. 0x30, 0x32,
  824. //Product Code (one ASCII character [20h-7Eh])
  825. 0x32,
  826. //Number of Deliveries to follow (Decimal, 00 if no data available for this tank)
  827. 0x30,0x30,
  828. //================================================
  829. //Tank Number (Decimal, 00=all)
  830. 0x30, 0x33,
  831. //Product Code (one ASCII character [20h-7Eh])
  832. 0x33,
  833. //Number of Deliveries to follow (Decimal, 00 if no data available for this tank)
  834. 0x30,0x31,
  835. //Starting Date/Time
  836. 0x32,0x30,0x30,0x31,0x30,0x36,0x31,0x34,0x31,0x39,
  837. //Ending Date/Time
  838. 0x32,0x30,0x30,0x31,0x30,0x36,0x31,0x34,0x32,0x31,
  839. //Number of eight character Data Fields to follow (Hex)
  840. 0x31,0x30,
  841. 0x34,0x34,0x44,0x44,0x39,0x37,0x44,0x45,
  842. 0x34,0x34,0x44,0x43,0x32,0x45,0x44,0x42,
  843. 0x34,0x33,0x44,0x42,0x38,0x39,0x42,0x45,
  844. 0x34,0x31,0x43,0x35,0x32,0x43,0x42,0x41,
  845. 0x34,0x34,0x46,0x41,0x30,0x30,0x30,0x30,
  846. 0x34,0x34,0x46,0x38,0x36,0x38,0x41,0x45,
  847. 0x34,0x33,0x46,0x45,0x41,0x43,0x37,0x46,
  848. 0x34,0x31,0x43,0x35,0x32,0x45,0x32,0x35,
  849. 0x34,0x34,0x37,0x43,0x42,0x32,0x38,0x46,
  850. 0x34,0x34,0x42,0x38,0x38,0x36,0x46,0x41,
  851. 0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,
  852. 0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,
  853. 0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,
  854. 0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,
  855. 0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,
  856. 0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,
  857. //================================================
  858. //Tank Number (Decimal, 00=all)
  859. 0x30, 0x34,
  860. //Product Code (one ASCII character [20h-7Eh])
  861. 0x34,
  862. //Number of Deliveries to follow (Decimal, 00 if no data available for this tank)
  863. 0x30,0x31,
  864. //Starting Date/Time
  865. 0x32,0x30,0x30,0x31,0x30,0x36,0x31,0x34,0x31,0x39,
  866. //Ending Date/Time
  867. 0x32,0x30,0x30,0x31,0x30,0x36,0x31,0x34,0x32,0x31,
  868. //Number of eight character Data Fields to follow (Hex)
  869. 0x31,0x30,
  870. 0x34,0x34,0x44,0x44,0x39,0x37,0x44,0x45,
  871. 0x34,0x34,0x44,0x43,0x32,0x45,0x44,0x42,
  872. 0x34,0x33,0x44,0x42,0x38,0x39,0x42,0x45,
  873. 0x34,0x31,0x43,0x35,0x32,0x43,0x42,0x41,
  874. 0x34,0x34,0x46,0x41,0x30,0x30,0x30,0x30,
  875. 0x34,0x34,0x46,0x38,0x36,0x38,0x41,0x45,
  876. 0x34,0x33,0x46,0x45,0x41,0x43,0x37,0x46,
  877. 0x34,0x31,0x43,0x35,0x32,0x45,0x32,0x35,
  878. 0x34,0x34,0x37,0x43,0x42,0x32,0x38,0x46,
  879. 0x34,0x34,0x42,0x38,0x38,0x36,0x46,0x41,
  880. 0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,
  881. 0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,
  882. 0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,
  883. 0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,
  884. 0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,
  885. 0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,
  886. //&& - Data Termination Flag
  887. 0x26, 0x26,
  888. //CCCC - Message Checksum
  889. 0x45, 0x45, 0x41, 0x39,
  890. //ETX
  891. 0x03 };
  892. var response = new QueryInTankMostRecentDeliveryReportResponse();
  893. var p = new VeederRoot_ATG_Console.Parser();
  894. var actual = p.Deserialize(raw.ToArray()) as QueryInTankMostRecentDeliveryReportResponse;
  895. Assert.AreEqual(true, actual != null);
  896. Assert.AreEqual(true, actual.TankNumberInFunctionCode == 0);
  897. Assert.AreEqual(true, actual.DeliveriesForTanks != null);
  898. Assert.AreEqual(true, actual.DeliveriesForTanks.Count == 4);
  899. for (int i = 0; i < actual.DeliveriesForTanks.Count; i++)
  900. {
  901. var deliveriesForOneTank = actual.DeliveriesForTanks[i];
  902. Assert.AreEqual(true, deliveriesForOneTank.TankNumber == i + 1);
  903. Assert.AreEqual(true, deliveriesForOneTank.ProductCode == char.Parse((i + 1).ToString()));
  904. if (deliveriesForOneTank.TankNumber == 2)
  905. Assert.AreEqual(true, deliveriesForOneTank.Deliveries == null);
  906. else
  907. Assert.AreEqual(true, deliveriesForOneTank.Deliveries != null);
  908. if (deliveriesForOneTank.TankNumber == 1)
  909. Assert.AreEqual(true, deliveriesForOneTank.Deliveries.Count == 2);
  910. else if (deliveriesForOneTank.TankNumber == 2)
  911. Assert.AreEqual(true, deliveriesForOneTank.Deliveries == null);
  912. else
  913. Assert.AreEqual(true, deliveriesForOneTank.Deliveries.Count == 1);
  914. if (deliveriesForOneTank.Deliveries != null)
  915. foreach (var delivery in deliveriesForOneTank.Deliveries)
  916. {
  917. //foreach (var deliveryReadingDataName in delivery.Datas.Keys)
  918. //{
  919. // var _ = delivery.Datas[deliveryReadingDataName];
  920. //}
  921. Assert.AreEqual(true,
  922. delivery.Datas.TryGetValue(
  923. Edge.Core.IndustryStandardInterface.ATG.DeliveryReadingDataName.StartingVolume,
  924. out double startingVolumeRead));
  925. Assert.AreEqual(true, startingVolumeRead
  926. == VeederRoot_ATG_Console.Util.ConvertIEEEWith4BytesToDouble(
  927. new byte[] {
  928. //0x34,0x34,0x44,0x44,0x39,0x37,0x44,0x45,
  929. 0x44, 0xDD, 0x97, 0xDE }));
  930. Assert.AreEqual(true,
  931. delivery.Datas.TryGetValue(
  932. Edge.Core.IndustryStandardInterface.ATG.DeliveryReadingDataName.StartingTcVolume,
  933. out double startingTcVolumeRead));
  934. Assert.AreEqual(true, startingTcVolumeRead
  935. == VeederRoot_ATG_Console.Util.ConvertIEEEWith4BytesToDouble(
  936. new byte[] {
  937. //0x34,0x34,0x44,0x43,0x32,0x45,0x44,0x42,
  938. 0x44, 0xDC, 0x2E, 0xDB }));
  939. Assert.AreEqual(true,
  940. delivery.Datas.TryGetValue(
  941. Edge.Core.IndustryStandardInterface.ATG.DeliveryReadingDataName.StartingHeight,
  942. out double startingHeightRead));
  943. Assert.AreEqual(true, startingHeightRead
  944. == VeederRoot_ATG_Console.Util.ConvertIEEEWith4BytesToDouble(
  945. new byte[] {
  946. //0x34,0x34,0x37,0x43,0x42,0x32,0x38,0x46,
  947. 0x44, 0x7C, 0xB2, 0x8F }));
  948. Assert.AreEqual(true,
  949. delivery.Datas.TryGetValue(
  950. Edge.Core.IndustryStandardInterface.ATG.DeliveryReadingDataName.EndingHeight,
  951. out double endingHeightRead));
  952. Assert.AreEqual(true, endingHeightRead
  953. == VeederRoot_ATG_Console.Util.ConvertIEEEWith4BytesToDouble(
  954. new byte[] {
  955. //0x34,0x34,0x42,0x38,0x38,0x36,0x46,0x41,
  956. 0x44, 0xB8, 0x86, 0xFA }));
  957. }
  958. }
  959. }
  960. [TestMethod]
  961. public void QueryInTankMostRecentDeliveryReportResponse_TestMethod4()
  962. {
  963. var raw = new byte[] {
  964. //SOH
  965. 0x01,
  966. //Function Code (4 bytes) + TT (2 bytes)
  967. 0x69, 0x32, 0x30, 0x43, 0x30, 0x30,
  968. //Current Date and Time
  969. 0x31, 0x38, 0x30, 0x35, 0x31, 0x30, 0x30, 0x36, 0x30, 0x33,
  970. //================================================
  971. //Tank Number (Decimal, 00=all)
  972. 0x30, 0x31,
  973. //Product Code (one ASCII character [20h-7Eh])
  974. 0x31,
  975. //Number of Deliveries to follow (Decimal, 00 if no data available for this tank)
  976. 0x30,0x32,
  977. //Starting Date/Time
  978. 0x32,0x30,0x30,0x31,0x30,0x36,0x31,0x34,0x31,0x39,
  979. //Ending Date/Time
  980. 0x32,0x30,0x30,0x31,0x30,0x36,0x31,0x34,0x32,0x31,
  981. //Number of eight character Data Fields to follow (Hex)
  982. 0x30,0x39,
  983. 0x34,0x34,0x44,0x44,0x39,0x37,0x44,0x45,
  984. 0x34,0x34,0x44,0x43,0x32,0x45,0x44,0x42,
  985. 0x34,0x33,0x44,0x42,0x38,0x39,0x42,0x45,
  986. 0x34,0x31,0x43,0x35,0x32,0x43,0x42,0x41,
  987. 0x34,0x34,0x46,0x41,0x30,0x30,0x30,0x30,
  988. 0x34,0x34,0x46,0x38,0x36,0x38,0x41,0x45,
  989. 0x34,0x33,0x46,0x45,0x41,0x43,0x37,0x46,
  990. 0x34,0x31,0x43,0x35,0x32,0x45,0x32,0x35,
  991. 0x34,0x34,0x37,0x43,0x42,0x32,0x38,0x46,
  992. //0x34,0x34,0x42,0x38,0x38,0x36,0x46,0x41,
  993. //Starting Date/Time
  994. 0x32,0x30,0x30,0x31,0x30,0x36,0x31,0x34,0x31,0x39,
  995. //Ending Date/Time
  996. 0x32,0x30,0x30,0x31,0x30,0x36,0x31,0x34,0x32,0x31,
  997. //Number of eight character Data Fields to follow (Hex)
  998. 0x30,0x39,
  999. 0x34,0x34,0x44,0x44,0x39,0x37,0x44,0x45,
  1000. 0x34,0x34,0x44,0x43,0x32,0x45,0x44,0x42,
  1001. 0x34,0x33,0x44,0x42,0x38,0x39,0x42,0x45,
  1002. 0x34,0x31,0x43,0x35,0x32,0x43,0x42,0x41,
  1003. 0x34,0x34,0x46,0x41,0x30,0x30,0x30,0x30,
  1004. 0x34,0x34,0x46,0x38,0x36,0x38,0x41,0x45,
  1005. 0x34,0x33,0x46,0x45,0x41,0x43,0x37,0x46,
  1006. 0x34,0x31,0x43,0x35,0x32,0x45,0x32,0x35,
  1007. 0x34,0x34,0x37,0x43,0x42,0x32,0x38,0x46,
  1008. //================================================
  1009. //Tank Number (Decimal, 00=all)
  1010. 0x30, 0x32,
  1011. //Product Code (one ASCII character [20h-7Eh])
  1012. 0x32,
  1013. //Number of Deliveries to follow (Decimal, 00 if no data available for this tank)
  1014. 0x30,0x30,
  1015. //================================================
  1016. //Tank Number (Decimal, 00=all)
  1017. 0x30, 0x33,
  1018. //Product Code (one ASCII character [20h-7Eh])
  1019. 0x33,
  1020. //Number of Deliveries to follow (Decimal, 00 if no data available for this tank)
  1021. 0x30,0x31,
  1022. //Starting Date/Time
  1023. 0x32,0x30,0x30,0x31,0x30,0x36,0x31,0x34,0x31,0x39,
  1024. //Ending Date/Time
  1025. 0x32,0x30,0x30,0x31,0x30,0x36,0x31,0x34,0x32,0x31,
  1026. //Number of eight character Data Fields to follow (Hex)
  1027. 0x31,0x30,
  1028. 0x34,0x34,0x44,0x44,0x39,0x37,0x44,0x45,
  1029. 0x34,0x34,0x44,0x43,0x32,0x45,0x44,0x42,
  1030. 0x34,0x33,0x44,0x42,0x38,0x39,0x42,0x45,
  1031. 0x34,0x31,0x43,0x35,0x32,0x43,0x42,0x41,
  1032. 0x34,0x34,0x46,0x41,0x30,0x30,0x30,0x30,
  1033. 0x34,0x34,0x46,0x38,0x36,0x38,0x41,0x45,
  1034. 0x34,0x33,0x46,0x45,0x41,0x43,0x37,0x46,
  1035. 0x34,0x31,0x43,0x35,0x32,0x45,0x32,0x35,
  1036. 0x34,0x34,0x37,0x43,0x42,0x32,0x38,0x46,
  1037. 0x34,0x34,0x42,0x38,0x38,0x36,0x46,0x41,
  1038. 0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,
  1039. 0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,
  1040. 0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,
  1041. 0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,
  1042. 0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,
  1043. 0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,
  1044. //================================================
  1045. //Tank Number (Decimal, 00=all)
  1046. 0x30, 0x34,
  1047. //Product Code (one ASCII character [20h-7Eh])
  1048. 0x34,
  1049. //Number of Deliveries to follow (Decimal, 00 if no data available for this tank)
  1050. 0x30,0x31,
  1051. //Starting Date/Time
  1052. 0x32,0x30,0x30,0x31,0x30,0x36,0x31,0x34,0x31,0x39,
  1053. //Ending Date/Time
  1054. 0x32,0x30,0x30,0x31,0x30,0x36,0x31,0x34,0x32,0x31,
  1055. //Number of eight character Data Fields to follow (Hex)
  1056. 0x31,0x30,
  1057. 0x34,0x34,0x44,0x44,0x39,0x37,0x44,0x45,
  1058. 0x34,0x34,0x44,0x43,0x32,0x45,0x44,0x42,
  1059. 0x34,0x33,0x44,0x42,0x38,0x39,0x42,0x45,
  1060. 0x34,0x31,0x43,0x35,0x32,0x43,0x42,0x41,
  1061. 0x34,0x34,0x46,0x41,0x30,0x30,0x30,0x30,
  1062. 0x34,0x34,0x46,0x38,0x36,0x38,0x41,0x45,
  1063. 0x34,0x33,0x46,0x45,0x41,0x43,0x37,0x46,
  1064. 0x34,0x31,0x43,0x35,0x32,0x45,0x32,0x35,
  1065. 0x34,0x34,0x37,0x43,0x42,0x32,0x38,0x46,
  1066. 0x34,0x34,0x42,0x38,0x38,0x36,0x46,0x41,
  1067. 0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,
  1068. 0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,
  1069. 0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,
  1070. 0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,
  1071. 0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,
  1072. 0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,
  1073. //&& - Data Termination Flag
  1074. 0x26, 0x26,
  1075. //CCCC - Message Checksum
  1076. 0x45, 0x45, 0x41, 0x39,
  1077. //ETX
  1078. 0x03 };
  1079. var response = new QueryInTankMostRecentDeliveryReportResponse();
  1080. var p = new VeederRoot_ATG_Console.Parser();
  1081. var actual = p.Deserialize(raw.ToArray()) as QueryInTankMostRecentDeliveryReportResponse;
  1082. Assert.AreEqual(true, actual != null);
  1083. Assert.AreEqual(true, actual.TankNumberInFunctionCode == 0);
  1084. Assert.AreEqual(true, actual.DeliveriesForTanks != null);
  1085. Assert.AreEqual(true, actual.DeliveriesForTanks.Count == 4);
  1086. for (int i = 0; i < actual.DeliveriesForTanks.Count; i++)
  1087. {
  1088. var deliveriesForOneTank = actual.DeliveriesForTanks[i];
  1089. Assert.AreEqual(true, deliveriesForOneTank.TankNumber == i + 1);
  1090. Assert.AreEqual(true, deliveriesForOneTank.ProductCode == char.Parse((i + 1).ToString()));
  1091. if (deliveriesForOneTank.TankNumber == 2)
  1092. Assert.AreEqual(true, deliveriesForOneTank.Deliveries == null);
  1093. else
  1094. Assert.AreEqual(true, deliveriesForOneTank.Deliveries != null);
  1095. if (deliveriesForOneTank.TankNumber == 1)
  1096. Assert.AreEqual(true, deliveriesForOneTank.Deliveries.Count == 2);
  1097. else if (deliveriesForOneTank.TankNumber == 2)
  1098. Assert.AreEqual(true, deliveriesForOneTank.Deliveries == null);
  1099. else
  1100. Assert.AreEqual(true, deliveriesForOneTank.Deliveries.Count == 1);
  1101. if (deliveriesForOneTank.Deliveries != null)
  1102. foreach (var delivery in deliveriesForOneTank.Deliveries)
  1103. {
  1104. //foreach (var deliveryReadingDataName in delivery.Datas.Keys)
  1105. //{
  1106. // var _ = delivery.Datas[deliveryReadingDataName];
  1107. //}
  1108. Assert.AreEqual(true,
  1109. delivery.Datas.TryGetValue(
  1110. Edge.Core.IndustryStandardInterface.ATG.DeliveryReadingDataName.StartingVolume,
  1111. out double startingVolumeRead));
  1112. Assert.AreEqual(true, startingVolumeRead
  1113. == VeederRoot_ATG_Console.Util.ConvertIEEEWith4BytesToDouble(
  1114. new byte[] {
  1115. //0x34,0x34,0x44,0x44,0x39,0x37,0x44,0x45,
  1116. 0x44, 0xDD, 0x97, 0xDE }));
  1117. Assert.AreEqual(true,
  1118. delivery.Datas.TryGetValue(
  1119. Edge.Core.IndustryStandardInterface.ATG.DeliveryReadingDataName.StartingTcVolume,
  1120. out double startingTcVolumeRead));
  1121. Assert.AreEqual(true, startingTcVolumeRead
  1122. == VeederRoot_ATG_Console.Util.ConvertIEEEWith4BytesToDouble(
  1123. new byte[] {
  1124. //0x34,0x34,0x44,0x43,0x32,0x45,0x44,0x42,
  1125. 0x44, 0xDC, 0x2E, 0xDB }));
  1126. Assert.AreEqual(true,
  1127. delivery.Datas.TryGetValue(
  1128. Edge.Core.IndustryStandardInterface.ATG.DeliveryReadingDataName.StartingHeight,
  1129. out double startingHeightRead));
  1130. Assert.AreEqual(true, startingHeightRead
  1131. == VeederRoot_ATG_Console.Util.ConvertIEEEWith4BytesToDouble(
  1132. new byte[] {
  1133. //0x34,0x34,0x37,0x43,0x42,0x32,0x38,0x46,
  1134. 0x44, 0x7C, 0xB2, 0x8F }));
  1135. if (deliveriesForOneTank.TankNumber == 1)
  1136. {
  1137. Assert.AreEqual(false,
  1138. delivery.Datas.TryGetValue(
  1139. Edge.Core.IndustryStandardInterface.ATG.DeliveryReadingDataName.EndingHeight,
  1140. out double endingHeightRead));
  1141. }
  1142. else
  1143. {
  1144. Assert.AreEqual(true,
  1145. delivery.Datas.TryGetValue(
  1146. Edge.Core.IndustryStandardInterface.ATG.DeliveryReadingDataName.EndingHeight,
  1147. out double endingHeightRead), $"Tank with number: {deliveriesForOneTank.TankNumber} does not have EndingHeight read");
  1148. Assert.AreEqual(true, endingHeightRead
  1149. == VeederRoot_ATG_Console.Util.ConvertIEEEWith4BytesToDouble(
  1150. new byte[] {
  1151. //0x34,0x34,0x42,0x38,0x38,0x36,0x46,0x41,
  1152. 0x44, 0xB8, 0x86, 0xFA }));
  1153. }
  1154. }
  1155. }
  1156. }
  1157. [TestMethod]
  1158. public void QueryInTankStatusReportResponse_TestMethod1()
  1159. {
  1160. var raw = new byte[] {
  1161. //SOH
  1162. 0x01,
  1163. //Function Code (4 bytes) + TT (2 bytes)
  1164. 0x69,0x32,0x30,0x35,0x30,0x30,
  1165. //Current Date and Time
  1166. 0x31,0x38,0x30,0x35,0x31,0x30,0x30,0x35,0x32,0x33,
  1167. //Tank Number (Decimal, 00=all)
  1168. 0x30, 0x31,
  1169. //Number of alarms active for tank (Hex, 00=none)
  1170. 0x30,0x31,
  1171. //Alarm Type Number
  1172. 0x31,0x32,
  1173. //&& - Data Termination Flag
  1174. 0x26, 0x26,
  1175. //CCCC - Message Checksum
  1176. 0x45, 0x45, 0x41, 0x39,
  1177. //ETX
  1178. 0x03 };
  1179. var response = new QueryInTankStatusReportResponse();
  1180. var p = new VeederRoot_ATG_Console.Parser();
  1181. var actual = p.Deserialize(raw.ToArray()) as QueryInTankStatusReportResponse;
  1182. Assert.AreEqual(true, actual != null);
  1183. Assert.AreEqual(true, actual.TankNumberInFunctionCode == 0);
  1184. Assert.AreEqual(true, actual.TanksOfAlarms != null);
  1185. Assert.AreEqual(true, actual.TanksOfAlarms.Count == 1);
  1186. Assert.AreEqual(true, actual.TanksOfAlarms.First().TankNumber == 1);
  1187. Assert.AreEqual(true, actual.TanksOfAlarms.First().NumberOfAlarmsActiveForThisTank == 1);
  1188. Assert.AreEqual(true, actual.TanksOfAlarms.First().Alarms != null);
  1189. Assert.AreEqual(true, actual.TanksOfAlarms.First().Alarms.Count() == 1);
  1190. Assert.AreEqual(true, actual.TanksOfAlarms.First().Alarms.First() == AlarmType.TankMaximumProductAlarm);
  1191. }
  1192. [TestMethod]
  1193. public void QueryInTankStatusReportResponse_TestMethod2()
  1194. {
  1195. var raw = new byte[] {
  1196. //SOH
  1197. 0x01,
  1198. //Function Code (4 bytes) + TT (2 bytes)
  1199. 0x69,0x32,0x30,0x35,0x30,0x30,
  1200. //Current Date and Time
  1201. 0x31,0x38,0x30,0x35,0x31,0x30,0x30,0x35,0x32,0x33,
  1202. //Tank Number (Decimal, 00=all)
  1203. 0x30, 0x31,
  1204. //Number of alarms active for tank (Hex, 00=none)
  1205. 0x30,0x32,
  1206. //Alarm Type Number
  1207. 0x31,0x32,
  1208. 0x31,0x33,
  1209. //&& - Data Termination Flag
  1210. 0x26, 0x26,
  1211. //CCCC - Message Checksum
  1212. 0x45, 0x45, 0x41, 0x39,
  1213. //ETX
  1214. 0x03 };
  1215. var response = new QueryInTankStatusReportResponse();
  1216. var p = new VeederRoot_ATG_Console.Parser();
  1217. var actual = p.Deserialize(raw.ToArray()) as QueryInTankStatusReportResponse;
  1218. Assert.AreEqual(true, actual != null);
  1219. Assert.AreEqual(true, actual.TankNumberInFunctionCode == 0);
  1220. Assert.AreEqual(true, actual.TanksOfAlarms != null);
  1221. Assert.AreEqual(true, actual.TanksOfAlarms.Count == 1);
  1222. Assert.AreEqual(true, actual.TanksOfAlarms.First().TankNumber == 1);
  1223. Assert.AreEqual(true, actual.TanksOfAlarms.First().NumberOfAlarmsActiveForThisTank == 2);
  1224. Assert.AreEqual(true, actual.TanksOfAlarms.First().Alarms != null);
  1225. Assert.AreEqual(true, actual.TanksOfAlarms.First().Alarms.Count() == 2);
  1226. Assert.AreEqual(true, actual.TanksOfAlarms.First().Alarms.First() == AlarmType.TankMaximumProductAlarm);
  1227. Assert.AreEqual(true, actual.TanksOfAlarms.First().Alarms.Skip(1).First() == AlarmType.TankGrossLeakTestFailAlarm);
  1228. }
  1229. [TestMethod]
  1230. public void QueryInTankStatusReportResponse_TestMethod3()
  1231. {
  1232. var raw = new byte[] {
  1233. //SOH
  1234. 0x01,
  1235. //Function Code (4 bytes) + TT (2 bytes)
  1236. 0x69,0x32,0x30,0x35,0x30,0x30,
  1237. //Current Date and Time
  1238. 0x31,0x38,0x30,0x35,0x31,0x30,0x30,0x35,0x32,0x33,
  1239. //Tank Number (Decimal, 00=all)
  1240. 0x30, 0x31,
  1241. //Number of alarms active for tank (Hex, 00=none)
  1242. 0x30,0x32,
  1243. //Alarm Type Number
  1244. 0x31,0x32,
  1245. 0x31,0x33,
  1246. //Tank Number (Decimal, 00=all)
  1247. 0x30, 0x32,
  1248. //Number of alarms active for tank (Hex, 00=none)
  1249. 0x30,0x32,
  1250. //Alarm Type Number
  1251. 0x31,0x32,
  1252. 0x31,0x33,
  1253. //&& - Data Termination Flag
  1254. 0x26, 0x26,
  1255. //CCCC - Message Checksum
  1256. 0x45, 0x45, 0x41, 0x39,
  1257. //ETX
  1258. 0x03 };
  1259. var response = new QueryInTankStatusReportResponse();
  1260. var p = new VeederRoot_ATG_Console.Parser();
  1261. var actual = p.Deserialize(raw.ToArray()) as QueryInTankStatusReportResponse;
  1262. Assert.AreEqual(true, actual != null);
  1263. Assert.AreEqual(true, actual.TankNumberInFunctionCode == 0);
  1264. Assert.AreEqual(true, actual.TanksOfAlarms != null);
  1265. Assert.AreEqual(true, actual.TanksOfAlarms.Count == 2);
  1266. var firstTank = actual.TanksOfAlarms.First();
  1267. Assert.AreEqual(true, firstTank.TankNumber == 1);
  1268. Assert.AreEqual(true, firstTank.NumberOfAlarmsActiveForThisTank == 2);
  1269. Assert.AreEqual(true, firstTank.Alarms != null);
  1270. Assert.AreEqual(true, firstTank.Alarms.Count() == 2);
  1271. Assert.AreEqual(true, firstTank.Alarms.First() == AlarmType.TankMaximumProductAlarm);
  1272. Assert.AreEqual(true, firstTank.Alarms.Skip(1).First() == AlarmType.TankGrossLeakTestFailAlarm);
  1273. var secondTank = actual.TanksOfAlarms.Skip(1).First();
  1274. Assert.AreEqual(true, secondTank.TankNumber == 2);
  1275. Assert.AreEqual(true, secondTank.NumberOfAlarmsActiveForThisTank == 2);
  1276. Assert.AreEqual(true, secondTank.Alarms != null);
  1277. Assert.AreEqual(true, secondTank.Alarms.Count() == 2);
  1278. Assert.AreEqual(true, secondTank.Alarms.First() == AlarmType.TankMaximumProductAlarm);
  1279. Assert.AreEqual(true, secondTank.Alarms.Skip(1).First() == AlarmType.TankGrossLeakTestFailAlarm);
  1280. }
  1281. [TestMethod]
  1282. public void QueryInTankStatusReportResponse_TestMethod4()
  1283. {
  1284. var raw = new byte[] {
  1285. //SOH
  1286. 0x01,
  1287. //Function Code (4 bytes) + TT (2 bytes)
  1288. 0x69,0x32,0x30,0x35,0x30,0x30,
  1289. //Current Date and Time
  1290. 0x31,0x38,0x30,0x35,0x31,0x30,0x30,0x35,0x32,0x33,
  1291. //Tank Number (Decimal, 00=all)
  1292. 0x30, 0x31,
  1293. //Number of alarms active for tank (Hex, 00=none)
  1294. 0x30,0x32,
  1295. //Alarm Type Number
  1296. 0x31,0x32,
  1297. 0x31,0x33,
  1298. //Tank Number (Decimal, 00=all)
  1299. 0x30, 0x32,
  1300. //Number of alarms active for tank (Hex, 00=none)
  1301. 0x30,0x32,
  1302. //Alarm Type Number
  1303. 0x31,0x32,
  1304. 0x31,0x33,
  1305. //Tank Number (Decimal, 00=all)
  1306. 0x30, 0x33,
  1307. //Number of alarms active for tank (Hex, 00=none)
  1308. 0x30,0x33,
  1309. //Alarm Type Number
  1310. 0x31,0x32,
  1311. 0x31,0x33,
  1312. 0x31,0x34,
  1313. //Tank Number (Decimal, 00=all)
  1314. 0x30, 0x34,
  1315. //Number of alarms active for tank (Hex, 00=none)
  1316. 0x30,0x36,
  1317. //Alarm Type Number
  1318. 0x31,0x32,
  1319. 0x31,0x33,
  1320. 0x31,0x34,
  1321. 0x31,0x34,
  1322. 0x31,0x34,
  1323. 0x32,0x39,
  1324. //&& - Data Termination Flag
  1325. 0x26, 0x26,
  1326. //CCCC - Message Checksum
  1327. 0x45, 0x45, 0x41, 0x39,
  1328. //ETX
  1329. 0x03 };
  1330. var response = new QueryInTankStatusReportResponse();
  1331. var p = new VeederRoot_ATG_Console.Parser();
  1332. var actual = p.Deserialize(raw.ToArray()) as QueryInTankStatusReportResponse;
  1333. Assert.AreEqual(true, actual != null);
  1334. Assert.AreEqual(true, actual.TankNumberInFunctionCode == 0);
  1335. Assert.AreEqual(true, actual.TanksOfAlarms != null);
  1336. Assert.AreEqual(true, actual.TanksOfAlarms.Count == 4);
  1337. var firstTank = actual.TanksOfAlarms.First();
  1338. Assert.AreEqual(true, firstTank.TankNumber == 1);
  1339. Assert.AreEqual(true, firstTank.NumberOfAlarmsActiveForThisTank == 2);
  1340. Assert.AreEqual(true, firstTank.Alarms != null);
  1341. Assert.AreEqual(true, firstTank.Alarms.Count() == 2);
  1342. Assert.AreEqual(true, firstTank.Alarms.First() == AlarmType.TankMaximumProductAlarm);
  1343. Assert.AreEqual(true, firstTank.Alarms.Skip(1).First() == AlarmType.TankGrossLeakTestFailAlarm);
  1344. var secondTank = actual.TanksOfAlarms.Skip(1).First();
  1345. Assert.AreEqual(true, secondTank.TankNumber == 2);
  1346. Assert.AreEqual(true, secondTank.NumberOfAlarmsActiveForThisTank == 2);
  1347. Assert.AreEqual(true, secondTank.Alarms != null);
  1348. Assert.AreEqual(true, secondTank.Alarms.Count() == 2);
  1349. Assert.AreEqual(true, secondTank.Alarms.First() == AlarmType.TankMaximumProductAlarm);
  1350. Assert.AreEqual(true, secondTank.Alarms.Skip(1).First() == AlarmType.TankGrossLeakTestFailAlarm);
  1351. var thirdTank = actual.TanksOfAlarms.Skip(2).First();
  1352. Assert.AreEqual(true, thirdTank.TankNumber == 3);
  1353. Assert.AreEqual(true, thirdTank.NumberOfAlarmsActiveForThisTank == 3);
  1354. Assert.AreEqual(true, thirdTank.Alarms != null);
  1355. Assert.AreEqual(true, thirdTank.Alarms.Count() == 3);
  1356. Assert.AreEqual(true, thirdTank.Alarms.First() == AlarmType.TankMaximumProductAlarm);
  1357. Assert.AreEqual(true, thirdTank.Alarms.Skip(1).First() == AlarmType.TankGrossLeakTestFailAlarm);
  1358. Assert.AreEqual(true, thirdTank.Alarms.Skip(2).First() == AlarmType.TankPeriodicLeakTestFailAlarm);
  1359. var fourthTank = actual.TanksOfAlarms.Skip(3).First();
  1360. Assert.AreEqual(true, fourthTank.TankNumber == 4);
  1361. Assert.AreEqual(true, fourthTank.NumberOfAlarmsActiveForThisTank == 6);
  1362. Assert.AreEqual(true, fourthTank.Alarms != null);
  1363. Assert.AreEqual(true, fourthTank.Alarms.Count() == 6);
  1364. Assert.AreEqual(true, fourthTank.Alarms.First() == AlarmType.TankMaximumProductAlarm);
  1365. Assert.AreEqual(true, fourthTank.Alarms.Skip(1).First() == AlarmType.TankGrossLeakTestFailAlarm);
  1366. Assert.AreEqual(true, fourthTank.Alarms.Skip(2).First() == AlarmType.TankPeriodicLeakTestFailAlarm);
  1367. Assert.AreEqual(true, fourthTank.Alarms.Last() == AlarmType.TankLineGrossLeakAlarm);
  1368. }
  1369. [TestMethod]
  1370. public void QueryOrSetTankProductLabelResponse_TestMethod1()
  1371. {
  1372. var raw = new byte[] {
  1373. //SOH
  1374. 0x01,
  1375. //Function Code (4 bytes) + TT (2 bytes)
  1376. 0x69,0x36,0x30,0x32,0x30,0x30,
  1377. //Current Date and Time
  1378. 0x31,0x38,0x30,0x35,0x31,0x30,0x30,0x35,0x32,0x33,
  1379. //Tank Number (Decimal, 00=all)
  1380. 0x30,0x31,
  1381. //Product Label (20 ASCII characters [20h-7Eh])
  1382. 0x74,0x61,0x6E,0x6B,0x31,0x20,0x39,0x32,0x23,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
  1383. //&& - Data Termination Flag
  1384. 0x26, 0x26,
  1385. //CCCC - Message Checksum
  1386. 0x45, 0x45, 0x41, 0x39,
  1387. //ETX
  1388. 0x03 };
  1389. var response = new QueryOrSetTankProductLabelResponse();
  1390. var p = new VeederRoot_ATG_Console.Parser();
  1391. var actual = p.Deserialize(raw.ToArray()) as QueryOrSetTankProductLabelResponse;
  1392. Assert.AreEqual(true, actual != null);
  1393. Assert.AreEqual(true, actual.TankNumberInFunctionCode == 0);
  1394. Assert.AreEqual(true, actual.ProductLabels != null);
  1395. Assert.AreEqual(true, actual.ProductLabels.Count() == 1);
  1396. Assert.AreEqual(true, actual.ProductLabels.First().Item1 == 1);
  1397. Assert.AreEqual(true, actual.ProductLabels.First().Item2 == Encoding.ASCII.GetString(new byte[] { 0x74, 0x61, 0x6E, 0x6B, 0x31, 0x20, 0x39, 0x32, 0x23, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, }));
  1398. }
  1399. [TestMethod]
  1400. public void QueryOrSetTankProductLabelResponse_TestMethod3()
  1401. {
  1402. var raw = new byte[] {
  1403. //SOH
  1404. 0x01,
  1405. //Function Code (4 bytes) + TT (2 bytes)
  1406. 0x69,0x36,0x30,0x32,0x30,0x30,
  1407. //Current Date and Time
  1408. 0x31,0x38,0x30,0x35,0x31,0x30,0x30,0x35,0x32,0x33,
  1409. //Tank Number (Decimal, 00=all)
  1410. 0x30,0x31,
  1411. //Product Label (20 ASCII characters [20h-7Eh])
  1412. 0x74,0x61,0x6E,0x6B,0x31,0x20,0x39,0x32,0x23,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
  1413. //Tank Number (Decimal, 00=all)
  1414. 0x30,0x32,
  1415. //Product Label (20 ASCII characters [20h-7Eh])
  1416. 0x31,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
  1417. //Tank Number (Decimal, 00=all)
  1418. 0x30,0x33,
  1419. //Product Label (20 ASCII characters [20h-7Eh])
  1420. 0x32,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
  1421. //Tank Number (Decimal, 00=all)
  1422. 0x30,0x34,
  1423. //Product Label (20 ASCII characters [20h-7Eh])
  1424. 0x33,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
  1425. //Tank Number (Decimal, 00=all)
  1426. 0x30,0x35,
  1427. //Product Label (20 ASCII characters [20h-7Eh])
  1428. 0x34,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
  1429. //Tank Number (Decimal, 00=all)
  1430. 0x30,0x36,
  1431. 0x35,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
  1432. //&& - Data Termination Flag
  1433. 0x26, 0x26,
  1434. //CCCC - Message Checksum
  1435. 0x45, 0x45, 0x41, 0x39,
  1436. //ETX
  1437. 0x03 };
  1438. var response = new QueryOrSetTankProductLabelResponse();
  1439. var p = new VeederRoot_ATG_Console.Parser();
  1440. var actual = p.Deserialize(raw.ToArray()) as QueryOrSetTankProductLabelResponse;
  1441. Assert.AreEqual(true, actual != null);
  1442. Assert.AreEqual(true, actual.TankNumberInFunctionCode == 0);
  1443. Assert.AreEqual(true, actual.ProductLabels != null);
  1444. Assert.AreEqual(true, actual.ProductLabels.Count() == 6);
  1445. Assert.AreEqual(true, actual.ProductLabels.First().Item1 == 1);
  1446. Assert.AreEqual(true, actual.ProductLabels.First().Item2 == Encoding.ASCII.GetString(new byte[] { 0x74, 0x61, 0x6E, 0x6B, 0x31, 0x20, 0x39, 0x32, 0x23, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, }));
  1447. Assert.AreEqual(true, actual.ProductLabels.Skip(1).First().Item1 == 2);
  1448. Assert.AreEqual(true, actual.ProductLabels.Skip(1).First().Item2 == Encoding.ASCII.GetString(new byte[] { 0x31, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, }));
  1449. Assert.AreEqual(true, actual.ProductLabels.Skip(2).First().Item1 == 3);
  1450. Assert.AreEqual(true, actual.ProductLabels.Skip(2).First().Item2 == Encoding.ASCII.GetString(new byte[] { 0x32, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, }));
  1451. Assert.AreEqual(true, actual.ProductLabels.Skip(3).First().Item1 == 4);
  1452. Assert.AreEqual(true, actual.ProductLabels.Skip(3).First().Item2 == Encoding.ASCII.GetString(new byte[] { 0x33, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, }));
  1453. Assert.AreEqual(true, actual.ProductLabels.Skip(4).First().Item1 == 5);
  1454. Assert.AreEqual(true, actual.ProductLabels.Skip(4).First().Item2 == Encoding.ASCII.GetString(new byte[] { 0x34, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, }));
  1455. Assert.AreEqual(true, actual.ProductLabels.Skip(5).First().Item1 == 6);
  1456. Assert.AreEqual(true, actual.ProductLabels.Skip(5).First().Item2 == Encoding.ASCII.GetString(new byte[] { 0x35, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, }));
  1457. }
  1458. [TestMethod]
  1459. public void QueryOrSetTankDiameterResponse_TestMethod1()
  1460. {
  1461. var raw = new byte[] {
  1462. //SOH
  1463. 0x01,
  1464. //Function Code (4 bytes) + TT (2 bytes)
  1465. 0x69,0x36,0x30,0x37,0x30,0x30,
  1466. //Current Date and Time
  1467. 0x31,0x38,0x30,0x35,0x31,0x30,0x30,0x35,0x32,0x33,
  1468. //Tank Number (Decimal, 00=all)
  1469. 0x30,0x31,
  1470. //Tank Diameter, Inches (ASCII Hex IEEE float)
  1471. 0x34,0x34,0x39,0x38,0x36,0x36,0x36,0x36,
  1472. //&& - Data Termination Flag
  1473. 0x26, 0x26,
  1474. //CCCC - Message Checksum
  1475. 0x45, 0x45, 0x41, 0x39,
  1476. //ETX
  1477. 0x03 };
  1478. var response = new QueryOrSetTankDiameterResponse();
  1479. var p = new VeederRoot_ATG_Console.Parser();
  1480. var actual = p.Deserialize(raw.ToArray()) as QueryOrSetTankDiameterResponse;
  1481. Assert.AreEqual(true, actual != null);
  1482. Assert.AreEqual(true, actual.TankNumberInFunctionCode == 0);
  1483. Assert.AreEqual(true, actual.Diameters != null);
  1484. Assert.AreEqual(true, actual.Diameters.Count() == 1);
  1485. Assert.AreEqual(true, actual.Diameters.First().Item1 == 1);
  1486. Assert.AreEqual(true, actual.Diameters.First().Item2 ==
  1487. VeederRoot_ATG_Console.Util.ConvertIEEEWith4BytesToDouble(
  1488. VeederRoot_ATG_Console.Util.ConvertHexBcdStrToBytes(
  1489. new byte[] { 0x34, 0x34, 0x39, 0x38, 0x36, 0x36, 0x36, 0x36, }).ToArray()));
  1490. }
  1491. [TestMethod]
  1492. public void QueryOrSetTankDiameterResponse_TestMethod3()
  1493. {
  1494. var raw = new byte[] {
  1495. //SOH
  1496. 0x01,
  1497. //Function Code (4 bytes) + TT (2 bytes)
  1498. 0x69,0x36,0x30,0x37,0x30,0x30,
  1499. //Current Date and Time
  1500. 0x31,0x38,0x30,0x35,0x31,0x30,0x30,0x35,0x32,0x33,
  1501. //Tank Number (Decimal, 00=all)
  1502. 0x30,0x31,
  1503. //Tank Diameter, Inches (ASCII Hex IEEE float)
  1504. 0x34,0x34,0x39,0x38,0x36,0x36,0x36,0x36,
  1505. 0x30,0x32,
  1506. 0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,
  1507. 0x30,0x33,
  1508. 0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,
  1509. 0x30,0x34,
  1510. 0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,
  1511. 0x30,0x35,
  1512. 0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,
  1513. 0x30,0x36,
  1514. 0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,
  1515. //&& - Data Termination Flag
  1516. 0x26, 0x26,
  1517. //CCCC - Message Checksum
  1518. 0x45, 0x45, 0x41, 0x39,
  1519. //ETX
  1520. 0x03 };
  1521. var response = new QueryOrSetTankDiameterResponse();
  1522. var p = new VeederRoot_ATG_Console.Parser();
  1523. var actual = p.Deserialize(raw.ToArray()) as QueryOrSetTankDiameterResponse;
  1524. Assert.AreEqual(true, actual != null);
  1525. Assert.AreEqual(true, actual.TankNumberInFunctionCode == 0);
  1526. Assert.AreEqual(true, actual.Diameters != null);
  1527. Assert.AreEqual(true, actual.Diameters.Count() == 6);
  1528. Assert.AreEqual(true, actual.Diameters.First().Item1 == 1);
  1529. Assert.AreEqual(true, actual.Diameters.First().Item2 ==
  1530. VeederRoot_ATG_Console.Util.ConvertIEEEWith4BytesToDouble(
  1531. VeederRoot_ATG_Console.Util.ConvertHexBcdStrToBytes(
  1532. new byte[] { 0x34, 0x34, 0x39, 0x38, 0x36, 0x36, 0x36, 0x36, }).ToArray()));
  1533. for (int i = 1; i < actual.Diameters.Count(); i++)
  1534. {
  1535. Assert.AreEqual(true, actual.Diameters.ElementAt(i).Item1 == i + 1);
  1536. Assert.AreEqual(true, actual.Diameters.ElementAt(i).Item2 == 0);
  1537. }
  1538. }
  1539. [TestMethod]
  1540. public void QueryInTankDiagnosticReportResponse_TestMethod1()
  1541. {
  1542. var raw = new byte[] {
  1543. //SOH
  1544. 0x01,
  1545. //Function Code (4 bytes) + TT (2 bytes)
  1546. 0x69,0x41,0x30,0x31,0x30,0x30,
  1547. //Current Date and Time
  1548. 0x31,0x38,0x30,0x35,0x31,0x30,0x30,0x35,0x32,0x33,
  1549. //TT - Tank Number (Decimal, 00=all)
  1550. 0x30,0x31,
  1551. //Product Code (one ASCII character [20h-7Eh])
  1552. 0x31,
  1553. //Probe Type
  1554. 0x30,0x33,
  1555. //Circuit Code (Hex)
  1556. 0x44,0x30,0x30,0x36,
  1557. //Probe Length (ASCII Hex IEEE float)
  1558. 0x34,0x34,0x46,0x41,0x44,0x33,0x33,0x33,
  1559. //Probe Serial Number (Decimal)
  1560. 0x32,0x30,0x34,0x32,0x30,0x37,
  1561. //Probe Date Code (Hex)
  1562. 0x31,0x32,0x39,0x35,
  1563. //&& - Data Termination Flag
  1564. 0x26, 0x26,
  1565. //CCCC - Message Checksum
  1566. 0x45, 0x45, 0x41, 0x39,
  1567. //ETX
  1568. 0x03 };
  1569. var response = new QueryInTankDiagnosticReportResponse();
  1570. var p = new VeederRoot_ATG_Console.Parser();
  1571. var actual = p.Deserialize(raw.ToArray()) as QueryInTankDiagnosticReportResponse;
  1572. Assert.AreEqual(true, actual != null);
  1573. Assert.AreEqual(true, actual.TankNumberInFunctionCode == 0);
  1574. Assert.AreEqual(true, actual.Probes != null);
  1575. Assert.AreEqual(true, actual.Probes.Count() == 1);
  1576. Assert.AreEqual(true, actual.Probes.First().TankNumber == 1);
  1577. Assert.AreEqual(true, actual.Probes.First().ProbeSerialNumber ==
  1578. Encoding.ASCII.GetString(new byte[] { 0x32, 0x30, 0x34, 0x32, 0x30, 0x37 }));
  1579. Assert.AreEqual(true, actual.Probes.First().ProbeLength ==
  1580. VeederRoot_ATG_Console.Util.ConvertIEEEWith4BytesToDouble(
  1581. VeederRoot_ATG_Console.Util.ConvertHexBcdStrToBytes(
  1582. new byte[] { 0x34, 0x34, 0x46, 0x41, 0x44, 0x33, 0x33, 0x33, }).ToArray()));
  1583. }
  1584. [TestMethod]
  1585. public void QueryInTankDiagnosticReportResponse_TestMethod3()
  1586. {
  1587. var raw = new byte[] {
  1588. //SOH
  1589. 0x01,
  1590. //Function Code (4 bytes) + TT (2 bytes)
  1591. 0x69,0x41,0x30,0x31,0x30,0x30,
  1592. //Current Date and Time
  1593. 0x31,0x38,0x30,0x35,0x31,0x30,0x30,0x35,0x32,0x33,
  1594. //TT - Tank Number (Decimal, 00=all)
  1595. 0x30,0x31,
  1596. //Product Code (one ASCII character [20h-7Eh])
  1597. 0x31,
  1598. //Probe Type
  1599. 0x30,0x33,
  1600. //Circuit Code (Hex)
  1601. 0x44,0x30,0x30,0x36,
  1602. //Probe Length (ASCII Hex IEEE float)
  1603. 0x34,0x34,0x46,0x41,0x44,0x33,0x33,0x33,
  1604. //Probe Serial Number (Decimal)
  1605. 0x32,0x30,0x34,0x32,0x30,0x37,
  1606. //Probe Date Code (Hex)
  1607. 0x31,0x32,0x39,0x35,
  1608. //TT - Tank Number (Decimal, 00=all)
  1609. 0x30,0x32,
  1610. //Product Code (one ASCII character [20h-7Eh])
  1611. 0x32,
  1612. //Probe Type
  1613. 0x30,0x33,
  1614. //Circuit Code (Hex)
  1615. 0x44,0x30,0x30,0x36,
  1616. //Probe Length (ASCII Hex IEEE float)
  1617. 0x34,0x34,0x46,0x41,0x44,0x33,0x33,0x33,
  1618. //Probe Serial Number (Decimal)
  1619. 0x32,0x30,0x34,0x32,0x30,0x38,
  1620. //Probe Date Code (Hex)
  1621. 0x31,0x32,0x39,0x35,
  1622. //TT - Tank Number (Decimal, 00=all)
  1623. 0x30,0x33,
  1624. //Product Code (one ASCII character [20h-7Eh])
  1625. 0x33,
  1626. //Probe Type
  1627. 0x30,0x33,
  1628. //Circuit Code (Hex)
  1629. 0x44,0x30,0x30,0x36,
  1630. //Probe Length (ASCII Hex IEEE float)
  1631. 0x34,0x34,0x46,0x41,0x44,0x33,0x33,0x33,
  1632. //Probe Serial Number (Decimal)
  1633. 0x32,0x30,0x34,0x32,0x30,0x39,
  1634. //Probe Date Code (Hex)
  1635. 0x31,0x32,0x39,0x35,
  1636. //&& - Data Termination Flag
  1637. 0x26, 0x26,
  1638. //CCCC - Message Checksum
  1639. 0x45, 0x45, 0x41, 0x39,
  1640. //ETX
  1641. 0x03 };
  1642. var response = new QueryInTankDiagnosticReportResponse();
  1643. var p = new VeederRoot_ATG_Console.Parser();
  1644. var actual = p.Deserialize(raw.ToArray()) as QueryInTankDiagnosticReportResponse;
  1645. Assert.AreEqual(true, actual != null);
  1646. Assert.AreEqual(true, actual.TankNumberInFunctionCode == 0);
  1647. Assert.AreEqual(true, actual.Probes != null);
  1648. Assert.AreEqual(true, actual.Probes.Count() == 3);
  1649. Assert.AreEqual(true, actual.Probes.First().TankNumber == 1);
  1650. Assert.AreEqual(true, actual.Probes.First().ProbeSerialNumber ==
  1651. Encoding.ASCII.GetString(new byte[] { 0x32, 0x30, 0x34, 0x32, 0x30, 0x37 }));
  1652. Assert.AreEqual(true, actual.Probes.First().ProbeLength ==
  1653. VeederRoot_ATG_Console.Util.ConvertIEEEWith4BytesToDouble(
  1654. VeederRoot_ATG_Console.Util.ConvertHexBcdStrToBytes(
  1655. new byte[] { 0x34, 0x34, 0x46, 0x41, 0x44, 0x33, 0x33, 0x33, }).ToArray()));
  1656. Assert.AreEqual(true, actual.Probes.Skip(1).First().TankNumber == 2);
  1657. Assert.AreEqual(true, actual.Probes.Skip(1).First().ProbeSerialNumber ==
  1658. Encoding.ASCII.GetString(new byte[] { 0x32, 0x30, 0x34, 0x32, 0x30, 0x38 }));
  1659. Assert.AreEqual(true, actual.Probes.First().ProbeLength ==
  1660. VeederRoot_ATG_Console.Util.ConvertIEEEWith4BytesToDouble(
  1661. VeederRoot_ATG_Console.Util.ConvertHexBcdStrToBytes(
  1662. new byte[] { 0x34, 0x34, 0x46, 0x41, 0x44, 0x33, 0x33, 0x33, }).ToArray()));
  1663. Assert.AreEqual(true, actual.Probes.Skip(2).First().TankNumber == 3);
  1664. Assert.AreEqual(true, actual.Probes.Skip(2).First().ProbeSerialNumber ==
  1665. Encoding.ASCII.GetString(new byte[] { 0x32, 0x30, 0x34, 0x32, 0x30, 0x39 }));
  1666. Assert.AreEqual(true, actual.Probes.First().ProbeLength ==
  1667. VeederRoot_ATG_Console.Util.ConvertIEEEWith4BytesToDouble(
  1668. VeederRoot_ATG_Console.Util.ConvertHexBcdStrToBytes(
  1669. new byte[] { 0x34, 0x34, 0x46, 0x41, 0x44, 0x33, 0x33, 0x33, }).ToArray()));
  1670. }
  1671. [TestMethod]
  1672. public void QueryInTankStatusReportRequest_TestMethod1()
  1673. {
  1674. var raw = new byte[] { 0x01, 0x69, 0x32, 0x30, 0x35, 0x30, 0x30, 0x31, 0x38, 0x30, 0x35, 0x31, 0x32, 0x30, 0x31, 0x32, 0x31, 0x30, 0x31, 0x30, 0x32, 0x31, 0x30, 0x30, 0x33, 0x26, 0x26, 0x46, 0x41, 0x44, 0x37, 0x03 };
  1675. var response = new QueryInTankStatusReportResponse();
  1676. var p = new VeederRoot_ATG_Console.Parser();
  1677. var actual = p.Deserialize(raw.ToArray()) as QueryInTankStatusReportResponse;
  1678. Assert.AreEqual(true, actual != null);
  1679. Assert.AreEqual(true, actual.TankNumberInFunctionCode == 0);
  1680. var alarmsForTanks = actual?.TanksOfAlarms.Select(ta =>
  1681. {
  1682. var alarms = new List<Edge.Core.IndustryStandardInterface.ATG.Alarm>();
  1683. alarms.AddRange(ta?.Alarms.Select(aType => new Edge.Core.IndustryStandardInterface.ATG.Alarm()
  1684. {
  1685. TankNumber = (byte)ta.TankNumber,
  1686. Priority = AlarmPriority.Alarm,
  1687. Type = aType,
  1688. CreatedTimeStamp = DateTime.Now,
  1689. }));
  1690. return alarms;
  1691. });
  1692. foreach (var alarmsForTank in alarmsForTanks)
  1693. {
  1694. var alarmEventArg = new AtgAlarmEventArg(
  1695. alarmsForTank.First().TankNumber,
  1696. alarmsForTank.Select(alarm => new Alarm()
  1697. {
  1698. TankNumber = alarmsForTank.First().TankNumber,
  1699. Priority = AlarmPriority.Alarm,
  1700. Type = alarm.Type,
  1701. CreatedTimeStamp = DateTime.Now,
  1702. }));
  1703. Assert.AreEqual(true, alarmEventArg != null);
  1704. }
  1705. }
  1706. }
  1707. }