RFIDLabel.cs 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632
  1. using FastReport.Utils;
  2. using System;
  3. using System.ComponentModel;
  4. using System.Drawing;
  5. using System.Text;
  6. using System.Windows.Forms;
  7. namespace FastReport
  8. {
  9. /// <summary>
  10. /// Represents a RFID label.
  11. /// </summary>
  12. public partial class RFIDLabel : ContainerObject
  13. {
  14. /// <summary>
  15. /// Specifies lock type on write\rewrite bank of data.
  16. /// </summary>
  17. public enum LockType
  18. {
  19. /// <summary>
  20. /// Unlock.
  21. /// </summary>
  22. Unlock = 'U',
  23. /// <summary>
  24. /// Lock.
  25. /// </summary>
  26. Lock = 'L',
  27. /// <summary>
  28. /// Permanently unlock.
  29. /// </summary>
  30. Open = 'O',
  31. /// <summary>
  32. /// Permanently lock.
  33. /// </summary>
  34. Protect = 'P'
  35. }
  36. /// <summary>
  37. /// Specifies action on error printing of RFID label.
  38. /// </summary>
  39. public enum EErrorHandle
  40. {
  41. /// <summary>
  42. /// Skip label.
  43. /// </summary>
  44. None = 'N',
  45. /// <summary>
  46. /// Place printer in Pause mode.
  47. /// </summary>
  48. PauseMode = 'P',
  49. /// <summary>
  50. /// Place printer in Error mode.
  51. /// </summary>
  52. ErrorMode = 'E',
  53. }
  54. private RFIDBank tidBank;
  55. private RFIDBank userBank;
  56. private RFIDBank epcBank;
  57. private string epcFormat;
  58. private string accessPassword;
  59. private string accessPasswordDataColumn;
  60. private string killPassword;
  61. private string killPasswordDataColumn;
  62. private LockType lockKillPassword;
  63. private LockType lockAccessPassword;
  64. private LockType lockEPCBank;
  65. private LockType lockUserBank;
  66. private int startPermaLock;
  67. private int countPermaLock;
  68. private bool adaptiveAntenna;
  69. private short readPower;
  70. private short writePower;
  71. private bool useAdjustForEPC;
  72. private bool rewriteEPCbank;
  73. private EErrorHandle errorHandle;
  74. /// <inheritdoc/>
  75. [Browsable(false)]
  76. public override FillBase Fill { get => base.Fill; set => base.Fill = value; }
  77. /// <inheritdoc/>
  78. [Browsable(false)]
  79. public override AnchorStyles Anchor { get => base.Anchor; set => base.Anchor = value; }
  80. /// <inheritdoc/>
  81. [Browsable(false)]
  82. public override Border Border { get => base.Border; set => base.Border = value; }
  83. /// <inheritdoc/>
  84. [Browsable(false)]
  85. public override DockStyle Dock { get => base.Dock; set => base.Dock = value; }
  86. /// <inheritdoc/>
  87. [Browsable(false)]
  88. public override bool Visible { get => base.Visible; set => base.Visible = value; }
  89. /// <summary>
  90. /// Gets or sets Tag ID memory bank.
  91. /// </summary>
  92. public RFIDBank TIDBank
  93. {
  94. get
  95. {
  96. return tidBank;
  97. }
  98. set
  99. {
  100. tidBank = value;
  101. }
  102. }
  103. /// <summary>
  104. /// Gets or sets User memory bank.
  105. /// </summary>
  106. public RFIDBank UserBank
  107. {
  108. get
  109. {
  110. return userBank;
  111. }
  112. set
  113. {
  114. userBank = value;
  115. }
  116. }
  117. /// <summary>
  118. /// Gets or sets EPC memory bank.
  119. /// </summary>
  120. public RFIDBank EpcBank
  121. {
  122. get
  123. {
  124. return epcBank;
  125. }
  126. set
  127. {
  128. epcBank = value;
  129. }
  130. }
  131. /// <summary>
  132. /// Gets or sets EPC format.
  133. /// </summary>
  134. [DefaultValue("96,8,3,3,20,24,38")]
  135. public string EpcFormat
  136. {
  137. get
  138. {
  139. return epcFormat;
  140. }
  141. set
  142. {
  143. epcFormat = value;
  144. }
  145. }
  146. /// <summary>
  147. /// Gets or sets access password.
  148. /// </summary>
  149. public string AccessPassword
  150. {
  151. get
  152. {
  153. return accessPassword;
  154. }
  155. set
  156. {
  157. accessPassword = value;
  158. }
  159. }
  160. /// <summary>
  161. /// Gets or sets kill password.
  162. /// </summary>
  163. public string KillPassword
  164. {
  165. get
  166. {
  167. return killPassword;
  168. }
  169. set
  170. {
  171. killPassword = value;
  172. }
  173. }
  174. /// <summary>
  175. /// Gets or sets the name of the data column used to set the access password.
  176. /// </summary>
  177. public string AccessPasswordDataColumn
  178. {
  179. get
  180. {
  181. return accessPasswordDataColumn;
  182. }
  183. set
  184. {
  185. accessPasswordDataColumn = value;
  186. }
  187. }
  188. /// <summary>
  189. /// Gets or sets the name of the data column used to set the kill password.
  190. /// </summary>
  191. public string KillPasswordDataColumn
  192. {
  193. get
  194. {
  195. return killPasswordDataColumn;
  196. }
  197. set
  198. {
  199. killPasswordDataColumn = value;
  200. }
  201. }
  202. /// <summary>
  203. /// Gets or sets the lock type for the kill password.
  204. /// </summary>
  205. public LockType LockKillPassword
  206. {
  207. get
  208. {
  209. return lockKillPassword;
  210. }
  211. set
  212. {
  213. lockKillPassword = value;
  214. }
  215. }
  216. /// <summary>
  217. /// Gets or sets the lock type for the access password.
  218. /// </summary>
  219. public LockType LockAccessPassword
  220. {
  221. get
  222. {
  223. return lockAccessPassword;
  224. }
  225. set
  226. {
  227. lockAccessPassword = value;
  228. }
  229. }
  230. /// <summary>
  231. /// Gets or sets the lock type for the EPC bank.
  232. /// </summary>
  233. public LockType LockEPCBank
  234. {
  235. get
  236. {
  237. return lockEPCBank;
  238. }
  239. set
  240. {
  241. lockEPCBank = value;
  242. }
  243. }
  244. /// <summary>
  245. /// Gets or sets the lock type for the user bank.
  246. /// </summary>
  247. public LockType LockUserBank
  248. {
  249. get
  250. {
  251. return lockUserBank;
  252. }
  253. set
  254. {
  255. lockUserBank = value;
  256. }
  257. }
  258. /// <summary>
  259. /// Gets or sets the start section for permanent lock of user bank.
  260. /// </summary>
  261. public int StartPermaLock
  262. {
  263. get
  264. {
  265. return startPermaLock;
  266. }
  267. set
  268. {
  269. startPermaLock = value;
  270. }
  271. }
  272. /// <summary>
  273. /// Gets or sets the count of section for permanent lock of user bank.
  274. /// </summary>
  275. public int CountPermaLock
  276. {
  277. get
  278. {
  279. return countPermaLock;
  280. }
  281. set
  282. {
  283. countPermaLock = value;
  284. }
  285. }
  286. /// <summary>
  287. /// Gets or sets the read power level for the label.
  288. /// </summary>
  289. public short ReadPower
  290. {
  291. get
  292. {
  293. return readPower;
  294. }
  295. set
  296. {
  297. readPower = value;
  298. }
  299. }
  300. /// <summary>
  301. /// Gets or sets the write power level for the label.
  302. /// </summary>
  303. public short WritePower
  304. {
  305. get
  306. {
  307. return writePower;
  308. }
  309. set
  310. {
  311. writePower = value;
  312. }
  313. }
  314. /// <summary>
  315. /// Gets or sets a value that determines whether the using auto adjust of bits when write EPC bank.
  316. /// </summary>
  317. public bool UseAdjustForEPC
  318. {
  319. get
  320. {
  321. return useAdjustForEPC;
  322. }
  323. set
  324. {
  325. useAdjustForEPC = value;
  326. }
  327. }
  328. /// <summary>
  329. /// Gets or sets a value that determines whether the entire EPC bank will be overwritten.
  330. /// </summary>
  331. public bool RewriteEPCbank
  332. {
  333. get
  334. {
  335. return rewriteEPCbank;
  336. }
  337. set
  338. {
  339. rewriteEPCbank = value;
  340. }
  341. }
  342. /// <summary>
  343. /// Gets or sets error handle mode.
  344. /// </summary>
  345. public EErrorHandle ErrorHandle
  346. {
  347. get
  348. {
  349. return errorHandle;
  350. }
  351. set
  352. {
  353. errorHandle = value;
  354. }
  355. }
  356. /// <summary>
  357. /// Gets or sets a value that determines whether to use the adaptive antenna property.
  358. /// </summary>
  359. public bool AdaptiveAntenna
  360. {
  361. get { return adaptiveAntenna; }
  362. set { adaptiveAntenna = value; }
  363. }
  364. /// <inheritdoc/>
  365. public override void GetData()
  366. {
  367. base.GetData();
  368. if (TIDBank.DataColumn.Contains("[") && TIDBank.DataColumn.Contains("]"))
  369. TIDBank.Data = Report.Calc(TIDBank.DataColumn).ToString();
  370. if (UserBank.DataColumn.Contains("[") && UserBank.DataColumn.Contains("]"))
  371. UserBank.Data = Report.Calc(UserBank.DataColumn).ToString();
  372. if (EpcBank.DataColumn.Contains("[") && EpcBank.DataColumn.Contains("]"))
  373. EpcBank.Data = Report.Calc(EpcBank.DataColumn).ToString();
  374. if (AccessPasswordDataColumn.Contains("[") && AccessPasswordDataColumn.Contains("]"))
  375. AccessPassword = Report.Calc(AccessPasswordDataColumn).ToString();
  376. if (KillPasswordDataColumn.Contains("[") && KillPasswordDataColumn.Contains("]"))
  377. KillPassword = Report.Calc(KillPasswordDataColumn).ToString();
  378. }
  379. /// <inheritdoc/>
  380. public override void Assign(Base source)
  381. {
  382. base.Assign(source);
  383. RFIDLabel rFIDLabel = source as RFIDLabel;
  384. TIDBank.Assign(rFIDLabel.TIDBank);
  385. EpcBank.Assign(rFIDLabel.EpcBank);
  386. UserBank.Assign(rFIDLabel.UserBank);
  387. EpcFormat = rFIDLabel.EpcFormat;
  388. AccessPassword = rFIDLabel.AccessPassword;
  389. KillPassword = rFIDLabel.KillPassword;
  390. AccessPasswordDataColumn = rFIDLabel.AccessPasswordDataColumn;
  391. KillPasswordDataColumn = rFIDLabel.KillPasswordDataColumn;
  392. LockAccessPassword = rFIDLabel.LockAccessPassword;
  393. LockKillPassword = rFIDLabel.LockKillPassword;
  394. LockEPCBank = rFIDLabel.LockEPCBank;
  395. LockUserBank = rFIDLabel.LockUserBank;
  396. StartPermaLock = rFIDLabel.StartPermaLock;
  397. CountPermaLock = rFIDLabel.CountPermaLock;
  398. AdaptiveAntenna = rFIDLabel.AdaptiveAntenna;
  399. ReadPower = rFIDLabel.ReadPower;
  400. WritePower = rFIDLabel.WritePower;
  401. UseAdjustForEPC = rFIDLabel.UseAdjustForEPC;
  402. RewriteEPCbank = rFIDLabel.RewriteEPCbank;
  403. ErrorHandle = rFIDLabel.ErrorHandle;
  404. }
  405. /// <inheritdoc/>
  406. public override void Serialize(FRWriter writer)
  407. {
  408. base.Serialize(writer);
  409. RFIDLabel c = writer.DiffObject as RFIDLabel;
  410. base.Serialize(writer);
  411. EpcBank.Serialize(writer, "EpcBank", c.EpcBank);
  412. TIDBank.Serialize(writer, "TidBank", c.TIDBank);
  413. UserBank.Serialize(writer, "UserBank", c.UserBank);
  414. if (EpcFormat != c.EpcFormat)
  415. writer.WriteStr("EpcFormat", EpcFormat);
  416. if (AccessPassword != c.AccessPassword)
  417. writer.WriteStr("AccessPassword", AccessPassword);
  418. if (KillPassword != c.KillPassword)
  419. writer.WriteStr("KillPassword", KillPassword);
  420. if (AccessPasswordDataColumn != c.AccessPasswordDataColumn)
  421. writer.WriteStr("AccessPasswordDataColumn", AccessPasswordDataColumn);
  422. if (KillPasswordDataColumn != c.KillPasswordDataColumn)
  423. writer.WriteStr("KillPasswordDataColumn", KillPasswordDataColumn);
  424. if (LockAccessPassword != c.LockAccessPassword)
  425. writer.WriteValue("LockAccessPassword", LockAccessPassword);
  426. if (LockKillPassword != c.LockKillPassword)
  427. writer.WriteValue("LockKillPassword", LockKillPassword);
  428. if (LockEPCBank != c.LockEPCBank)
  429. writer.WriteValue("LockEPCBlock", LockEPCBank);
  430. if (LockUserBank != c.LockUserBank)
  431. writer.WriteValue("LockUserBlock", LockUserBank);
  432. if (StartPermaLock != c.StartPermaLock)
  433. writer.WriteInt("StartPermaLock", StartPermaLock);
  434. if (CountPermaLock != c.CountPermaLock)
  435. writer.WriteInt("CountPermaLock", CountPermaLock);
  436. if (AdaptiveAntenna != c.AdaptiveAntenna)
  437. writer.WriteBool("AdaptiveAntenna", AdaptiveAntenna);
  438. if (ReadPower != c.ReadPower)
  439. writer.WriteInt("PowerRead", ReadPower);
  440. if (WritePower != c.WritePower)
  441. writer.WriteInt("PowerWrite", WritePower);
  442. if (UseAdjustForEPC != c.UseAdjustForEPC)
  443. writer.WriteBool("UseAdjustForEPC", UseAdjustForEPC);
  444. if (RewriteEPCbank != c.RewriteEPCbank)
  445. writer.WriteBool("RewriteEPCbank", RewriteEPCbank);
  446. if (ErrorHandle != c.ErrorHandle)
  447. writer.WriteValue("ErrorHandle", ErrorHandle);
  448. }
  449. /// <inheritdoc/>
  450. public override void Draw(FRPaintEventArgs e)
  451. {
  452. DrawBackground(e);
  453. DrawMarkers(e);
  454. Border.Draw(e, new RectangleF(AbsLeft, AbsTop, Width, Height));
  455. base.Draw(e);
  456. }
  457. public RFIDLabel()
  458. {
  459. tidBank = new RFIDBank();
  460. epcBank = new RFIDBank();
  461. userBank = new RFIDBank();
  462. epcFormat = "96,8,3,3,20,24,38";
  463. accessPassword = "00000000";
  464. killPassword = "00000000";
  465. accessPasswordDataColumn = "";
  466. killPasswordDataColumn = "";
  467. lockKillPassword = LockType.Open;
  468. lockAccessPassword = LockType.Open;
  469. lockEPCBank = LockType.Open;
  470. lockUserBank = LockType.Open;
  471. startPermaLock = 0;
  472. countPermaLock = 0;
  473. adaptiveAntenna = false;
  474. readPower = 16;
  475. writePower = 16;
  476. useAdjustForEPC = false;
  477. rewriteEPCbank = false;
  478. ErrorHandle = EErrorHandle.None;
  479. //Dock = System.Windows.Forms.DockStyle.Fill;
  480. }
  481. #if !FRCORE
  482. [TypeConverter(typeof(TypeConverters.FRExpandableObjectConverter))]
  483. #endif
  484. public class RFIDBank
  485. {
  486. private int offset;
  487. private string data;
  488. private string dataColumn;
  489. private Format dataFormat;
  490. /// <summary>
  491. /// Specifies the data format of a RFID label bank.
  492. /// </summary>
  493. public enum Format
  494. {
  495. Hex = 'H',
  496. ASCII = 'A'
  497. }
  498. /// <summary>
  499. /// Gets or sets a data of bank.
  500. /// </summary>
  501. public string Data
  502. {
  503. get { return data; }
  504. set { data = value; }
  505. }
  506. /// <summary>
  507. /// Gets or sets a data column name to this bank.
  508. /// </summary>
  509. public string DataColumn
  510. {
  511. get { return dataColumn; }
  512. set { dataColumn = value; }
  513. }
  514. /// <summary>
  515. /// Gets or sets a data offset of bank. Offset measured in 16-bit blocks.
  516. /// </summary>
  517. public int Offset
  518. {
  519. get { return offset; }
  520. set { offset = value; }
  521. }
  522. /// <summary>
  523. /// Gets or sets a data format of bank.
  524. /// </summary>
  525. public Format DataFormat
  526. {
  527. get { return dataFormat; }
  528. set { dataFormat = value; }
  529. }
  530. /// <summary>
  531. /// Gets count byte of data.
  532. /// </summary>
  533. public int CountByte
  534. {
  535. get
  536. {
  537. if (dataFormat == Format.ASCII)
  538. return Encoding.ASCII.GetByteCount(Data);
  539. else
  540. return (int)Math.Ceiling((double)Data.Length / 2);
  541. }
  542. }
  543. public RFIDBank()
  544. {
  545. dataColumn = "";
  546. data = "";
  547. dataFormat = Format.Hex;
  548. offset = 0;
  549. }
  550. /// <summary>
  551. /// Serializes the object.
  552. /// </summary>
  553. public void Serialize(FRWriter writer, string prefix, RFIDBank c)
  554. {
  555. if (Data != c.Data)
  556. writer.WriteStr(prefix + ".Data", Data);
  557. if (DataColumn != c.DataColumn)
  558. writer.WriteStr(prefix + ".DataColumn", DataColumn);
  559. if (DataFormat != c.DataFormat)
  560. writer.WriteValue(prefix + ".DataFormat", DataFormat);
  561. if (Offset != c.Offset)
  562. writer.WriteInt(prefix + ".Offset", Offset);
  563. }
  564. /// <summary>
  565. /// Copies the contents of another, similar object.
  566. /// </summary>
  567. public void Assign(RFIDBank rfidBank)
  568. {
  569. DataColumn = rfidBank.DataColumn;
  570. Data = rfidBank.Data;
  571. Offset = rfidBank.Offset;
  572. DataFormat = rfidBank.DataFormat;
  573. }
  574. }
  575. }
  576. }