SPAPEditor.cs 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625
  1. using UnityEngine;
  2. using System.Collections;
  3. using UnityEditor;
  4. using UnityEditor.Callbacks;
  5. using System.IO;
  6. using System.Collections.Generic;
  7. using System.Runtime.InteropServices;
  8. using System.Text;
  9. using UnityEditor.Build;
  10. using UnityEditor.Build.Reporting;
  11. namespace SerialPortUtility
  12. {
  13. /// <summary>
  14. /// SPAP Custom Editor
  15. /// </summary>
  16. [CustomEditor(typeof(SerialPortUtilityPro))]
  17. public class SPAPEditor : Editor
  18. {
  19. //License
  20. [DllImport("spap", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)]
  21. static extern void spapIsLicensed([MarshalAs(UnmanagedType.LPStr)]StringBuilder email, [MarshalAs(UnmanagedType.LPStr)]StringBuilder code, int size);
  22. private SerializedProperty ReadCompleteEventObject = null;
  23. private SerializedProperty SystemEventObject = null;
  24. private string _sendText = "";
  25. private Vector2 _scrollPos = Vector2.zero;
  26. private _feedCodeDebugSel _fcds = _feedCodeDebugSel.None;
  27. //for debug
  28. private SerializedProperty DebugConsoleMonitorProperty;
  29. private SerializedProperty ExpandConfigProperty;
  30. private SerializedProperty ExpandSPMonitorProperty;
  31. private SerializedProperty ExpandEventsProperty;
  32. private SerializedProperty ExternalConfig;
  33. private enum _baudrateSel
  34. {
  35. Rate1200bps = 1200,
  36. Rate2400bps = 2400,
  37. Rate4800bps = 4800,
  38. Rate9600bps = 9600,
  39. Rate19200bps = 19200,
  40. Rate38400bps = 38400,
  41. Rate57600bps = 57600,
  42. Rate115200bps = 115200,
  43. Rate230400bps = 230400,
  44. Rate460800bps = 460800,
  45. Rate500000bps = 500000,
  46. Rate921600bps = 921600,
  47. Rate1000000bps = 1000000,
  48. }
  49. private enum _splitFeedCodeSel
  50. {
  51. LF = 0, //\n
  52. CR, //\r
  53. CRLF, //\r\n
  54. STX, //\02
  55. ETX, //\03
  56. COMMA, //,
  57. COLON, //:
  58. SEMICOLON, //;
  59. AND, //&
  60. OR, //|
  61. TABHT, //\t
  62. SPACE, //space
  63. CUSTOMCODE,
  64. }
  65. private enum _feedCodeDebugSel
  66. {
  67. None = 0,
  68. LF, //\n
  69. CR, //\r
  70. CRLF, //\r\n
  71. }
  72. Texture2D _icon = null;
  73. Texture2D _icon_free = null;
  74. void OnEnable()
  75. {
  76. ReadCompleteEventObject = serializedObject.FindProperty("ReadCompleteEventObject");
  77. SystemEventObject = serializedObject.FindProperty("SystemEventObject");
  78. if (_icon == null) _icon = Resources.Load<Texture2D>("spap_icon");
  79. if (_icon_free == null) _icon_free = Resources.Load<Texture2D>("spap_icon_free");
  80. DebugConsoleMonitorProperty = serializedObject.FindProperty("DebugConsoleMonitor");
  81. ExpandConfigProperty = serializedObject.FindProperty("ExpandConfig");
  82. ExpandSPMonitorProperty = serializedObject.FindProperty("ExpandSPMonitor");
  83. ExpandEventsProperty = serializedObject.FindProperty("ExpandEventConfig");
  84. ExternalConfig = serializedObject.FindProperty("ExternalConfig");
  85. _sendText = "";
  86. _scrollPos = Vector2.zero;
  87. }
  88. public override void OnInspectorGUI()
  89. {
  90. SerialPortUtilityPro obj = target as SerialPortUtilityPro;
  91. serializedObject.Update();
  92. //License
  93. /*
  94. StringBuilder owner = new StringBuilder(255);
  95. StringBuilder code = new StringBuilder(255);
  96. spapIsLicensed(owner, code, 255);
  97. obj.LicenseEmail = owner.ToString();
  98. obj.LicenseCode = code.ToString();
  99. if (owner.ToString() == string.Empty)
  100. {
  101. if (_icon_free != null)
  102. {
  103. EditorGUILayout.BeginHorizontal();
  104. GUILayout.FlexibleSpace();
  105. GUILayout.Label(new GUIContent(_icon_free));
  106. GUILayout.FlexibleSpace();
  107. EditorGUILayout.EndHorizontal();
  108. GUI.backgroundColor = Color.red;
  109. if (GUILayout.Button("UNLOCK the 1MB transfer limited mode >>"))
  110. {
  111. //SPAPLicense.AddSPAPLicense();
  112. UnityEditorInternal.AssetStore.Open("content/125863");
  113. }
  114. GUI.backgroundColor = Color.white;
  115. }
  116. }
  117. else
  118. {*/
  119. if (_icon != null)
  120. {
  121. EditorGUILayout.BeginHorizontal();
  122. GUILayout.FlexibleSpace();
  123. GUILayout.Label(new GUIContent(_icon));
  124. GUILayout.FlexibleSpace();
  125. EditorGUILayout.EndHorizontal();
  126. }
  127. //}
  128. GUI.backgroundColor = new Color(0.50f, 0.70f, 1.0f);
  129. EditorGUILayout.Space();
  130. //button
  131. if (GUILayout.Button("SerialPort Configure", EditorStyles.toolbarButton))
  132. ExpandConfigProperty.boolValue = !ExpandConfigProperty.boolValue;
  133. GUI.backgroundColor = Color.white;
  134. if (ExpandConfigProperty.boolValue)
  135. {
  136. EditorGUILayout.BeginVertical(GUI.skin.box);
  137. EditorGUILayout.LabelField("SerialPort Status", EditorStyles.boldLabel);
  138. if (EditorApplication.isPlaying)
  139. {
  140. if (obj.IsOpened())
  141. {
  142. EditorGUILayout.HelpBox("Device Opened.", MessageType.Info, true);
  143. GUI.backgroundColor = Color.yellow;
  144. if (GUILayout.Button("Close the device."))
  145. obj.Close();
  146. GUI.backgroundColor = Color.white;
  147. }
  148. else
  149. {
  150. if (obj.IsErrorFinished())
  151. EditorGUILayout.HelpBox("Device Error Closed.", MessageType.Error, true);
  152. else
  153. EditorGUILayout.HelpBox("Device Closed.", MessageType.Warning, true);
  154. GUI.backgroundColor = Color.yellow;
  155. if (GUILayout.Button("Open the device."))
  156. obj.Open();
  157. GUI.backgroundColor = Color.white;
  158. }
  159. }
  160. else
  161. {
  162. string infoString = "Device is not running.";
  163. EditorGUILayout.HelpBox(infoString, MessageType.Info, true);
  164. }
  165. EditorGUILayout.EndVertical();
  166. if (obj.IsOpened())
  167. EditorGUI.BeginDisabledGroup(true);
  168. EditorGUILayout.BeginVertical(GUI.skin.box);
  169. EditorGUILayout.LabelField("Open Configure", EditorStyles.boldLabel);
  170. SerialPortUtilityPro.OpenSystem preMethod = obj.OpenMethod;
  171. obj.OpenMethod = (SerialPortUtilityPro.OpenSystem)EditorGUILayout.EnumPopup("Open Method", obj.OpenMethod);
  172. if (obj.OpenMethod != preMethod)
  173. {
  174. obj.VendorID = "";
  175. obj.ProductID = "";
  176. obj.SerialNumber = "";
  177. obj.Skip = 0;
  178. }
  179. int intdata = 0;
  180. obj.IsAutoOpen = EditorGUILayout.Toggle("Auto Open", obj.IsAutoOpen);
  181. switch (obj.OpenMethod)
  182. {
  183. case SerialPortUtilityPro.OpenSystem.USB:
  184. obj.VendorID = EditorGUILayout.TextField("Vendor ID (0000-FFFF)", obj.VendorID);
  185. obj.ProductID = EditorGUILayout.TextField("Product ID (0000-FFFF)", obj.ProductID);
  186. if (!IsHexString(obj.VendorID)) obj.VendorID = "";
  187. if (!IsHexString(obj.ProductID)) obj.ProductID = "";
  188. obj.SerialNumber = EditorGUILayout.TextField("Serial Number", obj.SerialNumber);
  189. EditorGUILayout.LabelField(" ","* Empty item is targeted to all devices.");
  190. obj.Skip = EditorGUILayout.IntField("Order (Default:0)", obj.Skip);
  191. if (obj.Skip < 0) obj.Skip = 0;
  192. GUI.backgroundColor = Color.yellow;
  193. GUILayout.BeginHorizontal();
  194. GUILayout.FlexibleSpace();
  195. if (GUILayout.Button("Show the devices connected to this PC.",GUILayout.Width(300))){
  196. SPAPTools window = (SPAPTools)EditorWindow.GetWindow(typeof(SPAPTools), true, "Show the devices connected to this PC.", true);
  197. window.spapObject = obj;
  198. window.Show();
  199. }
  200. GUILayout.EndHorizontal();
  201. break;
  202. case SerialPortUtilityPro.OpenSystem.PCI:
  203. #if UNITY_STANDALONE_WIN || UNITY_STANDALONE_LINUX
  204. obj.VendorID = EditorGUILayout.TextField("Vendor ID (0000-FFFF)", obj.VendorID);
  205. obj.ProductID = EditorGUILayout.TextField("Device ID (0000-FFFF)", obj.ProductID);
  206. if (!IsHexString(obj.VendorID)) obj.VendorID = "";
  207. if (!IsHexString(obj.ProductID)) obj.ProductID = "";
  208. EditorGUILayout.LabelField(" ", "* Empty item is targeted to all devices.");
  209. obj.Skip = EditorGUILayout.IntField("Order (Default:0)", obj.Skip);
  210. if (obj.Skip < 0) obj.Skip = 0;
  211. GUI.backgroundColor = Color.yellow;
  212. GUILayout.BeginHorizontal();
  213. GUILayout.FlexibleSpace();
  214. if (GUILayout.Button("Show the devices connected to this PC.", GUILayout.Width(300)))
  215. {
  216. SPAPTools window = (SPAPTools)EditorWindow.GetWindow(typeof(SPAPTools), true, "Show the devices connected to this PC.", true);
  217. window.spapObject = obj;
  218. window.Show();
  219. }
  220. GUILayout.EndHorizontal();
  221. #else
  222. obj.VendorID = EditorGUILayout.TextField("Device Path", obj.VendorID);
  223. obj.ProductID = "";
  224. EditorGUILayout.LabelField(" ", "* Empty item is targeted to all devices.");
  225. obj.Skip = EditorGUILayout.IntField("Order (Default:0)", obj.Skip);
  226. if (obj.Skip < 0) obj.Skip = 0;
  227. #endif
  228. break;
  229. case SerialPortUtilityPro.OpenSystem.BluetoothSSP:
  230. obj.DeviceName = EditorGUILayout.TextField("Device ID", obj.DeviceName);
  231. #if UNITY_ANDROID
  232. obj.BluetoothSSPNoServerMode = EditorGUILayout.Toggle("Server mode is not available", obj.BluetoothSSPNoServerMode);
  233. #endif
  234. obj.Skip = EditorGUILayout.IntField("Order (Default:0)", obj.Skip);
  235. if (obj.Skip < 0) obj.Skip = 0;
  236. GUI.backgroundColor = Color.yellow;
  237. GUILayout.BeginHorizontal();
  238. GUILayout.FlexibleSpace();
  239. if (GUILayout.Button("Show the devices connected to this PC.", GUILayout.Width(300)))
  240. {
  241. SPAPTools window = (SPAPTools)EditorWindow.GetWindow(typeof(SPAPTools), true, "Show the devices connected to this PC.", true);
  242. window.spapObject = obj;
  243. window.Show();
  244. }
  245. GUILayout.EndHorizontal();
  246. break;
  247. case SerialPortUtilityPro.OpenSystem.NumberOrder:
  248. obj.Skip = EditorGUILayout.IntField("Order (Default:0)", obj.Skip);
  249. if (obj.Skip < 0) obj.Skip = 0;
  250. break;
  251. case SerialPortUtilityPro.OpenSystem.TCPSerialEmulatorClient:
  252. obj.VendorID = EditorGUILayout.TextField("Connect IPv4 Address", obj.VendorID);
  253. obj.ProductID = EditorGUILayout.TextField("Connect Port", obj.ProductID);
  254. if (!int.TryParse(obj.ProductID, out intdata)) obj.ProductID = "";
  255. break;
  256. case SerialPortUtilityPro.OpenSystem.TCPSerialEmulatorServer:
  257. obj.VendorID = "";
  258. obj.ProductID = EditorGUILayout.TextField("Connected Port", obj.ProductID);
  259. if (!int.TryParse(obj.ProductID, out intdata)) obj.ProductID = "";
  260. break;
  261. }
  262. GUI.backgroundColor = Color.white;
  263. EditorGUILayout.EndVertical();
  264. EditorGUILayout.BeginVertical(GUI.skin.box);
  265. EditorGUILayout.PropertyField(DebugConsoleMonitorProperty, new GUIContent("Enabled Debug UI Console"));
  266. EditorGUILayout.PropertyField(ExternalConfig, new GUIContent("Enabled External Config"));
  267. if (ExternalConfig.boolValue)
  268. {
  269. obj.ExternalConfigPath = (SerialPortUtilityPro.SourcePath)EditorGUILayout.EnumPopup(" Config File Path", obj.ExternalConfigPath);
  270. obj.ExternalConfigFileName = EditorGUILayout.TextField(" ", obj.ExternalConfigFileName);
  271. }
  272. obj.EnabledTransmission = EditorGUILayout.Toggle("Enabled Transmission", obj.EnabledTransmission);
  273. EditorGUILayout.EndVertical();
  274. if (obj.OpenMethod != SerialPortUtilityPro.OpenSystem.TCPSerialEmulatorClient &&
  275. obj.OpenMethod != SerialPortUtilityPro.OpenSystem.TCPSerialEmulatorServer &&
  276. obj.OpenMethod != SerialPortUtilityPro.OpenSystem.BluetoothSSP)
  277. {
  278. EditorGUILayout.BeginVertical(GUI.skin.box);
  279. EditorGUILayout.LabelField("Communication Structure", EditorStyles.boldLabel);
  280. if (System.Enum.IsDefined(typeof(_baudrateSel), obj.BaudRate))
  281. {
  282. obj.BaudRate = (int)(_baudrateSel)EditorGUILayout.EnumPopup("BaudRate", (_baudrateSel)obj.BaudRate);
  283. obj.BaudRate = EditorGUILayout.IntField(" ", obj.BaudRate);
  284. }
  285. else
  286. {
  287. obj.BaudRate = EditorGUILayout.IntField("BaudRate", obj.BaudRate);
  288. }
  289. obj.Parity = (SerialPortUtilityPro.ParityEnum)EditorGUILayout.EnumPopup("Parity", obj.Parity);
  290. obj.StopBit = (SerialPortUtilityPro.StopBitEnum)EditorGUILayout.EnumPopup("Stop Bit", obj.StopBit);
  291. obj.DataBit = (SerialPortUtilityPro.DataBitEnum)EditorGUILayout.EnumPopup("Data Bit", obj.DataBit);
  292. obj.RecvDiscardNull = EditorGUILayout.Toggle("Discard Null Receive", obj.RecvDiscardNull);
  293. obj.AutoRTSCTSHandshake = EditorGUILayout.Toggle("Auto RTS/CTS Handshake", obj.AutoRTSCTSHandshake);
  294. obj.StartEnableDTR = EditorGUILayout.Toggle("Start DTR Enable", obj.StartEnableDTR);
  295. EditorGUILayout.EndVertical();
  296. }
  297. if (obj.IsOpened())
  298. EditorGUI.EndDisabledGroup();
  299. EditorGUILayout.BeginVertical(GUI.skin.box);
  300. EditorGUILayout.LabelField("Read Data Structure", EditorStyles.boldLabel);
  301. obj.ReadProtocol = (SerialPortUtilityPro.MethodSystem)EditorGUILayout.EnumPopup("Read Protocol", obj.ReadProtocol);
  302. switch (obj.ReadProtocol)
  303. {
  304. case SerialPortUtilityPro.MethodSystem.Streaming:
  305. case SerialPortUtilityPro.MethodSystem.BinaryStreaming:
  306. EditorGUILayout.PropertyField(ReadCompleteEventObject);
  307. break;
  308. case SerialPortUtilityPro.MethodSystem.SplitStringToArray:
  309. obj.SplitCode = GUISplitFeedCodeEnumPop("Split Code", obj.SplitCode);
  310. obj.FeedCode = GUISplitFeedCodeEnumPop("Feed Code", obj.FeedCode);
  311. EditorGUILayout.PropertyField(ReadCompleteEventObject);
  312. EditorGUILayout.HelpBox(" Receive Data Format: " +
  313. "AAA" + obj.SplitCode + "BBB" + obj.SplitCode + "CCC" + obj.FeedCode, MessageType.None);
  314. break;
  315. case SerialPortUtilityPro.MethodSystem.FixedLengthDataToString:
  316. case SerialPortUtilityPro.MethodSystem.FixedLengthDataToBinary:
  317. obj.FixedFeedCount = EditorGUILayout.IntField("Fixed-length Data Size", obj.FixedFeedCount);
  318. EditorGUILayout.PropertyField(ReadCompleteEventObject);
  319. break;
  320. case SerialPortUtilityPro.MethodSystem.SplitStringToDictionary:
  321. obj.SplitCode = GUISplitFeedCodeEnumPop("Split Code", obj.SplitCode);
  322. obj.FeedCode = GUISplitFeedCodeEnumPop("Feed Code", obj.FeedCode);
  323. EditorGUILayout.PropertyField(ReadCompleteEventObject);
  324. EditorGUILayout.HelpBox(" Receive Data Format: " +
  325. "AAA=DDD" + obj.SplitCode + "BBB=EEE" + obj.SplitCode + "CCC=FFF" + obj.FeedCode, MessageType.None);
  326. break;
  327. case SerialPortUtilityPro.MethodSystem.JSONToClassObject:
  328. obj.ReadCompleteEventObjectType = EditorGUILayout.TextField("Object Type", obj.ReadCompleteEventObjectType);
  329. GUI.backgroundColor = Color.yellow;
  330. GUILayout.BeginHorizontal();
  331. GUILayout.FlexibleSpace();
  332. if (GUILayout.Button("Show Object Type from this project.", GUILayout.Width(300)))
  333. {
  334. SPAPToolsObjectType window = (SPAPToolsObjectType)EditorWindow.GetWindow(typeof(SPAPToolsObjectType), true, "Show Object Type from this project.", true);
  335. window.spapObject = obj;
  336. window.Show();
  337. }
  338. GUILayout.EndHorizontal();
  339. GUI.backgroundColor = Color.white;
  340. EditorGUILayout.PropertyField(ReadCompleteEventObject);
  341. break;
  342. case SerialPortUtilityPro.MethodSystem.SplitStringToGameObject:
  343. obj.SplitCode = GUISplitFeedCodeEnumPop("Split Code", obj.SplitCode);
  344. obj.FeedCode = GUISplitFeedCodeEnumPop("Feed Code", obj.FeedCode);
  345. obj.ReadClassMembersObject = EditorGUILayout.ObjectField("GameObject", obj.ReadClassMembersObject, typeof(GameObject), true) as GameObject;
  346. EditorGUILayout.HelpBox(" Receive Data Format: " +
  347. "Class.VarName1=DDD" + obj.SplitCode + "Class.VarName2=EEE" + obj.SplitCode + "Class1.VarName1=FFF" + obj.FeedCode, MessageType.None);
  348. break;
  349. case SerialPortUtilityPro.MethodSystem.LineFeedDataToString:
  350. case SerialPortUtilityPro.MethodSystem.LineFeedDataToBinary:
  351. obj.FeedCode = GUISplitFeedCodeEnumPop("Feed Code", obj.FeedCode);
  352. EditorGUILayout.PropertyField(ReadCompleteEventObject);
  353. EditorGUILayout.HelpBox(" Receive Data Format: " +
  354. "AAABBBCCC" + obj.FeedCode, MessageType.None);
  355. break;
  356. case SerialPortUtilityPro.MethodSystem.ModbusASCII:
  357. EditorGUILayout.PropertyField(ReadCompleteEventObject);
  358. EditorGUILayout.HelpBox(" Receive Data Format: " +
  359. ":AABBDDDDDDXX<CR><LF>", MessageType.None);
  360. break;
  361. case SerialPortUtilityPro.MethodSystem.ModbusRTU:
  362. EditorGUILayout.PropertyField(ReadCompleteEventObject);
  363. EditorGUILayout.HelpBox(" Receive Data Format: " +
  364. "MODBUS RTU HEX BINARY DATA ( Beta )", MessageType.None);
  365. break;
  366. }
  367. EditorGUILayout.EndVertical();
  368. EditorGUILayout.BeginVertical(GUI.skin.box);
  369. EditorGUILayout.LabelField("Write Data Command", EditorStyles.boldLabel);
  370. EditorGUILayout.HelpBox("bool Write(string);\n" +
  371. "bool Write(string, feedCode);\n" +
  372. "bool WriteCRLF(string);\n" +
  373. "bool WriteCR(string);\n" +
  374. "bool WriteLF(string);\n" +
  375. "bool Write(List<string>, splitCode, feedCode);\n" +
  376. "bool Write(Dictionary<key, string>, splitCode, feedCode);\n" +
  377. "bool Write(SPUPMudbusData, binaryMode);" +
  378. "bool Write(byte[] or byte);\n" +
  379. "bool WriteJSON(object);"
  380. , MessageType.Info);
  381. EditorGUILayout.EndVertical();
  382. }
  383. EditorGUILayout.Space();
  384. GUI.backgroundColor = new Color(0.50f, 0.70f, 1.0f);
  385. if (GUILayout.Button("SerialPort Utility Events", EditorStyles.toolbarButton))
  386. ExpandEventsProperty.boolValue = !ExpandEventsProperty.boolValue;
  387. GUI.backgroundColor = Color.white;
  388. GUI.color = Color.white;
  389. if (ExpandEventsProperty.boolValue)
  390. {
  391. obj.UpdateProcessing = (SerialPortUtilityPro.UpdateMethod)EditorGUILayout.EnumPopup("Processing Update", obj.UpdateProcessing);
  392. if (obj.UpdateProcessing == SerialPortUtilityPro.UpdateMethod.ManualUpdate)
  393. EditorGUILayout.HelpBox("Please call ReadUpdate() at an arbitrary timing.", MessageType.Info);
  394. EditorGUILayout.LabelField("Event Handler");
  395. EditorGUILayout.PropertyField(SystemEventObject);
  396. }
  397. EditorGUILayout.Space();
  398. GUI.backgroundColor = new Color(0.50f, 0.70f, 1.0f);
  399. if (GUILayout.Button("SerialPort Debug Monitor", EditorStyles.toolbarButton))
  400. ExpandSPMonitorProperty.boolValue = !ExpandSPMonitorProperty.boolValue;
  401. GUI.backgroundColor = Color.white;
  402. GUI.color = Color.white;
  403. if (ExpandSPMonitorProperty.boolValue)
  404. {
  405. EditorGUILayout.Space();
  406. GUILayout.BeginHorizontal();
  407. if (!obj.IsOpened())
  408. EditorGUI.BeginDisabledGroup(true);
  409. _sendText = EditorGUILayout.TextField(_sendText);
  410. _fcds = (_feedCodeDebugSel)EditorGUILayout.EnumPopup(_fcds, GUILayout.Width(60));
  411. if (GUILayout.Button("Send", GUILayout.Width(60), GUILayout.Height(15)))
  412. {
  413. if (_sendText != string.Empty) {
  414. string feedc = ""; //None
  415. switch (_fcds)
  416. {
  417. case _feedCodeDebugSel.LF: feedc = "<LF>";
  418. break;
  419. case _feedCodeDebugSel.CR: feedc = "<CR>";
  420. break;
  421. case _feedCodeDebugSel.CRLF: feedc = "<CR><LF>";
  422. break;
  423. default: break;
  424. }
  425. if (!obj.Write(_sendText, feedc)) //Write
  426. obj.SerialDebugAddString(" [Send Error!]", true);
  427. }
  428. }
  429. GUILayout.EndHorizontal();
  430. EditorGUILayout.Space();
  431. GUILayout.BeginHorizontal();
  432. obj.RtsEnabled = EditorGUILayout.ToggleLeft("RTS(OUT)", obj.RtsEnabled, GUILayout.Width(80));
  433. obj.DtrEnabled = EditorGUILayout.ToggleLeft("DTR(OUT)", obj.DtrEnabled, GUILayout.Width(110));
  434. EditorGUILayout.ToggleLeft("CTS(IN)", obj.CtsHolding(), GUILayout.Width(80));
  435. EditorGUILayout.ToggleLeft("DSR(IN)", obj.DsrHolding(), GUILayout.Width(80));
  436. GUILayout.EndHorizontal();
  437. EditorGUILayout.Space();
  438. _scrollPos = EditorGUILayout.BeginScrollView(_scrollPos, EditorStyles.textArea, GUILayout.Height(260));
  439. foreach(string destr in obj.GetSerialDebugString.Split("\n".ToCharArray()))
  440. EditorGUILayout.SelectableLabel(destr, GUILayout.Height(15.0f));
  441. EditorGUILayout.EndScrollView();
  442. if (!obj.IsOpened())
  443. EditorGUI.EndDisabledGroup();
  444. }
  445. EditorGUILayout.Space();
  446. EditorGUILayout.LabelField("SerialPort Utility Pro Version " + SerialPortUtilityPro.VersionString);
  447. EditorGUILayout.Space();
  448. //changed param
  449. if (GUI.changed)
  450. {
  451. if (ExpandSPMonitorProperty.boolValue)
  452. {
  453. if (obj.IsOpened())
  454. {
  455. obj.RtsEnable(obj.RtsEnabled);
  456. obj.DtrEnable(obj.DtrEnabled);
  457. }
  458. }
  459. //Todo
  460. serializedObject.ApplyModifiedProperties();
  461. }
  462. EditorUtility.SetDirty(target); //editor set
  463. }
  464. private string GUISplitFeedCodeEnumPop(string itemName, string splitFeedCode)
  465. {
  466. string splitFeedCodeString = "";
  467. _splitFeedCodeSel sfcs;
  468. switch (splitFeedCode)
  469. {
  470. case "<LF>": sfcs = _splitFeedCodeSel.LF;
  471. break;
  472. case "<CR>": sfcs = _splitFeedCodeSel.CR;
  473. break;
  474. case "<CR><LF>": sfcs = _splitFeedCodeSel.CRLF;
  475. break;
  476. case "<STX>": sfcs = _splitFeedCodeSel.STX;
  477. break;
  478. case "<ETX>": sfcs = _splitFeedCodeSel.ETX;
  479. break;
  480. case ",": sfcs = _splitFeedCodeSel.COMMA;
  481. break;
  482. case ":": sfcs = _splitFeedCodeSel.COLON;
  483. break;
  484. case ";": sfcs = _splitFeedCodeSel.SEMICOLON;
  485. break;
  486. case "&": sfcs = _splitFeedCodeSel.AND;
  487. break;
  488. case "|": sfcs = _splitFeedCodeSel.OR;
  489. break;
  490. case "<HT>": sfcs = _splitFeedCodeSel.TABHT;
  491. break;
  492. case " ": sfcs = _splitFeedCodeSel.SPACE;
  493. break;
  494. default:
  495. sfcs = _splitFeedCodeSel.CUSTOMCODE;
  496. break;
  497. }
  498. sfcs = (_splitFeedCodeSel)EditorGUILayout.EnumPopup(itemName, (_splitFeedCodeSel)sfcs);
  499. switch (sfcs)
  500. {
  501. case _splitFeedCodeSel.LF: splitFeedCodeString = "<LF>";
  502. break;
  503. case _splitFeedCodeSel.CR: splitFeedCodeString = "<CR>";
  504. break;
  505. case _splitFeedCodeSel.CRLF: splitFeedCodeString = "<CR><LF>";
  506. break;
  507. case _splitFeedCodeSel.STX: splitFeedCodeString = "<STX>";
  508. break;
  509. case _splitFeedCodeSel.ETX: splitFeedCodeString = "<ETX>";
  510. break;
  511. case _splitFeedCodeSel.COMMA: splitFeedCodeString = ",";
  512. break;
  513. case _splitFeedCodeSel.COLON: splitFeedCodeString = ":";
  514. break;
  515. case _splitFeedCodeSel.SEMICOLON: splitFeedCodeString = ";";
  516. break;
  517. case _splitFeedCodeSel.AND: splitFeedCodeString = "&";
  518. break;
  519. case _splitFeedCodeSel.OR: splitFeedCodeString = "|";
  520. break;
  521. case _splitFeedCodeSel.TABHT: splitFeedCodeString = "<HT>";
  522. break;
  523. case _splitFeedCodeSel.SPACE: splitFeedCodeString = " ";
  524. break;
  525. default:
  526. splitFeedCodeString = splitFeedCode;
  527. break;
  528. }
  529. if (splitFeedCodeString == string.Empty)
  530. splitFeedCodeString = "<LF>";
  531. return EditorGUILayout.TextField(" ", splitFeedCodeString);
  532. }
  533. //is hex
  534. private bool IsHexString(string s)
  535. {
  536. if (string.IsNullOrEmpty(s))
  537. return false;
  538. foreach (char c in s)
  539. if (!System.Uri.IsHexDigit(c))
  540. return false;
  541. return true;
  542. }
  543. /*
  544. [PostProcessBuild]
  545. public static void OnPostprocessBuild(BuildTarget target, string pathToBuiltProject)
  546. {
  547. }
  548. */
  549. }
  550. //Build Processor
  551. public class BuildProcessor : IPreprocessBuildWithReport, IPostprocessBuildWithReport
  552. {
  553. public int callbackOrder => 0;
  554. public void OnPreprocessBuild(BuildReport report)
  555. {
  556. //if (PlayerSettings.Android.minSdkVersion < AndroidSdkVersions.AndroidApiLevel21)
  557. //{
  558. // PlayerSettings.Android.minSdkVersion = AndroidSdkVersions.AndroidApiLevel21;
  559. // Debug.Log("SerialPort Utility Pro changed Android.minSdkVersion( >= Level 21).");
  560. //}
  561. }
  562. public void OnPostprocessBuild(BuildReport report)
  563. {
  564. }
  565. }
  566. }