Compare commits
	
		
			544 Commits
		
	
	
		
			35d40e3b3c
			...
			dc-downloa
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 052028afe8 | |||
| 9b087f62f9 | |||
| 7d38cc1269 | |||
| f5baad16d5 | |||
| b35e6812aa | |||
| d7e709d997 | |||
| 4d93aa1392 | |||
| b0f1e0a493 | |||
| 0dffc1d1c2 | |||
| 3581dd4b1d | |||
| 8d2d7bbb15 | |||
| e2e7c0772d | |||
| 807cea1042 | |||
| 80712964ef | |||
| 978e98b2ee | |||
| 44c2820130 | |||
| 123f22cd21 | |||
| b60af1a4fc | |||
| bb3ecc4b76 | |||
| fa30fe045b | |||
| bae014822d | |||
| 6c472b542e | |||
| 7578746d2f | |||
| 0b1ed62df1 | |||
| 76ec41c291 | |||
| 630cd36f13 | |||
| cbe8bb7aeb | |||
| e04636e3f7 | |||
| 728185ddb9 | |||
| aaa485e2fc | |||
| 9a9480035b | |||
| 0a43654f9b | |||
| 4dba36a420 | |||
| f9ce6a6c1b | |||
| c2c6bc3f8a | |||
| 8c02ebcf15 | |||
| 100bfd63ab | |||
| 23ff4977d9 | |||
| 8da6443833 | |||
| 6b3ebde2b5 | |||
| 41392a98e3 | |||
| 1c9bb11f0b | |||
| ec0e687c21 | |||
| e040e784fc | |||
| d2300b87c6 | |||
| 0dff2ece75 | |||
| db24853062 | |||
| 530ea33460 | |||
| 005e4d249f | |||
| 1c0786e28c | |||
| 0aa8d9ba5a | |||
| 1ecb844b64 | |||
| 9a687e6628 | |||
| 979afa37d3 | |||
| 1e1820724d | |||
| d90954c6eb | |||
| cf77d0ff76 | |||
| 73d02d214a | |||
| 6a67d8e9b0 | |||
| 30d8cc3684 | |||
| bc9ebb7d68 | |||
| e6f6d43bf2 | |||
| 854c8b9706 | |||
| d521fd977a | |||
| ebbdc2f864 | |||
| 62496c5d95 | |||
| edd606fe78 | |||
| 1748c35c45 | |||
| 4c46932a3c | |||
| 686e113c3a | |||
| 6ddfbbfd9e | |||
| 7bfbdc0f07 | |||
| dd591fdd23 | |||
| 18c7b656c3 | |||
| 5e9b05e887 | |||
| 37aae73f21 | |||
| 0b4eed9dc0 | |||
| 12f48ad1bb | |||
| 5d7d1a2870 | |||
| 5d7f13a254 | |||
| d332a990d5 | |||
| bfa39eb3df | |||
| d7fcfa3d0f | |||
| f1e449c108 | |||
| 32346c2665 | |||
| 38e7bf4985 | |||
| 6df73e1082 | |||
| 19250a0a2f | |||
| 6f5c8103e4 | |||
| 07dcf0ba30 | |||
| 1e379cf086 | |||
| e87456f26b | |||
| 0c9a7bc7b5 | |||
| a35c6afcb8 | |||
| 
						
						
							
						
						b06f4f46bb
	
				 | 
					
					
						|||
| 
						
						
							
						
						33d45eab2e
	
				 | 
					
					
						|||
| d2e11d8f07 | |||
| fbffdc923f | |||
| 8faf5af2bf | |||
| 1d532c13a4 | |||
| d2d3afc28e | |||
| f4bb201633 | |||
| b68cf1fd1d | |||
| 0888c1b525 | |||
| a6faf9ce21 | |||
| 5577cc5d6d | |||
| 9967d5cc45 | |||
| e20ed57bd5 | |||
| 6986007b16 | |||
| 9ecdf73bc0 | |||
| 59d6c49cb2 | |||
| f6a8059e2d | |||
| 4372cb578b | |||
| d683a8fc32 | |||
| 4e92522578 | |||
| b45f3a04b4 | |||
| 0db39746db | |||
| f2844aa4d9 | |||
| d4043bd7d2 | |||
| 89b639c0ed | |||
| 1ad13d9a8a | |||
| 6f2cbb0a26 | |||
| c15cebf503 | |||
| 5ee1308c9d | |||
| 746d96ca7c | |||
| f387eaedea | |||
| 0fd977c399 | |||
| d53d72c536 | |||
| f4be1f3f51 | |||
| 75136e41f4 | |||
| 4007bc585e | |||
| 8fff5026df | |||
| 792ff33482 | |||
| 1d8b4ce191 | |||
| bc864c7e8b | |||
| 8bc86c6a94 | |||
| 35bd2743b2 | |||
| f45017e9f3 | |||
| 4d47a5f95c | |||
| 1ab625ca05 | |||
| e1a26ef966 | |||
| da31e1eda6 | |||
| a206ba8c83 | |||
| 1c5ab2aa7d | |||
| 39deef760b | |||
| 6079d9143f | |||
| c1cfca79d2 | |||
| 903d0206a5 | |||
| e163b9561e | |||
| 990d257b09 | |||
| dfbad69ab1 | |||
| 5f0c86ba19 | |||
| 3588b25e65 | |||
| 1f8b88b2b6 | |||
| 0050ea35d0 | |||
| 7e4c138d1b | |||
| 685568d4f6 | |||
| 14b4c035da | |||
| 90de2f415e | |||
| 3cc71cb69b | |||
| fef7533d00 | |||
| e93058cc6b | |||
| e65387aa60 | |||
| 904fa0374b | |||
| 4bf1bbe81f | |||
| 3ccdcbae51 | |||
| 8c50e6cf59 | |||
| 7e69846169 | |||
| 34c55c576c | |||
| 7c2c4d4b80 | |||
| f9f698fd15 | |||
| b4457d8815 | |||
| 3621777827 | |||
| 003bd0bf77 | |||
| 721c5dd7a5 | |||
| a24eb9fd8c | |||
| 24351b8342 | |||
| 4b3a39b0e6 | |||
| a44b780d93 | |||
| 19dfae9b56 | |||
| bef0d4fe12 | |||
| 72a2fc781c | |||
| fc264689b1 | |||
| fc587456d5 | |||
| a2b933ab71 | |||
| 7d0fdf4d6d | |||
| c2ce44c79b | |||
| 16a9556863 | |||
| 48896f97ec | |||
| 4486317cb2 | |||
| 6b9b88ea19 | |||
| 99a99d95a1 | |||
| d4ddbbee21 | |||
| 34e5189945 | |||
| c44c805238 | |||
| 196f1a730e | |||
| 7dc04c4422 | |||
| 5efac2619b | |||
| 9b0f741b9b | |||
| 81c5f8ee7e | |||
| 29e6a25e72 | |||
| 5abc057bda | |||
| 8aeb7ecfea | |||
| 4bb8e241b6 | |||
| 4469a23f9c | |||
| d1f795e2db | |||
| 6865056f4b | |||
| 37bd5c90d3 | |||
| fcba120dfa | |||
| 1d4f50fb9f | |||
| a78040a037 | |||
| 9b175d7789 | |||
| 2d7f145a25 | |||
| 4589c4ca76 | |||
| a32258a59e | |||
| 22f25e5251 | |||
| 258d883a51 | |||
| 504e242d42 | |||
| 731cdcbe09 | |||
| b4e2d4c54a | |||
| 42961dea40 | |||
| fd2f601f67 | |||
| b45af505cd | |||
| 2dfe80b654 | |||
| 4b9dcc5e99 | |||
| 53639b55c9 | |||
| 3a83efbd3f | |||
| c9d6a8d245 | |||
| 91db59b9f3 | |||
| 1d81e6b650 | |||
| 6d57b45d1a | |||
| 4e7ce2cd70 | |||
| 47fac31223 | |||
| 0d353cfbcf | |||
| bdcb073bf8 | |||
| 226553a8ab | |||
| d4ee56559b | |||
| 355b28ba40 | |||
| edeff35d7e | |||
| 09d5de1b0b | |||
| 145fdab26e | |||
| 89d1ec5b21 | |||
| f38c975dc6 | |||
| fba007aa35 | |||
| 8b6adb3ea7 | |||
| 30603317c6 | |||
| 7083f3b4f8 | |||
| 7ff866525e | |||
| 2164037123 | |||
| 2e7d33c4c8 | |||
| 2a2751f6f3 | |||
| 2764ef4371 | |||
| 9783f343e1 | |||
| 8c6f0dfcc7 | |||
| d688ad3d5c | |||
| 7b3f652b0e | |||
| 4cc42b2a65 | |||
| d783fd7fb6 | |||
| e0a0ff54e1 | |||
| 863d052a21 | |||
| 61b3d29e31 | |||
| cac4f7249e | |||
| 3223c430be | |||
| c09682ea33 | |||
| fef1d43d5f | |||
| 705424727b | |||
| b96f0896e3 | |||
| a3967c76ac | |||
| 
						
						
							
						
						1197598a3d
	
				 | 
					
					
						|||
| 
						
						
							
						
						ec13e97226
	
				 | 
					
					
						|||
| 
						
						
							
						
						a8dd9d7e24
	
				 | 
					
					
						|||
| 82751eb1d4 | |||
| 17a4a69df2 | |||
| a03261d04a | |||
| 7832ef5d8c | |||
| 9c213d0a97 | |||
| 18378afdc5 | |||
| 6dd8a8c6b3 | |||
| adfb358e12 | |||
| ff418b11a1 | |||
| 38e79f0354 | |||
| 103b3f3f9c | |||
| ff6a6e0e45 | |||
| afbce3b4ea | |||
| 823e59a582 | |||
| 01cfbddfb1 | |||
| 838efd3945 | |||
| 9a65cb4456 | |||
| df0951d671 | |||
| 60cc752819 | |||
| 57b4716e2a | |||
| 15f28e9ffd | |||
| a07893ddab | |||
| d0eb1d12d8 | |||
| cd59a39569 | |||
| 67c8b2f472 | |||
| 5158878ce2 | |||
| b6971c1db5 | |||
| 9df46a1c49 | |||
| 6765b12f0c | |||
| 3e925756cf | |||
| b2798b349e | |||
| 64dce44fe1 | |||
| 7e96b65c1b | |||
| 276d65a9d8 | |||
| ba71728979 | |||
| e82742a609 | |||
| 6773a7243a | |||
| 22c8997f1e | |||
| 9531a08b4a | |||
| c065b57f0c | |||
| cef05b7511 | |||
| bb35e985ad | |||
| 981a2ea13a | |||
| b14b296011 | |||
| 1ef9853876 | |||
| 01d8312aa8 | |||
| 507586f9dc | |||
| 12ffa71455 | |||
| a84f495d43 | |||
| 7e4b5006eb | |||
| 0a28f0d82c | |||
| 5427844977 | |||
| a45e552d90 | |||
| be28570d23 | |||
| 1509e8619c | |||
| a8df026a80 | |||
| a803907449 | |||
| afd31f1b27 | |||
| f8fef38009 | |||
| cbe1fd387d | |||
| 1620b73d01 | |||
| 4ebdcf56a0 | |||
| 99b9419150 | |||
| 4307fb96a6 | |||
| c35390b6d6 | |||
| fff6bd2b49 | |||
| 631ade1954 | |||
| 337bdd1bb0 | |||
| 978cc16304 | |||
| bea8242d6f | |||
| 56daa84a14 | |||
| 17ddfd0ddd | |||
| 2ac8c4cfc6 | |||
| 0559ff64e2 | |||
| 385a7b7b00 | |||
| 503b7c64f9 | |||
| beec9c2f9d | |||
| 5263b7de0f | |||
| 9b4d0494c8 | |||
| 0f2ee0349f | |||
| e700a40875 | |||
| 1eba5338e4 | |||
| f20be9ddcf | |||
| 7631c05e22 | |||
| ad93e536f0 | |||
| 259da8200e | |||
| 8d528f0f55 | |||
| 66d0214720 | |||
| 86064979b4 | |||
| 86c996d7ac | |||
| effe41bac9 | |||
| 4968942cc2 | |||
| 769626581f | |||
| 0e97ce7dc2 | |||
| 34334676fc | |||
| 853787cd4b | |||
| a932ed5471 | |||
| c338884fc7 | |||
| ed6df98653 | |||
| 9eb458c4c5 | |||
| 202e83268b | |||
| 8f26bfee0f | |||
| 1af136e39d | |||
| a550d55004 | |||
| a37a22d3f9 | |||
| a8941f4ef4 | |||
| 746565dbe0 | |||
| 79906df12e | |||
| edf1d105e7 | |||
| 6c4b02cb56 | |||
| 04d5061d79 | |||
| 042e6dfa38 | |||
| e523d3cc2c | |||
| 927197d0d1 | |||
| 72cb738af5 | |||
| 0fb38013f7 | |||
| 5f1376cf1e | |||
| 5db7b4224e | |||
| 7c7adc94e6 | |||
| 89c2d3a8ae | |||
| c2b52aa91d | |||
| 329c770aa0 | |||
| cdb045b72b | |||
| 6d43cf4c9f | |||
| 4caa0c0d83 | |||
| 4d2d38e45c | |||
| 9a55ce18e4 | |||
| 223c7a8f8d | |||
| ce72d3d14d | |||
| 8b66c47e49 | |||
| 4ff3b0efdf | |||
| 1fd2269753 | |||
| a8994423f4 | |||
| 4594c913e0 | |||
| cf9033e898 | |||
| b09ccfd4f5 | |||
| 6b4c486549 | |||
| 9c44656104 | |||
| d57914957d | |||
| c4f12ce75a | |||
| 4ad370ea46 | |||
| 44ad3caf2b | |||
| 427a272f8f | |||
| 96fb50e68d | |||
| 19274546c9 | |||
| d2d730589b | |||
| f88b0edb2a | |||
| c62299aa72 | |||
| c054668eac | |||
| 82352713f1 | |||
| 48073ab1f0 | |||
| c6e98f50c2 | |||
| ef88fdc9a4 | |||
| 8889aaca2a | |||
| 9b08420ac1 | |||
| 0ee92f0181 | |||
| a995cae000 | |||
| 0b7d504a7a | |||
| 6a4a852fd6 | |||
| 81a9304438 | |||
| 332d689b8c | |||
| b508c0517d | |||
| d2c0fdf820 | |||
| 7293afd203 | |||
| 2fd1053bf9 | |||
| e0a68a35f4 | |||
| 4e277b4ca6 | |||
| b3f4a4086b | |||
| eb7d77692b | |||
| ce1b1859df | |||
| 371cc1a187 | |||
| a94606ca89 | |||
| 5c9c9dc917 | |||
| ab8acfc7d1 | |||
| 1ddd0074b3 | |||
| 2b934f6baf | |||
| 1bdae56342 | |||
| 6caaae6d50 | |||
| 4dc0c71d3f | |||
| a54f4f94c9 | |||
| b8d6c909eb | |||
| e35fb9dc19 | |||
| 0e0363f131 | |||
| 088d7c8aa0 | |||
| 60084450e6 | |||
| 9775792916 | |||
| 93d6277386 | |||
| 37c5c7c4f6 | |||
| 5eb33f3e31 | |||
| 43f5f3ecae | |||
| c503750e90 | |||
| 7054c18113 | |||
| 077eb803a1 | |||
| f963b61ebc | |||
| 9ed51d60e4 | |||
| f5198efab3 | |||
| d6446f90fe | |||
| 58bceb5d27 | |||
| 92084bed99 | |||
| cd1c92a7db | |||
| 9ca758ecd3 | |||
| 3c54d8de6d | |||
| d91d4261d9 | |||
| 00f5216a9f | |||
| aeae9002fe | |||
| 9df425f5f8 | |||
| 5149a67d4b | |||
| 1309c27f7c | |||
| 26db620465 | |||
| bd213b8f8c | |||
| 31b7bd1314 | |||
| 0bdbd39632 | |||
| b979fb5b2a | |||
| cbefccd2d3 | |||
| 0ebe274e9a | |||
| c4d09eb2ea | |||
| 3039fcc553 | |||
| a67e587769 | |||
| d89520d58e | |||
| 06a9eba177 | |||
| a41dc5403f | |||
| 85b2c1f08e | |||
| ba8dd7d083 | |||
| fa04e32266 | |||
| 7d6b433373 | |||
| faae8b8d9a | |||
| a0d0de19c5 | |||
| 17eaa7858f | |||
| f2556412d8 | |||
| 26557542f1 | |||
| 6bb46e165c | |||
| 027529161d | |||
| 61c847102d | |||
| 3034f49c96 | |||
| 528b74549a | |||
| c7acc2a99b | |||
| 61afdfc325 | |||
| c34944af8b | |||
| 58684cf3c4 | |||
| 08122cf703 | |||
| fdd32cea92 | |||
| 7c17090a2b | |||
| 3de46ea099 | |||
| f46ac4075a | |||
| 0668ab65be | |||
| f66ae498ce | |||
| e420f95eb0 | |||
| 809440ba95 | |||
| c6ea94e249 | |||
| 4cee0e37da | |||
| 9c343f3eeb | |||
| e79d6c6fef | |||
| 88013e82f0 | |||
| 079a6910dd | |||
| bbf97dc58d | |||
| 810b603d70 | |||
| 8281303a55 | |||
| a4afeeb396 | |||
| bc3a801b8d | |||
| f52dec9124 | |||
| 07942153c3 | |||
| bac848f6be | |||
| ccc1bf2a99 | |||
| c8487a7541 | |||
| dc90705f24 | |||
| c4c503080e | |||
| e2d9c5aa90 | |||
| 60f845aa8d | |||
| fa0c31d9e4 | |||
| 57b82094c8 | |||
| af337874a6 | |||
| f016e9777e | |||
| 85bec3364f | 
							
								
								
									
										2
									
								
								.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										2
									
								
								.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,2 @@
 | 
				
			|||||||
 | 
					tags
 | 
				
			||||||
 | 
					*.tags
 | 
				
			||||||
							
								
								
									
										18
									
								
								ATBUpdateTool.ini
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										18
									
								
								ATBUpdateTool.ini
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,18 @@
 | 
				
			|||||||
 | 
					[REPOSITORY_URL]
 | 
				
			||||||
 | 
					repository-url="https://git.mimbach49.de/GerhardHoffmann"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					[DIRECTORIES]
 | 
				
			||||||
 | 
					plugin-directory="/usr/lib/"
 | 
				
			||||||
 | 
					working-directory="/opt/app/tools/atbupdate/"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					[PLUGINS]
 | 
				
			||||||
 | 
					plugin-name="libCAmaster.so"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					[FLAGS]
 | 
				
			||||||
 | 
					no-psa-hardware-update=false
 | 
				
			||||||
 | 
					dry-run=false
 | 
				
			||||||
 | 
					extended-version=false
 | 
				
			||||||
 | 
					yocto-version=false
 | 
				
			||||||
 | 
					yocto-install=false
 | 
				
			||||||
 | 
					always-download-config=true
 | 
				
			||||||
 | 
					always-download-dc=false
 | 
				
			||||||
							
								
								
									
										41
									
								
								DCPlugin/.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										41
									
								
								DCPlugin/.gitignore
									
									
									
									
										vendored
									
									
								
							@@ -1,41 +0,0 @@
 | 
				
			|||||||
# C++ objects and libs
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
*.slo
 | 
					 | 
				
			||||||
*.lo
 | 
					 | 
				
			||||||
*.o
 | 
					 | 
				
			||||||
*.a
 | 
					 | 
				
			||||||
*.la
 | 
					 | 
				
			||||||
*.lai
 | 
					 | 
				
			||||||
*.so
 | 
					 | 
				
			||||||
*.dll
 | 
					 | 
				
			||||||
*.dylib
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
# Qt-es
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
*.pro.user
 | 
					 | 
				
			||||||
*.pro.user.*
 | 
					 | 
				
			||||||
moc_*.cpp
 | 
					 | 
				
			||||||
qrc_*.cpp
 | 
					 | 
				
			||||||
Makefile
 | 
					 | 
				
			||||||
Makefile.*
 | 
					 | 
				
			||||||
*-build-*
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#
 | 
					 | 
				
			||||||
*.autosave
 | 
					 | 
				
			||||||
ui_*.h
 | 
					 | 
				
			||||||
version.h
 | 
					 | 
				
			||||||
version.txt
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
packages/*
 | 
					 | 
				
			||||||
*.pro.orig
 | 
					 | 
				
			||||||
Output/setup.exe
 | 
					 | 
				
			||||||
.directory
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
*~
 | 
					 | 
				
			||||||
resources/icons/*.png
 | 
					 | 
				
			||||||
resources/icons/*.jpg
 | 
					 | 
				
			||||||
resources/icons/*.gif
 | 
					 | 
				
			||||||
resources/style/*.qss
 | 
					 | 
				
			||||||
text/*.html
 | 
					 | 
				
			||||||
!text/*_template.html
 | 
					 | 
				
			||||||
text/*.xml
 | 
					 | 
				
			||||||
@@ -1,25 +0,0 @@
 | 
				
			|||||||
INCLUDEPATH += $${PWD}/include
 | 
					 | 
				
			||||||
DEPENDPATH += $${PWD}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
HEADERS += $${PWD}/include/com.h \
 | 
					 | 
				
			||||||
    $${PWD}/include/controlBus.h \
 | 
					 | 
				
			||||||
    $${PWD}/include/datIf.h \
 | 
					 | 
				
			||||||
    $${PWD}/include/dcBL.h \
 | 
					 | 
				
			||||||
    $${PWD}/include/hwapi.h \
 | 
					 | 
				
			||||||
    $${PWD}/include/interfaces.h \
 | 
					 | 
				
			||||||
    $${PWD}/include/prot.h \
 | 
					 | 
				
			||||||
    $${PWD}/include/sendWRcmd.h \
 | 
					 | 
				
			||||||
    $${PWD}/include/storeINdata.h \
 | 
					 | 
				
			||||||
    $${PWD}/include/tslib.h \
 | 
					 | 
				
			||||||
    $${PWD}/include/shared_mem_buffer.h
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
SOURCES += $${PWD}/src/com.cpp \
 | 
					 | 
				
			||||||
    $${PWD}/src/controlBus.cpp \
 | 
					 | 
				
			||||||
    $${PWD}/src/datIf.cpp \
 | 
					 | 
				
			||||||
    $${PWD}/src/dcBL.cpp \
 | 
					 | 
				
			||||||
    $${PWD}/src/hwapi.cpp \
 | 
					 | 
				
			||||||
    $${PWD}/src/prot.cpp \
 | 
					 | 
				
			||||||
    $${PWD}/src/sendWRcmd.cpp \
 | 
					 | 
				
			||||||
    $${PWD}/src/storeINdata.cpp \
 | 
					 | 
				
			||||||
    $${PWD}/src/tslib.cpp \
 | 
					 | 
				
			||||||
    $${PWD}/src/shared_mem_buffer.cpp
 | 
					 | 
				
			||||||
@@ -1,94 +0,0 @@
 | 
				
			|||||||
TEMPLATE = lib
 | 
					 | 
				
			||||||
CONFIG += plugin
 | 
					 | 
				
			||||||
#CONFIG += c++11 console
 | 
					 | 
				
			||||||
#CONFIG -= app_bundle
 | 
					 | 
				
			||||||
#QT += widgets
 | 
					 | 
				
			||||||
QT -= gui
 | 
					 | 
				
			||||||
QT += widgets serialport
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
INCLUDEPATH += $${PWD}/plugins
 | 
					 | 
				
			||||||
INCLUDEPATH += $${PWD}/include
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
QMAKE_CXXFLAGS += -Wno-deprecated-copy
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
# default
 | 
					 | 
				
			||||||
ARCH = PTU5
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
include(DCPlugin.pri)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
contains( CONFIG, DesktopLinux ) {
 | 
					 | 
				
			||||||
    QMAKE_CC = ccache $$QMAKE_CC
 | 
					 | 
				
			||||||
    QMAKE_CXX = ccache $$QMAKE_CXX
 | 
					 | 
				
			||||||
    QMAKE_CXXFLAGS += -std=c++11
 | 
					 | 
				
			||||||
    # QMAKE_CXXFLAGS += -Wno-deprecated-ctor
 | 
					 | 
				
			||||||
    linux-clang {  QMAKE_CXXFLAGS += -Qunused-arguments   }
 | 
					 | 
				
			||||||
    ARCH = DesktopLinux
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
contains( CONFIG, PTU5 ) {
 | 
					 | 
				
			||||||
    # QMAKE_CC = ccache $$QMAKE_CC
 | 
					 | 
				
			||||||
    # QMAKE_CXX = ccache $$QMAKE_CXX
 | 
					 | 
				
			||||||
    QMAKE_CXXFLAGS += -std=c++11
 | 
					 | 
				
			||||||
    linux-clang {  QMAKE_CXXFLAGS += -Qunused-arguments   }
 | 
					 | 
				
			||||||
    CONFIG += link_pkgconfig
 | 
					 | 
				
			||||||
    ARCH = PTU5
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
contains( CONFIG, PTU5_YOCTO ) {
 | 
					 | 
				
			||||||
    greaterThan(QT_MAJOR_VERSION, 4): QT += serialport
 | 
					 | 
				
			||||||
    PTU5BASEPATH = /opt/devel/ptu5
 | 
					 | 
				
			||||||
    ARCH = PTU5
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    # add qmqtt lib
 | 
					 | 
				
			||||||
    #LIBS += -lQt5Qmqtt
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
TARGET   = ATBDeviceControllerPlugin
 | 
					 | 
				
			||||||
#DESTDIR  = ../plugins
 | 
					 | 
				
			||||||
INTERFACE = DeviceController
 | 
					 | 
				
			||||||
INTERFACE_DEFINITION = $${PWD}/include/ATBAPP/DeviceControllerInterface.h
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
DEFINES += DEVICECONTROLLERPLUGIN_LIBRARY
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
# The following define makes your compiler emit warnings if you use
 | 
					 | 
				
			||||||
# any Qt feature that has been marked deprecated (the exact warnings
 | 
					 | 
				
			||||||
# depend on your compiler). Please consult the documentation of the
 | 
					 | 
				
			||||||
# deprecated API in order to know how to port your code away from it.
 | 
					 | 
				
			||||||
DEFINES += QT_DEPRECATED_WARNINGS
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
# You can also make your code fail to compile if it uses deprecated APIs.
 | 
					 | 
				
			||||||
# In order to do so, uncomment the following line.
 | 
					 | 
				
			||||||
# You can also select to disable deprecated APIs only up to a certain version of Qt.
 | 
					 | 
				
			||||||
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000    # disables all the APIs deprecated before Qt 6.0.0
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
# Default rules for deployment.
 | 
					 | 
				
			||||||
#qnx: target.path = /tmp/$${TARGET}/bin
 | 
					 | 
				
			||||||
#else: unix:!android: target.path = /opt/$${TARGET}/bin
 | 
					 | 
				
			||||||
#!isEmpty(target.path): INSTALLS += target
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
# ATBAPP interface
 | 
					 | 
				
			||||||
HEADERS += \
 | 
					 | 
				
			||||||
    src/ATBAPP/ATBAPPplugin.h \
 | 
					 | 
				
			||||||
    src/ATBAPP/DeviceControllerInterface.h \
 | 
					 | 
				
			||||||
    src/ATBAPP/ATBHealthEvent.h \
 | 
					 | 
				
			||||||
    src/ATBAPP/ATBDeviceControllerPlugin.h
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
SOURCES += \
 | 
					 | 
				
			||||||
    src/ATBAPP/ATBHealthEvent.cpp \
 | 
					 | 
				
			||||||
    src/ATBAPP/ATBDeviceControllerPlugin.cpp
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
DISTFILES += \
 | 
					 | 
				
			||||||
    generate-version.sh
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
# Define how to create version.h
 | 
					 | 
				
			||||||
VERSION_H = $$PWD/include/version.h
 | 
					 | 
				
			||||||
version.output = $$PWD/include/version.h
 | 
					 | 
				
			||||||
version.commands = $$PWD/generate-version.sh $${ARCH} $${TARGET} $${INTERFACE} $${INTERFACE_DEFINITION} $${VERSION_H}
 | 
					 | 
				
			||||||
version.depends = FORCE
 | 
					 | 
				
			||||||
version.input = VERSION_H
 | 
					 | 
				
			||||||
version.variable_out = HEADERS
 | 
					 | 
				
			||||||
QMAKE_EXTRA_COMPILERS += version
 | 
					 | 
				
			||||||
QMAKE_CLEAN += $${PWD}/include/version.h
 | 
					 | 
				
			||||||
@@ -1,155 +0,0 @@
 | 
				
			|||||||
#!/bin/bash
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
VERSION_STRING=""
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#GIT='/cygdrive/c/Program Files \(x86\)/Git/bin/git'
 | 
					 | 
				
			||||||
GIT=git
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
parse_git_branch () {
 | 
					 | 
				
			||||||
    $GIT branch --no-color 2> /dev/null | sed -e '/^[^*]/d' -e "s/* \(.*\)/\1/"
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
ARCH=$1
 | 
					 | 
				
			||||||
TARGET=$2
 | 
					 | 
				
			||||||
INTERFACE=$3
 | 
					 | 
				
			||||||
INTERFACE_DEFINITION=$4
 | 
					 | 
				
			||||||
VERSION_H=$5
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
SCRIPT=$(readlink -f $0)
 | 
					 | 
				
			||||||
SCRIPTPATH=`dirname $SCRIPT`
 | 
					 | 
				
			||||||
OUTPUTDIR=$(pwd)
 | 
					 | 
				
			||||||
echo " current dir is : " $(pwd)
 | 
					 | 
				
			||||||
echo $SCRIPT
 | 
					 | 
				
			||||||
echo $SCRIPTPATH
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
echo "changing dir to script path: " $SCRIPTPATH
 | 
					 | 
				
			||||||
cd $SCRIPTPATH
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
# set version string ##################################################################
 | 
					 | 
				
			||||||
if [ -z $VERSION_STRING ] ; then
 | 
					 | 
				
			||||||
  VERSION_STRING=$(date +%Y%m%d_%H%M)
 | 
					 | 
				
			||||||
fi
 | 
					 | 
				
			||||||
GIT_DESCRIBE=$($GIT describe)
 | 
					 | 
				
			||||||
GIT_BRANCH=$(parse_git_branch)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
# extract path from branchname:
 | 
					 | 
				
			||||||
IFS='_' read -ra TMP_ARRAY <<< "${GIT_BRANCH}"
 | 
					 | 
				
			||||||
BRANCH_PATH=${TMP_ARRAY[0]}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
# detect if we have a development version:
 | 
					 | 
				
			||||||
if [ ${#TMP_ARRAY[1]} -gt 0 ] ; then
 | 
					 | 
				
			||||||
  DEV_SUFFIX="_dev"
 | 
					 | 
				
			||||||
else
 | 
					 | 
				
			||||||
  DEV_SUFFIX=""
 | 
					 | 
				
			||||||
fi
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
# detect if git status is dirty
 | 
					 | 
				
			||||||
GIT_DESCRIBE_DIRTY=$($GIT describe --dirty)
 | 
					 | 
				
			||||||
if [ "${GIT_DESCRIBE_DIRTY:(-6)}" == "-dirty" ] ; then
 | 
					 | 
				
			||||||
  DIRTY_SUFFIX="_dirty"
 | 
					 | 
				
			||||||
else
 | 
					 | 
				
			||||||
  DIRTY_SUFFIX=""
 | 
					 | 
				
			||||||
fi
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
if [ -n "$DIRTY_SUFFIX" ] || [ -n "$DEV_SUFFIX" ] ; then
 | 
					 | 
				
			||||||
  DEVDIRTY=true
 | 
					 | 
				
			||||||
else
 | 
					 | 
				
			||||||
  DEVDIRTY=false
 | 
					 | 
				
			||||||
fi
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
# extract interface definition 
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#
 | 
					 | 
				
			||||||
#Q_DECLARE_INTERFACE(CCInterface,
 | 
					 | 
				
			||||||
#         "eu.atb.ptu.plugin.CCInterface/2.9.0")
 | 
					 | 
				
			||||||
# -> extract whole string within quotation marks
 | 
					 | 
				
			||||||
INTERFACE_VERSION=$(grep 'eu.atb.ptu.plugin.' ${INTERFACE_DEFINITION})
 | 
					 | 
				
			||||||
# get string within quotes:
 | 
					 | 
				
			||||||
INTERFACE_VERSION=`echo ${INTERFACE_VERSION} | awk -F \" '{print $2}'`
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#
 | 
					 | 
				
			||||||
# write version.h
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
echo "     TARGET is: $TARGET"
 | 
					 | 
				
			||||||
echo "     ARCH   is: $ARCH"
 | 
					 | 
				
			||||||
echo " "
 | 
					 | 
				
			||||||
echo "     PluginName: $TARGET"
 | 
					 | 
				
			||||||
echo "     Interface:  $INTERFACE"
 | 
					 | 
				
			||||||
echo "     InterfaceVersion: $INTERFACE_VERSION"
 | 
					 | 
				
			||||||
echo " "
 | 
					 | 
				
			||||||
echo "     new version is:  $VERSION_STRING"
 | 
					 | 
				
			||||||
echo "     git describe is: $GIT_DESCRIBE"
 | 
					 | 
				
			||||||
echo "     git branch is:   $GIT_BRANCH"
 | 
					 | 
				
			||||||
echo "     branch-path is:  $BRANCH_PATH"
 | 
					 | 
				
			||||||
echo "  "
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
echo "     dev suffix:     $DEV_SUFFIX"
 | 
					 | 
				
			||||||
echo "     dirty suffix:   $DIRTY_SUFFIX"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
PLUGIN_VERSION=${VERSION_STRING}
 | 
					 | 
				
			||||||
#ATB_QT_GIT_DESCRIBE=${GIT_DESCRIBE}_${GIT_BRANCH}
 | 
					 | 
				
			||||||
PLUGIN_GIT_DESCRIBE=${GIT_DESCRIBE}_${BRANCH_PATH}${DEV_SUFFIX}${DIRTY_SUFFIX}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#TARGET=IngenicoZVT_CCPlugin
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
# build version.h #####################################################################
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
echo "     building new version info (version.h) ..."
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
echo "#ifndef VERSION_H"   >  ${VERSION_H}
 | 
					 | 
				
			||||||
echo "#define VERSION_H"   >> ${VERSION_H}
 | 
					 | 
				
			||||||
echo ""                    >> ${VERSION_H}
 | 
					 | 
				
			||||||
echo ""                    >> ${VERSION_H}
 | 
					 | 
				
			||||||
echo "#define INTERFACE_VERSION \"${INTERFACE_VERSION}\""      >> ${VERSION_H}
 | 
					 | 
				
			||||||
echo "#define PLUGIN_VERSION \"${PLUGIN_VERSION}\""           >> ${VERSION_H}
 | 
					 | 
				
			||||||
echo ""                                                       >> ${VERSION_H}
 | 
					 | 
				
			||||||
echo "#define PLUGIN_GIT_DESCRIBE \"${PLUGIN_GIT_DESCRIBE}\"" >> ${VERSION_H}
 | 
					 | 
				
			||||||
echo ""                                                       >> ${VERSION_H}
 | 
					 | 
				
			||||||
echo ""                                                       >> ${VERSION_H}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
cat <<EOT >> ${VERSION_H}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
const std::string pluginInfoString = R"(
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    "Interface": "${INTERFACE}",
 | 
					 | 
				
			||||||
    "InterfaceVersion": "${INTERFACE_VERSION}",
 | 
					 | 
				
			||||||
    "PluginName": "${TARGET}",
 | 
					 | 
				
			||||||
    "Version": "${PLUGIN_VERSION}",
 | 
					 | 
				
			||||||
    "git-describe": "${PLUGIN_GIT_DESCRIBE}",
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
)";
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
EOT
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
echo ""                                              >> ${VERSION_H}
 | 
					 | 
				
			||||||
echo ""                                              >> ${VERSION_H}
 | 
					 | 
				
			||||||
if [ ${DEVDIRTY} == "true" ] ; then
 | 
					 | 
				
			||||||
echo "#define DEVDIRTY"                              >> ${VERSION_H}
 | 
					 | 
				
			||||||
echo ""                                              >> ${VERSION_H}
 | 
					 | 
				
			||||||
echo ""                                              >> ${VERSION_H}
 | 
					 | 
				
			||||||
fi
 | 
					 | 
				
			||||||
echo "#define SYSTEM_ARCH \"${ARCH}\""               >> ${VERSION_H}
 | 
					 | 
				
			||||||
echo "#define ARCH_${ARCH}"                          >> ${VERSION_H}
 | 
					 | 
				
			||||||
echo ""                                              >> ${VERSION_H}
 | 
					 | 
				
			||||||
echo "" 					     >> ${VERSION_H}
 | 
					 | 
				
			||||||
echo "#endif //VERSION_H"  >> ${VERSION_H}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
@@ -1,105 +0,0 @@
 | 
				
			|||||||
//CAT is always master, no receive before request
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#ifndef SER_H
 | 
					 | 
				
			||||||
#define SER_H
 | 
					 | 
				
			||||||
#include <stdint.h>
 | 
					 | 
				
			||||||
#include <QMainWindow>
 | 
					 | 
				
			||||||
#include <QString>
 | 
					 | 
				
			||||||
#include <QTimer>
 | 
					 | 
				
			||||||
#include <QSerialPort>
 | 
					 | 
				
			||||||
#include "tslib.h"
 | 
					 | 
				
			||||||
#include "controlBus.h"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#define MAXTELEGRAMLEN          90
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// display all inputs and outputs in output window:
 | 
					 | 
				
			||||||
//#define PRINTALLDEBUGS          1
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
class T_com : public QMainWindow        //,  public QPlainTextEdit
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    Q_OBJECT
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    // complete send message (protocol frame)
 | 
					 | 
				
			||||||
    QByteArray  sendBuffer;         //[MAXTELEGRAMLEN];
 | 
					 | 
				
			||||||
    uint16_t     sendLen;            // >0: Daten Sendebereit, nach senden wieder auf 0 setzen
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    // right after reception:
 | 
					 | 
				
			||||||
    QByteArray  rawInput;           //[MAXTELEGRAMLEN];
 | 
					 | 
				
			||||||
    uint16_t     rawInLen;           // 0: keine neuen Daten erhalten
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
//    QSerialPort *CatSerial = nullptr;
 | 
					 | 
				
			||||||
    QSerialPort *CatSerial;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    //char oeffneSerialPort();
 | 
					 | 
				
			||||||
    char open_Serial_Port();
 | 
					 | 
				
			||||||
    void closeSerialPort();
 | 
					 | 
				
			||||||
    void receiveByLength(void);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
private slots:
 | 
					 | 
				
			||||||
    void readSomeBytes(void);
 | 
					 | 
				
			||||||
    void serialSendComplete(void);
 | 
					 | 
				
			||||||
    //void incomingWake(void);    //bool LevelOfTheBit);
 | 
					 | 
				
			||||||
    void receiveTO(void);
 | 
					 | 
				
			||||||
    void ser_ISR100ms();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
public:
 | 
					 | 
				
			||||||
    T_com(QWidget *parent = nullptr);
 | 
					 | 
				
			||||||
    ~T_com();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    QTimer *serRecTime;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    bool isPortOpen(void);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    void writeToSerial(const QByteArray &data, uint16_t sendLength);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    void receiveFixLen(int64_t nrOfbytesToReceive);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    bool readFromSerial(QByteArray &data, uint16_t &sendLength);
 | 
					 | 
				
			||||||
        // retval: true: data available
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/*
 | 
					 | 
				
			||||||
    uint8_t getAllPortPins(void);
 | 
					 | 
				
			||||||
        // rs232pins: all signals bitwise coded in one byte:
 | 
					 | 
				
			||||||
        // readback output:  bit 0=TxD(=output)      bit2=DTR (=output)    bit 6=RTS (=output)
 | 
					 | 
				
			||||||
        // unused inputs:       bit1=RxD    bit 3=DCD    bit 5 = RING
 | 
					 | 
				
			||||||
        // handshake inputs:           bit 4=DSR (0x10)     bit 7=CTS (0x80)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    bool getHSin_CTS(void);
 | 
					 | 
				
			||||||
        // return the CTS Handshake input): true= high level (+8V)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    bool getHSin_DSR(void);
 | 
					 | 
				
			||||||
        // return the DSR Handshake input): true= high level (+8V)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    bool setHSout_RTS(bool hsout);
 | 
					 | 
				
			||||||
        // hsout true=positiv voltage +12V  false= -12V
 | 
					 | 
				
			||||||
        // retval: true=setting OK
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    bool setHSout_DTR(bool hsout);
 | 
					 | 
				
			||||||
        // hsout true=positiv voltage +12V  false= -12V
 | 
					 | 
				
			||||||
        // retval: true=setting OK
 | 
					 | 
				
			||||||
*/
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
signals:
 | 
					 | 
				
			||||||
    void receivingFinished();
 | 
					 | 
				
			||||||
    void sendingFinished();
 | 
					 | 
				
			||||||
    //void wasWokenBySerialHandshake();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#endif // SER_H
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
@@ -1,194 +0,0 @@
 | 
				
			|||||||
#ifndef CONTROLBUS_H
 | 
					 | 
				
			||||||
#define CONTROLBUS_H
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#include <stdint.h>
 | 
					 | 
				
			||||||
#include "tslib.h"
 | 
					 | 
				
			||||||
#include <QString>
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// ///////////////////////////////////////////////////////////////////////////////////
 | 
					 | 
				
			||||||
//          control serial interface   gui <--> serial
 | 
					 | 
				
			||||||
// ///////////////////////////////////////////////////////////////////////////////////
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
void epi_setSerial(int BaudNr, QString BaudStr, QString ComName, uint8_t connect);
 | 
					 | 
				
			||||||
    // Actions: open serial port with parameters
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
void epi_closeSerial(void);
 | 
					 | 
				
			||||||
// Actions: close serial port
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// Actions, GUI Buttons -> API, start cyclic transmission
 | 
					 | 
				
			||||||
void epi_startEmmision(char start);   // 1: start sending activated
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
//void epi_setPeriodicSendTimeVal(uint16_t val);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
//  Port -> API
 | 
					 | 
				
			||||||
void gpi_serialChanged(void);
 | 
					 | 
				
			||||||
    // serial confirms that port was closed or opened
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// Actions, API -> serialPort
 | 
					 | 
				
			||||||
uint8_t gpi_getSerialConn(void);      // connect if 1, disconnect if 0
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
int gpi_getBaudNr(void);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
QString gpi_getComPortName(void);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
void gpi_serialIsOpen(bool offen);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
bool epi_isSerialPortOpen();
 | 
					 | 
				
			||||||
    // true: port is open   false: port is closed
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// Meldung von TabCom an Datif: starte zyklische Sendung:
 | 
					 | 
				
			||||||
bool gpi_isEmmisionOn(void);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
//uint16_t gpi_getPeriodicSendTimeVal();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
//bool gpi_PeriodicSendTimeHasChanged();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
//void epi_setCurrSlavAddr(int slavAd);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
//int gpi_getCurrSlavAddr(void);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// ///////////////////////////////////////////////////////////////////////////////////
 | 
					 | 
				
			||||||
//          Status Display    gui <--> serial
 | 
					 | 
				
			||||||
// ///////////////////////////////////////////////////////////////////////////////////
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
//---------------------
 | 
					 | 
				
			||||||
    // Statuszeile COM Port  (serial Port) (open, closed)
 | 
					 | 
				
			||||||
// Display in tab_com
 | 
					 | 
				
			||||||
QString epi_getTxt4comStateLine(void);
 | 
					 | 
				
			||||||
void epi_clrTxt4comStateLine();
 | 
					 | 
				
			||||||
    // GUI: get Text for serial Comport-State Line
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
//---------------------
 | 
					 | 
				
			||||||
// Statuszeile Handshakes (serial Control)   flow.cpp
 | 
					 | 
				
			||||||
// geht überhaupt was raus? kommt überhaupt was zurück?
 | 
					 | 
				
			||||||
// I
 | 
					 | 
				
			||||||
QString epi_getTxt4HsStateLine(void);
 | 
					 | 
				
			||||||
void epi_clrTxt4HsStateLine();
 | 
					 | 
				
			||||||
    // GUI: get Text
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// II Master receive state (empfangenes Telgramm OK? crc? length?  )
 | 
					 | 
				
			||||||
// Statuszeile Auswertung der SlaveResponse (serial Frame, CRC usw)  (prot.cpp)
 | 
					 | 
				
			||||||
QString epi_getTxt4masterStateLine(void);
 | 
					 | 
				
			||||||
void epi_clrTxt4masterStateLine();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// III Slave receive (from Master) OK? if then show results, if not then show errors
 | 
					 | 
				
			||||||
// entweder Empfangsfehler anzeigen (crc? length?) oder result OUT-OK, OUT_ERR, IN_OK, IN_ERR
 | 
					 | 
				
			||||||
// Hintergrund: wenn der Slave Fehler im Master-Telegramm gefunden hat, dann kann er es auch
 | 
					 | 
				
			||||||
// nicht verwenden und nichts ausgeben oder einlesen
 | 
					 | 
				
			||||||
QString epi_getTxt4resultStateLine(void);
 | 
					 | 
				
			||||||
void epi_clrTxt4resultStateLine();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// IV  Statuszeile Sende- und Empfangsdaten (Datif)
 | 
					 | 
				
			||||||
// Display in tab_com
 | 
					 | 
				
			||||||
QString epi_getTxt4dataStateLine(void);
 | 
					 | 
				
			||||||
void epi_clrTxt4dataStateLine();
 | 
					 | 
				
			||||||
// GUI: get Text for serial Comport-State Line
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// V, unten, Datif
 | 
					 | 
				
			||||||
QString epi_getTxt4datifLine(void);
 | 
					 | 
				
			||||||
void epi_clrTxt4datifLine();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
//---------------------
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        // sende-empfangs-Rohdaten-Fenster
 | 
					 | 
				
			||||||
// Display in tab_com
 | 
					 | 
				
			||||||
QString epi_getTxt4RsDiagWin(void);
 | 
					 | 
				
			||||||
void epi_clrTxt4RsDiagWin();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
QString epi_get2ndTxt4RsDiagWin(void);
 | 
					 | 
				
			||||||
void epi_clr2ndTxt4RsDiagWin();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// Statuszeile COM Port  (serial Port) (open, closed)
 | 
					 | 
				
			||||||
// Display in tab_com
 | 
					 | 
				
			||||||
void gpi_setTxt4comStateLine(QString txtline);
 | 
					 | 
				
			||||||
    // serial: write Text to be displayed in serial Comport-State line (like "connected")
 | 
					 | 
				
			||||||
    // used in vcp.cpp, links in tabCom
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// Statuszeile Handshakes (serial Control)
 | 
					 | 
				
			||||||
// I obere Zeile
 | 
					 | 
				
			||||||
void gpi_setTxt4HsStateLine(QString txtline);
 | 
					 | 
				
			||||||
    // used in flow.cc
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// II
 | 
					 | 
				
			||||||
void gpi_setTxt4masterStateLine(QString txtline);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// III
 | 
					 | 
				
			||||||
void gpi_setTxt4resultStateLine(QString txtline);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// IV
 | 
					 | 
				
			||||||
void gpi_setTxt4dataStateLine(QString txtline);
 | 
					 | 
				
			||||||
    // serial: write Text to be displayed in serial Comport-State line (like "connected")
 | 
					 | 
				
			||||||
    // used in prot.cpp
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// V  unten:
 | 
					 | 
				
			||||||
void gpi_setTxt4datifLine(QString txtline);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// sende-empfangs-Rohdaten-Fenster
 | 
					 | 
				
			||||||
// Display in tab_com
 | 
					 | 
				
			||||||
void gpi_setTxt4RsDiagWin(QString txtline);
 | 
					 | 
				
			||||||
void gpi_set2ndTxt4RsDiagWin(QString txtline);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// ///////////////////////////////////////////////////////////////////////////////////
 | 
					 | 
				
			||||||
//          Memory for Slave responses, common data
 | 
					 | 
				
			||||||
// ///////////////////////////////////////////////////////////////////////////////////
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
bool epi_getResult_serialTestOK();
 | 
					 | 
				
			||||||
// retval: true: test was successful, got right response
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// result of serial line test, slave sent fixed string
 | 
					 | 
				
			||||||
void gpi_storeResult_serialTestOK(bool wasOn);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// ///////////////////////////////////////////////////////////////////////////////////
 | 
					 | 
				
			||||||
//          restore just received data
 | 
					 | 
				
			||||||
// ///////////////////////////////////////////////////////////////////////////////////
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
uint8_t gpi_startNewRequest();
 | 
					 | 
				
			||||||
    // called by Datif
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
uint8_t gpi_storeResultOfLastRequest(bool answisok);
 | 
					 | 
				
			||||||
    // written by Datif
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
uint8_t epi_getResultOfLastRequest();
 | 
					 | 
				
			||||||
    // retval: 0: in progress  1: OK  2: error
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
void gpi_storeRecPayLoad(uint8_t RdDlen, uint8_t const *receivedData);
 | 
					 | 
				
			||||||
    // stored by Datif
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
uint16_t epi_getLastPayLoad(uint16_t plBufSiz, uint8_t *payLoad);
 | 
					 | 
				
			||||||
    // get data back in *pl, max 64 byte
 | 
					 | 
				
			||||||
    // retval = nr of bytes received. If host buffer too small then
 | 
					 | 
				
			||||||
    // only plBufSíz bytes are copied to pl
 | 
					 | 
				
			||||||
    // plBufSíz=size of host buffer
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
@@ -1,341 +0,0 @@
 | 
				
			|||||||
// Data Interface between slave (DC) and pi buffer
 | 
					 | 
				
			||||||
// determines sending and receiving order of data
 | 
					 | 
				
			||||||
// cares for storing input data and restoring output data
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#ifndef DIF_H
 | 
					 | 
				
			||||||
#define DIF_H
 | 
					 | 
				
			||||||
#include <stdint.h>
 | 
					 | 
				
			||||||
#include "tslib.h"
 | 
					 | 
				
			||||||
#include "prot.h"
 | 
					 | 
				
			||||||
#include "dcBL.h"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#include <QMainWindow>
 | 
					 | 
				
			||||||
#include <QString>
 | 
					 | 
				
			||||||
#include <QTimer>
 | 
					 | 
				
			||||||
#include <QDebug>
 | 
					 | 
				
			||||||
#include <QDateTime>
 | 
					 | 
				
			||||||
#include <QDate>
 | 
					 | 
				
			||||||
#include <QTime>
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#define CMD2DC_sendTime             20
 | 
					 | 
				
			||||||
#define CMD2DC_setWakeFrequ         112
 | 
					 | 
				
			||||||
#define CMD2DC_MOV_UPLOCK           113
 | 
					 | 
				
			||||||
#define CMD2DC_MOV_DNLOCK           114
 | 
					 | 
				
			||||||
#define CMD2DC_UPPER_DOOR           115
 | 
					 | 
				
			||||||
#define CMD2DC_LOWER_DOOR           116
 | 
					 | 
				
			||||||
#define CMD2DC_VAULT_DOOR           117
 | 
					 | 
				
			||||||
#define CMD2DC_REJMOT_ON            118
 | 
					 | 
				
			||||||
#define CMD2DC_REJMOT_RUN           119
 | 
					 | 
				
			||||||
#define CMD2DC_LED_COIN             100
 | 
					 | 
				
			||||||
#define CMD2DC_LED_ILLU             101
 | 
					 | 
				
			||||||
#define CMD2DC_LED_TICKET           102
 | 
					 | 
				
			||||||
#define CMD2DC_LED_START            104
 | 
					 | 
				
			||||||
#define CMD2DC_LED_PIN              103
 | 
					 | 
				
			||||||
#define CMD2DC_LED_IN               105
 | 
					 | 
				
			||||||
#define CMD2DC_FAN                  106
 | 
					 | 
				
			||||||
#define CMD2DC_SIREN                107
 | 
					 | 
				
			||||||
#define CMD2DC_BARRIER              108
 | 
					 | 
				
			||||||
#define CMD2DC_WAKEPTU              109
 | 
					 | 
				
			||||||
#define CMD2DC_SWITCHAUXPWR         110
 | 
					 | 
				
			||||||
#define CMD2DC_SWITCHAUXDDR         18
 | 
					 | 
				
			||||||
#define CMD2DC_SWITCHAUXOUT         19
 | 
					 | 
				
			||||||
#define CMD2DC_UCONTACTON           111
 | 
					 | 
				
			||||||
#define CMD2DC_DEVICE_PARAM         23
 | 
					 | 
				
			||||||
#define CMD2DC_SEND_MACH_ID         11
 | 
					 | 
				
			||||||
#define CMD2DC_RDBK_DEV_PARA        14
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#define CMD2DC_RDBK_MACH_ID         15
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#define CMD2DC_MDB_ON               120
 | 
					 | 
				
			||||||
#define CMD2DC_MDB_GET_STATE        107  // REQ
 | 
					 | 
				
			||||||
#define CMD2DC_MDB_DORESET          121
 | 
					 | 
				
			||||||
#define CMD2DC_MDB_SETWAK           122
 | 
					 | 
				
			||||||
//#define CMD2DC_MDB_GETWAK           0x2812  // REQ not nec.
 | 
					 | 
				
			||||||
#define CMD2DC_MDB_SENDCMD          123
 | 
					 | 
				
			||||||
#define CMD2DC_MDB_SENDMSG          12
 | 
					 | 
				
			||||||
#define CMD2DC_MDB_GETRESP          22  // REQ
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#define CMD2DC_EMP_SET              24
 | 
					 | 
				
			||||||
#define CMD2DC_EMP_GET_ALL          23  // REQ
 | 
					 | 
				
			||||||
#define CMD2DC_EMP_STARTPOLL        124
 | 
					 | 
				
			||||||
#define CMD2DC_EMP_STARTPAY         125
 | 
					 | 
				
			||||||
#define CMD2DC_EMP_STOPPAY          126
 | 
					 | 
				
			||||||
#define CMD2DC_EMP_GOTCOIN          108  // REQ
 | 
					 | 
				
			||||||
#define CMD2DC_SHUTTER_OPEN         129
 | 
					 | 
				
			||||||
#define CMD2DC_ESCR_OPEN            132
 | 
					 | 
				
			||||||
#define CMD2DC_ESCR_TAKE            133
 | 
					 | 
				
			||||||
#define CMD2DC_ESCR_RETURN          134
 | 
					 | 
				
			||||||
#define CMD2DC_MOD_ON               135
 | 
					 | 
				
			||||||
#define CMD2DC_MOD_WAK              136
 | 
					 | 
				
			||||||
#define CMD2DC_CRED_ON              137
 | 
					 | 
				
			||||||
#define CMD2DC_CRED_WAK             138
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// READ Commands ((e.g. get input)
 | 
					 | 
				
			||||||
#define CMD2DC_TestSerial           10
 | 
					 | 
				
			||||||
#define CMD2DC_GetSerialConfig      105
 | 
					 | 
				
			||||||
#define CMD2DC_RdBkHWversion        11
 | 
					 | 
				
			||||||
#define CMD2DC_RdBkSWversion        12
 | 
					 | 
				
			||||||
#define CMD2DC_RdBkDCstate          101
 | 
					 | 
				
			||||||
#define CMD2DC_RdBkUID              18
 | 
					 | 
				
			||||||
#define CMD2DC_RdBkTime             104
 | 
					 | 
				
			||||||
#define CMD2DC_RdBkAnalog           106
 | 
					 | 
				
			||||||
#define CMD2DC_GetAllInputs         102
 | 
					 | 
				
			||||||
#define CMD2DC_RdBkAllOutputs       103
 | 
					 | 
				
			||||||
#define CMD2DC_MIFREADERON          127
 | 
					 | 
				
			||||||
#define CMD2DC_ATB_CREATE           128
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// Mif read data:
 | 
					 | 
				
			||||||
#define CMD2DC_RdBk_MifState        109
 | 
					 | 
				
			||||||
#define CMD2DC_RdBk_MifData         24
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#define CMD2DC_RdBk_AtbCardType     25
 | 
					 | 
				
			||||||
#define CMD2DC_SHUTTER_COIN         131
 | 
					 | 
				
			||||||
#define CMD2DC_SHUTTER_OPEN3S       130
 | 
					 | 
				
			||||||
#define CMD2DC_SEND_SHUT_TIME       0x2915
 | 
					 | 
				
			||||||
#define CMD2DC_ESCR_TAKE            133
 | 
					 | 
				
			||||||
#define CMD2DC_ESCR_RETURN          134
 | 
					 | 
				
			||||||
#define CMD2DC_PRINTERON            139
 | 
					 | 
				
			||||||
#define CMD2DC_RdBk_PrnState        110
 | 
					 | 
				
			||||||
#define CMD2DC_RdBk_PrnFonts        26
 | 
					 | 
				
			||||||
#define CMD2DC_RdBk_AllPrnData      27
 | 
					 | 
				
			||||||
                                           // nr of params:
 | 
					 | 
				
			||||||
#define CMD2DC_PRI_SYS_CMD          25  // 3
 | 
					 | 
				
			||||||
#define CMD2DC_PRI_ESC_CMD          26  // 4
 | 
					 | 
				
			||||||
#define CMD2DC_PRI_SETUP            27  // 5
 | 
					 | 
				
			||||||
#define CMD2DC_PRI_MOVE             140  // 2
 | 
					 | 
				
			||||||
#define CMD2DC_PRI_SETFONT          141  // 4
 | 
					 | 
				
			||||||
#define CMD2DC_PRI_SETLETTER        142  // 3
 | 
					 | 
				
			||||||
#define CMD2DC_PRI_CUT              143  // 1
 | 
					 | 
				
			||||||
#define CMD2DC_PRI_PRINT_TXT        13  // 64
 | 
					 | 
				
			||||||
#define CMD2DC_PRI_LF               144  // 1
 | 
					 | 
				
			||||||
#define CMD2DC_PRI_PRIFONTTABLE     145
 | 
					 | 
				
			||||||
#define CMD2DC_PRI_BARCODE          14  // ca 15...25
 | 
					 | 
				
			||||||
#define CMD2DC_STOR_QR_DATA         15  // 150
 | 
					 | 
				
			||||||
#define CMD2DC_PRI_QR_CODE          146  // 0
 | 
					 | 
				
			||||||
#define CMD2DC_PRI_LOGOFROMFLASH    147  // 2
 | 
					 | 
				
			||||||
#define CMD2DC_PRI_STORE_DOC        16  // 1
 | 
					 | 
				
			||||||
#define CMD2DC_PRI_DOCUMENT_NR      17  // 1 + 64
 | 
					 | 
				
			||||||
#define CMD2DC_PRI_CLEAR_DOC        148  // 1
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/*
 | 
					 | 
				
			||||||
// WRITE Commands (e.g. switch relay)
 | 
					 | 
				
			||||||
#define CMD2DC_sendTime             0x1310
 | 
					 | 
				
			||||||
#define CMD2DC_setWakeFrequ         0x1320
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#define CMD2DC_MOV_UPLOCK           0x1801
 | 
					 | 
				
			||||||
#define CMD2DC_MOV_DNLOCK           0x1802
 | 
					 | 
				
			||||||
#define CMD2DC_UPPER_DOOR           0x1810
 | 
					 | 
				
			||||||
#define CMD2DC_LOWER_DOOR           0x1811
 | 
					 | 
				
			||||||
#define CMD2DC_VAULT_DOOR           0x1812
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// neu 7.10.21:
 | 
					 | 
				
			||||||
#define CMD2DC_REJMOT_ON            0x1813
 | 
					 | 
				
			||||||
#define CMD2DC_REJMOT_RUN           0x1814
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#define CMD2DC_LED_COIN             0x1204
 | 
					 | 
				
			||||||
#define CMD2DC_LED_ILLU             0x1205
 | 
					 | 
				
			||||||
#define CMD2DC_LED_TICKET           0x1206
 | 
					 | 
				
			||||||
#define CMD2DC_LED_START            0x1208
 | 
					 | 
				
			||||||
#define CMD2DC_LED_PIN              0x1207
 | 
					 | 
				
			||||||
#define CMD2DC_LED_IN               0x1209
 | 
					 | 
				
			||||||
#define CMD2DC_FAN                  0x1210
 | 
					 | 
				
			||||||
#define CMD2DC_SIREN                0x1211
 | 
					 | 
				
			||||||
#define CMD2DC_BARRIER              0x1212
 | 
					 | 
				
			||||||
#define CMD2DC_WAKEPTU              0x1218
 | 
					 | 
				
			||||||
#define CMD2DC_SWITCHAUXPWR         0x1220
 | 
					 | 
				
			||||||
#define CMD2DC_SWITCHAUXDDR         0x1222
 | 
					 | 
				
			||||||
#define CMD2DC_SWITCHAUXOUT         0x1224
 | 
					 | 
				
			||||||
#define CMD2DC_UCONTACTON           0x1226
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#define CMD2DC_DEVICE_PARAM         0x2000
 | 
					 | 
				
			||||||
#define CMD2DC_SEND_MACH_ID         0x2002
 | 
					 | 
				
			||||||
#define CMD2DC_RDBK_DEV_PARA        0x2001
 | 
					 | 
				
			||||||
#define CMD2DC_RDBK_MACH_ID         0x2003
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// --------------------------- MDB --------------
 | 
					 | 
				
			||||||
#define CMD2DC_MDB_ON               0x2800
 | 
					 | 
				
			||||||
#define CMD2DC_MDB_GET_STATE        0x2801  // REQ
 | 
					 | 
				
			||||||
#define CMD2DC_MDB_DORESET          0x2802
 | 
					 | 
				
			||||||
#define CMD2DC_MDB_SETWAK           0x2811
 | 
					 | 
				
			||||||
//#define CMD2DC_MDB_GETWAK           0x2812  // REQ not nec.
 | 
					 | 
				
			||||||
#define CMD2DC_MDB_SENDCMD          0x2820
 | 
					 | 
				
			||||||
#define CMD2DC_MDB_SENDMSG          0x2821
 | 
					 | 
				
			||||||
#define CMD2DC_MDB_GETRESP          0x2822  // REQ
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// --------------------------- EMP --------------
 | 
					 | 
				
			||||||
#define CMD2DC_EMP_SET              0x2830
 | 
					 | 
				
			||||||
#define CMD2DC_EMP_GET_ALL          0x2831  // REQ
 | 
					 | 
				
			||||||
#define CMD2DC_EMP_STARTPOLL        0x2832
 | 
					 | 
				
			||||||
#define CMD2DC_EMP_STARTPAY         0x2834
 | 
					 | 
				
			||||||
#define CMD2DC_EMP_STOPPAY          0x2836
 | 
					 | 
				
			||||||
#define CMD2DC_EMP_GOTCOIN          0x2837  // REQ
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#define CMD2DC_SHUTTER_OPEN         0x2911
 | 
					 | 
				
			||||||
#define CMD2DC_ESCR_OPEN            0x2920
 | 
					 | 
				
			||||||
#define CMD2DC_ESCR_TAKE            0x2921
 | 
					 | 
				
			||||||
#define CMD2DC_ESCR_RETURN          0x2922
 | 
					 | 
				
			||||||
#define CMD2DC_MOD_ON               0x2940
 | 
					 | 
				
			||||||
#define CMD2DC_MOD_WAK              0x2941
 | 
					 | 
				
			||||||
#define CMD2DC_CRED_ON              0x2960
 | 
					 | 
				
			||||||
#define CMD2DC_CRED_WAK             0x2961
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// READ Commands ((e.g. get input)
 | 
					 | 
				
			||||||
#define CMD2DC_TestSerial           0x1101
 | 
					 | 
				
			||||||
#define CMD2DC_GetSerialConfig      0x1107
 | 
					 | 
				
			||||||
#define CMD2DC_RdBkHWversion        0x110A
 | 
					 | 
				
			||||||
#define CMD2DC_RdBkSWversion        0x110B
 | 
					 | 
				
			||||||
#define CMD2DC_RdBkDCstate          0x110C
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#define CMD2DC_RdBkUID              0x1305
 | 
					 | 
				
			||||||
#define CMD2DC_RdBkTime             0x1313
 | 
					 | 
				
			||||||
#define CMD2DC_RdBkAnalog           0x1550
 | 
					 | 
				
			||||||
#define CMD2DC_GetAllInputs         0x1201
 | 
					 | 
				
			||||||
#define CMD2DC_RdBkAllOutputs       0x1202
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#define CMD2DC_MIFREADERON          0x2900
 | 
					 | 
				
			||||||
#define CMD2DC_ATB_CREATE           0x2907
 | 
					 | 
				
			||||||
// Mif read data:
 | 
					 | 
				
			||||||
#define CMD2DC_RdBk_MifState       0x2902
 | 
					 | 
				
			||||||
#define CMD2DC_RdBk_MifData         0x2903
 | 
					 | 
				
			||||||
#define CMD2DC_RdBk_AtbCardType     0x2905
 | 
					 | 
				
			||||||
//#define CMD2DC_RdBk_CardData        0x2906
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// higher Level operation commands
 | 
					 | 
				
			||||||
//#define CMD2DC_SHUTTER_ONE          0x2912
 | 
					 | 
				
			||||||
#define CMD2DC_SHUTTER_COIN         0x2913
 | 
					 | 
				
			||||||
#define CMD2DC_SHUTTER_OPEN3S       0x2912
 | 
					 | 
				
			||||||
#define CMD2DC_SEND_SHUT_TIME       0x2915
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#define CMD2DC_ESCR_TAKE            0x2921
 | 
					 | 
				
			||||||
#define CMD2DC_ESCR_RETURN          0x2922
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#define CMD2DC_PRINTERON            0x2A01
 | 
					 | 
				
			||||||
#define CMD2DC_RdBk_PrnState        0x2A02
 | 
					 | 
				
			||||||
#define CMD2DC_RdBk_PrnFonts        0x2A12
 | 
					 | 
				
			||||||
#define CMD2DC_RdBk_AllPrnData      0x2A40
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
                                            // nr of params:
 | 
					 | 
				
			||||||
#define CMD2DC_PRI_SYS_CMD          0x2A03  // 3
 | 
					 | 
				
			||||||
#define CMD2DC_PRI_ESC_CMD          0x2A04  // 4
 | 
					 | 
				
			||||||
#define CMD2DC_PRI_SETUP            0x2A05  // 5
 | 
					 | 
				
			||||||
#define CMD2DC_PRI_MOVE             0x2A06  // 2
 | 
					 | 
				
			||||||
#define CMD2DC_PRI_SETFONT          0x2A10  // 4
 | 
					 | 
				
			||||||
#define CMD2DC_PRI_SETLETTER        0x2A11  // 3
 | 
					 | 
				
			||||||
#define CMD2DC_PRI_CUT              0x2A13  // 1
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#define CMD2DC_PRI_PRINT_TXT        0x2A14  // 64
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#define CMD2DC_PRI_LF               0x2A15  // 1
 | 
					 | 
				
			||||||
#define CMD2DC_PRI_PRIFONTTABLE     0x2A16
 | 
					 | 
				
			||||||
#define CMD2DC_PRI_BARCODE          0x2A17  // ca 15...25
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#define CMD2DC_STOR_QR_DATA         0x2A18  // 150
 | 
					 | 
				
			||||||
#define CMD2DC_PRI_QR_CODE          0x2A19  // 0
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#define CMD2DC_PRI_LOGOFROMFLASH    0x2A1A  // 2
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#define CMD2DC_PRI_STORE_DOC        0x2A41  // 1
 | 
					 | 
				
			||||||
#define CMD2DC_PRI_DOCUMENT_NR      0x2A42  // 1 + 64
 | 
					 | 
				
			||||||
#define CMD2DC_PRI_CLEAR_DOC        0x2A43  // 1
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
*/
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#define FIX_SLAVE_ADDR          0
 | 
					 | 
				
			||||||
#define SEND_ATONCE             1
 | 
					 | 
				
			||||||
#define SENDCOMBINED            0
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
class T_datif : public QMainWindow
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    Q_OBJECT    
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    char sendINrequestsAutomatic(void);
 | 
					 | 
				
			||||||
        // sende alle Befehle um die Eingangsdaten abzufragen der Reihe nach
 | 
					 | 
				
			||||||
    char loadRecDataFromFrame();
 | 
					 | 
				
			||||||
    void datif_startSending(void);
 | 
					 | 
				
			||||||
    void datif_sendIOrequest(uint16_t WRcmd, uint16_t RDcmd, uint8_t nrOfWrData);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    void datif_send8byteOutCmd(uint16_t WRcmd, uint16_t RDcmd);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    bool verifyLineTestresponse(uint8_t RdDlen, uint8_t *receivedData);
 | 
					 | 
				
			||||||
    void datif_OUT_setTime(void);
 | 
					 | 
				
			||||||
    uint8_t datif_OUT_SendRandomData(uint8_t *buf, uint8_t Length);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    void datif_send64byteOutCmd(uint16_t WRcmd, uint16_t addr, uint16_t RDcmd);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    void datif_sendToMemory(uint16_t WRcmd, uint16_t docNr, uint16_t blockNr, uint8_t *data64);
 | 
					 | 
				
			||||||
        // send printer documents to DC2 memory
 | 
					 | 
				
			||||||
        // docNr: 0...15(31)    with 1280 byte each (20 blocks a 64byte)
 | 
					 | 
				
			||||||
        // blockNr=0...19   with 64byte each
 | 
					 | 
				
			||||||
        // docNr =transmitted in WRITEADDRESS high byte
 | 
					 | 
				
			||||||
        // blockNr=transmitted in WRITEADDRESS low byte
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    T_prot *myDCIF;
 | 
					 | 
				
			||||||
    QTimer *datif_trigger;
 | 
					 | 
				
			||||||
    uint8_t selectedSlaveAddr;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
private slots:
 | 
					 | 
				
			||||||
    char datif_cycleSend();
 | 
					 | 
				
			||||||
    void StoredRecData();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
public:
 | 
					 | 
				
			||||||
    T_datif(QWidget *parent = nullptr);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    T_prot *getProt() { return myDCIF; }
 | 
					 | 
				
			||||||
    T_prot const *getProt() const { return myDCIF; }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    void resetChain(void);
 | 
					 | 
				
			||||||
    char isPortOpen(void);
 | 
					 | 
				
			||||||
    void sendWRcommand(uint16_t nxtAsCmd);
 | 
					 | 
				
			||||||
        // Sende Schreibbefehle die bereits vorher asynchron gespeichert wurden
 | 
					 | 
				
			||||||
    void send_requests(uint16_t nextWrCmd);
 | 
					 | 
				
			||||||
    void sendHighLevel(uint16_t nxtHLCmd);
 | 
					 | 
				
			||||||
    bool areDataValid(void);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
signals:
 | 
					 | 
				
			||||||
    void ResponseRecieved();
 | 
					 | 
				
			||||||
        //the requested data are stored in peripheral image
 | 
					 | 
				
			||||||
        // can be loaded with epi
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    void datif_templatePrintFinished_OK();
 | 
					 | 
				
			||||||
    void datif_templatePrintFinished_Err();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    void datif_gotNewCoin();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#endif // CI_H
 | 
					 | 
				
			||||||
@@ -1,102 +0,0 @@
 | 
				
			|||||||
#ifndef DCBL_H
 | 
					 | 
				
			||||||
#define DCBL_H
 | 
					 | 
				
			||||||
#include <stdint.h>
 | 
					 | 
				
			||||||
#include "qbytearray.h"
 | 
					 | 
				
			||||||
#include "qstring.h"
 | 
					 | 
				
			||||||
#include <QFile>
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
uint8_t dcBL_prepareDC_BLcmd(uint8_t Cmd, uint8_t SendDataLength, uint8_t *sendData, uint8_t *outBuf);
 | 
					 | 
				
			||||||
// make BL protocol, retval = outbuf length (5...133)
 | 
					 | 
				
			||||||
// bring data in correct form: start always with 0x02   finish with 0x03 and append checksum
 | 
					 | 
				
			||||||
// 0x02 Cmd < ...sendData ..>  CRC  CRC 0x03
 | 
					 | 
				
			||||||
// Data length = 0...64
 | 
					 | 
				
			||||||
// special conversion: if data contain 2 or 3 (STX, ETX) then write two bytes:  0x1B (=ESC) and data|0x80
 | 
					 | 
				
			||||||
// so maxlength = 5 + 2 x 64 (if all data are 2 or 3)  without 2,3: maxlength = 5 + 64
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
uint8_t dcBL_readBLversion(uint8_t *sendData);
 | 
					 | 
				
			||||||
    // minimum size of sendData-buffer: 5byte  retval: length
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
uint8_t dcBL_readFWversion(uint8_t *sendData);
 | 
					 | 
				
			||||||
    // minimum size of sendData-buffer: 5byte  retval: length
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
uint8_t dcBL_exitBL(uint8_t *sendData);
 | 
					 | 
				
			||||||
    // minimum size of sendData-buffer: 5byte  retval: length
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
uint8_t dcBL_sendFlashStartAddr2BL(uint32_t startAddr, uint8_t *sendData);
 | 
					 | 
				
			||||||
    // minimum size of sendData-buffer: 13byte    retval: length (9...13)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
uint8_t dcBL_writeLastPage(uint8_t *sendData);
 | 
					 | 
				
			||||||
    // minimum size of sendData-buffer: 5byte  retval: length
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
uint8_t dcBL_restartDC(uint8_t *sendData);
 | 
					 | 
				
			||||||
    // minimum size of sendData-buffer: 20 byte  retval: length
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
uint8_t dcBL_activatBootloader(uint8_t *sendData);
 | 
					 | 
				
			||||||
    // minimum size of sendData-buffer: 20 byte  retval: length
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
uint8_t dcBL_getResponse(uint8_t *respBuff);
 | 
					 | 
				
			||||||
    // retval: nr of received bytes
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
bool dcBL_responseOK();
 | 
					 | 
				
			||||||
    // retval: 0: response OK (cmd |0x80)    1: response error (cmd or "0xe0")
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
bool dcBL_importBinFile(QByteArray readBinFile, uint32_t fileSize, char withDispl);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
bool dcBL_isTextMemFree(void);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
void dcBL_writeText(QString newTxt);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
bool dcBL_checkForText(void);
 | 
					 | 
				
			||||||
    // if pointer at 0 then no more content
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
QString dcBL_readText(void);
 | 
					 | 
				
			||||||
    // read from 0...9 (oldest first)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
void dcBL_iniChain(void);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
uint8_t dcBL_startChain(void);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
uint8_t dcBL_runChain(void);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
void dcBL_iniLoading(void);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
void dcBL_startLoading(void);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
uint8_t dcBL_sendHexfile(void);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
uint8_t dcBL_getResult(void);
 | 
					 | 
				
			||||||
// call after every step to what's going on....
 | 
					 | 
				
			||||||
//  1: connected to BL
 | 
					 | 
				
			||||||
//  2: transmission started
 | 
					 | 
				
			||||||
//  3: transmission successful
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#define RAW_BL_DATALEN      150
 | 
					 | 
				
			||||||
void gpi_storeRawReceivedData(uint8_t  RdDlen, uint8_t *receivedData);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
uint8_t epi_getRawReceivedData(uint8_t *receivedData);
 | 
					 | 
				
			||||||
    // retval=length, will be zeroed after first reading
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
uint8_t epi_getRawRecLength(void);
 | 
					 | 
				
			||||||
    // retval=length
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
QString epi_getRawReceivedString();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
void epi_clrRawReceivedString();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
uint8_t dcBL_sendSuccess(uint8_t lastCommand);
 | 
					 | 
				
			||||||
    // return val: 0: no response by now  1:error  10: OK
 | 
					 | 
				
			||||||
    // lastCommand=0x21 for sendAddr or 0x22 for send data
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
char dcBL_loadBinary(char withDisplay);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#endif // DCBL_H
 | 
					 | 
				
			||||||
@@ -1,35 +0,0 @@
 | 
				
			|||||||
 | 
					 | 
				
			||||||
#ifndef hwchk_H
 | 
					 | 
				
			||||||
#define hwchk_H
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#include <stdint.h>
 | 
					 | 
				
			||||||
#include <QTabWidget>
 | 
					 | 
				
			||||||
#include <QObject>
 | 
					 | 
				
			||||||
#include "interfaces.h"
 | 
					 | 
				
			||||||
//#include "datIf.h"
 | 
					 | 
				
			||||||
#include <QDebug>
 | 
					 | 
				
			||||||
#include <QSharedMemory>
 | 
					 | 
				
			||||||
#include "hwapi.h"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
//class QSharedMemory;
 | 
					 | 
				
			||||||
class hwChk :   public QObject,
 | 
					 | 
				
			||||||
                public hwinf
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    Q_OBJECT
 | 
					 | 
				
			||||||
//    Q_PLUGIN_METADATA(IID "Atb.Psa2020.software.HWapi/1.0" )   //FILE "HWapi.json")
 | 
					 | 
				
			||||||
//    Q_INTERFACES(hwinf)
 | 
					 | 
				
			||||||
//private:
 | 
					 | 
				
			||||||
//    QSharedMemory *m_sharedMem;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
public:
 | 
					 | 
				
			||||||
    explicit hwChk(QWidget *parent = nullptr);
 | 
					 | 
				
			||||||
    virtual ~hwChk();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
public:
 | 
					 | 
				
			||||||
    hwinf *HWaccess;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							@@ -1,129 +0,0 @@
 | 
				
			|||||||
 | 
					 | 
				
			||||||
#ifndef SERIAL_FRAME_H
 | 
					 | 
				
			||||||
#define SERIAL_FRAME_H
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#include <stdint.h>
 | 
					 | 
				
			||||||
#include <QMainWindow>
 | 
					 | 
				
			||||||
#include <QString>
 | 
					 | 
				
			||||||
#include <QTimer>
 | 
					 | 
				
			||||||
#include "tslib.h"
 | 
					 | 
				
			||||||
#include "com.h"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/*
 | 
					 | 
				
			||||||
 get's OUT-data from datif,
 | 
					 | 
				
			||||||
 get's IN-data from datif
 | 
					 | 
				
			||||||
 get's send command from datif
 | 
					 | 
				
			||||||
    makes frame and calls: isSerialFree(), setSendData(),
 | 
					 | 
				
			||||||
    if not free retrigger datif sending period (normally 500ms or 50ms for direct cmds)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    with control-signal: gotReceiveData():
 | 
					 | 
				
			||||||
        getRecData();
 | 
					 | 
				
			||||||
        send results to diag window/line
 | 
					 | 
				
			||||||
        send IN-data to datif
 | 
					 | 
				
			||||||
*/
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#define     FRAME_DATALEN       64
 | 
					 | 
				
			||||||
#define     FRAME_MAXLEN        FRAME_DATALEN+20
 | 
					 | 
				
			||||||
#define     BL_DATA_LEN         150
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#define     DATALEN_SEND_FAST            4
 | 
					 | 
				
			||||||
#define     DATALEN_SEND_LONG            64
 | 
					 | 
				
			||||||
#define     HEADERLEN_SEND               4
 | 
					 | 
				
			||||||
#define     TELEGRAMLEN_SEND_FAST        12
 | 
					 | 
				
			||||||
#define     TELEGRAMLEN_SEND_LONG        70
 | 
					 | 
				
			||||||
#define     STARTSIGN_SEND_FAST          0x3F
 | 
					 | 
				
			||||||
#define     STARTSIGN_SEND_LONG          0x3D
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#define     DATALEN_RECEIVE_FAST            8
 | 
					 | 
				
			||||||
#define     DATALEN_RECEIVE_LONG            64
 | 
					 | 
				
			||||||
#define     HEADERLEN_RECEIVE               2
 | 
					 | 
				
			||||||
#define     TELEGRAMLEN_RECEIVE_FAST        12
 | 
					 | 
				
			||||||
#define     TELEGRAMLEN_RECEIVE_LONG        68
 | 
					 | 
				
			||||||
#define     STARTSIGN_RECEIVE_FAST          0x5F
 | 
					 | 
				
			||||||
#define     STARTSIGN_RECEIVE_LONG          0x5D
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
class T_prot : public QMainWindow
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    Q_OBJECT
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    // Dateneingang von Datif:
 | 
					 | 
				
			||||||
    uint8_t  SendDataValid;     // bit1: WR OK  bit 2: RD OK
 | 
					 | 
				
			||||||
    uint16_t slaveAddr;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    uint16_t WriteCommand;
 | 
					 | 
				
			||||||
    uint16_t WriteAddr;
 | 
					 | 
				
			||||||
    uint8_t  WrDataLength;
 | 
					 | 
				
			||||||
    uint8_t  ui8OutputData[FRAME_DATALEN];
 | 
					 | 
				
			||||||
    char     chOut_Data[FRAME_DATALEN];
 | 
					 | 
				
			||||||
    uint8_t  kindOfData;    // 0: binaries, 1:text
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    uint16_t ReadCommand;
 | 
					 | 
				
			||||||
    uint16_t ReadAddr;
 | 
					 | 
				
			||||||
    uint16_t reserve;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    // Ausgangs-Daten, werden vom Datif geholt:
 | 
					 | 
				
			||||||
    // nur wenn CommandState und readState OK
 | 
					 | 
				
			||||||
    uint8_t  RecSlaveAddr;
 | 
					 | 
				
			||||||
    bool    INdataValid;        // nur true wenn CommandState OK und readState OK
 | 
					 | 
				
			||||||
    uint16_t readSource;        // diese (Eingangs-)Daten stehen im Puffer
 | 
					 | 
				
			||||||
    uint16_t readAddress;       // von dieser Adr wurden die Daten gelesen
 | 
					 | 
				
			||||||
    //uint8_t  lastWakeSrc;       // falls der Slave den Master geweckt hat
 | 
					 | 
				
			||||||
    uint8_t  RdDataLength;
 | 
					 | 
				
			||||||
    uint8_t  InputData[FRAME_DATALEN];
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    // 11.11.2020:
 | 
					 | 
				
			||||||
    uint8_t  BLsendDataLength;
 | 
					 | 
				
			||||||
    uint8_t  ui8BLsendData[BL_DATA_LEN];
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    T_com *mySerialPort;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    void startPacking(void);
 | 
					 | 
				
			||||||
    void startFastPacking(void);
 | 
					 | 
				
			||||||
    uint8_t FramecheckInData(uint8_t *Inbuf, uint16_t LL);
 | 
					 | 
				
			||||||
    uint8_t FastCheckInData(uint8_t *Inbuf, uint16_t LL);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    uint8_t CheckInResult(uint8_t *Inbuf);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    uint8_t ShowFastInData(uint8_t *recBuffer);
 | 
					 | 
				
			||||||
    uint8_t ShowInData(uint8_t *recBuffer); // was CheckInData
 | 
					 | 
				
			||||||
    void setRecLen(uint16_t WriteCmd);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
private slots:
 | 
					 | 
				
			||||||
    void analyseRecData(void);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
public:
 | 
					 | 
				
			||||||
    T_com *getSerialPort() { return mySerialPort; }
 | 
					 | 
				
			||||||
    T_com const *getSerialPort() const { return mySerialPort; }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    T_prot();
 | 
					 | 
				
			||||||
    bool isPortOpen(void);
 | 
					 | 
				
			||||||
    bool isSerialFree(void);
 | 
					 | 
				
			||||||
    void setUserWriteData(uint16_t WriteCmd, uint16_t WrAddr, uint8_t  WrDatLen, uint8_t *data);
 | 
					 | 
				
			||||||
    void setUserWriteData(uint16_t WriteCmd, uint16_t WrAddr);
 | 
					 | 
				
			||||||
    void setUserWriteData(uint16_t WriteCmd);
 | 
					 | 
				
			||||||
    void setUserWriteText(uint16_t WriteCmd, uint16_t WrAddr, uint8_t  WrDatLen, char *data);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    void setUserWrite1DB(uint16_t WriteCmd, uint16_t WrAddr, uint8_t val);
 | 
					 | 
				
			||||||
    void setUserWrite2DB(uint16_t WriteCmd, uint16_t WrAddr, uint8_t val0, uint8_t val1);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    void setUserReadData( uint16_t ReadCmd,  uint16_t RdAddr, uint16_t reserv);
 | 
					 | 
				
			||||||
    void setUserReadData( uint16_t ReadCmd,  uint16_t RdAddr);
 | 
					 | 
				
			||||||
    void setUserReadData( uint16_t ReadCmd);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    void setBLsendData( uint8_t len, uint8_t *buf);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    void receiveFixLen(int64_t nrOfbytesToReceive);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    void sendUserData(uint16_t slaveAdr);
 | 
					 | 
				
			||||||
    bool ifDataReceived();
 | 
					 | 
				
			||||||
    bool getReceivedInData(uint8_t  *SlavAddr, uint16_t *readSrc, uint16_t *readAddr,
 | 
					 | 
				
			||||||
                           uint8_t  *RdDlen, uint8_t *receivedData);
 | 
					 | 
				
			||||||
        // retval: data valid, only one time true
 | 
					 | 
				
			||||||
signals:
 | 
					 | 
				
			||||||
    void framerecieved();   //bool gotINdata);
 | 
					 | 
				
			||||||
    void rawDataRecieved();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#endif // T_prot_H
 | 
					 | 
				
			||||||
@@ -1,250 +0,0 @@
 | 
				
			|||||||
 | 
					 | 
				
			||||||
#ifndef SENDWRCMDS_DEFS_H
 | 
					 | 
				
			||||||
#define SENDWRCMDS_DEFS_H
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#include <stdint.h>
 | 
					 | 
				
			||||||
#include "tslib.h"
 | 
					 | 
				
			||||||
#include <QString>
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// asynch. Commands
 | 
					 | 
				
			||||||
// store OUTPUT commands until time to send
 | 
					 | 
				
			||||||
// problem: OUT commands are set if a button is pressed or a transaction event happens
 | 
					 | 
				
			||||||
// so it's never synchron with sending grid
 | 
					 | 
				
			||||||
// but sending must apply the 100ms time grid as we have to wait for the response before sending the next command!!!
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// Level 0 (DC direct)
 | 
					 | 
				
			||||||
#define SENDDIRCMD_TestSerial           1
 | 
					 | 
				
			||||||
#define SENDDIRCMD_MakeReset            2
 | 
					 | 
				
			||||||
#define SENDDIRCMD_setTime              3
 | 
					 | 
				
			||||||
#define SENDDIRCMD_setWakeFrequ         4
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// Level 1 (DC DO's switching connected parts)
 | 
					 | 
				
			||||||
#define SENDDIRCMD_MOVEUP_LOCK            5
 | 
					 | 
				
			||||||
#define SENDDIRCMD_MOVEDN_LOCK            6
 | 
					 | 
				
			||||||
#define SENDDIRCMD_OPENUP_DOOR            7
 | 
					 | 
				
			||||||
#define SENDDIRCMD_OPENDN_DOOR            8
 | 
					 | 
				
			||||||
#define SENDDIRCMD_LEDILLU              9
 | 
					 | 
				
			||||||
#define SENDDIRCMD_LEDCOIN              10
 | 
					 | 
				
			||||||
#define SENDDIRCMD_LEDTICKET            11
 | 
					 | 
				
			||||||
#define SENDDIRCMD_LEDPAD               12
 | 
					 | 
				
			||||||
#define SENDDIRCMD_LEDSTART             13
 | 
					 | 
				
			||||||
#define SENDDIRCMD_LEDINSIDE            14
 | 
					 | 
				
			||||||
//#define SENDDIRCMD_LED_ALL              15
 | 
					 | 
				
			||||||
#define SENDDIRCMD_FAN                  16
 | 
					 | 
				
			||||||
#define SENDDIRCMD_LAERM                17
 | 
					 | 
				
			||||||
#define SENDDIRCMD_REL1                 18
 | 
					 | 
				
			||||||
#define SENDDIRCMD_WAKEPTU              20
 | 
					 | 
				
			||||||
#define SENDDIRCMD_AUXPWR               21
 | 
					 | 
				
			||||||
#define SENDDIRCMD_AUXDDR               22
 | 
					 | 
				
			||||||
#define SENDDIRCMD_AUXOUT               23
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#define SENDDIRCMD_UCONTACT_ON          30
 | 
					 | 
				
			||||||
#define SENDDIRCMD_PRN2_SWONOFF         31
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#define SENDDIRCMD_MIF_SWONOFF          32      // 0x2900
 | 
					 | 
				
			||||||
#define SENDDIRCMD_MIF_ATBCREATE        33      // 0x2907
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#define SENDDIRCMD_MOD_SWONOFF          40
 | 
					 | 
				
			||||||
#define SENDDIRCMD_MOD_WAKE             41
 | 
					 | 
				
			||||||
#define SENDDIRCMD_MDB_POWER            42
 | 
					 | 
				
			||||||
#define SENDDIRCMD_MDB_WAKE             43
 | 
					 | 
				
			||||||
#define SENDDIRCMD_CRED_ON              44
 | 
					 | 
				
			||||||
#define SENDDIRCMD_CRED_WAKE            45
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#define SENDDIRCMD_SHUT_MOV             50
 | 
					 | 
				
			||||||
#define SENDDIRCMD_ESCRO_MOV            51
 | 
					 | 
				
			||||||
#define SENDDIR_OPENVAULT               52
 | 
					 | 
				
			||||||
#define SENDDIR_REJMOT_ON               53
 | 
					 | 
				
			||||||
#define SENDDIR_REJMOT_RUN              54
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// Level 2 (serial from DC to devices)
 | 
					 | 
				
			||||||
#define SEND_REQU_SERCONF               100
 | 
					 | 
				
			||||||
#define SEND_REQU_HWversion             101
 | 
					 | 
				
			||||||
#define SEND_REQU_SWversion             102
 | 
					 | 
				
			||||||
#define SEND_REQU_CONDITION             103
 | 
					 | 
				
			||||||
#define SEND_REQU_UID                   104
 | 
					 | 
				
			||||||
#define SEND_REQU_TIME                  105
 | 
					 | 
				
			||||||
    // includes wake frequency
 | 
					 | 
				
			||||||
#define SEND_REQU_ANALOGS               110
 | 
					 | 
				
			||||||
#define SEND_REQU_DIG_INPUTS            111
 | 
					 | 
				
			||||||
#define SEND_REQU_DIG_OUTPUTS           112
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#define SEND_REQU_PRN_STATE             120
 | 
					 | 
				
			||||||
#define SEND_REQU_PRN_FONTS             121
 | 
					 | 
				
			||||||
#define SEND_REQU_PRN_ALL               122
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#define SEND_REQU_MIFSTATE             123
 | 
					 | 
				
			||||||
    // Type and state of reader
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#define SEND_REQU_MIFDATA               124
 | 
					 | 
				
			||||||
    // Type, UID, Header of card
 | 
					 | 
				
			||||||
    // read one card sector
 | 
					 | 
				
			||||||
    // sectors must be addressed by RD_ADD
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#define SEND_REQU_MIF_ATB_TYPE          125
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#define SEND_REQU_MDB_GETSTAT           126
 | 
					 | 
				
			||||||
//#define SEND_REQU_MDB_GETWAK            127
 | 
					 | 
				
			||||||
#define SEND_REQU_MDB_GETRESP           128
 | 
					 | 
				
			||||||
#define SEND_REQU_EMP_GETALL            129
 | 
					 | 
				
			||||||
#define SEND_REQU_EMP_GETCOIN           130
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#define SENDDIRCMD_DEVICE_PARA          131
 | 
					 | 
				
			||||||
#define SENDDIRCMD_MACHINE_ID           132
 | 
					 | 
				
			||||||
#define SEND_REQU_DEVICE_PARA           133
 | 
					 | 
				
			||||||
#define SEND_REQU_MACINE_ID             134
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// further: mdb state, coinchecker state, bill state, modem state, credit_state....
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#define SENDDIRCMD_SHUTOPENBYTIME       60
 | 
					 | 
				
			||||||
#define SENDDIRCMD_SHUTOPENBYCOIN       61
 | 
					 | 
				
			||||||
//#define SENDDIRCMD_SHUT_SENDTIME        62
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#define SENDDIRCMD_ESCRO_TAKE           63
 | 
					 | 
				
			||||||
#define SENDDIRCMD_ESCRO_GIVE           64
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#define SENDDIRCMD_PRN_SYS_CMD          70
 | 
					 | 
				
			||||||
#define SENDDIRCMD_PRN_ESC_CMD          71
 | 
					 | 
				
			||||||
#define SENDDIRCMD_PRN_SETUP            72
 | 
					 | 
				
			||||||
#define SENDDIRCMD_PRN_MOVE             73
 | 
					 | 
				
			||||||
#define SENDDIRCMD_PRN_SETFONT          74
 | 
					 | 
				
			||||||
#define SENDDIRCMD_PRN_SETLETT          75
 | 
					 | 
				
			||||||
#define SENDDIRCMD_PRN_CUT              76
 | 
					 | 
				
			||||||
//#define SENDDIRCMD_PRN_TXT              // not needed
 | 
					 | 
				
			||||||
#define SENDDIRCMD_PRN_LF               78
 | 
					 | 
				
			||||||
#define SENDDIRCMD_PRN_FONTTAB          79
 | 
					 | 
				
			||||||
#define SENDDIRCMD_PRN_BC               80
 | 
					 | 
				
			||||||
#define SENDDIRCMD_PRN_QR               81
 | 
					 | 
				
			||||||
#define SENDDIRCMD_PRN_STOREDQR         82
 | 
					 | 
				
			||||||
#define SENDDIRCMD_PRN_LOGO_FL          83
 | 
					 | 
				
			||||||
//#define SENDDIRCMD_PRN_LOGO_GRAF        84
 | 
					 | 
				
			||||||
//#define SENDDIRCMD_PRN_LOGODAT          85
 | 
					 | 
				
			||||||
//#define SENDDIRCMD_PRN_STORBC           86
 | 
					 | 
				
			||||||
#define SENDDIRCMD_PRN_STORQR           87
 | 
					 | 
				
			||||||
#define SENDDIRCMD_PRN_DOC              88
 | 
					 | 
				
			||||||
#define SENDDIRCMD_PRN_CLEARDOC         89
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
//#define SENDDIRCMD_MDB_POWER            42
 | 
					 | 
				
			||||||
//#define SENDDIRCMD_MDB_WAKE             43
 | 
					 | 
				
			||||||
#define SENDDIRCMD_MDB_RES              90
 | 
					 | 
				
			||||||
#define SENDDIRCMD_MDB_SENDCMD          91
 | 
					 | 
				
			||||||
#define SENDDIRCMD_MDB_SNDMSG           92
 | 
					 | 
				
			||||||
#define SENDDIRCMD_EMP_SETT             93
 | 
					 | 
				
			||||||
#define SENDDIRCMD_EMP_POLL             94
 | 
					 | 
				
			||||||
#define SENDDIRCMD_EMP_STARPPAY         95
 | 
					 | 
				
			||||||
#define SENDDIRCMD_EMP_STOPPAY          96
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// obsolete:
 | 
					 | 
				
			||||||
#define SENDDIRCMD_PRN1_SENDTEXT        54
 | 
					 | 
				
			||||||
#define SENDDIRCMD_PRN1_SENDCMD         55
 | 
					 | 
				
			||||||
#define SENDDIRCMD_PRN1_SERPAR          56
 | 
					 | 
				
			||||||
#define SENDDIRCMD_PRN_LEVEL2_4B        58
 | 
					 | 
				
			||||||
#define SENDDIRCMD_PRN_LEVEL2_64        59
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// highest priority
 | 
					 | 
				
			||||||
#define CMDSTACKDEPTH   16
 | 
					 | 
				
			||||||
// means: up to 16 cmd can be stored. They are issued one by one every 100ms
 | 
					 | 
				
			||||||
void sendWRcmd_clrCmdStack(void);
 | 
					 | 
				
			||||||
bool sendWRcmd_setSendCommand0(uint16_t nextCmd);
 | 
					 | 
				
			||||||
    // GUI or app sends a command to DC transfered by serial
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
uint16_t sendWRcmd_getSendCommand0(void);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// lower priority
 | 
					 | 
				
			||||||
#define CMD4STACKDEPTH   8
 | 
					 | 
				
			||||||
void sendWRcmd_clrCmd4Stack(void);
 | 
					 | 
				
			||||||
bool sendWRcmd_setSendCommand4(uint16_t nextCmd, uint8_t dat1, uint8_t dat2, uint8_t dat3, uint8_t dat4);
 | 
					 | 
				
			||||||
uint16_t sendWRcmd_getSendCommand4(uint8_t *dat1, uint8_t *dat2, uint8_t *dat3, uint8_t *dat4);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#define CMD8STACKDEPTH   4
 | 
					 | 
				
			||||||
void sendWRcmd_clrCmd8Stack(void);
 | 
					 | 
				
			||||||
bool sendWRcmd_setSendCommand8(uint16_t nextCmd, uint8_t dat1, uint8_t dat2, uint16_t dat3, uint32_t dat4);
 | 
					 | 
				
			||||||
uint16_t sendWRcmd_getSendCommand8(uint8_t *dat1, uint8_t *dat2, uint16_t *dat3, uint32_t *dat4);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// lowest priority
 | 
					 | 
				
			||||||
// wait for resonse before send next!
 | 
					 | 
				
			||||||
bool sendWRcmd_setSendBlock160(uint8_t leng, uint8_t *buf);
 | 
					 | 
				
			||||||
uint8_t sendWRcmd_getSendBlock160(uint8_t *leng, uint8_t *buf);
 | 
					 | 
				
			||||||
    // retval = *leng
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
void sendWRcmd_INI(void);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
uint8_t epi_store64ByteSendData(uint8_t length, uint8_t *buf);
 | 
					 | 
				
			||||||
    // HWapi writes data to be forwarded to DC and further to mdb-device
 | 
					 | 
				
			||||||
    // not batched! don't use twice within 100ms
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
uint8_t gpi_restore64ByteSendData(uint8_t *length, uint8_t *buf);
 | 
					 | 
				
			||||||
    // datif reads data to forward to dc
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// ONE printer doc consists of 20 x 64 byte
 | 
					 | 
				
			||||||
#define MAXNROF_PRNBYTES   64
 | 
					 | 
				
			||||||
#define MAXNROF_PRNBLOCKS  20
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
void epi_resetPrinterStack(void);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
uint8_t epi_storePrnText(char *buf, uint8_t leng);
 | 
					 | 
				
			||||||
    // store text and binary data from Gui in next higher free memory 0....9
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
uint8_t gpi_restorePrnText(uint8_t *retbuf);
 | 
					 | 
				
			||||||
    // read printer text and send to slave, size of retbuf== 64
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
uint8_t gpi_chk4remainingText(void);
 | 
					 | 
				
			||||||
    // retval: 0: no more textline left (to send)  >0: nr of lines
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
void epi_storeUserOfSendingTextBuffer(uint8_t user, uint8_t para1, uint8_t para2, uint8_t para3, uint8_t para4 );
 | 
					 | 
				
			||||||
    // user=1: Text-Print is using this buffer
 | 
					 | 
				
			||||||
    //      2: QR-code-Printer is using this buffer
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
uint8_t gpi_getUserOfSendingTextBuffer(uint8_t *para1, uint8_t *para2, uint8_t *para3, uint8_t *para4);
 | 
					 | 
				
			||||||
    // user=1: Text-Print is using this buffer
 | 
					 | 
				
			||||||
    //      2: QR-code-Printer is using this buffer
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#define     FDCMD_STACKDEPTH    16
 | 
					 | 
				
			||||||
void sendFDcmd_clrStack(void);
 | 
					 | 
				
			||||||
bool sendFDcmd_set(uint8_t nextWrCmd, uint8_t nextRdCmd, uint8_t blockNum, uint8_t dat1, uint8_t dat2, uint8_t dat3, uint8_t dat4);
 | 
					 | 
				
			||||||
    // write Command to memory, wait for transport
 | 
					 | 
				
			||||||
bool sendFDcmd_get(uint8_t *nextWrCmd, uint8_t *nextRdCmd, uint8_t *blockNum, uint8_t *dat1, uint8_t *dat2, uint8_t *dat3, uint8_t *dat4);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
uint8_t check4FDshortCmd(void);
 | 
					 | 
				
			||||||
    // returns number of waiting command, maxFDCMD_STACKDEPTH
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
uint8_t check4freeFDshortCmd(void);
 | 
					 | 
				
			||||||
    // returns number of free places in short-command stack
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#define     FDLONG_STACKDEPTH    16
 | 
					 | 
				
			||||||
void longFDcmd_clrStack(void);
 | 
					 | 
				
			||||||
bool longFDcmd_set(uint8_t nextWrCmd, uint8_t nextRdCmd, uint8_t blockNum, uint8_t length, uint8_t *data);
 | 
					 | 
				
			||||||
    // write Command to memory, wait for transport
 | 
					 | 
				
			||||||
    // data buffer size always 64! data[64], padded with 0
 | 
					 | 
				
			||||||
bool longFDcmd_get(uint8_t *nextWrCmd, uint8_t *nextRdCmd, uint8_t *blockNum, uint8_t *length, uint8_t *data);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
uint8_t check4FDlongCmd(void);
 | 
					 | 
				
			||||||
    // returns number of waiting command
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
uint8_t check4freeFDlongCmd(void);
 | 
					 | 
				
			||||||
    // returns number of free places in long-command stack
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
uint8_t epi_store64BdevParameter(uint8_t length, uint8_t *buf);
 | 
					 | 
				
			||||||
    // HWapi writes data to be stored
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
uint8_t epi_restore64BdevParameter(uint8_t *length, uint8_t *buf);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
@@ -1,296 +0,0 @@
 | 
				
			|||||||
#ifndef SHARED_MEM_BUFFER_INCLUDED_H
 | 
					 | 
				
			||||||
#define SHARED_MEM_BUFFER_INCLUDED_H
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#include <cinttypes>
 | 
					 | 
				
			||||||
#include <atomic>
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#include <QSharedMemory>
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
struct SharedMemBuffer {
 | 
					 | 
				
			||||||
    struct rs {
 | 
					 | 
				
			||||||
        char comportName[16]; // z.B. "COM48"
 | 
					 | 
				
			||||||
        char baudStr[16];     // z.B. "19200"
 | 
					 | 
				
			||||||
        int  baudNr;          // 0...5 oder -1
 | 
					 | 
				
			||||||
        uint8_t connect;      // 0,1
 | 
					 | 
				
			||||||
        bool portIsOpen;
 | 
					 | 
				
			||||||
    } rs;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    char AutoEmissionOn;     // 1: zyklisch Anfragen zum Slave senden
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    struct datif {
 | 
					 | 
				
			||||||
        uint16_t sendingPeriod;
 | 
					 | 
				
			||||||
        bool     sendingPer_changed;
 | 
					 | 
				
			||||||
    } datif;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#if 0
 | 
					 | 
				
			||||||
    // controlBus.cpp
 | 
					 | 
				
			||||||
    char        txt4comStateLine[32];
 | 
					 | 
				
			||||||
    char        txt4HsStateLine[32];
 | 
					 | 
				
			||||||
    char        txt4masterStateLine[32];
 | 
					 | 
				
			||||||
    char        txt4resultStateLine[32];
 | 
					 | 
				
			||||||
    char        txt4dataLine[32];
 | 
					 | 
				
			||||||
    char        txt4datifReceive[32];
 | 
					 | 
				
			||||||
    char        txt4diagWindow[32];
 | 
					 | 
				
			||||||
    char        sndTxt4diagWindow[32];
 | 
					 | 
				
			||||||
    bool        Sdata_serialTestResult[32];
 | 
					 | 
				
			||||||
    uint8_t     Sdata_pProtResultOk[32];
 | 
					 | 
				
			||||||
    uint16_t    Sdata_receivedDataLength[32];
 | 
					 | 
				
			||||||
    uint8_t     Sdata_receivedDataBlock[64];
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    // datif.cpp
 | 
					 | 
				
			||||||
    uint8_t     dif_dataStep;
 | 
					 | 
				
			||||||
    uint8_t     dif_scanStep;
 | 
					 | 
				
			||||||
    uint8_t     RDBLKNR;
 | 
					 | 
				
			||||||
    uint8_t     datif_OutCmdpara1;
 | 
					 | 
				
			||||||
    uint8_t     datif_OutCmdpara2;
 | 
					 | 
				
			||||||
    uint8_t     datif_OutCmdpara3;
 | 
					 | 
				
			||||||
    uint8_t     datif_OutCmdpara4;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    uint16_t    datif_OutCmdpara5;
 | 
					 | 
				
			||||||
    uint32_t    datif_OutCmdpara6;
 | 
					 | 
				
			||||||
    uint8_t     cycl_running;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    // dcBL.cpp
 | 
					 | 
				
			||||||
    uint8_t     dcBL_LastBLcmd;   // stored the last sent cmd in order to analys response
 | 
					 | 
				
			||||||
    uint8_t     dcBL_AtbBinFile[300000];
 | 
					 | 
				
			||||||
    uint32_t    dcBL_fileSize;
 | 
					 | 
				
			||||||
    uint16_t    dcBL_nrOfBlocks;
 | 
					 | 
				
			||||||
    uint16_t    dcBL_fileCrc;
 | 
					 | 
				
			||||||
    uint8_t     dcBL_myBuf[300000]; // same content like "dcBL_AtbBinFile" but bytewise
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    char        BlResp[50][32];
 | 
					 | 
				
			||||||
    uint8_t     dcBL_step;
 | 
					 | 
				
			||||||
    uint8_t     dcBL_state;
 | 
					 | 
				
			||||||
    uint16_t    dcBL_BlkCtr;
 | 
					 | 
				
			||||||
    uint16_t    dcBL_cyclCtr;
 | 
					 | 
				
			||||||
    uint16_t    repeatCtr;
 | 
					 | 
				
			||||||
    uint8_t     Sdata_rawData[150];
 | 
					 | 
				
			||||||
    uint8_t     Sdata_LengthRawData;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    // hwapi.cpp
 | 
					 | 
				
			||||||
    uint16_t    hwapi_shutterTime;
 | 
					 | 
				
			||||||
    char        ticketTemplate[1024];
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    // sendWRcmd.cpp
 | 
					 | 
				
			||||||
    uint16_t    nextAsynchsendCmd0[16];
 | 
					 | 
				
			||||||
    uint8_t     nrOfCmdsInQueue;
 | 
					 | 
				
			||||||
    uint16_t    nextAsynchsendCmd4[8];
 | 
					 | 
				
			||||||
    uint8_t     nextCmd4para1[8];
 | 
					 | 
				
			||||||
    uint8_t     nextCmd4para2[8];
 | 
					 | 
				
			||||||
    uint8_t     nextCmd4para3[8];
 | 
					 | 
				
			||||||
    uint8_t     nextCmd4para4[8];
 | 
					 | 
				
			||||||
    uint8_t     nrOfCmds4InQueue;
 | 
					 | 
				
			||||||
    uint16_t    nextAsynchsendCmd8[4];
 | 
					 | 
				
			||||||
    uint8_t     nextCmd8para1[4];
 | 
					 | 
				
			||||||
    uint8_t     nextCmd8para2[4];
 | 
					 | 
				
			||||||
    uint16_t    nextCmd8para3[4];
 | 
					 | 
				
			||||||
    uint32_t    nextCmd8para4[4];
 | 
					 | 
				
			||||||
    uint8_t     nrOfCmds8InQueue;
 | 
					 | 
				
			||||||
    uint8_t     sendAsynchDataBuf[160]; // no stack, only ONE buffer
 | 
					 | 
				
			||||||
    uint8_t     sendAsyDatLen;
 | 
					 | 
				
			||||||
    uint8_t     Sdata_mdbSendBuffer[64];
 | 
					 | 
				
			||||||
    uint8_t     Sdata_mdbSendLen;
 | 
					 | 
				
			||||||
    uint8_t     prnDataParameters[4];
 | 
					 | 
				
			||||||
    uint8_t     prnDataBufferUser;
 | 
					 | 
				
			||||||
    char        Sdata_PRN_TEXT[20][64];
 | 
					 | 
				
			||||||
    uint8_t     pPrnDataBuff;        // points to next PRINTER_BLOCK
 | 
					 | 
				
			||||||
    uint8_t     nextFDwrCmd[16];
 | 
					 | 
				
			||||||
    uint8_t     nextFDrdCmd[16];
 | 
					 | 
				
			||||||
    uint8_t     nextFDblkNr[16];
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    uint8_t     nextFDpara1[16];
 | 
					 | 
				
			||||||
    uint8_t     nextFDpara2[16];
 | 
					 | 
				
			||||||
    uint8_t     nextFDpara3[16];
 | 
					 | 
				
			||||||
    uint8_t     nextFDpara4[16];
 | 
					 | 
				
			||||||
    uint8_t     p_nextFDcmdsInQueue;
 | 
					 | 
				
			||||||
    uint8_t     longFDwrCmd[16];
 | 
					 | 
				
			||||||
    uint8_t     longFDrdCmd[16];
 | 
					 | 
				
			||||||
    uint8_t     longFDblkNr[16];
 | 
					 | 
				
			||||||
    uint8_t     longFDlength[16];
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    uint8_t     longFDpara[16][64];
 | 
					 | 
				
			||||||
    uint8_t     p_longFDcmdsInQueue;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    // storeInData.cpp
 | 
					 | 
				
			||||||
    bool        indat_savePrnPwr;
 | 
					 | 
				
			||||||
    bool        indat_saveMifPwr;
 | 
					 | 
				
			||||||
    bool        indat_MdbIsOn;
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    uint8_t     ndbs;
 | 
					 | 
				
			||||||
    uint8_t     pari;
 | 
					 | 
				
			||||||
    uint8_t     nsb;
 | 
					 | 
				
			||||||
    uint8_t     br;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#define MAXNROF_GENSTR 16
 | 
					 | 
				
			||||||
    char        genStrings[MAXNROF_GENSTR][64];
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#define MAXNROF_AI 4
 | 
					 | 
				
			||||||
    uint16_t    AI_val[MAXNROF_AI];
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    struct DigitalInputs {
 | 
					 | 
				
			||||||
        uint8_t doorSwitch;
 | 
					 | 
				
			||||||
        uint8_t vaultSwitch;
 | 
					 | 
				
			||||||
        uint8_t lockSwitch;
 | 
					 | 
				
			||||||
        uint8_t opto;
 | 
					 | 
				
			||||||
        uint8_t aux;
 | 
					 | 
				
			||||||
        bool wakeFromPtu;
 | 
					 | 
				
			||||||
        bool wakeFromMdb;
 | 
					 | 
				
			||||||
        bool wakeFromModem;
 | 
					 | 
				
			||||||
        bool PrnReady;
 | 
					 | 
				
			||||||
        bool CoinAttach;
 | 
					 | 
				
			||||||
        bool CoinEscrowOpen;
 | 
					 | 
				
			||||||
        bool mifCardTap;
 | 
					 | 
				
			||||||
        bool contactPwrOn;
 | 
					 | 
				
			||||||
        bool mifarePwrOn;
 | 
					 | 
				
			||||||
        bool rdbk_mdbTxd;
 | 
					 | 
				
			||||||
        bool AuxPwrOn;
 | 
					 | 
				
			||||||
        bool gsmPwrOn;
 | 
					 | 
				
			||||||
        bool creditPwrOn;
 | 
					 | 
				
			||||||
        bool printerPwrOn;
 | 
					 | 
				
			||||||
        bool mdbPwrOn;
 | 
					 | 
				
			||||||
        bool rejMot_home;
 | 
					 | 
				
			||||||
        uint8_t npe_sensor;
 | 
					 | 
				
			||||||
    } din;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    struct DigitalOutputs {
 | 
					 | 
				
			||||||
        uint8_t mbdRxTst;
 | 
					 | 
				
			||||||
        uint8_t motorBits;
 | 
					 | 
				
			||||||
        uint8_t serialSwitch;                 // serial drv on/off, Serial mux1, Serial mux2
 | 
					 | 
				
			||||||
        uint8_t ledsAndFan;
 | 
					 | 
				
			||||||
        uint8_t laermUndRelay;
 | 
					 | 
				
			||||||
        uint8_t ptuWake;
 | 
					 | 
				
			||||||
        uint8_t auxPower;
 | 
					 | 
				
			||||||
        uint8_t coinShutter;
 | 
					 | 
				
			||||||
        uint8_t coinEscrow;
 | 
					 | 
				
			||||||
        uint8_t printerPower;
 | 
					 | 
				
			||||||
    } dout;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    struct Sdata {
 | 
					 | 
				
			||||||
#define NROFMIFSTATEBYTES       40
 | 
					 | 
				
			||||||
#define PRN_STATE_ARRAY_SIZE    20
 | 
					 | 
				
			||||||
#define PRN_STATE_FONT_SIZE     20
 | 
					 | 
				
			||||||
        uint8_t MIF_STATE[NROFMIFSTATEBYTES];
 | 
					 | 
				
			||||||
        uint8_t MIF_DATA[12][64];
 | 
					 | 
				
			||||||
        uint8_t PRN_STATE[PRN_STATE_ARRAY_SIZE];
 | 
					 | 
				
			||||||
        uint8_t PRN_FONTS[PRN_STATE_FONT_SIZE];
 | 
					 | 
				
			||||||
        bool mdb_busRdy;
 | 
					 | 
				
			||||||
        bool mdb_V12on;
 | 
					 | 
				
			||||||
        bool mdb_V5on;
 | 
					 | 
				
			||||||
        uint8_t mdbNrOfRecData;
 | 
					 | 
				
			||||||
        uint8_t RecBuff[40];
 | 
					 | 
				
			||||||
        uint8_t empNrOfsettings;
 | 
					 | 
				
			||||||
        uint8_t emp_settingsBuff[66];
 | 
					 | 
				
			||||||
        uint8_t NrOfDeviceSetting;
 | 
					 | 
				
			||||||
        uint8_t DeviceSettingBuff[66];
 | 
					 | 
				
			||||||
        uint8_t NrOfMachineIDSetting;
 | 
					 | 
				
			||||||
        uint8_t NrOfMachineIDBuff[66];
 | 
					 | 
				
			||||||
        uint64_t slaveUID;
 | 
					 | 
				
			||||||
        uint8_t UIDstr[8];
 | 
					 | 
				
			||||||
#define MAXNROF_MEASURE 4
 | 
					 | 
				
			||||||
        uint32_t measurement[MAXNROF_MEASURE];
 | 
					 | 
				
			||||||
        bool serialTestResult;
 | 
					 | 
				
			||||||
        uint8_t pProtResultOk;
 | 
					 | 
				
			||||||
        uint16_t receivedDataLength;
 | 
					 | 
				
			||||||
        uint8_t receivedDataBlock[64];
 | 
					 | 
				
			||||||
    } Sdata;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    uint8_t mif_cardType;
 | 
					 | 
				
			||||||
    uint8_t mif_cardHolder[8];
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#define MEMDEPTH_GOTCOINS (16)
 | 
					 | 
				
			||||||
    struct T_coin {
 | 
					 | 
				
			||||||
        uint8_t valid;
 | 
					 | 
				
			||||||
        uint8_t signal;
 | 
					 | 
				
			||||||
        uint8_t error;
 | 
					 | 
				
			||||||
        uint8_t pad;
 | 
					 | 
				
			||||||
        uint16_t value;
 | 
					 | 
				
			||||||
    } gotCoin[MEMDEPTH_GOTCOINS];
 | 
					 | 
				
			||||||
    uint8_t ctr_gotCoin;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    struct store {
 | 
					 | 
				
			||||||
        uint32_t insertedAmount;
 | 
					 | 
				
			||||||
        uint16_t lastCoinType[64];
 | 
					 | 
				
			||||||
        uint16_t lastCoinValue[64];
 | 
					 | 
				
			||||||
        uint64_t wakeSrc;
 | 
					 | 
				
			||||||
        uint8_t rbDevParamLen;
 | 
					 | 
				
			||||||
        uint8_t rbDevParams[66];
 | 
					 | 
				
			||||||
        uint8_t deviceCondLen;
 | 
					 | 
				
			||||||
        uint8_t deviceCond[66];
 | 
					 | 
				
			||||||
        uint8_t machCondLen;
 | 
					 | 
				
			||||||
        uint8_t machCond[66];
 | 
					 | 
				
			||||||
        uint8_t DcBackupNrOfAccNr;
 | 
					 | 
				
			||||||
        uint16_t DcBackupAccNr[16];    // z.Z. nur 8
 | 
					 | 
				
			||||||
        uint8_t gotNrBlocksOfVaultRec;
 | 
					 | 
				
			||||||
        uint8_t vaultrecord[360];
 | 
					 | 
				
			||||||
        uint32_t amount;
 | 
					 | 
				
			||||||
        uint16_t nrOfCoins;
 | 
					 | 
				
			||||||
        bool    dcDataValid;
 | 
					 | 
				
			||||||
        uint8_t wakeReason;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    } store;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    struct T_globTime {
 | 
					 | 
				
			||||||
        // Reihenfolge nicht vertauschen!!!!!
 | 
					 | 
				
			||||||
        uint8_t     hour;
 | 
					 | 
				
			||||||
        uint8_t     minute;
 | 
					 | 
				
			||||||
        uint8_t     second;
 | 
					 | 
				
			||||||
        uint8_t     Year;
 | 
					 | 
				
			||||||
        uint8_t     Month;
 | 
					 | 
				
			||||||
        uint8_t     DayOfMonth;
 | 
					 | 
				
			||||||
        uint8_t     DayOfWeek;          // 1=monday...7
 | 
					 | 
				
			||||||
        uint8_t     reserve1;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        uint16_t     MinutesOfToday;
 | 
					 | 
				
			||||||
        uint16_t     reserve2;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        uint32_t     SecondsOfToday;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        uint8_t      IsLeapyear;
 | 
					 | 
				
			||||||
        uint8_t      nextLeap;
 | 
					 | 
				
			||||||
        uint8_t      lastLeap;
 | 
					 | 
				
			||||||
        uint8_t      hoursOfWeek;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        uint16_t     minOfWeek;
 | 
					 | 
				
			||||||
        uint16_t     hoursOfMonth;
 | 
					 | 
				
			||||||
        uint16_t     minOfMonth;
 | 
					 | 
				
			||||||
        uint16_t     dayOfYear;
 | 
					 | 
				
			||||||
        uint16_t     hoursOfYear;
 | 
					 | 
				
			||||||
        uint16_t     reserve3;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        uint32_t     minOfYear;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        uint8_t      squareOutMode;
 | 
					 | 
				
			||||||
        uint8_t      free1;
 | 
					 | 
				
			||||||
        uint16_t     reserve4;
 | 
					 | 
				
			||||||
        uint32_t     minOfMillenium;
 | 
					 | 
				
			||||||
        // bis hierher 44byts
 | 
					 | 
				
			||||||
        uint32_t    free2;
 | 
					 | 
				
			||||||
        uint32_t    free3;
 | 
					 | 
				
			||||||
        uint32_t    free4;
 | 
					 | 
				
			||||||
    } getGlobalTime;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    static QSharedMemory *getShm(std::size_t s = 0);
 | 
					 | 
				
			||||||
    static SharedMemBuffer *getData() {
 | 
					 | 
				
			||||||
        return (SharedMemBuffer *)getShm()->data();
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    static SharedMemBuffer const *getDataConst() {
 | 
					 | 
				
			||||||
        return (SharedMemBuffer const *)getShm()->data();
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#if 0
 | 
					 | 
				
			||||||
    static std::atomic<bool> __sharedMemLocked;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    static bool sharedMemLocked() {
 | 
					 | 
				
			||||||
        return __sharedMemLocked;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    static void setSharedMemLocked() {
 | 
					 | 
				
			||||||
        __sharedMemLocked = true;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    static void setSharedMemUnlocked() {
 | 
					 | 
				
			||||||
        __sharedMemLocked = false;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#endif // SHARED_MEM_BUFFER_INCLUDED_H
 | 
					 | 
				
			||||||
@@ -1,427 +0,0 @@
 | 
				
			|||||||
 | 
					 | 
				
			||||||
#ifndef STOREINDATA_H
 | 
					 | 
				
			||||||
#define STOREINDATA_H
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#include <stdint.h>
 | 
					 | 
				
			||||||
//#include "tslib.h"
 | 
					 | 
				
			||||||
#include <QString>
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#define MAXNROF_AO              3
 | 
					 | 
				
			||||||
//#define MAXNROF_GENSTR          16
 | 
					 | 
				
			||||||
#define MAXNROF_CONTR_PORTS     11
 | 
					 | 
				
			||||||
#define MAXNROF_DIports         2
 | 
					 | 
				
			||||||
#define MAXNROF_DOports         2
 | 
					 | 
				
			||||||
#define MAXNROF_CTR             2
 | 
					 | 
				
			||||||
#define MEASCHAN_TEMPERATURE    0
 | 
					 | 
				
			||||||
#define MEASCHAN_VOLTAGE        1
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// gpi: DC-driver stores data for graphic peripheral interface
 | 
					 | 
				
			||||||
// epi: gui reads values from external peripheral interface
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// store power on/off condition of the devices to control the data request
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
void indat_storePrinterPower(bool isOn);
 | 
					 | 
				
			||||||
bool indat_isPrinterOn();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
void indat_storeMifarePower(bool isOn);
 | 
					 | 
				
			||||||
bool indat_isMifareOn();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
void indat_storeMDBisOn(bool isOn);
 | 
					 | 
				
			||||||
bool indat_isMdbOn();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
void gpi_storeSlaveSerParams(uint8_t slaveBaudRate, uint8_t NrDataBits,
 | 
					 | 
				
			||||||
                             uint8_t parity, uint8_t NrStopBits);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
void epi_getSlaveSerParams(uint8_t *slaveBaudRate, uint8_t *NrDataBits,
 | 
					 | 
				
			||||||
                             uint8_t *parity, uint8_t *NrStopBits);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
QString epi_getSlaveParamSTR();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
void gpi_storeGenerals(uint8_t genNr, QString text);
 | 
					 | 
				
			||||||
    // 0=HW   1=SW  2=State
 | 
					 | 
				
			||||||
QString epi_loadGenerals(uint8_t genNr);
 | 
					 | 
				
			||||||
// genNr=0=HW   1=SW  2=State
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
void gpi_storeUID(uint8_t const *buf8byteUid);
 | 
					 | 
				
			||||||
// buffer size: 8 byte
 | 
					 | 
				
			||||||
void epi_getUIDdec(uint8_t *buf8byteUid);
 | 
					 | 
				
			||||||
// buffer size: 8 byte
 | 
					 | 
				
			||||||
QString epi_getUIDstr();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// ///////////////////////////////////////////////////////////////////////////////////
 | 
					 | 
				
			||||||
//          Time and Date
 | 
					 | 
				
			||||||
// ///////////////////////////////////////////////////////////////////////////////////
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
uint8_t epi_getSquareMode();
 | 
					 | 
				
			||||||
void gpi_backupSquareMode(uint8_t squMode);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
void gpi_backupTime(uint8_t *timeBuffer, uint8_t Leng);     // 104, <=8byte
 | 
					 | 
				
			||||||
void epi_getTime(uint8_t *hh, uint8_t *mm, uint8_t *ss);
 | 
					 | 
				
			||||||
void epi_getDate(uint8_t *yy, uint8_t *mm, uint8_t *dd);
 | 
					 | 
				
			||||||
void epi_getToday(uint8_t *dow, uint16_t *minOfToday, uint32_t *secOfToday);
 | 
					 | 
				
			||||||
bool epi_isLeapYear(uint8_t *lastLeapYear, uint8_t *NextLeapYear);
 | 
					 | 
				
			||||||
bool epi_isLeapYear();
 | 
					 | 
				
			||||||
void epi_getSpecialWeekTimeDate(uint8_t *DayOfWeek, uint8_t *HoursOfWeek, uint16_t *MinutesOfWeek);
 | 
					 | 
				
			||||||
void epi_getSpecialMonthTimeDate(uint8_t *DayOfMonth, uint16_t *HoursOfMonth, uint16_t *MinutesOfMonth);
 | 
					 | 
				
			||||||
void epi_getSpecialYearTimeDate(uint16_t *DayOfYear, uint16_t *HoursOfYear, uint32_t *MinutesOfYear);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// ///////////////////////////////////////////////////////////////////////////////////
 | 
					 | 
				
			||||||
//          Analog values
 | 
					 | 
				
			||||||
// ///////////////////////////////////////////////////////////////////////////////////
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// #define MAXNROF_AI              4
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
void gpi_storeAIs(uint8_t aiNr, uint16_t val);   // rs -> Sdata
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
uint8_t gpi_getMaxNrAIs();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
uint16_t epi_loadAIs(uint8_t aiNr);              //       Sdata -> gui
 | 
					 | 
				
			||||||
    // return value of one ADC with channel nr: aiNr 0...15
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
uint32_t epi_loadMeasureValue(uint8_t ValueNr);
 | 
					 | 
				
			||||||
    // ValueNr 0=ADC0, 1=ADC1 aso...
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
void gpi_storeMeasureValue(uint8_t ValueNr, uint32_t val);
 | 
					 | 
				
			||||||
    // in mV, also bis 65,535V
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
QString epi_getSlaveTemperatureStr();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
QString epi_getSlaveVoltageStr();
 | 
					 | 
				
			||||||
    // value in "meas_volt" in mV, also bis 65,535V. Value range [6000...16000] (6V...16V)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// ///////////////////////////////////////////////////////////////////////////////////
 | 
					 | 
				
			||||||
//          digital inputs
 | 
					 | 
				
			||||||
// ///////////////////////////////////////////////////////////////////////////////////
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
void gpi_storeDI_doorSwitches(uint8_t upperDoor, uint8_t lowerDoor, uint8_t vaultDoor);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
uint8_t epi_getDI_doorSwitches(void);
 | 
					 | 
				
			||||||
    // bit0: upper door  1: low door  2:vault door
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
void gpi_storeDI_vaultSwitches(uint8_t CashBoxIn, uint8_t BillBoxIn);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
uint8_t epi_getDI_vaultSwitches(void);
 | 
					 | 
				
			||||||
    // bit0: cash box    1: bill box in
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
void gpi_storeDI_lockSwitches(uint8_t indatUL, uint8_t indatLL);
 | 
					 | 
				
			||||||
    // D5: bit 0: upper lockbar up   bit1:down
 | 
					 | 
				
			||||||
    // D6: bit 0: lower lockbar up   bit1:down
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
uint8_t epi_getDI_lockSwitches(void);
 | 
					 | 
				
			||||||
    // retval: bit 0: upper lockbar up   bit1: upper lockbar is down
 | 
					 | 
				
			||||||
    //         bit 2: lower lockbar up   bit1: lower lockbar is down
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
void gpi_storeDI_optos(uint8_t indatOpto);
 | 
					 | 
				
			||||||
    // OptoIn bit 0,1: optoin 1,2
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
uint8_t epi_getDI_optos(void);
 | 
					 | 
				
			||||||
    // bit0: opto in 1    1: opto in 2
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
uint8_t gpi_storeDI_auxIn(uint8_t indatAuxIn); // Aux0...5
 | 
					 | 
				
			||||||
uint8_t epi_getDI_auxIn(void);                 // bit0: auxin 1  ...  5: auxin 6
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
bool gpi_storeDI_ptuWake(bool w);
 | 
					 | 
				
			||||||
bool epi_getDI_ptuWake(void);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
bool gpi_storeDI_mbdWake(bool w);
 | 
					 | 
				
			||||||
bool epi_getDI_mdbWake(void);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
bool gpi_storeDI_prnReady(bool ready);
 | 
					 | 
				
			||||||
bool epi_getDI_prnReady(void);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
bool gpi_storeDI_CoinAttach(bool attach);
 | 
					 | 
				
			||||||
bool epi_getDI_CoinAttach(void);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
bool gpi_storeDI_CoinEscrow(bool ce);
 | 
					 | 
				
			||||||
bool epi_getDI_CoinEscrow(void);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
bool gpi_storeDI_mifareCardTapped(bool tapped);
 | 
					 | 
				
			||||||
bool epi_getDI_mifareCardTapped(void);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
bool gpi_storeDI_modemWake(bool w);
 | 
					 | 
				
			||||||
bool epi_getDI_modemWake(void);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
bool gpi_storeDI_contactPowerIsOn(bool on);
 | 
					 | 
				
			||||||
bool epi_getDI_contactPwr(void);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
bool gpi_storeDI_MifarePowerIsOn(bool on);
 | 
					 | 
				
			||||||
bool epi_getDI_mifarePwr(void);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
bool gpi_storeDI_readbackMdbTxD(bool rdbkMdbTxd);
 | 
					 | 
				
			||||||
bool epi_getDI_mdbTxd(void);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
bool gpi_storeDI_AuxPowerIsOn(bool on);
 | 
					 | 
				
			||||||
bool epi_getDI_auxPwr(void);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
bool gpi_storeDI_GsmPowerIsOn(bool on);
 | 
					 | 
				
			||||||
bool epi_getDI_gsmPwr(void);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
bool gpi_storeDI_CreditPowerIsOn(bool on);
 | 
					 | 
				
			||||||
bool epi_getDI_creditPwr(void);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
bool gpi_storeDI_PrinterPowerIsOn(bool on);
 | 
					 | 
				
			||||||
bool epi_getDI_printerPwr(void);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
bool gpi_storeDI_MdbPowerIsOn(bool on);
 | 
					 | 
				
			||||||
bool epi_getDI_mdbPwr(void);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
bool gpi_storeDI_rejMot_home(bool reject);
 | 
					 | 
				
			||||||
bool epi_getDI_rejectMotor_homepos(void);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
uint8_t gpi_storeDI_paperLow(uint8_t di);
 | 
					 | 
				
			||||||
uint8_t epi_getDI_npe_sensor(void);
 | 
					 | 
				
			||||||
    // 0: Sensor sees paper 1: no paper 99: off
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// ///////////////////////////////////////////////////////////////////////////////////
 | 
					 | 
				
			||||||
//          readback digital outputs
 | 
					 | 
				
			||||||
// ///////////////////////////////////////////////////////////////////////////////////
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
uint8_t gpi_storeDO_mdbRxTst(uint8_t do_mbdRxTst);
 | 
					 | 
				
			||||||
bool epi_getDO_mdbRxTestOut(void);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
uint8_t gpi_storeDO_motorOutputs(uint8_t Pwr);
 | 
					 | 
				
			||||||
uint8_t epi_getDO_motorOuts(void);
 | 
					 | 
				
			||||||
    // bit0: upper lock forward    bit 1 backward
 | 
					 | 
				
			||||||
    // bit2: lower lock forward    bit 3 backward
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
uint8_t gpi_storeDO_serialSwitch(uint8_t state);
 | 
					 | 
				
			||||||
    // serial drv on/off, Serial mux1, Serial mux2
 | 
					 | 
				
			||||||
uint8_t epi_getDO_serialSwitch(void);
 | 
					 | 
				
			||||||
    // serial drv on/off, Serial mux1, Serial mux2
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
bool epi_getDO_serialDriverIsOn(void);
 | 
					 | 
				
			||||||
bool epi_getDO_serialMux1isSetToPrinter(void);
 | 
					 | 
				
			||||||
    // mux1 off: serial is switched to printer
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
bool epi_getDO_serialMux1isSetToModem(void);
 | 
					 | 
				
			||||||
    // mux1 on: serial is switched to modem
 | 
					 | 
				
			||||||
bool epi_getDO_serialMux2isSetToCredit(void);
 | 
					 | 
				
			||||||
    // mux2 off: serial is switched to credit card terminal
 | 
					 | 
				
			||||||
bool epi_getDO_serialMux2isSetToMifare(void);
 | 
					 | 
				
			||||||
    // mux2 on: serial is switched to mifare reader
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
uint8_t gpi_storeDO_ledsAndFan(uint8_t ledState);
 | 
					 | 
				
			||||||
bool epi_getDO_led_coin(void);
 | 
					 | 
				
			||||||
bool epi_getDO_led_front(void);
 | 
					 | 
				
			||||||
bool epi_getDO_led_ticket(void);
 | 
					 | 
				
			||||||
bool epi_getDO_led_pin(void);
 | 
					 | 
				
			||||||
bool epi_getDO_led_start(void);
 | 
					 | 
				
			||||||
bool epi_getDO_led_inside(void);
 | 
					 | 
				
			||||||
bool epi_getDO_fan(void);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
uint8_t gpi_storeDO_sirenAndRelay(uint8_t sirenRelay);
 | 
					 | 
				
			||||||
bool epi_getDO_sirene(void);
 | 
					 | 
				
			||||||
bool epi_getDO_relay(void);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
uint8_t gpi_storeDO_ptuWake(uint8_t state);
 | 
					 | 
				
			||||||
bool epi_getDO_ptuWake(void);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
uint8_t gpi_storeDO_auxPower(uint8_t pwr);
 | 
					 | 
				
			||||||
bool epi_getDO_auxPower(void);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
uint8_t gpi_storeDO_coinShutter(uint8_t state);
 | 
					 | 
				
			||||||
bool epi_getDO_coinShutterOpen(void);
 | 
					 | 
				
			||||||
bool epi_getDO_coinShutterTest(void);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
uint8_t gpi_storeDO_coinEscrow(uint8_t state);
 | 
					 | 
				
			||||||
uint8_t epi_getDO_coinEscrow(void);
 | 
					 | 
				
			||||||
    // retval: 1:return flap is open   2:take flap is open    0:closed
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
uint8_t gpi_storeDO_printerPwrOn(uint8_t state);
 | 
					 | 
				
			||||||
uint8_t epi_getDO_printerPwr(void);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// ---------------------------------------------------------------------------------------------
 | 
					 | 
				
			||||||
// counterchecks, make sure that DC-outputs are correct
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/*
 | 
					 | 
				
			||||||
bool epi_cntchk_wakePtu(void);
 | 
					 | 
				
			||||||
bool epi_cntchk_enabDrv01(void);        // no communication possible if 0 !!!!!
 | 
					 | 
				
			||||||
bool epi_cntchk_swRs1toModem(void);
 | 
					 | 
				
			||||||
bool epi_cntchk_modemWake(void);
 | 
					 | 
				
			||||||
bool epi_cntchk_enabDrv2(void);
 | 
					 | 
				
			||||||
bool epi_cntchk_swRs2toMIF(void);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
bool epi_cntchk_shutterIsOpen(void);
 | 
					 | 
				
			||||||
    // counter check if shutter is really open,  PJ4 must be OUT and HIGH, PB5 must be OUT and HIGH
 | 
					 | 
				
			||||||
    // retval TRUE: shutter is open   FALSE: shutter is closed
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
bool epi_cntchk_escrowReturnIsOpen(void);
 | 
					 | 
				
			||||||
bool epi_cntchk_escrowTakeIsOpen(void);
 | 
					 | 
				
			||||||
bool epi_cntchk_aux1DirOut(uint8_t auxNr);
 | 
					 | 
				
			||||||
bool epi_cntchk_aux1OutHigh(uint8_t auxNr);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
bool epi_cntchk_ledPaperOn(void);
 | 
					 | 
				
			||||||
bool epi_cntchk_ledPinpadOn(void);
 | 
					 | 
				
			||||||
bool epi_cntchk_ledStartOn(void);
 | 
					 | 
				
			||||||
bool epi_cntchk_ledServiceOn(void);
 | 
					 | 
				
			||||||
bool epi_cntchk_ledCoinOn(void);
 | 
					 | 
				
			||||||
bool epi_cntchk_ledIllumOn(void);
 | 
					 | 
				
			||||||
bool epi_cntchk_FanOn(void);
 | 
					 | 
				
			||||||
bool epi_cntchk_RelaisOn(void);
 | 
					 | 
				
			||||||
bool epi_cntchk_LaermOn(void);
 | 
					 | 
				
			||||||
bool epi_cntchk_Mot1Ron(void);
 | 
					 | 
				
			||||||
bool epi_cntchk_Mot1Fon(void);
 | 
					 | 
				
			||||||
bool epi_cntchk_Mot2Ron(void);
 | 
					 | 
				
			||||||
bool epi_cntchk_Mot2Fon(void);
 | 
					 | 
				
			||||||
*/
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// ------------------------------------------------------------------------------------
 | 
					 | 
				
			||||||
// MDB Sendind Data  are store here for next transport to DC (Device Controller)
 | 
					 | 
				
			||||||
// Transport to Slave runs every 100ms, answer from mdb-slave (e.g. coin changer) comes right
 | 
					 | 
				
			||||||
// with next slave answer
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// start with: SENDDIRCMD_EXCHGMDB,
 | 
					 | 
				
			||||||
    // send crude data from here to DC, DC to mdb slaves, mdb answer, return here within 50ms
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
uint8_t gpi_storeMdbRecData(uint8_t length, uint8_t *buf);
 | 
					 | 
				
			||||||
    // datif store received mdb data
 | 
					 | 
				
			||||||
uint8_t epi_getMdbResponse(void);
 | 
					 | 
				
			||||||
     // 0=no response  1=ACK  2=NAK  3=ACK with data
 | 
					 | 
				
			||||||
uint8_t epi_getMdbRecLength(void);
 | 
					 | 
				
			||||||
    // 0...31
 | 
					 | 
				
			||||||
uint8_t epi_restoreMdbRecData(uint8_t *buf);
 | 
					 | 
				
			||||||
    // hwapi reads received mdb data from PI
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
uint8_t gpi_storeMifReaderStateAndCardType(uint8_t const *buf);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/* data description:
 | 
					 | 
				
			||||||
byte 0: current read state: 0=power off  1=reader-fault 2=ready
 | 
					 | 
				
			||||||
                            3=just reading 4=read complete
 | 
					 | 
				
			||||||
                            5=read partial, removed too early
 | 
					 | 
				
			||||||
                            6=state unknown
 | 
					 | 
				
			||||||
byte 1,2: read data length from card
 | 
					 | 
				
			||||||
3: 1=reader is OK (reported serial nr is OK)  0=wrong or no reader
 | 
					 | 
				
			||||||
4...15: reader version, expected "SL025-1.8"
 | 
					 | 
				
			||||||
byte16: 1=card is present   0:not
 | 
					 | 
				
			||||||
17: 0
 | 
					 | 
				
			||||||
18: card type reported from reader
 | 
					 | 
				
			||||||
19: 1=allowed card type 0=not
 | 
					 | 
				
			||||||
20: card size: 1 or 4 (dec) = card size
 | 
					 | 
				
			||||||
21: LengthOfUID: 4 or 7 (dec) (byte)
 | 
					 | 
				
			||||||
22: UID 8 byte in hex
 | 
					 | 
				
			||||||
byte 30: sector logged: 0
 | 
					 | 
				
			||||||
byte 31: current sector: 0
 | 
					 | 
				
			||||||
byte 32: result, always 0
 | 
					 | 
				
			||||||
*/
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
uint8_t epi_restoreMifState(uint8_t *buf, uint8_t maxBufferSize);
 | 
					 | 
				
			||||||
    // retval 0=OK 1=error host buffer too small
 | 
					 | 
				
			||||||
bool gpi_storeMifCardData(uint8_t blkNr, uint8_t const *receivedData);
 | 
					 | 
				
			||||||
    // blkNr=0...11    receivedData[64]
 | 
					 | 
				
			||||||
uint8_t epi_restoreMifData(uint8_t blkNr, uint8_t *buf, uint8_t maxBufferSize);
 | 
					 | 
				
			||||||
    // blkNr=0...11    return buf[64]
 | 
					 | 
				
			||||||
    // retval: 1=error 0=OK
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
void epi_restorePrinterState(uint8_t *buf);
 | 
					 | 
				
			||||||
void gpi_storePrinterState(uint8_t const *buf);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
void epi_restorePrinterFonts(uint8_t *buf);
 | 
					 | 
				
			||||||
void gpi_storePrinterFonts(uint8_t const *buf);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
bool gpi_storeMdbState(bool busReady, bool V12on, bool V5on);
 | 
					 | 
				
			||||||
bool epi_restoreMdbBusReady(void);
 | 
					 | 
				
			||||||
bool epi_restoreMdbV12Ready(void);
 | 
					 | 
				
			||||||
bool epi_restoreMdbV5Ready(void);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
void gpi_storeMdbResponse(uint8_t leng, uint8_t const *data);
 | 
					 | 
				
			||||||
void epi_restoreMdbResponse(uint8_t *leng, uint8_t *data);
 | 
					 | 
				
			||||||
    // last received mdb answer (from mdb device)
 | 
					 | 
				
			||||||
    // only needed if a special command was sent directly
 | 
					 | 
				
			||||||
    // DB0: mdb Device-Nr
 | 
					 | 
				
			||||||
    // DB1: last sent mdb command
 | 
					 | 
				
			||||||
    // DB2: nr of received (payload) data bytes (apart from ACK, can be 0....34)
 | 
					 | 
				
			||||||
    // DB3...DB38: rec.data (payload)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
void gpi_storeEmpSettings(uint8_t leng, uint8_t const *data);
 | 
					 | 
				
			||||||
void epi_restoreEmpSettings(uint8_t *leng, uint8_t *data);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/*
 | 
					 | 
				
			||||||
void gpi_storeEmpCoinSignal(uint8_t leng, uint8_t *data);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
void epi_restoreEmpCoinSignal(uint8_t *leng, uint8_t *data);
 | 
					 | 
				
			||||||
    // return 5 byte:
 | 
					 | 
				
			||||||
    //      data[0]=got coin 0xFF=emp reported an error  0=got nothing
 | 
					 | 
				
			||||||
    //      data[1]=emp-signal of last inserted coin
 | 
					 | 
				
			||||||
    //      data[2,3]=emp-value of last inserted coin
 | 
					 | 
				
			||||||
    //      data[4] = emp-error or warning
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
void epi_clearEmpCoinSignal();
 | 
					 | 
				
			||||||
*/
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
void gpi_storeEmpCoinSignal(uint8_t leng, uint8_t const *data);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
uint8_t epi_isNewCoinLeft(void);
 | 
					 | 
				
			||||||
    // retval: 0...16 coins left in FIFO
 | 
					 | 
				
			||||||
void epi_restoreEmpCoinSignal(uint8_t *valid, uint8_t *signal, uint8_t *error, uint16_t *value);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
void gpi_storeRbDeviceSettings(uint8_t leng, uint8_t const *data);
 | 
					 | 
				
			||||||
void epi_restoreRbDeviceSettings(uint8_t *leng, uint8_t *data);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
void gpi_storeMachineIDsettings(uint8_t leng, uint8_t const *data);
 | 
					 | 
				
			||||||
void epi_restoreMachineIDsettings(uint8_t *leng, uint8_t *data);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
void epi_clearCurrentPayment(void);
 | 
					 | 
				
			||||||
void gpi_storeCurrentPayment(uint32_t insertedAmount, uint16_t lastCoinType, uint16_t lastCoinValue);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
uint32_t epi_CurrentPaymentGetAmount(void);
 | 
					 | 
				
			||||||
uint16_t epi_CurrentPaymentGetLastCoin(void);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
bool epi_CurrentPaymentGetAllCoins(uint16_t *types, uint16_t *values);
 | 
					 | 
				
			||||||
    // alle bei diesem Verkauf eingeworfenen Münzen sind gespeichert falls die jmd. braucht
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
void gpi_storeWakeSources(uint8_t const *receivedData);
 | 
					 | 
				
			||||||
uint64_t epi_getWakeSources(void);
 | 
					 | 
				
			||||||
uint8_t epi_getWakeReason(void);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
void gpi_storeExtendedTime(uint8_t leng, uint8_t const *data);
 | 
					 | 
				
			||||||
void epi_restoreExtendedTime(uint8_t *leng, uint8_t *data);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
void gpi_storeDeviceConditions(uint8_t leng, uint8_t const *data);
 | 
					 | 
				
			||||||
void epi_restoreDeviceConditions(uint8_t *leng, uint8_t *data);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
void gpi_storeDynMachineConditions(uint8_t leng, uint8_t const *data);
 | 
					 | 
				
			||||||
void epi_restoreDynMachineConditions(uint8_t *leng, uint8_t *data);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
void gpi_storeDCbackupAccNr(uint8_t leng, uint8_t const *data);
 | 
					 | 
				
			||||||
void epi_restoreDCbackupAccNr(uint8_t *leng, uint16_t *accNrs);
 | 
					 | 
				
			||||||
    // return accNrs[0..7]
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
void epi_iniVRstorage(void);
 | 
					 | 
				
			||||||
void gpi_storeVaultRecord(uint8_t blkNr, uint8_t const *data);
 | 
					 | 
				
			||||||
bool epi_checkIfVaultRecordAvailable(void);
 | 
					 | 
				
			||||||
bool epi_restoreVaultRecord(uint16_t *length, uint8_t *buf);
 | 
					 | 
				
			||||||
    // true if completly received
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
void gpi_storeCBlevel(uint32_t amount, uint16_t nrOfCoins);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
uint32_t epi_getCashBoxContent(void);
 | 
					 | 
				
			||||||
uint16_t epi_getNrOfCoinsInCashBox(void);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
void gpi_storeNewMifareCard(uint8_t typ, uint8_t const *holder);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
uint8_t epi_mifGetCardType(uint8_t const *holder);
 | 
					 | 
				
			||||||
    //holder[8] = name of card holder
 | 
					 | 
				
			||||||
    // retval Type of MifareCard, 1=upper door, 2=lower door 3=test printer 4=test coins
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
void gpi_storeDcDataValid(bool isVal);
 | 
					 | 
				
			||||||
bool gpi_areDcDataValid();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
@@ -1,90 +0,0 @@
 | 
				
			|||||||
#ifndef TSLIB_H
 | 
					 | 
				
			||||||
#define TSLIB_H
 | 
					 | 
				
			||||||
#include <stdint.h>
 | 
					 | 
				
			||||||
#include <QByteArray>
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#define LOWBYTE     false
 | 
					 | 
				
			||||||
#define HIGHBYTE    true
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
uint16_t uchar2uint(char Highbyte, char Lowbyte);
 | 
					 | 
				
			||||||
uint16_t uchar2uint(uint8_t Highbyte, uint8_t Lowbyte);
 | 
					 | 
				
			||||||
uint32_t uchar2ulong(uint8_t Highbyte, uint8_t MHbyte, uint8_t MLbyte, uint8_t Lowbyte);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
uint8_t  uint2uchar(uint16_t uival, bool getHighB);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
uint8_t ulong2uchar(uint32_t ulval, uint8_t getBytNr);
 | 
					 | 
				
			||||||
    // getBytNr: 0=LSB  3=MSB
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
void delay(uint16_t MilliSec);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#define     MITSEK          1
 | 
					 | 
				
			||||||
#define     OHNESEK         0
 | 
					 | 
				
			||||||
#define     HourSys12h          1
 | 
					 | 
				
			||||||
#define     HourSys24h          0
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
void GetTimeString(uint8_t hours, uint8_t minutes, uint8_t seconds, uint8_t System12h, uint8_t ShowSec, uint8_t *buf);
 | 
					 | 
				
			||||||
    // generate time as ascii string from integers hours/minutes/seconds
 | 
					 | 
				
			||||||
    // System12h=0:  24h system    =1: 12h System
 | 
					 | 
				
			||||||
    // ShowSec=0:     String has 5 digits (hh:mm)   =1: String has 8 digits (hh:mm:ss)
 | 
					 | 
				
			||||||
    // return String in *buf      // 12 byte für buf!
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#define     DateFormatDeutsch       0
 | 
					 | 
				
			||||||
#define     DateFormatAmerica       1
 | 
					 | 
				
			||||||
#define     UsePointSeperator       0
 | 
					 | 
				
			||||||
#define     UseSlashSeperator       1
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
void GetDateString(uint8_t day, uint8_t month, uint8_t yearhigh, uint8_t yearlow, uint8_t format, uint8_t sep, uint8_t *buf);
 | 
					 | 
				
			||||||
    // generate date as ascii string from integers day/month/year
 | 
					 | 
				
			||||||
    // yearhigh in europe always 20 (not in arabia)
 | 
					 | 
				
			||||||
    // format=  0: dd.mm.yyyy   (deutsch)
 | 
					 | 
				
			||||||
    //          1: mm.dd.yyyy   (amerika)
 | 
					 | 
				
			||||||
    //          2: yyyy.mm.dd   (Iran, Dubai)
 | 
					 | 
				
			||||||
    //          3: dd.yyyy.mm
 | 
					 | 
				
			||||||
    //          4: mm.yyyy.dd
 | 
					 | 
				
			||||||
    //          5: yyyy.dd.mm
 | 
					 | 
				
			||||||
        // sep: 0: use . as seperator   1: use / as seperator
 | 
					 | 
				
			||||||
    // return String in *buf      // 11 byte für buf!
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
void GetShortDateString(uint8_t day, uint8_t month, uint8_t yearlow, uint8_t format, uint8_t sep, uint8_t *buf);
 | 
					 | 
				
			||||||
    // generate date as ascii string from integers day/month/year
 | 
					 | 
				
			||||||
    // format=  0: dd.mm.yy   (deutsch)
 | 
					 | 
				
			||||||
    //          1: mm.dd.yy   (amerika)
 | 
					 | 
				
			||||||
    //          2: yy.mm.dd   (Iran, Dubai)
 | 
					 | 
				
			||||||
    //          3: dd.yy.mm
 | 
					 | 
				
			||||||
    //          4: mm.yy.dd
 | 
					 | 
				
			||||||
    //          5: yy.dd.mm
 | 
					 | 
				
			||||||
        // sep: 0: use . as seperator   1: use / as seperator
 | 
					 | 
				
			||||||
    // return String in *buf      // 11byte für buf!
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
uint16_t tslib_strlen(char *buf);
 | 
					 | 
				
			||||||
uint16_t tslib_strlen(uint8_t *buf);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
void tslib_strclr(char *buf, char clrsign, uint16_t len);
 | 
					 | 
				
			||||||
void tslib_strclr(uint8_t *buf, char clrsign, uint16_t len);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
void tslib_strcpy(char *srcbuf, char *destbuf, uint16_t len);
 | 
					 | 
				
			||||||
void tslib_strcpy(char *srcbuf, uint8_t *destbuf, uint16_t len);
 | 
					 | 
				
			||||||
void tslib_strcpy(uint8_t *srcbuf, uint8_t *destbuf, uint16_t len);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
uint16_t tslib_calcCrcCcitt(uint16_t BufLength, uint8_t *buf);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
bool tslib_isDecAsciiNumber(char sign);
 | 
					 | 
				
			||||||
bool tslib_isHexAsciiNumber(char sign);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
int tslib_getMinimum(int val1, int val2);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
void tslib_text2array(QByteArray text, char *aray, uint16_t maxArayLen);
 | 
					 | 
				
			||||||
    // usage:  tslib_text2array("my text", ctmp, 50);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
void biox_CopyBlock(uint8_t *src, uint16_t srcPos, uint8_t *dest, uint16_t destPos, uint16_t len);
 | 
					 | 
				
			||||||
    // both buffers starting from pos 0
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#endif // TSLIB_H
 | 
					 | 
				
			||||||
@@ -1,22 +0,0 @@
 | 
				
			|||||||
#ifndef ATBAPPPLUGIN_H
 | 
					 | 
				
			||||||
#define ATBAPPPLUGIN_H
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/***********************************************************
 | 
					 | 
				
			||||||
 * a simple class with only one method for plugin info
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
#include <QObject>
 | 
					 | 
				
			||||||
#include <QString>
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
class ATBAPPplugin
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
public:
 | 
					 | 
				
			||||||
    virtual const QString & getPluginInfo() = 0;
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
Q_DECLARE_INTERFACE(ATBAPPplugin,
 | 
					 | 
				
			||||||
                    "eu.atb.ptu.plugin.ATBAPPplugin/0.9")
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#endif // ATBAPPPLUGIN_H
 | 
					 | 
				
			||||||
@@ -1,293 +0,0 @@
 | 
				
			|||||||
#include "src/ATBAPP/ATBDeviceControllerPlugin.h"
 | 
					 | 
				
			||||||
#include "src/ATBAPP/ATBHealthEvent.h"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#include <QTimer>
 | 
					 | 
				
			||||||
#include <QTextCodec>
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
ATBDeviceControllerPlugin::ATBDeviceControllerPlugin(QObject *parent) : QObject(parent),
 | 
					 | 
				
			||||||
    pluginState(PLUGIN_STATE::NOT_INITIALIZED)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    this->pluginInfo = QString::fromUtf8(pluginInfoString.c_str());
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    this->hw = new hwapi();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    connect(dynamic_cast<QObject*>(hw), SIGNAL(hwapi_templatePrintFinished_OK()),  this, SLOT(onPrintFinishedOK()));
 | 
					 | 
				
			||||||
    connect(dynamic_cast<QObject*>(hw), SIGNAL(hwapi_templatePrintFinished_Err()), this, SLOT(onPrintFinishedERR()));
 | 
					 | 
				
			||||||
    connect(dynamic_cast<QObject*>(hw), SIGNAL(hwapi_gotNewCoin()),    this, SLOT(onCashGotCoin()));
 | 
					 | 
				
			||||||
    connect(dynamic_cast<QObject*>(hw), SIGNAL(hwapi_vendStopByMax()), this, SLOT(onCashVendStopByMax()));
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
ATBDeviceControllerPlugin::~ATBDeviceControllerPlugin() {}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
PLUGIN_STATE ATBDeviceControllerPlugin::initDCPlugin(QObject *healthEventReceiver, const QSettings & settings)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    this->healthEventReceiver = healthEventReceiver;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    // read variables from setting
 | 
					 | 
				
			||||||
    QString serialPort = settings.value("DEVICE_CONTROLLER/serialPort", "ttymxc2").toString();
 | 
					 | 
				
			||||||
    QByteArray printerEncoding = settings.value("DEVICE_CONTROLLER/printerEnconding", "ISO 8859-2").toString().toLatin1();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    // open serial port
 | 
					 | 
				
			||||||
    hw->dc_openSerial(5, "115200", serialPort, 1);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    // text encoding for printer
 | 
					 | 
				
			||||||
    this->codec = QTextCodec::codecForName(printerEncoding);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    this->pluginState = PLUGIN_STATE::INITIALIZED;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    return pluginState;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// TASKS: Cash handling -------------------------------------------------------
 | 
					 | 
				
			||||||
void ATBDeviceControllerPlugin::requestStartCashInput(const QString & amount)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    qCritical() << "Start Cash vending with amount = " << amount;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    uint32_t amountInt = static_cast<uint32_t>(amount.toUInt());
 | 
					 | 
				
			||||||
    hw->cash_startPayment(amountInt);
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
void ATBDeviceControllerPlugin::requestStopCashInput()
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    hw->cash_stopPayment();
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
void ATBDeviceControllerPlugin::cashCollect()
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    hw->vend_success();
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
void ATBDeviceControllerPlugin::cashAbort()
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    hw->vend_failed();
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// TASKS: printing ------------------------------------------------------------
 | 
					 | 
				
			||||||
void ATBDeviceControllerPlugin::requestPrintTicket(const QHash<QString, QVariant> & printingData)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    struct T_dynDat *dynTicketData = new T_dynDat;
 | 
					 | 
				
			||||||
    memset(dynTicketData, 0, sizeof(*dynTicketData));
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    qCritical() << "ATBDeviceControllerPlugin::requestPrintTicket( "        << endl
 | 
					 | 
				
			||||||
                << "     licenseplate = " << printingData["licenseplate"]   << endl
 | 
					 | 
				
			||||||
                << "           amount = " << printingData["amount"]         << endl
 | 
					 | 
				
			||||||
                << "       parkingEnd = " << printingData["parkingEnd"]     << endl
 | 
					 | 
				
			||||||
                << "      currentTime = " << printingData["currentTime"]    << endl
 | 
					 | 
				
			||||||
                << "      currentDate = " << printingData["currentDate"]    << endl;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    // set dynamic printer data:
 | 
					 | 
				
			||||||
    memcpy((char*)dynTicketData->licensePlate, codec->fromUnicode(printingData["licenseplate"].toString()).data(), 8);
 | 
					 | 
				
			||||||
    memcpy((char*)dynTicketData->vendingPrice, codec->fromUnicode(printingData["amount"].toString()).data(), 8);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    QDateTime parkingEndQDateTime = QDateTime::fromString(printingData["parkingEnd"].toString(), Qt::ISODate);
 | 
					 | 
				
			||||||
    QDateTime currentDateTime     = QDateTime::fromString(printingData["currentTime"].toString(), Qt::ISODate);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    memcpy((char*)dynTicketData->parkingEnd,   codec->fromUnicode(parkingEndQDateTime.toString("hh:mm")).data(), 8);
 | 
					 | 
				
			||||||
    memcpy((char*)dynTicketData->currentTime,  codec->fromUnicode(currentDateTime.toString("hh:mm")).data(), 8);
 | 
					 | 
				
			||||||
    memcpy((char*)dynTicketData->currentDate,  codec->fromUnicode(currentDateTime.toString("dd.MM.yy")).data(), 8);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    // DEBUG
 | 
					 | 
				
			||||||
    qCritical() << "ATBDeviceControllerPlugin::requestPrintTicket()";
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    if (!this->hw->dc_isPortOpen()) {
 | 
					 | 
				
			||||||
        qCritical() << "    ... serial port is not open!";
 | 
					 | 
				
			||||||
        this->onPrintFinishedERR();
 | 
					 | 
				
			||||||
        return;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    // TODO: wird hier nur 'licensePlate' gedruckt?
 | 
					 | 
				
			||||||
    if (!this->hw->prn_sendDynamicPrnValues(dynTicketData->licensePlate)) {
 | 
					 | 
				
			||||||
        this->errorCode = "hwapi::prn_sendDynamicPrnValues";
 | 
					 | 
				
			||||||
        this->errorDescription = "hwapi method 'hwapi::prn_sendDynamicPrnValues' result is false";
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        qCritical() << "ERROR:";
 | 
					 | 
				
			||||||
        qCritical() << "ATBDeviceControllerPlugin::requestPrintTicket( "        << endl
 | 
					 | 
				
			||||||
                    << "     licenseplate = " << printingData["licenseplate"]   << endl
 | 
					 | 
				
			||||||
                    << "           amount = " << printingData["amount"]         << endl
 | 
					 | 
				
			||||||
                    << "       parkingEnd = " << printingData["parkingEnd"]     << endl
 | 
					 | 
				
			||||||
                    << "      currentTime = " << printingData["currentTime"]    << endl
 | 
					 | 
				
			||||||
                    << "      currentDate = " << printingData["currentDate"]    << endl;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        this->onPrintFinishedERR();
 | 
					 | 
				
			||||||
        return;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    QTimer::singleShot(1000, this, SLOT(onPrinterDataPrepared()));
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
void ATBDeviceControllerPlugin::onPrinterDataPrepared()
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    this->currentTemplate = 1;
 | 
					 | 
				
			||||||
    this->onPrinterPrintNextTemplate();
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
void ATBDeviceControllerPlugin::onPrinterPrintNextTemplate()
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    qCritical() << "     ... print template " << this->currentTemplate;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    if (!this->hw->prn_printTemplate(this->currentTemplate)) {
 | 
					 | 
				
			||||||
        this->errorCode = "hwapi::prn_printTemplate";
 | 
					 | 
				
			||||||
        this->errorDescription = QString("hwapi method 'hwapi::onPrinterPrintNextTemplate(%1)' result is false").arg(this->currentTemplate);
 | 
					 | 
				
			||||||
        this->onPrintFinishedERR();
 | 
					 | 
				
			||||||
        return;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    if (this->currentTemplate >= 3) {
 | 
					 | 
				
			||||||
        // all templates are printed
 | 
					 | 
				
			||||||
        this->currentTemplate = 0;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        // FAKE SIGNAL:
 | 
					 | 
				
			||||||
        QTimer::singleShot(1000, this, SLOT(onPrintFinishedOK()));
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    else {
 | 
					 | 
				
			||||||
        // print next template
 | 
					 | 
				
			||||||
        this->currentTemplate++;
 | 
					 | 
				
			||||||
        QTimer::singleShot(3000, this, SLOT(onPrinterPrintNextTemplate()));
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/************************************************************************************************
 | 
					 | 
				
			||||||
 * private slots, interface to low level hwapi
 | 
					 | 
				
			||||||
 *
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
void ATBDeviceControllerPlugin::onPrintFinishedOK()
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    // DEBUG
 | 
					 | 
				
			||||||
    qCritical() << "ATBDeviceControllerPlugin::onPrintFinishedOK()";
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    emit this->printTicketFinished(nsDeviceControllerInterface::RESULT_STATE::SUCCESS,
 | 
					 | 
				
			||||||
                                   "",
 | 
					 | 
				
			||||||
                                   "");
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
void ATBDeviceControllerPlugin::onPrintFinishedERR()
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    // DEBUG
 | 
					 | 
				
			||||||
    qCritical() << "ATBDeviceControllerPlugin::onPrintFinishedERR()";
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    this->errorCode = "PRINTER";               // TODO: get more detailed error code from low level API
 | 
					 | 
				
			||||||
    this->errorDescription = "Printer error";  // TODO: get more detailed error description from low level API
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    emit this->printTicketFinished(nsDeviceControllerInterface::RESULT_STATE::ERROR_BACKEND,
 | 
					 | 
				
			||||||
                                   this->errorCode,
 | 
					 | 
				
			||||||
                                   this->errorDescription);
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/************************************************************************************************
 | 
					 | 
				
			||||||
 * cash payment
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
void ATBDeviceControllerPlugin::onCashGotCoin()
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    // DEBUG
 | 
					 | 
				
			||||||
    qCritical() << "ATBDeviceControllerPlugin::onGotCoin()";
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    uint32_t amountInt = this->hw->getInsertedAmount();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    QString amountString = QString::number(amountInt);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    emit this->cashInputEvent(nsDeviceControllerInterface::RESULT_STATE::SUCCESS,
 | 
					 | 
				
			||||||
                              nsDeviceControllerInterface::CASH_STATE::CACHE_INPUT,
 | 
					 | 
				
			||||||
                              amountString,
 | 
					 | 
				
			||||||
                              "",
 | 
					 | 
				
			||||||
                              "");
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
void ATBDeviceControllerPlugin::onCashVendStopByMax()
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    // DEBUG
 | 
					 | 
				
			||||||
    qCritical() << "ATBDeviceControllerPlugin::onCashVendStopByMax()";
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    uint32_t amountInt = this->hw->getInsertedAmount();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    QString amountString = QString::number(amountInt);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    emit this->cashInputFinished(nsDeviceControllerInterface::RESULT_STATE::SUCCESS,
 | 
					 | 
				
			||||||
                              amountString,
 | 
					 | 
				
			||||||
                              "",
 | 
					 | 
				
			||||||
                              "");
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/************************************************************************************************
 | 
					 | 
				
			||||||
 * Mandatory plugin methods
 | 
					 | 
				
			||||||
 *
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
PLUGIN_STATE ATBDeviceControllerPlugin::getState()
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    return this->pluginState;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
QString & ATBDeviceControllerPlugin::getLastError()
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    return this->errorCode;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
const QString & ATBDeviceControllerPlugin::getLastErrorDescription()
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    return this->errorDescription;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
const QString & ATBDeviceControllerPlugin::getPluginInfo()
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    return this->pluginInfo;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
const QString ATBDeviceControllerPlugin::getString(nsDeviceControllerInterface::RESULT_STATE resultState)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    QString str;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    switch (resultState) {
 | 
					 | 
				
			||||||
    case nsDeviceControllerInterface::RESULT_STATE::SUCCESS:
 | 
					 | 
				
			||||||
        str = QString("RESULT_STATE::SUCCESS");
 | 
					 | 
				
			||||||
        break;
 | 
					 | 
				
			||||||
    case nsDeviceControllerInterface::RESULT_STATE::ERROR_BACKEND:
 | 
					 | 
				
			||||||
        str = QString("RESULT_STATE::ERROR_BACKEND");
 | 
					 | 
				
			||||||
        break;
 | 
					 | 
				
			||||||
    case nsDeviceControllerInterface::RESULT_STATE::ERROR_TIMEOUT:
 | 
					 | 
				
			||||||
        str = QString("RESULT_STATE::ERROR_TIMEOUT");
 | 
					 | 
				
			||||||
        break;
 | 
					 | 
				
			||||||
    case nsDeviceControllerInterface::RESULT_STATE::ERROR_PROCESS:
 | 
					 | 
				
			||||||
        str = QString("RESULT_STATE::ERROR_PROCESS");
 | 
					 | 
				
			||||||
        break;
 | 
					 | 
				
			||||||
    case nsDeviceControllerInterface::RESULT_STATE::ERROR_RETRY:
 | 
					 | 
				
			||||||
        str = QString("RESULT_STATE::ERROR_RETRY");
 | 
					 | 
				
			||||||
        break;
 | 
					 | 
				
			||||||
    case nsDeviceControllerInterface::RESULT_STATE::INFO:
 | 
					 | 
				
			||||||
        str = QString("RESULT_STATE::INFO");
 | 
					 | 
				
			||||||
        break;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    return str;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/************************************************************************************************
 | 
					 | 
				
			||||||
 * ... end
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#if QT_VERSION < 0x050000
 | 
					 | 
				
			||||||
Q_EXPORT_PLUGIN2( ATBDeviceControllerPlugin, ATBDeviceControllerPlugin )
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
@@ -1,125 +0,0 @@
 | 
				
			|||||||
#ifndef ATBDEVICECONTROLLERPLUGIN_H
 | 
					 | 
				
			||||||
#define ATBDEVICECONTROLLERPLUGIN_H
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#include <QObject>
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#include "src/ATBAPP/DeviceControllerInterface.h"
 | 
					 | 
				
			||||||
#include "src/ATBAPP/ATBAPPplugin.h"
 | 
					 | 
				
			||||||
#include "version.h"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#include "hwapi.h"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#include <unistd.h>
 | 
					 | 
				
			||||||
#include <thread>
 | 
					 | 
				
			||||||
#include <memory>
 | 
					 | 
				
			||||||
#include <QSharedMemory>
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
class QTextCodec;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
using namespace nsDeviceControllerInterface;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
class QSettings;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
class ATBDeviceControllerPlugin : public QObject,
 | 
					 | 
				
			||||||
        public DeviceControllerInterface
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    Q_OBJECT
 | 
					 | 
				
			||||||
    Q_INTERFACES(ATBAPPplugin)
 | 
					 | 
				
			||||||
    Q_INTERFACES(DeviceControllerInterface)
 | 
					 | 
				
			||||||
    #if QT_VERSION >= 0x050000
 | 
					 | 
				
			||||||
    Q_PLUGIN_METADATA( IID "ATBDeviceControllerPlugin" )
 | 
					 | 
				
			||||||
    #endif
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
public:
 | 
					 | 
				
			||||||
    explicit ATBDeviceControllerPlugin(QObject *parent = nullptr);
 | 
					 | 
				
			||||||
    ~ATBDeviceControllerPlugin();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    // ----------------------------------------------------------------------------
 | 
					 | 
				
			||||||
    // interface:
 | 
					 | 
				
			||||||
    PLUGIN_STATE initDCPlugin(QObject *healthEventReceiver, const QSettings & settings);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    // TASKS: Cash handling -------------------------------------------------------
 | 
					 | 
				
			||||||
    void requestStartCashInput(const QString & amount);
 | 
					 | 
				
			||||||
    void requestStopCashInput();
 | 
					 | 
				
			||||||
    void cashCollect();
 | 
					 | 
				
			||||||
    void cashAbort();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    // TASKS: printing ------------------------------------------------------------
 | 
					 | 
				
			||||||
    void requestPrintTicket(const QHash<QString, QVariant> & printingData);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    // mandantory ATBAPP plugin methods: ------------------------------------------
 | 
					 | 
				
			||||||
    nsDeviceControllerInterface::PLUGIN_STATE getState();
 | 
					 | 
				
			||||||
    QString & getLastError();
 | 
					 | 
				
			||||||
    const QString & getLastErrorDescription();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    const QString & getPluginInfo();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    // helpers e.g. for debug / log
 | 
					 | 
				
			||||||
    const QString getString(nsDeviceControllerInterface::RESULT_STATE resultState);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
signals:
 | 
					 | 
				
			||||||
    void printTicketFinished(nsDeviceControllerInterface::RESULT_STATE resultState,
 | 
					 | 
				
			||||||
                                     const QString & errorCode,
 | 
					 | 
				
			||||||
                                     const QString & errorDescription);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    void cashInputEvent(nsDeviceControllerInterface::RESULT_STATE resultState,
 | 
					 | 
				
			||||||
                        nsDeviceControllerInterface::CASH_STATE cashState,
 | 
					 | 
				
			||||||
                        const QString & newCashValue,
 | 
					 | 
				
			||||||
                        const QString & errorCode,
 | 
					 | 
				
			||||||
                        const QString & errorDescription);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    void cashInputFinished(nsDeviceControllerInterface::RESULT_STATE resultState,
 | 
					 | 
				
			||||||
                                     const QString & newCashValue,
 | 
					 | 
				
			||||||
                                     const QString & errorCode,
 | 
					 | 
				
			||||||
                                     const QString & errorDescription);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    void requestServiceMode();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    void Error(
 | 
					 | 
				
			||||||
            const QString & errorCode,
 | 
					 | 
				
			||||||
            const QString & errorDescription);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
private:
 | 
					 | 
				
			||||||
   QString errorCode;
 | 
					 | 
				
			||||||
   QString errorDescription;
 | 
					 | 
				
			||||||
   QString pluginInfo;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
   int currentTemplate;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
   bool useDebug;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
   PLUGIN_STATE pluginState;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
   QObject* healthEventReceiver;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
   hwinf* hw;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
   QTextCodec *codec;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
private slots:
 | 
					 | 
				
			||||||
   // printer
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
   void onPrinterDataPrepared();
 | 
					 | 
				
			||||||
   void onPrinterPrintNextTemplate();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
   void onPrintFinishedOK();
 | 
					 | 
				
			||||||
   void onPrintFinishedERR();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
   // cash payment
 | 
					 | 
				
			||||||
   void onCashGotCoin();
 | 
					 | 
				
			||||||
   void onCashVendStopByMax();
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#endif // ATBDEVICECONTROLLERPLUGIN_H
 | 
					 | 
				
			||||||
@@ -1,25 +0,0 @@
 | 
				
			|||||||
#include "src/ATBAPP/ATBHealthEvent.h"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
ATBHealthEvent::ATBHealthEvent(ATB_HEALTH_MODE mode, const QString & errorNumber, const QString & errorDescription) :
 | 
					 | 
				
			||||||
    QEvent(ATB_HEALTH_EVENT),
 | 
					 | 
				
			||||||
    healthMode(mode),
 | 
					 | 
				
			||||||
    errorNumber(errorNumber),
 | 
					 | 
				
			||||||
    errorDescription(errorDescription)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
QString ATBHealthEvent::getErrorNumber()
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    return this->errorNumber;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
QString ATBHealthEvent::getErrorDescription()
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    return this->errorDescription;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
ATB_HEALTH_MODE ATBHealthEvent::getMode()
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    return this->healthMode;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
@@ -1,44 +0,0 @@
 | 
				
			|||||||
#ifndef ATBHEALTHEVENT_H
 | 
					 | 
				
			||||||
#define ATBHEALTHEVENT_H
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#include <QEvent>
 | 
					 | 
				
			||||||
#include <QString>
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
enum class ATB_HEALTH_MODE : quint8;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
const QEvent::Type ATB_HEALTH_EVENT = static_cast<QEvent::Type>(QEvent::User + 1);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
class ATBHealthEvent : public QEvent
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
public:
 | 
					 | 
				
			||||||
    ATBHealthEvent(ATB_HEALTH_MODE mode, const QString & errorNumber, const QString & errorDescription);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    QString getErrorNumber();
 | 
					 | 
				
			||||||
    QString getErrorDescription();
 | 
					 | 
				
			||||||
    ATB_HEALTH_MODE getMode();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
signals:
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
public slots:
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
private:
 | 
					 | 
				
			||||||
    ATB_HEALTH_MODE healthMode;
 | 
					 | 
				
			||||||
    QString errorNumber;
 | 
					 | 
				
			||||||
    QString errorDescription;
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
enum class ATB_HEALTH_MODE : quint8 {
 | 
					 | 
				
			||||||
    WARNING,
 | 
					 | 
				
			||||||
    ERROR,
 | 
					 | 
				
			||||||
    WARNING_CORRECTION,
 | 
					 | 
				
			||||||
    ERROR_CORRECTION,
 | 
					 | 
				
			||||||
    DEBUG,
 | 
					 | 
				
			||||||
    STATE,
 | 
					 | 
				
			||||||
    UNSPECIFIED
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#endif // ATBHEALTHEVENT_H
 | 
					 | 
				
			||||||
@@ -1,142 +0,0 @@
 | 
				
			|||||||
#ifndef DEVICECONTROLLERINTERFACE_H
 | 
					 | 
				
			||||||
#define DEVICECONTROLLERINTERFACE_H
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#include <QtPlugin>
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#include <QSettings>
 | 
					 | 
				
			||||||
#include <QString>
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#include "ATBAPPplugin.h"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
namespace nsDeviceControllerInterface {
 | 
					 | 
				
			||||||
    enum class PLUGIN_STATE : quint8;
 | 
					 | 
				
			||||||
    enum class RESULT_STATE : quint8;
 | 
					 | 
				
			||||||
    enum class CASH_STATE   : quint8;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
class DeviceControllerInterface : public ATBAPPplugin
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    Q_INTERFACES(ATBAPPplugin)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
public:
 | 
					 | 
				
			||||||
    virtual ~DeviceControllerInterface() {}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    virtual nsDeviceControllerInterface::PLUGIN_STATE initDCPlugin(QObject *healthEventReceiver,
 | 
					 | 
				
			||||||
                                                                   const QSettings & settings) = 0;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    // TASKS: Cash handling -------------------------------------------------------
 | 
					 | 
				
			||||||
    /**
 | 
					 | 
				
			||||||
     * enables coin input
 | 
					 | 
				
			||||||
     * amount = "0": pay-up
 | 
					 | 
				
			||||||
     * amount > "0": pay-down
 | 
					 | 
				
			||||||
     */
 | 
					 | 
				
			||||||
    virtual void requestStartCashInput(const QString & amount) = 0;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    /**
 | 
					 | 
				
			||||||
     * called e.g. on Button "NEXT" in pay-up (direct coin input)
 | 
					 | 
				
			||||||
     */
 | 
					 | 
				
			||||||
    virtual void requestStopCashInput() = 0;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    /**
 | 
					 | 
				
			||||||
     * called e.g. on Button "NEXT" in pay-up (direct coin input)
 | 
					 | 
				
			||||||
     */
 | 
					 | 
				
			||||||
    virtual void cashCollect() = 0;
 | 
					 | 
				
			||||||
    virtual void cashAbort() = 0;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    // TASKS: printing ------------------------------------------------------------
 | 
					 | 
				
			||||||
    virtual void requestPrintTicket(const QHash<QString, QVariant> & printingData) = 0;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    // mandantory ATBAPP plugin methods:
 | 
					 | 
				
			||||||
    virtual nsDeviceControllerInterface::PLUGIN_STATE getState() = 0;
 | 
					 | 
				
			||||||
    virtual const QString & getLastError() = 0;
 | 
					 | 
				
			||||||
    virtual const QString & getLastErrorDescription() = 0;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    // return a plugin description in JSON or XML
 | 
					 | 
				
			||||||
    // -> ATBAPPplugin::getPluginInfo()
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    // helpers e.g. for debug / log
 | 
					 | 
				
			||||||
    virtual const QString getString(nsDeviceControllerInterface::RESULT_STATE resultState) = 0;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
signals:
 | 
					 | 
				
			||||||
    virtual void printTicketFinished(nsDeviceControllerInterface::RESULT_STATE resultState,
 | 
					 | 
				
			||||||
                                     const QString & errorCode,
 | 
					 | 
				
			||||||
                                     const QString & errorDescription) = 0;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    /**
 | 
					 | 
				
			||||||
     * emitted on e.g. a coin input
 | 
					 | 
				
			||||||
     */
 | 
					 | 
				
			||||||
    virtual void cashInputEvent(nsDeviceControllerInterface::RESULT_STATE resultState,
 | 
					 | 
				
			||||||
                                nsDeviceControllerInterface::CASH_STATE cashState,
 | 
					 | 
				
			||||||
                                const QString & newCashValue,
 | 
					 | 
				
			||||||
                                /* additional variables? */
 | 
					 | 
				
			||||||
                                const QString & errorCode,
 | 
					 | 
				
			||||||
                                const QString & errorDescription) = 0;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    /**
 | 
					 | 
				
			||||||
     * emitted if cashInput has been stopped, e.g. in result to task requestStopCashInput():
 | 
					 | 
				
			||||||
     *  -> shutter is blocked
 | 
					 | 
				
			||||||
     *  -> no cash input is possible
 | 
					 | 
				
			||||||
     *  -> coins are in cache
 | 
					 | 
				
			||||||
     */
 | 
					 | 
				
			||||||
    virtual void cashInputFinished(nsDeviceControllerInterface::RESULT_STATE resultState,
 | 
					 | 
				
			||||||
                                     const QString & newCashValue,
 | 
					 | 
				
			||||||
                                     /*  additional variables? */
 | 
					 | 
				
			||||||
                                     const QString & errorCode,
 | 
					 | 
				
			||||||
                                     const QString & errorDescription) = 0;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    /**
 | 
					 | 
				
			||||||
     * emitted e.g. if service door is opened
 | 
					 | 
				
			||||||
     */
 | 
					 | 
				
			||||||
    virtual void requestServiceMode() = 0;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    /**
 | 
					 | 
				
			||||||
     * emitted on error
 | 
					 | 
				
			||||||
     * depending on errorCode:
 | 
					 | 
				
			||||||
     * -> interrupt selling process
 | 
					 | 
				
			||||||
     * -> machine can go to state OOO
 | 
					 | 
				
			||||||
     * -> send error event to ISMAS
 | 
					 | 
				
			||||||
     * -> ...
 | 
					 | 
				
			||||||
     */
 | 
					 | 
				
			||||||
    virtual void Error(
 | 
					 | 
				
			||||||
            /*  additional variables? */
 | 
					 | 
				
			||||||
            const QString & errorCode,
 | 
					 | 
				
			||||||
            const QString & errorDescription) = 0;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
Q_DECLARE_INTERFACE(DeviceControllerInterface,
 | 
					 | 
				
			||||||
                    "eu.atb.ptu.plugin.DeviceControllerInterface/1.0")
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
namespace nsDeviceControllerInterface {
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    enum class PLUGIN_STATE : quint8 {
 | 
					 | 
				
			||||||
        NOT_INITIALIZED = 0,
 | 
					 | 
				
			||||||
        INITIALIZED = 1
 | 
					 | 
				
			||||||
    };
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    enum class RESULT_STATE : quint8 {
 | 
					 | 
				
			||||||
        SUCCESS = 1,                // operation was successfull
 | 
					 | 
				
			||||||
        ERROR_BACKEND,              // error from backend (e.g. backend replies with error)
 | 
					 | 
				
			||||||
        ERROR_TIMEOUT,              // the operation timed out
 | 
					 | 
				
			||||||
        ERROR_PROCESS,              // internal plugin error, should not occur (this is a bug in implementation)
 | 
					 | 
				
			||||||
        ERROR_RETRY,                // retry operation
 | 
					 | 
				
			||||||
        INFO                        // informational (e.g. display a message, log something etc.)
 | 
					 | 
				
			||||||
    };
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    enum class CASH_STATE   : quint8 {
 | 
					 | 
				
			||||||
        CACHE_EMPTY,                // Cache still empty, default state
 | 
					 | 
				
			||||||
        CACHE_INPUT,                // Coins are in Cache
 | 
					 | 
				
			||||||
        OVERPAYED,
 | 
					 | 
				
			||||||
        /* t.b.d. */
 | 
					 | 
				
			||||||
    };
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#endif // DEVICECONTROLLERINTERFACE_H
 | 
					 | 
				
			||||||
@@ -1,449 +0,0 @@
 | 
				
			|||||||
#include "com.h"
 | 
					 | 
				
			||||||
#include <QDebug>
 | 
					 | 
				
			||||||
//#include "controlBus.h"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
//////////////////////////////////////////////////////////////////////////////////
 | 
					 | 
				
			||||||
///
 | 
					 | 
				
			||||||
///      serial hardware layer
 | 
					 | 
				
			||||||
///
 | 
					 | 
				
			||||||
//////////////////////////////////////////////////////////////////////////////////
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
static int64_t com_want2read;
 | 
					 | 
				
			||||||
// -------------------------------------------------------------------------------------------------------------
 | 
					 | 
				
			||||||
// --------- PUBLIC --------------------------------------------------------------------------------------------
 | 
					 | 
				
			||||||
// -------------------------------------------------------------------------------------------------------------
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
void T_com::writeToSerial(const QByteArray &data, uint16_t sendLength)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    sendBuffer=data;
 | 
					 | 
				
			||||||
    sendLen=sendLength;
 | 
					 | 
				
			||||||
    if (CatSerial->isOpen())
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
        //qDebug() << "sending..." << sendBuffer;
 | 
					 | 
				
			||||||
        CatSerial->write(sendBuffer);
 | 
					 | 
				
			||||||
    } else
 | 
					 | 
				
			||||||
        qDebug() << "error sending, port is not open";
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
bool T_com::readFromSerial(QByteArray &data, uint16_t &sendLength)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    // return one time true if new data (completly) read.
 | 
					 | 
				
			||||||
    // return new data in &data and &sendLength  to other objects
 | 
					 | 
				
			||||||
    uint16_t ll=rawInLen;
 | 
					 | 
				
			||||||
    if (!CatSerial->isOpen())
 | 
					 | 
				
			||||||
        return false;
 | 
					 | 
				
			||||||
    data.clear();
 | 
					 | 
				
			||||||
    data.append(rawInput);
 | 
					 | 
				
			||||||
    sendLength=ll;
 | 
					 | 
				
			||||||
    rawInLen=0;         // beim 2. Aufruf 0 zurück weil nichts neues da
 | 
					 | 
				
			||||||
    if (ll>0)
 | 
					 | 
				
			||||||
        return true;
 | 
					 | 
				
			||||||
    return false;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// -------------------------------------------------------------------------------------------------------------
 | 
					 | 
				
			||||||
// ---------   PRIVATES  --------------------------------------------------------------------------------------
 | 
					 | 
				
			||||||
// -------------------------------------------------------------------------------------------------------------
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
T_com::T_com(QWidget *parent) : QMainWindow(parent)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    // port settings come from tabCom->Sdata->serial
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    gpi_serialChanged();
 | 
					 | 
				
			||||||
    CatSerial = new QSerialPort();  // PortHW object for Control&Analyse Tool
 | 
					 | 
				
			||||||
    //CatSerial->clear();
 | 
					 | 
				
			||||||
    //CatSerial->clearError();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    connect(CatSerial, &QSerialPort::readyRead, this, &T_com::readSomeBytes);
 | 
					 | 
				
			||||||
        // still reading, not sure if complete, undefined number of calls while reading
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    connect(CatSerial, &QSerialPort::bytesWritten, this, &T_com::serialSendComplete);
 | 
					 | 
				
			||||||
        // system confirms sending complete
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    //connect(CatSerial, &QSerialPort::dataTerminalReadyChanged, this, &T_com::incomingWake);
 | 
					 | 
				
			||||||
    //connect(CatSerial, &QSerialPort::requestToSendChanged, this, &T_com::incomingWake);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    // timer detects time gap in input flow
 | 
					 | 
				
			||||||
    serRecTime = new QTimer();
 | 
					 | 
				
			||||||
    connect(serRecTime, SIGNAL(timeout()), this, SLOT(receiveTO()));
 | 
					 | 
				
			||||||
    serRecTime->setSingleShot(true);        // single shot! only one impulse if receive complete
 | 
					 | 
				
			||||||
    serRecTime->stop();                     // on hold
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    // check COM-TAB periodic if user wants to connect or disconnect
 | 
					 | 
				
			||||||
    QTimer *ChkConnectTimer = new QTimer();
 | 
					 | 
				
			||||||
    connect(ChkConnectTimer, SIGNAL(timeout()), this, SLOT(ser_ISR100ms()));
 | 
					 | 
				
			||||||
    ChkConnectTimer->setSingleShot(false);
 | 
					 | 
				
			||||||
    ChkConnectTimer->start(100);     // in ms
 | 
					 | 
				
			||||||
    com_want2read=0;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
T_com::~T_com()
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    if (CatSerial->isOpen())
 | 
					 | 
				
			||||||
        CatSerial->close();
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
void T_com::ser_ISR100ms()
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    //qDebug() << "~~>LIB" << "ENTER...";
 | 
					 | 
				
			||||||
    // call every 100ms to check if user(HMI) wants to connect or disconnect
 | 
					 | 
				
			||||||
    uint8_t chkConn = gpi_getSerialConn();    // from global GUI buffer (Sdata)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    //qDebug() << "~~>LIB" << "checking connect button... " << chkConn;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    switch (chkConn)
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
        case 0: // 0 button "connect" was just released
 | 
					 | 
				
			||||||
                //qDebug() << "close serial port" << chkConn;
 | 
					 | 
				
			||||||
                closeSerialPort();
 | 
					 | 
				
			||||||
                gpi_serialChanged();    // set chkConn to 2, thus getting edge
 | 
					 | 
				
			||||||
                break;
 | 
					 | 
				
			||||||
        case 1: // 1 button "connect" was just pressed
 | 
					 | 
				
			||||||
                //qDebug() << "open serial port" << chkConn;
 | 
					 | 
				
			||||||
                open_Serial_Port();
 | 
					 | 
				
			||||||
                gpi_serialChanged();    // set chkConn to 2, thus getting edge
 | 
					 | 
				
			||||||
                break;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    if (CatSerial->isOpen()) {
 | 
					 | 
				
			||||||
        gpi_serialIsOpen(true);
 | 
					 | 
				
			||||||
    } else {
 | 
					 | 
				
			||||||
        gpi_serialIsOpen(false);
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    //qDebug() << "LEAVE " << chkConn;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// -------------------------------------------------------------------------------------------------------------
 | 
					 | 
				
			||||||
// -------------------------------------------------------------------------------------------------------------
 | 
					 | 
				
			||||||
// -------------------------------------------------------------------------------------------------------------
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
char T_com::open_Serial_Port()
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    //qDebug() << "ENTER";
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    bool ret;
 | 
					 | 
				
			||||||
    QString myString=nullptr, myPortName=nullptr, myBaudStr=nullptr;
 | 
					 | 
				
			||||||
    int myBaudNr;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    if (CatSerial->isOpen()) {
 | 
					 | 
				
			||||||
        qDebug() << "!!!IS OPEN!!!";
 | 
					 | 
				
			||||||
        return 0;                   // opening twice is not allowed
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    //qDebug() << "connecting..." << myPortName;
 | 
					 | 
				
			||||||
    myPortName=gpi_getComPortName();                // was selected and stored from GUI
 | 
					 | 
				
			||||||
    CatSerial->setPortName(myPortName);
 | 
					 | 
				
			||||||
    myBaudNr=gpi_getBaudNr();                       // was selected and stored from GUI
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    //qDebug() << "myPortName" << myPortName << ", myBaudNr" << myBaudNr;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    switch (myBaudNr)
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
        // 0:1200   1:9600   2:19200   3:38400   4:57600   5:115200
 | 
					 | 
				
			||||||
        case 0: CatSerial->setBaudRate(QSerialPort::Baud1200); myBaudStr="1200"; break;
 | 
					 | 
				
			||||||
        case 1: CatSerial->setBaudRate(QSerialPort::Baud9600); myBaudStr="9600"; break;
 | 
					 | 
				
			||||||
        case 2: CatSerial->setBaudRate(QSerialPort::Baud19200); myBaudStr="19200"; break;
 | 
					 | 
				
			||||||
        case 3: CatSerial->setBaudRate(QSerialPort::Baud38400); myBaudStr="38400"; break;
 | 
					 | 
				
			||||||
        case 4: CatSerial->setBaudRate(QSerialPort::Baud57600); myBaudStr="57600"; break;
 | 
					 | 
				
			||||||
        case 5: CatSerial->setBaudRate(QSerialPort::Baud115200); myBaudStr="115200"; break;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    CatSerial->setDataBits(QSerialPort::Data8);
 | 
					 | 
				
			||||||
        // alt: QSerialPort::Data5,6,7,8
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    CatSerial->setParity(QSerialPort::NoParity);
 | 
					 | 
				
			||||||
        // alt: EvenParity, OddParity, NoParity
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    CatSerial->setStopBits(QSerialPort::OneStop);
 | 
					 | 
				
			||||||
        // alternative: OneStop, TwoStop, OneAndHalfStop
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    CatSerial->setFlowControl(QSerialPort::NoFlowControl);
 | 
					 | 
				
			||||||
        // alt: HardwareControl, SoftwareControl, NoFlowControl
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    ret=CatSerial->open(QIODevice::ReadWrite);
 | 
					 | 
				
			||||||
        // alt: QIODevice::ReadWrite  QIODevice::ReadOnly  QIODevice::WriteOnly
 | 
					 | 
				
			||||||
    if (!ret)
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
        myString.clear();
 | 
					 | 
				
			||||||
        myString = "error ";
 | 
					 | 
				
			||||||
        myString.append(CatSerial->errorString());
 | 
					 | 
				
			||||||
        qDebug() << myString;
 | 
					 | 
				
			||||||
        gpi_setTxt4comStateLine(myString);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        //qDebug() << "LEAVE";
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        return 0;
 | 
					 | 
				
			||||||
    } else
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
        myString.clear();
 | 
					 | 
				
			||||||
        myString.append(myPortName);
 | 
					 | 
				
			||||||
        //lang=myString.size();
 | 
					 | 
				
			||||||
        myString.append(" opened with ");
 | 
					 | 
				
			||||||
        myString.append(myBaudStr);
 | 
					 | 
				
			||||||
        myString.append(" 8N1");
 | 
					 | 
				
			||||||
        qDebug() << myString;
 | 
					 | 
				
			||||||
        gpi_setTxt4comStateLine(myString);
 | 
					 | 
				
			||||||
        gpi_setTxt4RsDiagWin(myString+"\n");
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    //qDebug() << "LEAVE";
 | 
					 | 
				
			||||||
    return 0;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
void T_com::closeSerialPort()
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    //qDebug() << "ENTER";
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    if (CatSerial->isOpen())
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
        qDebug() << "closing connection";
 | 
					 | 
				
			||||||
        CatSerial->close();
 | 
					 | 
				
			||||||
        gpi_setTxt4comStateLine("closed");
 | 
					 | 
				
			||||||
        gpi_setTxt4RsDiagWin("closed");
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    //qDebug() << "LEAVE";
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
void T_com::readSomeBytes(void)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    // called by serial-read-detection
 | 
					 | 
				
			||||||
    // restart off-time as input flow is ongoing
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    // timer for slow receive
 | 
					 | 
				
			||||||
    // and serves as timeout for fast receive is msg is shorter as expected
 | 
					 | 
				
			||||||
        serRecTime->stop();
 | 
					 | 
				
			||||||
        serRecTime->start(20);     // in ms
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        //qDebug()<< "com-rec read some bytes";
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    this->receiveByLength();    // since 14.12.21: fast receive
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
void T_com::receiveFixLen(int64_t nrOfbytesToReceive)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    // call this before sending a request to slave
 | 
					 | 
				
			||||||
    // then we know exactly when reception is complete -> much faster
 | 
					 | 
				
			||||||
    com_want2read=nrOfbytesToReceive;
 | 
					 | 
				
			||||||
        // since 14.12.21: FastDevice Protocol has two lengthen:
 | 
					 | 
				
			||||||
        // fast: 12byte reception  long: 68byte
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
void T_com::receiveByLength(void)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    if (CatSerial->isOpen())
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
        QString myString=nullptr, tmpStr=nullptr;
 | 
					 | 
				
			||||||
        int64_t nrOfBytesreceived = CatSerial->bytesAvailable();        // nr of received bytes
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        //qDebug()<< "com-rec current Len: "<< nrOfBytesreceived;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        if (nrOfBytesreceived >= com_want2read)
 | 
					 | 
				
			||||||
        {
 | 
					 | 
				
			||||||
            QByteArray data = CatSerial->readAll();     // erst auslesen wenn alles da! löscht den Empfangspuffer
 | 
					 | 
				
			||||||
            serRecTime->stop();     // stop timeout to avoid 2nd emit
 | 
					 | 
				
			||||||
            rawInLen=uint16_t (nrOfBytesreceived);
 | 
					 | 
				
			||||||
            rawInput.clear();
 | 
					 | 
				
			||||||
            rawInput.append(data);
 | 
					 | 
				
			||||||
            // report "new data received" to other objects
 | 
					 | 
				
			||||||
            //qDebug()<< "com-recFinished by Len "<< rawInLen;
 | 
					 | 
				
			||||||
            emit receivingFinished();
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
void T_com::receiveTO(void)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    // no new input data for 20ms, --> assuming frame complete
 | 
					 | 
				
			||||||
    // save data in private "rawInput"-buffer
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    if (CatSerial->isOpen())
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        QString myString=nullptr, tmpStr=nullptr;
 | 
					 | 
				
			||||||
        int64_t nrOfBytesreceived = CatSerial->bytesAvailable();        // nr of received bytes
 | 
					 | 
				
			||||||
        QByteArray data = CatSerial->readAll();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        rawInLen=uint16_t (nrOfBytesreceived);
 | 
					 | 
				
			||||||
        rawInput.clear();
 | 
					 | 
				
			||||||
        rawInput.append(data);
 | 
					 | 
				
			||||||
        //rawInput[rawInLen]=0;       // Zwangsterminierung bei QByteArray nicht nötig
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        // diag display in serial in/out window and debug window
 | 
					 | 
				
			||||||
        myString.clear();
 | 
					 | 
				
			||||||
        myString.setNum(rawInLen);
 | 
					 | 
				
			||||||
        myString.append(" in: ");
 | 
					 | 
				
			||||||
        //myString.append(rawInput);
 | 
					 | 
				
			||||||
        for (int ii=0; ii<rawInLen; ii++)
 | 
					 | 
				
			||||||
        {
 | 
					 | 
				
			||||||
            tmpStr.clear();
 | 
					 | 
				
			||||||
            tmpStr.setNum(rawInput[ii],16);   // problem: wenn >0x80 dann wird EIN Byte 16 stellig angezeigt
 | 
					 | 
				
			||||||
            int ll=tmpStr.length();
 | 
					 | 
				
			||||||
            if (ll>2)
 | 
					 | 
				
			||||||
            {
 | 
					 | 
				
			||||||
                myString.append(tmpStr[ll-2]);
 | 
					 | 
				
			||||||
                myString.append(tmpStr[ll-1]);
 | 
					 | 
				
			||||||
            } else
 | 
					 | 
				
			||||||
            {
 | 
					 | 
				
			||||||
                myString.append(tmpStr);
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
                myString.append(" ");
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
        myString.append("\n");
 | 
					 | 
				
			||||||
    #ifdef PRINTALLDEBUGS
 | 
					 | 
				
			||||||
        qDebug() << "VCP:" << myString;   // display all inputs and outputs in output window
 | 
					 | 
				
			||||||
    #endif
 | 
					 | 
				
			||||||
        gpi_setTxt4RsDiagWin(myString);
 | 
					 | 
				
			||||||
        //gpi_set2ndTxt4RsDiagWin(myString);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        // report "new data received" to other objects
 | 
					 | 
				
			||||||
        //qDebug()<< "com-recFinished by TO";
 | 
					 | 
				
			||||||
        emit receivingFinished();
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
void T_com::serialSendComplete(void)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    // system confirms sending complete, diag display
 | 
					 | 
				
			||||||
    QString myString=nullptr, tmpStr=nullptr;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    myString.clear();
 | 
					 | 
				
			||||||
    myString.setNum(sendLen);
 | 
					 | 
				
			||||||
    myString.append(" out: ");
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    for (int ii=0; ii<sendLen; ii++)
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
        tmpStr.clear();
 | 
					 | 
				
			||||||
        tmpStr.setNum(sendBuffer[ii],16);   // problem: wenn >0x80 dann 16stellig
 | 
					 | 
				
			||||||
        int ll=tmpStr.length();
 | 
					 | 
				
			||||||
        if (ll>2)
 | 
					 | 
				
			||||||
        {
 | 
					 | 
				
			||||||
            //qDebug() << "long_string" << ll << "\n";
 | 
					 | 
				
			||||||
            myString.append(tmpStr[ll-2]);
 | 
					 | 
				
			||||||
            myString.append(tmpStr[ll-1]);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        } else
 | 
					 | 
				
			||||||
        {
 | 
					 | 
				
			||||||
            myString.append(tmpStr);
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
            myString.append(" ");
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#ifdef PRINTALLDEBUGS
 | 
					 | 
				
			||||||
    myString.append("\n");
 | 
					 | 
				
			||||||
    qDebug() << myString; // display all output data in out-window
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    gpi_setTxt4RsDiagWin(myString);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    emit sendingFinished();     // for whom it may interest
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
bool T_com::isPortOpen(void)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    if (CatSerial->isOpen())
 | 
					 | 
				
			||||||
        return true;
 | 
					 | 
				
			||||||
    return false;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// -------------------------------------------------------------------------------------------------------------
 | 
					 | 
				
			||||||
// -------------------------------------------------------------------------------------------------------------
 | 
					 | 
				
			||||||
// -------------------------------------------------------------------------------------------------------------
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/*
 | 
					 | 
				
			||||||
uint8_t T_com::getAllPortPins(void)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    uint8_t rs232pins=0;
 | 
					 | 
				
			||||||
    rs232pins= uint8_t(CatSerial->pinoutSignals());
 | 
					 | 
				
			||||||
        // rs232pins: all signals bitwise coded in one byte:
 | 
					 | 
				
			||||||
        // readback output:  bit 0=TxD(=output)      bit2=DTR (=output)    bit 6=RTS (=output)
 | 
					 | 
				
			||||||
        // unused inputs:       bit1=RxD    bit 3=DCD    bit 5 = RING
 | 
					 | 
				
			||||||
        // handshake inputs:           bit 4=DSR (0x10)     bit 7=CTS (0x80)
 | 
					 | 
				
			||||||
    //qDebug()<<"serial port pins: " << rs232pins;
 | 
					 | 
				
			||||||
    return rs232pins;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
bool T_com::getHSin_CTS(void)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    // return the used Handshake IN (CTS, alt. DSR): true= high level (+8V)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    uint8_t rs232pins=0;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    rs232pins= uint8_t(CatSerial->pinoutSignals());
 | 
					 | 
				
			||||||
        // rs232pins: all signals bitwise coded in one byte:
 | 
					 | 
				
			||||||
        // readback output:  bit 0=TxD(=output)      bit2=DTR (=output)    bit 6=RTS (=output)
 | 
					 | 
				
			||||||
        // unused inputs:       bit1=RxD    bit 3=DCD    bit 5 = RING
 | 
					 | 
				
			||||||
        // handshake inputs:           bit 4=DSR (0x10)     bit 7=CTS (0x80)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    if (rs232pins & 0x80)   // CTS
 | 
					 | 
				
			||||||
        return true;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    return false;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
bool T_com::getHSin_DSR(void)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    uint8_t rs232pins=0;
 | 
					 | 
				
			||||||
    rs232pins= uint8_t(CatSerial->pinoutSignals());
 | 
					 | 
				
			||||||
    if (rs232pins & 0x10)   // DSR
 | 
					 | 
				
			||||||
        return true;
 | 
					 | 
				
			||||||
    return false;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
void T_com::incomingWake(void)       //(bool LevelOfTheBit)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    emit wasWokenBySerialHandshake();
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
bool T_com::setHSout_RTS(bool hsout)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    // hsout true=positiv voltage +12V  false= -12V
 | 
					 | 
				
			||||||
    // retval: true=setting OK
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    bool cc;
 | 
					 | 
				
			||||||
    // 10.5.19, am Windows-PC nachgemessen, funktioniert gut
 | 
					 | 
				
			||||||
    // false ergibt -12V    true ergibt +12V
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    cc=CatSerial->setRequestToSend(hsout);  // RTS out
 | 
					 | 
				
			||||||
            // retval true means "setting was successful"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    // alternative: use DTR as Handshake:
 | 
					 | 
				
			||||||
    //cc=CatSerial->setDataTerminalReady(false);     // DTR out
 | 
					 | 
				
			||||||
        // retval true means "setting was successful"
 | 
					 | 
				
			||||||
    //qDebug()<<"RTS " <<cc;
 | 
					 | 
				
			||||||
    return cc;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
bool T_com::setHSout_DTR(bool hsout)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    // hsout true=positiv voltage +12V  false= -12V
 | 
					 | 
				
			||||||
    // retval: true=setting OK
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    bool cc;
 | 
					 | 
				
			||||||
    // 10.5.19, am Windows-PC nachgemessen, funktioniert gut
 | 
					 | 
				
			||||||
    // false ergibt -12V    true ergibt +12V
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    cc=CatSerial->setDataTerminalReady(hsout);     // DTR out
 | 
					 | 
				
			||||||
        // retval true means "setting was successful"
 | 
					 | 
				
			||||||
    //qDebug()<<"DTR " <<cc;
 | 
					 | 
				
			||||||
    return cc;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
*/
 | 
					 | 
				
			||||||
@@ -1,326 +0,0 @@
 | 
				
			|||||||
#include <stdint.h>
 | 
					 | 
				
			||||||
#include <algorithm>
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#include <QString>
 | 
					 | 
				
			||||||
#include <QDebug>
 | 
					 | 
				
			||||||
#include "tslib.h"
 | 
					 | 
				
			||||||
#include "shared_mem_buffer.h"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// ///////////////////////////////////////////////////////////////////////////////////
 | 
					 | 
				
			||||||
//          control serial interface   gui <--> serial
 | 
					 | 
				
			||||||
// ///////////////////////////////////////////////////////////////////////////////////
 | 
					 | 
				
			||||||
void epi_setSerial(int BaudNr,
 | 
					 | 
				
			||||||
                   QString BaudStr,
 | 
					 | 
				
			||||||
                   QString ComName,
 | 
					 | 
				
			||||||
                   uint8_t connect) {
 | 
					 | 
				
			||||||
    memset(&SharedMemBuffer::getData()->rs.comportName[0], 0x00,
 | 
					 | 
				
			||||||
           sizeof(SharedMemBuffer::getData()->rs.comportName));
 | 
					 | 
				
			||||||
    strncpy(SharedMemBuffer::getData()->rs.comportName,
 | 
					 | 
				
			||||||
            ComName.toStdString().c_str(),
 | 
					 | 
				
			||||||
            sizeof(SharedMemBuffer::getData()->rs.comportName)-1);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    memset(&SharedMemBuffer::getData()->rs.baudStr[0], 0x00,
 | 
					 | 
				
			||||||
           sizeof(SharedMemBuffer::getData()->rs.baudStr));
 | 
					 | 
				
			||||||
    strncpy(SharedMemBuffer::getData()->rs.baudStr,
 | 
					 | 
				
			||||||
            BaudStr.toStdString().c_str(),
 | 
					 | 
				
			||||||
            sizeof(SharedMemBuffer::getData()->rs.baudStr)-1);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    SharedMemBuffer::getData()->rs.baudNr = BaudNr;
 | 
					 | 
				
			||||||
    SharedMemBuffer::getData()->rs.connect = connect;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
void epi_closeSerial(void) {
 | 
					 | 
				
			||||||
    SharedMemBuffer::getData()->rs.connect = 0;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
void gpi_serialChanged(void) {
 | 
					 | 
				
			||||||
    // serial confirms that port was closed or opened
 | 
					 | 
				
			||||||
    // rs_connect=2;   // Flanke, nur 1x öffnen/schließen
 | 
					 | 
				
			||||||
    SharedMemBuffer::getData()->rs.connect = 2;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
uint8_t gpi_getSerialConn(void) {
 | 
					 | 
				
			||||||
    return SharedMemBuffer::getDataConst()->rs.connect;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
int gpi_getBaudNr(void) {
 | 
					 | 
				
			||||||
    return SharedMemBuffer::getDataConst()->rs.baudNr;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
QString gpi_getComPortName(void) {
 | 
					 | 
				
			||||||
    return SharedMemBuffer::getDataConst()->rs.comportName;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
void gpi_serialIsOpen(bool offen) {
 | 
					 | 
				
			||||||
    SharedMemBuffer::getData()->rs.portIsOpen = offen;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
bool epi_isSerialPortOpen() {
 | 
					 | 
				
			||||||
    // true: port is open   false: port is closed
 | 
					 | 
				
			||||||
    return SharedMemBuffer::getDataConst()->rs.portIsOpen;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// ///////////////////////////////////////////////////////////////////////////////////
 | 
					 | 
				
			||||||
//          Control transfer   gui <--> serial
 | 
					 | 
				
			||||||
// ///////////////////////////////////////////////////////////////////////////////////
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
void epi_startEmmision(char start) {
 | 
					 | 
				
			||||||
    SharedMemBuffer::getData()->AutoEmissionOn = start;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
bool gpi_isEmmisionOn(void) {
 | 
					 | 
				
			||||||
    return SharedMemBuffer::getDataConst()->AutoEmissionOn;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
uint16_t gpi_getPeriodicSendTimeVal() {
 | 
					 | 
				
			||||||
    SharedMemBuffer::getData()->datif.sendingPer_changed = 0;
 | 
					 | 
				
			||||||
    if ((SharedMemBuffer::getDataConst()->datif.sendingPeriod < 3) ||
 | 
					 | 
				
			||||||
        (SharedMemBuffer::getDataConst()->datif.sendingPeriod > 10000)) {
 | 
					 | 
				
			||||||
        return 130;         // ms, default
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    return SharedMemBuffer::getDataConst()->datif.sendingPeriod;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
void epi_setPeriodicSendTimeVal(uint16_t val) {
 | 
					 | 
				
			||||||
    if (val>=3 && val<10000) {
 | 
					 | 
				
			||||||
        SharedMemBuffer::getData()->datif.sendingPer_changed = 1;
 | 
					 | 
				
			||||||
        SharedMemBuffer::getData()->datif.sendingPeriod = val;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
bool gpi_PeriodicSendTimeHasChanged() {
 | 
					 | 
				
			||||||
    return SharedMemBuffer::getDataConst()->datif.sendingPer_changed;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// ///////////////////////////////////////////////////////////////////////////////////
 | 
					 | 
				
			||||||
//          Status Display    gui <--> serial
 | 
					 | 
				
			||||||
// ///////////////////////////////////////////////////////////////////////////////////
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
//              linke Spalte, über Connect Button
 | 
					 | 
				
			||||||
static QString txt4comStateLine;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
QString epi_getTxt4comStateLine(void) {
 | 
					 | 
				
			||||||
    // GUI: get Text for serial Comport-State Line
 | 
					 | 
				
			||||||
    return txt4comStateLine;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
void gpi_setTxt4comStateLine(QString txtline) {
 | 
					 | 
				
			||||||
    // serial: write Text to be displayed in serial Comport-State line (like "connected")
 | 
					 | 
				
			||||||
    txt4comStateLine.clear();
 | 
					 | 
				
			||||||
    if (txtline=="")
 | 
					 | 
				
			||||||
        txt4comStateLine.clear();
 | 
					 | 
				
			||||||
    else
 | 
					 | 
				
			||||||
        txt4comStateLine=txtline;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
void epi_clrTxt4comStateLine() {
 | 
					 | 
				
			||||||
    txt4comStateLine.clear();
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// rechte Spalte, oberste Statuszeile
 | 
					 | 
				
			||||||
// I) "Handshakes" (serial Control)   flow.cpp
 | 
					 | 
				
			||||||
// geht überhaupt was raus? kommt überhaupt was zurück?
 | 
					 | 
				
			||||||
static QString txt4HsStateLine;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
QString epi_getTxt4HsStateLine(void) {
 | 
					 | 
				
			||||||
    return txt4HsStateLine;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
void gpi_setTxt4HsStateLine(QString txtline) {
 | 
					 | 
				
			||||||
    txt4HsStateLine.clear();
 | 
					 | 
				
			||||||
    if (txtline=="")
 | 
					 | 
				
			||||||
        txt4HsStateLine.clear();
 | 
					 | 
				
			||||||
    else
 | 
					 | 
				
			||||||
        txt4HsStateLine=txtline;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
void epi_clrTxt4HsStateLine() {
 | 
					 | 
				
			||||||
    txt4HsStateLine.clear();
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// II) Master receive state (empfangenes Telgramm OK? crc? length?  )
 | 
					 | 
				
			||||||
// Statuszeile Auswertung der SlaveResponse (serial Frame, CRC usw)  (prot.cpp)
 | 
					 | 
				
			||||||
static QString txt4masterStateLine;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
QString epi_getTxt4masterStateLine(void) {
 | 
					 | 
				
			||||||
    return txt4masterStateLine;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
void gpi_setTxt4masterStateLine(QString txtline) {
 | 
					 | 
				
			||||||
    txt4masterStateLine.clear();
 | 
					 | 
				
			||||||
    if (txtline=="")
 | 
					 | 
				
			||||||
        txt4masterStateLine.clear();
 | 
					 | 
				
			||||||
    else
 | 
					 | 
				
			||||||
        txt4masterStateLine=txtline;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
void epi_clrTxt4masterStateLine() {
 | 
					 | 
				
			||||||
    txt4masterStateLine.clear();
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
//---------------------------------------------------------------------------------------------
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// III   Slave receive (from Master) OK? if then show results, if not then show errors
 | 
					 | 
				
			||||||
// entweder Empfangsfehler anzeigen (crc? length?) oder result OUT-OK, OUT_ERR, IN_OK, IN_ERR
 | 
					 | 
				
			||||||
// Hintergrund: wenn der Slave Fehler im Master-Telegramm gefunden hat, dann kann er es auch
 | 
					 | 
				
			||||||
// nicht verwenden und nichts ausgeben oder einlesen
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
static QString txt4resultStateLine;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
QString epi_getTxt4resultStateLine(void) {
 | 
					 | 
				
			||||||
    return txt4resultStateLine;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
void gpi_setTxt4resultStateLine(QString txtline) {
 | 
					 | 
				
			||||||
    txt4resultStateLine.clear();
 | 
					 | 
				
			||||||
    if (txtline=="")
 | 
					 | 
				
			||||||
        txt4resultStateLine.clear();
 | 
					 | 
				
			||||||
    else
 | 
					 | 
				
			||||||
        txt4resultStateLine=txtline;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
void epi_clrTxt4resultStateLine() {
 | 
					 | 
				
			||||||
    txt4resultStateLine.clear();
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
//---------------------------------------------------------------------------------------------
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// IV  Statuszeile Empfangsdaten
 | 
					 | 
				
			||||||
static QString txt4dataLine;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
QString epi_getTxt4dataStateLine(void) {
 | 
					 | 
				
			||||||
    // GUI: get Text for serial Comport-State Line
 | 
					 | 
				
			||||||
    return txt4dataLine;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
void gpi_setTxt4dataStateLine(QString txtline) {
 | 
					 | 
				
			||||||
    // serial: write Text to be displayed in serial Comport-State line (like "connected")
 | 
					 | 
				
			||||||
    txt4dataLine.clear();
 | 
					 | 
				
			||||||
    if (txtline=="")
 | 
					 | 
				
			||||||
        txt4dataLine.clear();
 | 
					 | 
				
			||||||
    else
 | 
					 | 
				
			||||||
        txt4dataLine=txtline;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
void epi_clrTxt4dataStateLine() {
 | 
					 | 
				
			||||||
    txt4dataLine.clear();
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
//---------------------------------------------------------------------------------------------
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// 5. Zeile: Datif Ergebnis, Daten brauchbar?
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
static QString txt4datifReceive;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
QString epi_getTxt4datifLine(void) {
 | 
					 | 
				
			||||||
    return txt4datifReceive;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
void gpi_setTxt4datifLine(QString txtline) {
 | 
					 | 
				
			||||||
    txt4datifReceive.clear();
 | 
					 | 
				
			||||||
    if (txtline=="")
 | 
					 | 
				
			||||||
        txt4datifReceive.clear();
 | 
					 | 
				
			||||||
    else
 | 
					 | 
				
			||||||
        txt4datifReceive=txtline;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
void epi_clrTxt4datifLine() {
 | 
					 | 
				
			||||||
    txt4datifReceive.clear();
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
//---------------------------------------------------------------------------------------------
 | 
					 | 
				
			||||||
//---------------------------------------------------------------------------------------------
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
static QString txt4diagWindow;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
QString epi_getTxt4RsDiagWin(void) {
 | 
					 | 
				
			||||||
    return txt4diagWindow;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
void gpi_setTxt4RsDiagWin(QString txtline) {
 | 
					 | 
				
			||||||
    txt4diagWindow.clear();
 | 
					 | 
				
			||||||
    if (txtline=="")
 | 
					 | 
				
			||||||
        txt4diagWindow.clear();
 | 
					 | 
				
			||||||
    else
 | 
					 | 
				
			||||||
        txt4diagWindow=txtline;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
void epi_clrTxt4RsDiagWin() {
 | 
					 | 
				
			||||||
    txt4diagWindow.clear();
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
//---------------------------------------------------------------------------------------------
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
static QString sndTxt4diagWindow;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
QString epi_get2ndTxt4RsDiagWin(void) {
 | 
					 | 
				
			||||||
    return sndTxt4diagWindow;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
void gpi_set2ndTxt4RsDiagWin(QString txtline) {
 | 
					 | 
				
			||||||
    sndTxt4diagWindow.clear();
 | 
					 | 
				
			||||||
    if (txtline=="")
 | 
					 | 
				
			||||||
        sndTxt4diagWindow.clear();
 | 
					 | 
				
			||||||
    else
 | 
					 | 
				
			||||||
        sndTxt4diagWindow=txtline;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
void epi_clr2ndTxt4RsDiagWin() {
 | 
					 | 
				
			||||||
    sndTxt4diagWindow.clear();
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// ///////////////////////////////////////////////////////////////////////////////////
 | 
					 | 
				
			||||||
//          Memory for Slave responses, common data
 | 
					 | 
				
			||||||
// ///////////////////////////////////////////////////////////////////////////////////
 | 
					 | 
				
			||||||
void gpi_storeResult_serialTestOK(bool wasOk) {
 | 
					 | 
				
			||||||
    SharedMemBuffer::getData()->Sdata.serialTestResult = wasOk;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
bool epi_getResult_serialTestOK() {
 | 
					 | 
				
			||||||
    // retval: true: test was successful, got right response
 | 
					 | 
				
			||||||
    return SharedMemBuffer::getDataConst()->Sdata.serialTestResult;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// ///////////////////////////////////////////////////////////////////////////////////
 | 
					 | 
				
			||||||
//          Store received data for hwapi
 | 
					 | 
				
			||||||
// ///////////////////////////////////////////////////////////////////////////////////
 | 
					 | 
				
			||||||
void gpi_startNewRequest() {
 | 
					 | 
				
			||||||
    SharedMemBuffer::getData()->Sdata.pProtResultOk = 0;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
void gpi_storeResultOfLastRequest(bool answisok) {
 | 
					 | 
				
			||||||
    SharedMemBuffer::getData()->Sdata.pProtResultOk = answisok ? 1 : 2;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
uint8_t epi_getResultOfLastRequest() {
 | 
					 | 
				
			||||||
    // retval: 0: in progress  1: OK  2: error
 | 
					 | 
				
			||||||
    return SharedMemBuffer::getDataConst()->Sdata.pProtResultOk;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
void gpi_storeRecPayLoad(uint8_t RdDlen, uint8_t const *receivedData) {
 | 
					 | 
				
			||||||
    SharedMemBuffer::getData()->Sdata.receivedDataLength
 | 
					 | 
				
			||||||
        = std::min(RdDlen, (uint8_t)(64));
 | 
					 | 
				
			||||||
    memset((char *)(&SharedMemBuffer::getData()->Sdata.receivedDataBlock[0]),
 | 
					 | 
				
			||||||
           0x00, sizeof(SharedMemBuffer::getData()->Sdata.receivedDataBlock));
 | 
					 | 
				
			||||||
    strncpy((char *)(&SharedMemBuffer::getData()->Sdata.receivedDataBlock[0]),
 | 
					 | 
				
			||||||
            (char const *)receivedData,
 | 
					 | 
				
			||||||
            sizeof(SharedMemBuffer::getData()->Sdata.receivedDataBlock)-1);
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
uint16_t epi_getLastPayLoad(uint16_t plBufSiz, uint8_t *payLoad) {
 | 
					 | 
				
			||||||
    // get data back in *pl, max 64 byte
 | 
					 | 
				
			||||||
    // retval = nr of bytes received. If host buffer too small then
 | 
					 | 
				
			||||||
    // only plBufSíz bytes are copied to pl
 | 
					 | 
				
			||||||
    // plBufSíz=size of host buffer
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    uint16_t ml = std::min(plBufSiz, (uint16_t)(64));
 | 
					 | 
				
			||||||
    if (SharedMemBuffer::getDataConst()->Sdata.receivedDataLength < ml) {
 | 
					 | 
				
			||||||
        ml = SharedMemBuffer::getDataConst()->Sdata.receivedDataLength;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    strncpy((char *)payLoad,
 | 
					 | 
				
			||||||
            (char const *)(&SharedMemBuffer::getData()->Sdata.receivedDataBlock[0]),
 | 
					 | 
				
			||||||
            ml);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    return SharedMemBuffer::getDataConst()->Sdata.receivedDataLength;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							@@ -1,25 +0,0 @@
 | 
				
			|||||||
 | 
					 | 
				
			||||||
#include <stdint.h>
 | 
					 | 
				
			||||||
#include "hwChk.h"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
hwChk::hwChk(QWidget *parent) : QObject(parent)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
//    myDCIF = new T_prot();
 | 
					 | 
				
			||||||
// h: T_prot *myDCIF;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    //myDatif = new T_datif();
 | 
					 | 
				
			||||||
    HWaccess = new hwinf();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    struct T_moduleCondition dcModCond;
 | 
					 | 
				
			||||||
    sys_getDeviceConditions(dcModCond);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
hwChk::~hwChk()
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							@@ -1,764 +0,0 @@
 | 
				
			|||||||
#include "prot.h"
 | 
					 | 
				
			||||||
#include <QDebug>
 | 
					 | 
				
			||||||
#include "controlBus.h"
 | 
					 | 
				
			||||||
#include "dcBL.h"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
T_prot::T_prot()
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    mySerialPort = new T_com();
 | 
					 | 
				
			||||||
    connect(mySerialPort, SIGNAL(receivingFinished()), this, SLOT( analyseRecData() ));
 | 
					 | 
				
			||||||
    //connect(mySerialPort, SIGNAL(sendingFinished()), this, SLOT(sendeFin()));
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    for (int nn=0; nn<FRAME_DATALEN; nn++)
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
        chOut_Data[nn]=0;
 | 
					 | 
				
			||||||
        ui8OutputData[nn]=0;
 | 
					 | 
				
			||||||
        InputData[nn]=0;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    for (int nn=0; nn<BL_DATA_LEN; nn++)
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
        ui8BLsendData[nn]=0;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    WriteCommand=0;
 | 
					 | 
				
			||||||
    WriteAddr=0;
 | 
					 | 
				
			||||||
    WrDataLength=0;
 | 
					 | 
				
			||||||
    SendDataValid=0;
 | 
					 | 
				
			||||||
    kindOfData=0;
 | 
					 | 
				
			||||||
    slaveAddr=0;
 | 
					 | 
				
			||||||
    ReadCommand=0;
 | 
					 | 
				
			||||||
    ReadAddr=0;
 | 
					 | 
				
			||||||
    reserve =0;
 | 
					 | 
				
			||||||
    RecSlaveAddr =0;
 | 
					 | 
				
			||||||
    INdataValid=0;
 | 
					 | 
				
			||||||
    readSource =0;
 | 
					 | 
				
			||||||
    readAddress=0;
 | 
					 | 
				
			||||||
    RdDataLength=0;
 | 
					 | 
				
			||||||
    BLsendDataLength=0;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// ---------------------------------------------------------------------------------------------------------
 | 
					 | 
				
			||||||
// sending.....
 | 
					 | 
				
			||||||
// ---------------------------------------------------------------------------------------------------------
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
bool T_prot::isPortOpen(void)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    return mySerialPort->isPortOpen();
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
bool T_prot::isSerialFree(void)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    return true;           // ohne HS's kann er nicht blockiert sein
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
void T_prot::setRecLen(uint16_t WriteCmd)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    if (WriteCmd<100)
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
        RdDataLength=DATALEN_RECEIVE_LONG;      // store here already because it's no longer
 | 
					 | 
				
			||||||
                                                // returned from slave
 | 
					 | 
				
			||||||
        mySerialPort->receiveFixLen(TELEGRAMLEN_RECEIVE_LONG);
 | 
					 | 
				
			||||||
    } else
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
        RdDataLength=DATALEN_RECEIVE_FAST;
 | 
					 | 
				
			||||||
        mySerialPort->receiveFixLen(TELEGRAMLEN_RECEIVE_FAST);
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
void T_prot::setUserWriteData(uint16_t WriteCmd, uint16_t WrAddr, uint8_t  WrDatLen, uint8_t *data)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    WriteCommand=WriteCmd;
 | 
					 | 
				
			||||||
    WriteAddr=WrAddr;
 | 
					 | 
				
			||||||
    WrDataLength=WrDatLen;
 | 
					 | 
				
			||||||
    if (WrDataLength>FRAME_DATALEN)
 | 
					 | 
				
			||||||
        WrDataLength=FRAME_DATALEN;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    for (int nn=0; nn<WrDataLength; nn++)
 | 
					 | 
				
			||||||
        ui8OutputData[nn]=data[nn];
 | 
					 | 
				
			||||||
    SendDataValid=1;    // always set WR first
 | 
					 | 
				
			||||||
    kindOfData=0;    // 0: binaries, 1:text
 | 
					 | 
				
			||||||
    this->setRecLen(WriteCmd);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
void T_prot::setUserWriteData(uint16_t WriteCmd, uint16_t WrAddr)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    WriteCommand=WriteCmd;
 | 
					 | 
				
			||||||
    WriteAddr=WrAddr;
 | 
					 | 
				
			||||||
    WrDataLength=0;
 | 
					 | 
				
			||||||
    for (int nn=0; nn<FRAME_DATALEN; nn++)
 | 
					 | 
				
			||||||
        ui8OutputData[nn]=0;
 | 
					 | 
				
			||||||
    SendDataValid=1;    // always set WR first
 | 
					 | 
				
			||||||
    kindOfData=0;    // 0: binaries, 1:text
 | 
					 | 
				
			||||||
    this->setRecLen(WriteCmd);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
void T_prot::setUserWriteData(uint16_t WriteCmd)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    WriteCommand=WriteCmd;
 | 
					 | 
				
			||||||
    WriteAddr=0;
 | 
					 | 
				
			||||||
    WrDataLength=0;
 | 
					 | 
				
			||||||
    for (int nn=0; nn<FRAME_DATALEN; nn++)
 | 
					 | 
				
			||||||
        ui8OutputData[nn]=0;
 | 
					 | 
				
			||||||
    SendDataValid=1;    // always set WR first
 | 
					 | 
				
			||||||
    kindOfData=0;    // 0: binaries, 1:text
 | 
					 | 
				
			||||||
    this->setRecLen(WriteCmd);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
void T_prot::setUserWrite1DB(uint16_t WriteCmd, uint16_t WrAddr, uint8_t val)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    // wie oben, jedoch einfachere Datenübergabe
 | 
					 | 
				
			||||||
    WriteCommand=WriteCmd;
 | 
					 | 
				
			||||||
    WriteAddr=WrAddr;
 | 
					 | 
				
			||||||
    WrDataLength=1;
 | 
					 | 
				
			||||||
    ui8OutputData[0]=val;
 | 
					 | 
				
			||||||
    SendDataValid=1;    // always set WR first
 | 
					 | 
				
			||||||
    kindOfData=0;    // 0: binaries, 1:text
 | 
					 | 
				
			||||||
    this->setRecLen(WriteCmd);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
void T_prot::setUserWrite2DB(uint16_t WriteCmd, uint16_t WrAddr, uint8_t val0, uint8_t val1)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    WriteCommand=WriteCmd;
 | 
					 | 
				
			||||||
    WriteAddr=WrAddr;
 | 
					 | 
				
			||||||
    WrDataLength=2;
 | 
					 | 
				
			||||||
    ui8OutputData[0]=val0;
 | 
					 | 
				
			||||||
    ui8OutputData[1]=val1;
 | 
					 | 
				
			||||||
    SendDataValid=1;    // always set WR first
 | 
					 | 
				
			||||||
    kindOfData=0;    // 0: binaries, 1:text
 | 
					 | 
				
			||||||
    this->setRecLen(WriteCmd);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
void T_prot::setUserWriteText(uint16_t WriteCmd, uint16_t WrAddr, uint8_t  WrDatLen, char *data)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    WriteCommand=WriteCmd;
 | 
					 | 
				
			||||||
    WriteAddr=WrAddr;
 | 
					 | 
				
			||||||
    WrDataLength=WrDatLen;
 | 
					 | 
				
			||||||
    if (WrDataLength>FRAME_DATALEN)
 | 
					 | 
				
			||||||
        WrDataLength=FRAME_DATALEN;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    for (int nn=0; nn<WrDataLength; nn++)
 | 
					 | 
				
			||||||
        chOut_Data[nn]=data[nn];
 | 
					 | 
				
			||||||
    SendDataValid=1;    // always set WR first
 | 
					 | 
				
			||||||
    kindOfData=1;    // 0: binaries, 1:text
 | 
					 | 
				
			||||||
    this->setRecLen(WriteCmd);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
void T_prot::setUserReadData( uint16_t ReadCmd,  uint16_t RdAddr, uint16_t reserv)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    ReadCommand=ReadCmd;
 | 
					 | 
				
			||||||
    ReadAddr=RdAddr;
 | 
					 | 
				
			||||||
    reserve=reserv;  
 | 
					 | 
				
			||||||
    SendDataValid |=2;
 | 
					 | 
				
			||||||
    readAddress=RdAddr;    // store here already because it's no longer returned from slave
 | 
					 | 
				
			||||||
    readSource=ReadCmd;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
void T_prot::setUserReadData( uint16_t ReadCmd,  uint16_t RdAddr)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    ReadCommand=ReadCmd;
 | 
					 | 
				
			||||||
    ReadAddr=RdAddr;
 | 
					 | 
				
			||||||
    reserve=0;
 | 
					 | 
				
			||||||
    SendDataValid |=2;
 | 
					 | 
				
			||||||
    readAddress=RdAddr;    // store here already because it's no longer returned from slave
 | 
					 | 
				
			||||||
    readSource=ReadCmd;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
void T_prot::setUserReadData( uint16_t ReadCmd)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    ReadCommand=ReadCmd;
 | 
					 | 
				
			||||||
    ReadAddr=0;
 | 
					 | 
				
			||||||
    reserve=0;
 | 
					 | 
				
			||||||
    SendDataValid |=2;
 | 
					 | 
				
			||||||
    readAddress=0;    // store here already because it's no longer returned from slave
 | 
					 | 
				
			||||||
    readSource=ReadCmd;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
void T_prot::setBLsendData( uint8_t len, uint8_t *buf)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    for (int nn=0; nn<BL_DATA_LEN; nn++)
 | 
					 | 
				
			||||||
        ui8BLsendData[nn]=0;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    BLsendDataLength=len;
 | 
					 | 
				
			||||||
    if ( BLsendDataLength>BL_DATA_LEN) BLsendDataLength=BL_DATA_LEN;
 | 
					 | 
				
			||||||
    for (int nn=0; nn<BLsendDataLength; nn++)
 | 
					 | 
				
			||||||
        ui8BLsendData[nn]=buf[nn];
 | 
					 | 
				
			||||||
    WriteCommand=0xFFFF;
 | 
					 | 
				
			||||||
    this->setRecLen(100);   // how many??
 | 
					 | 
				
			||||||
    //readAddress=          // needed??
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    //qDebug()<<"prot: got BL data " << len << "bytes, ";
 | 
					 | 
				
			||||||
    //for (int i=0; i<len; ++i) {
 | 
					 | 
				
			||||||
    //    printf("%02x ", (unsigned char)buf[i]);
 | 
					 | 
				
			||||||
    //} printf("\n");
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    /*
 | 
					 | 
				
			||||||
qDebug()<<buf[0] <<buf[1] <<buf[2] <<buf[3] <<buf[4] <<buf[5] <<buf[6] <<buf[7];
 | 
					 | 
				
			||||||
qDebug() <<buf[8] <<buf[9] <<buf[10] <<buf[11] <<buf[12] <<buf[13]<<buf[14]<<buf[15];
 | 
					 | 
				
			||||||
qDebug() <<buf[16] <<buf[17] <<buf[18] <<buf[19] <<buf[20] <<buf[21]<<buf[22]<<buf[23];
 | 
					 | 
				
			||||||
qDebug() <<buf[24] <<buf[25] <<buf[26] <<buf[27] <<buf[28] <<buf[29]<<buf[30]<<buf[31];
 | 
					 | 
				
			||||||
qDebug() <<buf[32] <<buf[33] <<buf[34] <<buf[35] <<buf[36] <<buf[37]<<buf[38]<<buf[39];
 | 
					 | 
				
			||||||
qDebug() <<buf[40] <<buf[41] <<buf[42] <<buf[43] <<buf[44] <<buf[45]<<buf[46]<<buf[47];
 | 
					 | 
				
			||||||
qDebug() <<buf[48] <<buf[49] <<buf[50] <<buf[51] <<buf[52] <<buf[53] <<buf[54]<<buf[55];
 | 
					 | 
				
			||||||
qDebug() <<buf[56] <<buf[57] <<buf[58] <<buf[59] <<buf[60] <<buf[61] <<buf[62]<<buf[63];
 | 
					 | 
				
			||||||
qDebug() <<buf[64] <<buf[65] <<buf[66] <<buf[67] <<buf[68] <<buf[69] <<buf[70]<<buf[71];
 | 
					 | 
				
			||||||
qDebug() <<buf[72] <<buf[73] <<buf[74] <<buf[75] <<buf[76] <<buf[77] <<buf[78]<<buf[79];
 | 
					 | 
				
			||||||
*/
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
void T_prot::receiveFixLen(int64_t nrOfbytesToReceive)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    mySerialPort->receiveFixLen(nrOfbytesToReceive);
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
void T_prot::sendUserData(uint16_t slaveAdr)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    // man könnte hier noch "SendDataValid" abfragen,
 | 
					 | 
				
			||||||
    // muss immer 3 sein, muss man aber nicht
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    //qDebug()  << "prot send user data "<<slaveAdr;
 | 
					 | 
				
			||||||
    QByteArray  packBuf_2;
 | 
					 | 
				
			||||||
    slaveAddr=slaveAdr;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    if (WriteCommand==0xFFFF)
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
        // Bypass for bootloader, no protocol frame but send as is...
 | 
					 | 
				
			||||||
        packBuf_2.clear();
 | 
					 | 
				
			||||||
        for (int nn=0; nn<BLsendDataLength; nn++)
 | 
					 | 
				
			||||||
            packBuf_2[nn]=char(ui8BLsendData[nn]);        
 | 
					 | 
				
			||||||
        mySerialPort->writeToSerial(packBuf_2, BLsendDataLength);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    } else
 | 
					 | 
				
			||||||
        startFastPacking();     // quicker since 15.12.21TS
 | 
					 | 
				
			||||||
        //startPacking();
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
void T_prot::startFastPacking(void)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    uint16_t  mycrc;
 | 
					 | 
				
			||||||
    uint16_t  sendLen;
 | 
					 | 
				
			||||||
    uint8_t   uctmp, nn, pp, CrcLp;
 | 
					 | 
				
			||||||
    char      sendBuffer[FRAME_MAXLEN], ctmp;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    //qDebug()  << "prot start fast packing "<<slaveAddr;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    for (int nn=0; nn<FRAME_MAXLEN; nn++)
 | 
					 | 
				
			||||||
        sendBuffer[nn]=0;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    if (WriteCommand>9 && WriteCommand<100)
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
        // long command 10...99
 | 
					 | 
				
			||||||
        // WriteCommand==0 if only read request, then use short sending
 | 
					 | 
				
			||||||
        sendBuffer[0]=STARTSIGN_SEND_LONG;
 | 
					 | 
				
			||||||
        WrDataLength=DATALEN_SEND_LONG;    // immer
 | 
					 | 
				
			||||||
        //qDebug()  << "send long cmd, len: " << WrDataLength;
 | 
					 | 
				
			||||||
    } else
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
        // fast command
 | 
					 | 
				
			||||||
        sendBuffer[0]=STARTSIGN_SEND_FAST;
 | 
					 | 
				
			||||||
        WrDataLength=DATALEN_SEND_FAST;    // immer
 | 
					 | 
				
			||||||
        //qDebug()  << "send fast cmd, len: " << WrDataLength;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    sendBuffer[1]= uint8_t(WriteCommand);
 | 
					 | 
				
			||||||
    sendBuffer[2]= uint8_t(ReadCommand);
 | 
					 | 
				
			||||||
    if (WriteAddr>0)
 | 
					 | 
				
			||||||
        sendBuffer[3]= char(WriteAddr);  // bei fast nur EINE adresse, wr hat Vorrang
 | 
					 | 
				
			||||||
    else
 | 
					 | 
				
			||||||
        sendBuffer[3]= char(ReadAddr);
 | 
					 | 
				
			||||||
    // beim Fast prot. ist das reserve dann ists egal was drin steht
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    if (kindOfData)   // 0: binaries, 1:text
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
        for (nn=0; nn<WrDataLength; nn++)
 | 
					 | 
				
			||||||
        {
 | 
					 | 
				
			||||||
            pp=HEADERLEN_SEND+nn;
 | 
					 | 
				
			||||||
            ctmp=(chOut_Data[nn]);      // text
 | 
					 | 
				
			||||||
            sendBuffer[pp]= char(ctmp);
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    } else
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
        for (nn=0; nn<WrDataLength; nn++)
 | 
					 | 
				
			||||||
        {
 | 
					 | 
				
			||||||
            pp=HEADERLEN_SEND+nn;
 | 
					 | 
				
			||||||
            uctmp=(ui8OutputData[nn]);      // bin
 | 
					 | 
				
			||||||
            sendBuffer[pp]= char(uctmp);
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    CrcLp= HEADERLEN_SEND + WrDataLength;
 | 
					 | 
				
			||||||
    mycrc=0;
 | 
					 | 
				
			||||||
    for (nn=0; nn<CrcLp; nn++)
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
        uctmp=sendBuffer[nn];
 | 
					 | 
				
			||||||
        mycrc+=uint16_t(uctmp);
 | 
					 | 
				
			||||||
        //qDebug() << mycrc;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    sendBuffer[CrcLp]=char(mycrc);
 | 
					 | 
				
			||||||
    mycrc>>=8;
 | 
					 | 
				
			||||||
    sendBuffer[CrcLp+1]=char(mycrc);
 | 
					 | 
				
			||||||
    sendLen=CrcLp+2;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    // send to VCP:
 | 
					 | 
				
			||||||
    QByteArray  packBuff;
 | 
					 | 
				
			||||||
    packBuff.clear();
 | 
					 | 
				
			||||||
    packBuff.append(sendBuffer, sendLen);  // ohne sendLen wird beim ersten \0 abgeschnitten!!!
 | 
					 | 
				
			||||||
    mySerialPort->writeToSerial(packBuff, sendLen);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/*
 | 
					 | 
				
			||||||
void T_prot::startPacking(void)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    uint16_t  mycrc;
 | 
					 | 
				
			||||||
    uint16_t  uitmp, sendLen;
 | 
					 | 
				
			||||||
    uint8_t   uctmp, nn, pp, CrcLp;
 | 
					 | 
				
			||||||
    char     sendBuffer[FRAME_MAXLEN], ctmp;
 | 
					 | 
				
			||||||
    
 | 
					 | 
				
			||||||
    //qDebug()  << "prot start packing "<<slaveAddr;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    for (int nn=0; nn<FRAME_MAXLEN; nn++)
 | 
					 | 
				
			||||||
        sendBuffer[nn]=0;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    sendBuffer[0]='>';
 | 
					 | 
				
			||||||
    uitmp=slaveAddr;
 | 
					 | 
				
			||||||
    sendBuffer[1]= char(uitmp);
 | 
					 | 
				
			||||||
    uitmp>>=8;
 | 
					 | 
				
			||||||
    sendBuffer[2]= char(uitmp);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    uitmp=WriteCommand;
 | 
					 | 
				
			||||||
    sendBuffer[3]= char(uitmp);
 | 
					 | 
				
			||||||
    uitmp>>=8;
 | 
					 | 
				
			||||||
    sendBuffer[4]= char(uitmp);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    uitmp=WriteAddr;
 | 
					 | 
				
			||||||
    sendBuffer[5]= char(uitmp);
 | 
					 | 
				
			||||||
    uitmp>>=8;
 | 
					 | 
				
			||||||
    sendBuffer[6]= char(uitmp);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    uitmp=ReadCommand;
 | 
					 | 
				
			||||||
    sendBuffer[7]= char(uitmp);
 | 
					 | 
				
			||||||
    uitmp>>=8;
 | 
					 | 
				
			||||||
    sendBuffer[8]= char(uitmp);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    uitmp=ReadAddr;
 | 
					 | 
				
			||||||
    sendBuffer[9]= char(uitmp);
 | 
					 | 
				
			||||||
    uitmp>>=8;
 | 
					 | 
				
			||||||
    sendBuffer[10]= char(uitmp);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    uitmp=reserve;
 | 
					 | 
				
			||||||
    sendBuffer[11]= '-';    //char(uitmp);
 | 
					 | 
				
			||||||
    uitmp>>=8;
 | 
					 | 
				
			||||||
    sendBuffer[12]= '-';    //char(uitmp);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    sendBuffer[13]= char(WrDataLength);
 | 
					 | 
				
			||||||
    CrcLp= 14 + WrDataLength;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    if (kindOfData)   // 0: binaries, 1:text
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
        for (nn=0; nn<WrDataLength; nn++)
 | 
					 | 
				
			||||||
        {
 | 
					 | 
				
			||||||
            pp=14+nn;
 | 
					 | 
				
			||||||
            ctmp=(chOut_Data[nn]);
 | 
					 | 
				
			||||||
            sendBuffer[pp]= ctmp;
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    } else
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
        for (nn=0; nn<WrDataLength; nn++)
 | 
					 | 
				
			||||||
        {
 | 
					 | 
				
			||||||
            pp=14+nn;
 | 
					 | 
				
			||||||
            uctmp=(ui8OutputData[nn]);
 | 
					 | 
				
			||||||
            sendBuffer[pp]= char(uctmp);
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    mycrc=0;
 | 
					 | 
				
			||||||
    for (nn=0; nn<CrcLp; nn++)
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
        uctmp=sendBuffer[nn];
 | 
					 | 
				
			||||||
        mycrc+=uint16_t(uctmp);
 | 
					 | 
				
			||||||
        //qDebug() << mycrc;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    sendBuffer[CrcLp]=char(mycrc);
 | 
					 | 
				
			||||||
    mycrc>>=8;
 | 
					 | 
				
			||||||
    sendBuffer[CrcLp+1]=char(mycrc);
 | 
					 | 
				
			||||||
    sendLen=CrcLp+2;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    sendBuffer[CrcLp+2]=13;
 | 
					 | 
				
			||||||
    sendBuffer[CrcLp+3]=10;
 | 
					 | 
				
			||||||
    sendLen+=2;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    // send to VCP:
 | 
					 | 
				
			||||||
    QByteArray  packBuff;
 | 
					 | 
				
			||||||
    packBuff.clear();
 | 
					 | 
				
			||||||
    packBuff.append(sendBuffer, sendLen);  // ohne sendLen wird beim ersten \0 abgeschnitten!!!
 | 
					 | 
				
			||||||
    mySerialPort->writeToSerial(packBuff, sendLen);
 | 
					 | 
				
			||||||
    // void T_com::writeToSerial(const QByteArray &data, uint16_t sendLength)
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
*/
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// ---------------------------------------------------------------------------------------------------------
 | 
					 | 
				
			||||||
// receiving.....
 | 
					 | 
				
			||||||
// ---------------------------------------------------------------------------------------------------------
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
void T_prot::analyseRecData(void)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    // Aufruf per connect aus serialcontrol wenn Daten empfangen wurden
 | 
					 | 
				
			||||||
    // getRecData(QByteArray &data, uint16_t &sendLength);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    QByteArray Indata;
 | 
					 | 
				
			||||||
    QString myString, tempStr;
 | 
					 | 
				
			||||||
//char recBuffer[FRAME_MAXLEN];
 | 
					 | 
				
			||||||
uint8_t recBuffer[FRAME_MAXLEN];
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    uint16_t recLength;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    INdataValid=false;
 | 
					 | 
				
			||||||
    gpi_setTxt4HsStateLine("");
 | 
					 | 
				
			||||||
    gpi_setTxt4masterStateLine("");
 | 
					 | 
				
			||||||
    gpi_setTxt4resultStateLine("");
 | 
					 | 
				
			||||||
    gpi_setTxt4dataStateLine("");
 | 
					 | 
				
			||||||
    gpi_setTxt4datifLine("");
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    // read from "VCP":
 | 
					 | 
				
			||||||
    mySerialPort->readFromSerial(Indata, recLength);
 | 
					 | 
				
			||||||
//qDebug()<<"prot: got data " << recLength;
 | 
					 | 
				
			||||||
    if (recLength>FRAME_MAXLEN)
 | 
					 | 
				
			||||||
        recLength=FRAME_MAXLEN;
 | 
					 | 
				
			||||||
    for (int nn=0; nn<recLength; nn++)
 | 
					 | 
				
			||||||
        recBuffer[nn]=uint8_t(Indata[nn]);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    myString.clear();
 | 
					 | 
				
			||||||
    tempStr.clear();
 | 
					 | 
				
			||||||
    //uint8_t result=FramecheckInData(recBuffer, recLength);  // check input data (response from slave)
 | 
					 | 
				
			||||||
    uint8_t result=FastCheckInData(recBuffer, recLength);  // check input data (response from slave)
 | 
					 | 
				
			||||||
    if (result>0)
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
        // dann anzeige
 | 
					 | 
				
			||||||
        switch (result)
 | 
					 | 
				
			||||||
        {
 | 
					 | 
				
			||||||
          case 1: gpi_setTxt4masterStateLine("wrong length received"); break;
 | 
					 | 
				
			||||||
          case 2: gpi_setTxt4masterStateLine("wrong start sign received"); break;
 | 
					 | 
				
			||||||
          case 3: gpi_setTxt4masterStateLine("received datalen too big"); break;
 | 
					 | 
				
			||||||
          case 4: gpi_setTxt4masterStateLine("wrong data len received"); break;
 | 
					 | 
				
			||||||
          case 5: gpi_setTxt4masterStateLine("wrong crc received"); break;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
        myString.setNum(result);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        // Daten abspeichern, könnten vom BL sein:
 | 
					 | 
				
			||||||
        gpi_storeRawReceivedData(uint8_t(recLength), recBuffer);
 | 
					 | 
				
			||||||
        emit rawDataRecieved();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    } else
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
        //& result ==0
 | 
					 | 
				
			||||||
        gpi_setTxt4masterStateLine("slave response OK");
 | 
					 | 
				
			||||||
        // Daten OK, also prüfe Inhalt.
 | 
					 | 
				
			||||||
        // Konnte der Slave das Master-Command verwenden oder hatte es Fehler?
 | 
					 | 
				
			||||||
        // konnte der Slave die geforderten Daten ausgeben (DOs, AOs)?
 | 
					 | 
				
			||||||
        // konnte der Slave die geforderten Daten einlesen (AIs, DIs)?
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        //CheckInResult(recBuffer);    // Ergebnisse des Slaves anzeigen
 | 
					 | 
				
			||||||
            // stimmt nicht mehr bei FastProt
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        ShowFastInData(recBuffer);    // Eingangs-Daten des Slaves anzeigen
 | 
					 | 
				
			||||||
     }
 | 
					 | 
				
			||||||
    emit framerecieved();
 | 
					 | 
				
			||||||
    //qDebug() << "framereceived emitted";
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
uint8_t T_prot::FastCheckInData(uint8_t *Inbuf, uint16_t LL)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    uint16_t rawInLen=LL, crcL_Addr, recCrc, myCrc, nn, datalen, nxt;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    if (Inbuf[0]!=STARTSIGN_RECEIVE_FAST && Inbuf[0]!=STARTSIGN_RECEIVE_LONG)
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
        //qDebug() << "prot: got wrong start sign: " << Inbuf[0];
 | 
					 | 
				
			||||||
        return 2;       // wrong start sign
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    if ( (rawInLen<TELEGRAMLEN_RECEIVE_FAST && Inbuf[0]==STARTSIGN_RECEIVE_FAST) ||
 | 
					 | 
				
			||||||
         (rawInLen<TELEGRAMLEN_RECEIVE_LONG && Inbuf[0]==STARTSIGN_RECEIVE_LONG)   )
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
        //qDebug("prot: got %d bytes only", rawInLen);
 | 
					 | 
				
			||||||
        return 1;       // wrong length
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    if (Inbuf[0]==0x5F)
 | 
					 | 
				
			||||||
        datalen=DATALEN_RECEIVE_FAST;
 | 
					 | 
				
			||||||
    else
 | 
					 | 
				
			||||||
        datalen=DATALEN_RECEIVE_LONG;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    crcL_Addr=datalen+HEADERLEN_RECEIVE;  // weil im definierten protocol 2 bytes vor den Daten stehen
 | 
					 | 
				
			||||||
    recCrc=0;
 | 
					 | 
				
			||||||
    recCrc=uchar2uint(uint8_t(Inbuf[crcL_Addr+1]), uint8_t(Inbuf[crcL_Addr]));
 | 
					 | 
				
			||||||
    myCrc=0;
 | 
					 | 
				
			||||||
    for (nn=0; nn<crcL_Addr; nn++)
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
        nxt=uint16_t (Inbuf[nn]);
 | 
					 | 
				
			||||||
        nxt &=0x00FF;   // the casting makes 0xFFFF out of 0xFF !!!!!!!!!
 | 
					 | 
				
			||||||
        myCrc+=nxt;
 | 
					 | 
				
			||||||
        //qDebug("CRC: nxt: %d  sum: %d", nxt, myCrc);
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    if (myCrc != recCrc)
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
        //qDebug() << "crc does not match:   mycrc=" << myCrc<< "   receivedCRC=" << recCrc;
 | 
					 | 
				
			||||||
        //qDebug("calculated over %d bytes", crcL_Addr);
 | 
					 | 
				
			||||||
        return 5;       // crc wrong
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    return 0;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/*
 | 
					 | 
				
			||||||
uint8_t T_prot::FramecheckInData(uint8_t *Inbuf, uint16_t LL)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    uint16_t rawInLen=LL, crcL_Addr, recCrc, myCrc, nn, datalen, nxt;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    if (rawInLen<12)
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
        qDebug("prot: got %d bytes only", rawInLen);
 | 
					 | 
				
			||||||
        return 1;       // wrong length
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    if ( Inbuf[0] != '<')
 | 
					 | 
				
			||||||
        return 2;       // wrong start sign
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    datalen=uint16_t(Inbuf[9]);
 | 
					 | 
				
			||||||
    if ( datalen > FRAME_DATALEN)  //[9]=reported data lenght
 | 
					 | 
				
			||||||
        return 3;       // reported datalen too big
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    if ((datalen !=(rawInLen-12)) && (datalen !=(rawInLen-13)) && (datalen !=(rawInLen-14)) )
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
        // angehängtes CR und/oder LF tolerieren
 | 
					 | 
				
			||||||
        qDebug() << "wrong data length, " << datalen << " " << rawInLen;
 | 
					 | 
				
			||||||
        return 4;       // data len does not match to complete length
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    crcL_Addr=datalen+10;  // weil im definierten protocol 10 bytes vor den Daten stehen
 | 
					 | 
				
			||||||
    recCrc=0;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    recCrc=uchar2uint(uint8_t(Inbuf[crcL_Addr+1]), uint8_t(Inbuf[crcL_Addr]));
 | 
					 | 
				
			||||||
    myCrc=0;
 | 
					 | 
				
			||||||
    for (nn=0; nn<crcL_Addr; nn++)
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
        nxt=uint16_t (Inbuf[nn]);
 | 
					 | 
				
			||||||
        nxt &=0x00FF;   // the casting makes 0xFFFF out of 0xFF !!!!!!!!!
 | 
					 | 
				
			||||||
        myCrc+=nxt;
 | 
					 | 
				
			||||||
        //qDebug("CRC: nxt: %d  sum: %d", nxt, myCrc);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    if (myCrc != recCrc)
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
        qDebug() << "crc does not match:   mycrc=" << myCrc<< "   receivedCRC=" << recCrc;
 | 
					 | 
				
			||||||
        qDebug("calculated over %d bytes", crcL_Addr);
 | 
					 | 
				
			||||||
        return 5;       // crc wrong
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    return 0;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
*/
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
uint8_t T_prot::CheckInResult(uint8_t *Inbuf)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    char slaveresult;
 | 
					 | 
				
			||||||
    QString myString=nullptr, tempStr=nullptr;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    // slave results anzeigen
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    slaveresult=Inbuf[2];    // hier steht das "Command Result" des slaves,
 | 
					 | 
				
			||||||
                            // d.h das Ergebnis der Protokol-Prüfung (Master->Slave)
 | 
					 | 
				
			||||||
    switch (slaveresult)
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
//        received message (from master) analysis:
 | 
					 | 
				
			||||||
//        0: got valid request
 | 
					 | 
				
			||||||
// this errors can only come back from a single device (not bus)
 | 
					 | 
				
			||||||
// or from a bus slave in local mode
 | 
					 | 
				
			||||||
//        1: wrong start     2: wrong length
 | 
					 | 
				
			||||||
//        3: wrong crc       4: wrong addr
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        case 1: gpi_setTxt4resultStateLine("slave got wrong start sign"); break;
 | 
					 | 
				
			||||||
        case 2: gpi_setTxt4resultStateLine("slave got wrong length"); break;
 | 
					 | 
				
			||||||
        case 3: gpi_setTxt4resultStateLine("slave got wrong crc"); break;
 | 
					 | 
				
			||||||
        case 4: gpi_setTxt4resultStateLine("slave got wrong addr"); break;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        case 10: gpi_setTxt4resultStateLine("slave is in local mode"); break;
 | 
					 | 
				
			||||||
        case 13: gpi_setTxt4resultStateLine("local mode with wrong crc"); break;
 | 
					 | 
				
			||||||
        case 14: gpi_setTxt4resultStateLine("local mode with wrong addr"); break;
 | 
					 | 
				
			||||||
           // wenn 1..4 dann konnte der Slave das Mastertelegramm gar nicht verwenden, also hier Stoppen
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    if (slaveresult>0 && slaveresult<10)
 | 
					 | 
				
			||||||
        return 1;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    // Slave hat gültiges Kommando empfangen:
 | 
					 | 
				
			||||||
    // 2.result auswerten:
 | 
					 | 
				
			||||||
    // recBuffer[3];   // Write result, d.h. Ergebnis des Schreibvorganges (z.B. DOs) des Slaves
 | 
					 | 
				
			||||||
    // recBuffer[4];   // Read result, d.h. Ergebnis des Lesevorganges (z.B. DIs) des Slaves
 | 
					 | 
				
			||||||
    // bisher nicht bekannt welche Fehlercodes es gibt, also den code direkt ausgeben.
 | 
					 | 
				
			||||||
    // bisher bekannt: 0=OK
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    myString.clear();
 | 
					 | 
				
			||||||
    myString = "Slave OUT and IN Result: ";
 | 
					 | 
				
			||||||
    tempStr.setNum(Inbuf[3],16);
 | 
					 | 
				
			||||||
    myString.append(tempStr);
 | 
					 | 
				
			||||||
    myString.append(" ");
 | 
					 | 
				
			||||||
    tempStr.setNum(Inbuf[4],16);
 | 
					 | 
				
			||||||
    myString.append(tempStr);
 | 
					 | 
				
			||||||
    gpi_setTxt4resultStateLine(myString);
 | 
					 | 
				
			||||||
    return 0;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
uint8_t T_prot::ShowFastInData(uint8_t *recBuffer)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    QString myString=nullptr, tempStr=nullptr;
 | 
					 | 
				
			||||||
    uint8_t result;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    RecSlaveAddr=0;
 | 
					 | 
				
			||||||
    result=recBuffer[1];    // total result
 | 
					 | 
				
			||||||
    result &=0x60;          // only read result (bit 5,6)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    if (result==0)     // read result =OK,
 | 
					 | 
				
			||||||
                       // dann sind die Eingangsdaten gültig
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
        myString.append("valid INdata: ");
 | 
					 | 
				
			||||||
        INdataValid=true;
 | 
					 | 
				
			||||||
        //readSource   already set with sending
 | 
					 | 
				
			||||||
        readAddress=0;
 | 
					 | 
				
			||||||
        // RdDataLength already set with sending
 | 
					 | 
				
			||||||
        if (RdDataLength>FRAME_DATALEN)
 | 
					 | 
				
			||||||
            RdDataLength=FRAME_DATALEN;
 | 
					 | 
				
			||||||
        for (int ii=0; ii<RdDataLength; ii++)
 | 
					 | 
				
			||||||
            InputData[ii]=uint8_t(recBuffer[ii+HEADERLEN_RECEIVE]);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        tempStr.setNum(readSource,16);
 | 
					 | 
				
			||||||
        myString.append(tempStr);
 | 
					 | 
				
			||||||
        myString.append(" add:");
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        tempStr.setNum(readAddress);
 | 
					 | 
				
			||||||
        myString.append(tempStr);
 | 
					 | 
				
			||||||
        //myString.append(" wakeSrc:");
 | 
					 | 
				
			||||||
        //tempStr.setNum(lastWakeSrc);
 | 
					 | 
				
			||||||
        //myString.append(tempStr);
 | 
					 | 
				
			||||||
        myString.append(" Dlen:");
 | 
					 | 
				
			||||||
        tempStr.setNum(RdDataLength);
 | 
					 | 
				
			||||||
        myString.append(tempStr);        
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    } else
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
        myString=" ";   // Eingangsdaten nicht gültig, sieht man aber weiter oben schon
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    gpi_setTxt4dataStateLine(myString);
 | 
					 | 
				
			||||||
    //qDebug() << myString;
 | 
					 | 
				
			||||||
    //qDebug("prot_checkInData_bindata: %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d ",
 | 
					 | 
				
			||||||
    //        InputData[0], InputData[1], InputData[2], InputData[3],
 | 
					 | 
				
			||||||
    //        InputData[4], InputData[5], InputData[6], InputData[7],
 | 
					 | 
				
			||||||
    //        InputData[8], InputData[9], InputData[10], InputData[11],
 | 
					 | 
				
			||||||
    //        InputData[12], InputData[13], InputData[14], InputData[15]);
 | 
					 | 
				
			||||||
    return 0;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/*
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
uint8_t T_prot::ShowInData(uint8_t *recBuffer)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    QString myString=nullptr, tempStr=nullptr;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    RecSlaveAddr=recBuffer[1];
 | 
					 | 
				
			||||||
    if (recBuffer[2]==0 && recBuffer[4]==0)     // comand result=OK und read result =OK,
 | 
					 | 
				
			||||||
                                                // dann sind die Eingangsdaten gültig
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
        myString.append("valid INdata: ");
 | 
					 | 
				
			||||||
        INdataValid=true;
 | 
					 | 
				
			||||||
        readSource=uchar2uint(recBuffer[6],recBuffer[5]);
 | 
					 | 
				
			||||||
        readAddress=uchar2uint(recBuffer[8],recBuffer[7]);
 | 
					 | 
				
			||||||
        //lastWakeSrc=uint8_t(recBuffer[4]);
 | 
					 | 
				
			||||||
        RdDataLength=uint8_t(recBuffer[9]);
 | 
					 | 
				
			||||||
        if (RdDataLength>FRAME_DATALEN)
 | 
					 | 
				
			||||||
            RdDataLength=FRAME_DATALEN;
 | 
					 | 
				
			||||||
        for (int ii=0; ii<RdDataLength; ii++)
 | 
					 | 
				
			||||||
            InputData[ii]=uint8_t(recBuffer[ii+10]);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        tempStr.setNum(readSource,16);
 | 
					 | 
				
			||||||
        myString.append(tempStr);
 | 
					 | 
				
			||||||
        myString.append(" add:");
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        tempStr.setNum(readAddress);
 | 
					 | 
				
			||||||
        myString.append(tempStr);
 | 
					 | 
				
			||||||
        //myString.append(" wakeSrc:");
 | 
					 | 
				
			||||||
        //tempStr.setNum(lastWakeSrc);
 | 
					 | 
				
			||||||
        //myString.append(tempStr);
 | 
					 | 
				
			||||||
        myString.append(" Dlen:");
 | 
					 | 
				
			||||||
        tempStr.setNum(RdDataLength);
 | 
					 | 
				
			||||||
        myString.append(tempStr);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    } else
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
        myString=" ";   // Eingangsdaten nicht gültig, sieht man aber weiter oben schon
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    gpi_setTxt4dataStateLine(myString);
 | 
					 | 
				
			||||||
    //qDebug() << myString;
 | 
					 | 
				
			||||||
    //qDebug("prot_checkInData_bindata: %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d ",
 | 
					 | 
				
			||||||
    //        InputData[0], InputData[1], InputData[2], InputData[3],
 | 
					 | 
				
			||||||
    //        InputData[4], InputData[5], InputData[6], InputData[7],
 | 
					 | 
				
			||||||
    //        InputData[8], InputData[9], InputData[10], InputData[11],
 | 
					 | 
				
			||||||
    //        InputData[12], InputData[13], InputData[14], InputData[15]);
 | 
					 | 
				
			||||||
    return 0;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
*/
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
bool T_prot::ifDataReceived()
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    return  INdataValid;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
bool T_prot::getReceivedInData(uint8_t  *SlavAddr, uint16_t *readSrc, uint16_t *readAddr,
 | 
					 | 
				
			||||||
                                    uint8_t  *RdDlen, uint8_t *receivedData)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    uint8_t nn;
 | 
					 | 
				
			||||||
    *SlavAddr=RecSlaveAddr;
 | 
					 | 
				
			||||||
    *readSrc=readSource;        // diese (Eingangs-)Daten stehen im Puffer
 | 
					 | 
				
			||||||
    *readAddr=readAddress;       // von dieser Adr wurden die Daten gelesen
 | 
					 | 
				
			||||||
    //*lastWakSourc=lastWakeSrc;       // falls der Slave den Master geweckt hat
 | 
					 | 
				
			||||||
    *RdDlen=RdDataLength;
 | 
					 | 
				
			||||||
    for (nn=0; nn<FRAME_DATALEN; nn++)
 | 
					 | 
				
			||||||
        receivedData[nn]=0;
 | 
					 | 
				
			||||||
    for (nn=0; nn<RdDataLength; nn++)
 | 
					 | 
				
			||||||
        receivedData[nn]=InputData[nn];
 | 
					 | 
				
			||||||
    return INdataValid;           // nur true wenn CommandState OK und readState OK
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
@@ -1,704 +0,0 @@
 | 
				
			|||||||
#include <stdint.h>
 | 
					 | 
				
			||||||
#include <QString>
 | 
					 | 
				
			||||||
#include <QDebug>
 | 
					 | 
				
			||||||
#include "tslib.h"
 | 
					 | 
				
			||||||
#include "sendWRcmd.h"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
void indat_PrnPwr(void);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
void sendWRcmd_INI(void)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    sendWRcmd_clrCmdStack();
 | 
					 | 
				
			||||||
    sendWRcmd_clrCmd4Stack();
 | 
					 | 
				
			||||||
    sendFDcmd_clrStack();
 | 
					 | 
				
			||||||
    longFDcmd_clrStack();
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// Command Stack for commands without parameters
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
static uint16_t nextAsynchsendCmd0[CMDSTACKDEPTH];
 | 
					 | 
				
			||||||
static uint8_t  nrOfCmdsInQueue;
 | 
					 | 
				
			||||||
/* convention: use simple (not rotating) FIFO Stack:
 | 
					 | 
				
			||||||
Example: nrOfCmdsInQueue=4 then
 | 
					 | 
				
			||||||
    nextAsynchsendCmd0[0]=cmd1      // was stored as first
 | 
					 | 
				
			||||||
    nextAsynchsendCmd0[1]=cmd2
 | 
					 | 
				
			||||||
    nextAsynchsendCmd0[2]=cmd3
 | 
					 | 
				
			||||||
    nextAsynchsendCmd0[3]=cmd4      // came in as last
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    Send: [0] first, then move buffer 1 down:
 | 
					 | 
				
			||||||
    nextAsynchsendCmd0[0]=cmd2
 | 
					 | 
				
			||||||
    nextAsynchsendCmd0[1]=cmd3
 | 
					 | 
				
			||||||
    nextAsynchsendCmd0[2]=cmd4
 | 
					 | 
				
			||||||
    nextAsynchsendCmd0[3]=0;
 | 
					 | 
				
			||||||
    nrOfCmdsInQueue=3 now
 | 
					 | 
				
			||||||
*/
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
void sendWRcmd_clrCmdStack(void)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    uint8_t nn;
 | 
					 | 
				
			||||||
    for (nn=0; nn<CMDSTACKDEPTH; nn++)
 | 
					 | 
				
			||||||
        nextAsynchsendCmd0[nn]=0;
 | 
					 | 
				
			||||||
    nrOfCmdsInQueue=0;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
bool sendWRcmd_setSendCommand0(uint16_t nextCmd)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    // write Command to memory, wait for transport
 | 
					 | 
				
			||||||
    if (nrOfCmdsInQueue>=CMDSTACKDEPTH)
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
        qDebug() << "cannot save cmd because stack is full";
 | 
					 | 
				
			||||||
        return false;           // not possible
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    nextAsynchsendCmd0[nrOfCmdsInQueue++]=nextCmd;
 | 
					 | 
				
			||||||
    //qDebug() << "PI cmd queued:"<< nextCmd << ", saved, pp=" << nrOfCmdsInQueue;
 | 
					 | 
				
			||||||
    return true;                // ok, will be sent
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
uint16_t sendWRcmd_getSendCommand0(void)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    uint16_t nxtAsynchCmd;
 | 
					 | 
				
			||||||
    uint8_t nn, ll;
 | 
					 | 
				
			||||||
    if (nrOfCmdsInQueue==0 || nrOfCmdsInQueue>CMDSTACKDEPTH)
 | 
					 | 
				
			||||||
        return 0;   // error
 | 
					 | 
				
			||||||
    nxtAsynchCmd=nextAsynchsendCmd0[0];
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    // move Puffer down by one element
 | 
					 | 
				
			||||||
    if (CMDSTACKDEPTH>0)
 | 
					 | 
				
			||||||
        ll=CMDSTACKDEPTH-1;
 | 
					 | 
				
			||||||
    else
 | 
					 | 
				
			||||||
        ll=0;
 | 
					 | 
				
			||||||
    for (nn=0; nn<ll; nn++)
 | 
					 | 
				
			||||||
        nextAsynchsendCmd0[nn]=nextAsynchsendCmd0[nn+1];
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    if (nrOfCmdsInQueue>0)
 | 
					 | 
				
			||||||
        nrOfCmdsInQueue--;
 | 
					 | 
				
			||||||
    //qDebug() << "PI cmd queued:"<< nxtAsynchCmd << ", restored, pp now =" << nrOfCmdsInQueue;
 | 
					 | 
				
			||||||
    return nxtAsynchCmd;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
//---------------------------------------------------------------------------------------------------------------------
 | 
					 | 
				
			||||||
//---------------------------------------------------------------------------------------------------------------------
 | 
					 | 
				
			||||||
// Command Stack for commands with 4 parameters
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
static uint16_t nextAsynchsendCmd4[CMD4STACKDEPTH];
 | 
					 | 
				
			||||||
static uint8_t  nextCmd4para1[CMD4STACKDEPTH];
 | 
					 | 
				
			||||||
static uint8_t  nextCmd4para2[CMD4STACKDEPTH];
 | 
					 | 
				
			||||||
static uint8_t  nextCmd4para3[CMD4STACKDEPTH];
 | 
					 | 
				
			||||||
static uint8_t  nextCmd4para4[CMD4STACKDEPTH];
 | 
					 | 
				
			||||||
static uint8_t  nrOfCmds4InQueue;
 | 
					 | 
				
			||||||
/* convention: use simple (not rotating) FIFO Stack:
 | 
					 | 
				
			||||||
Example: nrOfCmdsInQueue=4 then
 | 
					 | 
				
			||||||
    nextAsynchsendCmd0[0]=cmd1      // was stored as first
 | 
					 | 
				
			||||||
    nextAsynchsendCmd0[1]=cmd2
 | 
					 | 
				
			||||||
    nextAsynchsendCmd0[2]=cmd3
 | 
					 | 
				
			||||||
    nextAsynchsendCmd0[3]=cmd4      // came in as last
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    Send: [0] first, then move buffer 1 down:
 | 
					 | 
				
			||||||
    nextAsynchsendCmd0[0]=cmd2
 | 
					 | 
				
			||||||
    nextAsynchsendCmd0[1]=cmd3
 | 
					 | 
				
			||||||
    nextAsynchsendCmd0[2]=cmd4
 | 
					 | 
				
			||||||
    nextAsynchsendCmd0[3]=0;
 | 
					 | 
				
			||||||
    nrOfCmdsInQueue=3 now
 | 
					 | 
				
			||||||
*/
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
void sendWRcmd_clrCmd4Stack(void)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    uint8_t nn;
 | 
					 | 
				
			||||||
    for (nn=0; nn<CMD4STACKDEPTH; nn++)
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
        nextAsynchsendCmd4[nn]=0;
 | 
					 | 
				
			||||||
        nextCmd4para1[nn]=0;
 | 
					 | 
				
			||||||
        nextCmd4para2[nn]=0;
 | 
					 | 
				
			||||||
        nextCmd4para3[nn]=0;
 | 
					 | 
				
			||||||
        nextCmd4para4[nn]=0;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    nrOfCmds4InQueue=0;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
bool sendWRcmd_setSendCommand4(uint16_t nextCmd, uint8_t dat1, uint8_t dat2, uint8_t dat3, uint8_t dat4)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    // write Command to memory, wait for transport
 | 
					 | 
				
			||||||
    if (nrOfCmds4InQueue>=CMD4STACKDEPTH)
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
        qDebug() << "cannot save cmd because stack is full";
 | 
					 | 
				
			||||||
        return false;           // not possible
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    nextAsynchsendCmd4[nrOfCmds4InQueue]=nextCmd;
 | 
					 | 
				
			||||||
    nextCmd4para1[nrOfCmds4InQueue]=dat1;
 | 
					 | 
				
			||||||
    nextCmd4para2[nrOfCmds4InQueue]=dat2;
 | 
					 | 
				
			||||||
    nextCmd4para3[nrOfCmds4InQueue]=dat3;
 | 
					 | 
				
			||||||
    nextCmd4para4[nrOfCmds4InQueue]=dat4;
 | 
					 | 
				
			||||||
    //qDebug() << "data with 4 data byte saved, pp=" << nrOfCmds4InQueue;
 | 
					 | 
				
			||||||
    //qDebug() << " dat1=" << nextCmd4para1[nrOfCmds4InQueue] << " dat2=" << nextCmd4para2[nrOfCmds4InQueue]
 | 
					 | 
				
			||||||
    //             << " dat3=" << nextCmd4para3[nrOfCmds4InQueue]  << " dat4=" << nextCmd4para4[nrOfCmds4InQueue];
 | 
					 | 
				
			||||||
    nrOfCmds4InQueue++;
 | 
					 | 
				
			||||||
    return true;                // ok, will be sent
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
uint16_t sendWRcmd_getSendCommand4(uint8_t *dat1, uint8_t *dat2, uint8_t *dat3, uint8_t *dat4)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    uint16_t nxtAsynchCmd;
 | 
					 | 
				
			||||||
    uint8_t nn, ll;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    if (nrOfCmds4InQueue==0 || nrOfCmds4InQueue>CMD4STACKDEPTH)
 | 
					 | 
				
			||||||
        return 0;   // error
 | 
					 | 
				
			||||||
    nxtAsynchCmd=nextAsynchsendCmd4[0];
 | 
					 | 
				
			||||||
    *dat1=nextCmd4para1[0];
 | 
					 | 
				
			||||||
    *dat2=nextCmd4para2[0];
 | 
					 | 
				
			||||||
    *dat3=nextCmd4para3[0];
 | 
					 | 
				
			||||||
    *dat4=nextCmd4para4[0];
 | 
					 | 
				
			||||||
    //qDebug() << "cmd4  restored to send from [0];  pp=" << nrOfCmds4InQueue;
 | 
					 | 
				
			||||||
    //qDebug() << " data1: " << nextCmd4para1[0] << " data2: " << nextCmd4para2[0] <<
 | 
					 | 
				
			||||||
    //            " data3: " << nextCmd4para3[0] << " data4: " << nextCmd4para4[0];
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    // move Puffer down by one element
 | 
					 | 
				
			||||||
        if (CMD4STACKDEPTH>0)
 | 
					 | 
				
			||||||
        ll=CMD4STACKDEPTH-1;
 | 
					 | 
				
			||||||
    else
 | 
					 | 
				
			||||||
        ll=0;
 | 
					 | 
				
			||||||
    for (nn=0; nn<ll; nn++)
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
        nextAsynchsendCmd4[nn]=nextAsynchsendCmd4[nn+1];
 | 
					 | 
				
			||||||
        nextCmd4para1[nn]=nextCmd4para1[nn+1];
 | 
					 | 
				
			||||||
        nextCmd4para2[nn]=nextCmd4para2[nn+1];
 | 
					 | 
				
			||||||
        nextCmd4para3[nn]=nextCmd4para3[nn+1];
 | 
					 | 
				
			||||||
        nextCmd4para4[nn]=nextCmd4para4[nn+1];
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    if (nrOfCmds4InQueue>0)
 | 
					 | 
				
			||||||
        nrOfCmds4InQueue--;
 | 
					 | 
				
			||||||
    //qDebug() << "cmd4  after push down: pp=" << nrOfCmds4InQueue;
 | 
					 | 
				
			||||||
    return nxtAsynchCmd;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
static uint16_t  nextAsynchsendCmd8[CMD8STACKDEPTH];
 | 
					 | 
				
			||||||
static uint8_t   nextCmd8para1[CMD8STACKDEPTH];
 | 
					 | 
				
			||||||
static uint8_t   nextCmd8para2[CMD8STACKDEPTH];
 | 
					 | 
				
			||||||
static uint16_t  nextCmd8para3[CMD8STACKDEPTH];
 | 
					 | 
				
			||||||
static uint32_t  nextCmd8para4[CMD8STACKDEPTH];
 | 
					 | 
				
			||||||
static uint8_t   nrOfCmds8InQueue;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
void sendWRcmd_clrCmd8Stack(void)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    uint8_t nn;
 | 
					 | 
				
			||||||
    for (nn=0; nn<CMD8STACKDEPTH; nn++)
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
        nextAsynchsendCmd8[nn]=0;
 | 
					 | 
				
			||||||
        nextCmd8para1[nn]=0;
 | 
					 | 
				
			||||||
        nextCmd8para2[nn]=0;
 | 
					 | 
				
			||||||
        nextCmd8para3[nn]=0;
 | 
					 | 
				
			||||||
        nextCmd8para4[nn]=0;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    nrOfCmds8InQueue=0;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
bool sendWRcmd_setSendCommand8(uint16_t nextCmd, uint8_t dat1, uint8_t dat2, uint16_t dat3, uint32_t dat4)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    // write Command to memory, wait for transport
 | 
					 | 
				
			||||||
    if (nrOfCmds8InQueue>=CMD8STACKDEPTH)
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
        qDebug() << "cannot save cmd because stack is full";
 | 
					 | 
				
			||||||
        return false;           // not possible
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    nextAsynchsendCmd8[nrOfCmds8InQueue]=nextCmd;
 | 
					 | 
				
			||||||
    nextCmd8para1[nrOfCmds8InQueue]=dat1;
 | 
					 | 
				
			||||||
    nextCmd8para2[nrOfCmds8InQueue]=dat2;
 | 
					 | 
				
			||||||
    nextCmd8para3[nrOfCmds8InQueue]=dat3;
 | 
					 | 
				
			||||||
    nextCmd8para4[nrOfCmds8InQueue]=dat4;
 | 
					 | 
				
			||||||
    nrOfCmds8InQueue++;
 | 
					 | 
				
			||||||
    return true;                // ok, will be sent
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
uint16_t sendWRcmd_getSendCommand8(uint8_t *dat1, uint8_t *dat2, uint16_t *dat3, uint32_t *dat4)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    uint16_t nxtAsynchCmd;
 | 
					 | 
				
			||||||
    uint8_t nn, ll;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    if (nrOfCmds8InQueue==0 || nrOfCmds8InQueue>CMD8STACKDEPTH)
 | 
					 | 
				
			||||||
        return 0;   // error
 | 
					 | 
				
			||||||
    nxtAsynchCmd=nextAsynchsendCmd8[0];
 | 
					 | 
				
			||||||
    *dat1=nextCmd8para1[0];
 | 
					 | 
				
			||||||
    *dat2=nextCmd8para2[0];
 | 
					 | 
				
			||||||
    *dat3=nextCmd8para3[0];
 | 
					 | 
				
			||||||
    *dat4=nextCmd8para4[0];
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    // move buffer down by one element
 | 
					 | 
				
			||||||
    if (CMD8STACKDEPTH>0)
 | 
					 | 
				
			||||||
        ll=CMD8STACKDEPTH-1;
 | 
					 | 
				
			||||||
    else
 | 
					 | 
				
			||||||
        ll=0;
 | 
					 | 
				
			||||||
    for (nn=0; nn<ll; nn++)
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
        nextAsynchsendCmd8[nn]=nextAsynchsendCmd8[nn+1];
 | 
					 | 
				
			||||||
        nextCmd8para1[nn]=nextCmd8para1[nn+1];
 | 
					 | 
				
			||||||
        nextCmd8para2[nn]=nextCmd8para2[nn+1];
 | 
					 | 
				
			||||||
        nextCmd8para3[nn]=nextCmd8para3[nn+1];
 | 
					 | 
				
			||||||
        nextCmd8para4[nn]=nextCmd8para4[nn+1];
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    if (nrOfCmds8InQueue>0)
 | 
					 | 
				
			||||||
        nrOfCmds8InQueue--;
 | 
					 | 
				
			||||||
    return nxtAsynchCmd;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
static uint8_t sendAsynchDataBuf[160]; // no stack, only ONE buffer
 | 
					 | 
				
			||||||
static uint8_t sendAsyDatLen;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
bool sendWRcmd_setSendBlock160(uint8_t leng, uint8_t *buf)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    //qDebug()  << "pi epi: storing send data";
 | 
					 | 
				
			||||||
    if (leng>160) leng=160;
 | 
					 | 
				
			||||||
    sendAsyDatLen=leng;
 | 
					 | 
				
			||||||
    tslib_strclr(sendAsynchDataBuf, 0, 160);
 | 
					 | 
				
			||||||
    for (uint8_t nn=0; nn<leng; nn++)
 | 
					 | 
				
			||||||
        sendAsynchDataBuf[nn]=buf[nn];
 | 
					 | 
				
			||||||
    return true;                // ok, will be sent
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
uint8_t sendWRcmd_getSendBlock160(uint8_t *leng, uint8_t *buf)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    //qDebug()  << "pi gpi: restoring send data";
 | 
					 | 
				
			||||||
    *leng=sendAsyDatLen;
 | 
					 | 
				
			||||||
    for (uint8_t nn=0; nn<sendAsyDatLen; nn++)
 | 
					 | 
				
			||||||
        buf[nn]=sendAsynchDataBuf[nn];
 | 
					 | 
				
			||||||
    sendAsyDatLen=0;
 | 
					 | 
				
			||||||
    //tslib_strclr(sendAsynchDataBuf, 0, 64);
 | 
					 | 
				
			||||||
    return *leng;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// ------------------------------------------------------------------------------------
 | 
					 | 
				
			||||||
// MDB Sendind Data  are store here for next transport to DC (Device Controller)
 | 
					 | 
				
			||||||
// Transport to Slave runs every 100ms, answer from mdb-slave (e.g. coin changer) comes rigth
 | 
					 | 
				
			||||||
// with next slave answer
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// start with: SENDDIRCMD_EXCHGMDB,
 | 
					 | 
				
			||||||
    // send crude data from here to DC, DC to mdb slaves, mdb answer, return here within 50ms
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
static uint8_t Sdata_mdbSendBuffer[64];
 | 
					 | 
				
			||||||
static uint8_t Sdata_mdbSendLen;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
uint8_t epi_store64ByteSendData(uint8_t length, uint8_t *buf)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    // HWapi writes data to be forwarded to DC and further to mdb-device
 | 
					 | 
				
			||||||
    for (uint8_t nn=0; nn<length; nn++)
 | 
					 | 
				
			||||||
        Sdata_mdbSendBuffer[nn]=buf[nn];
 | 
					 | 
				
			||||||
    Sdata_mdbSendLen=length;
 | 
					 | 
				
			||||||
    return 0;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
uint8_t gpi_restore64ByteSendData(uint8_t *length, uint8_t *buf)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    // datif reads data to forward to dc
 | 
					 | 
				
			||||||
    for (uint8_t nn=0; nn<Sdata_mdbSendLen; nn++)
 | 
					 | 
				
			||||||
        buf[nn]=Sdata_mdbSendBuffer[nn];
 | 
					 | 
				
			||||||
    *length=Sdata_mdbSendLen;
 | 
					 | 
				
			||||||
    Sdata_mdbSendLen=0;
 | 
					 | 
				
			||||||
    return 0;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
//------------------------------------------------------------------------------------
 | 
					 | 
				
			||||||
//------------------------------------------------------------------------------------
 | 
					 | 
				
			||||||
//---------------------------------------- Printer Text Fifo -------------------------
 | 
					 | 
				
			||||||
static uint8_t prnDataParameters[4];
 | 
					 | 
				
			||||||
static uint8_t prnDataBufferUser;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
void epi_storeUserOfSendingTextBuffer(uint8_t user, uint8_t para1, uint8_t para2, uint8_t para3, uint8_t para4 )
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    // user=1: Text-Print is using this buffer
 | 
					 | 
				
			||||||
    //      2: QR-code-Printer is using this buffer
 | 
					 | 
				
			||||||
    prnDataBufferUser=user;
 | 
					 | 
				
			||||||
    prnDataParameters[0]=para1;
 | 
					 | 
				
			||||||
    prnDataParameters[1]=para2;
 | 
					 | 
				
			||||||
    prnDataParameters[2]=para3;
 | 
					 | 
				
			||||||
    prnDataParameters[3]=para4;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
//    qDebug() << "new user stored: " << user;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
uint8_t gpi_getUserOfSendingTextBuffer(uint8_t *para1, uint8_t *para2, uint8_t *para3, uint8_t *para4)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    // user=1: Text-Print is using this buffer
 | 
					 | 
				
			||||||
    //      2: QR-code-Printer is using this buffer
 | 
					 | 
				
			||||||
    //qDebug() << "returning user "<< prnDataBufferUser;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    *para1=prnDataParameters[0];
 | 
					 | 
				
			||||||
    *para2=prnDataParameters[1];
 | 
					 | 
				
			||||||
    *para3=prnDataParameters[2];
 | 
					 | 
				
			||||||
    *para4=prnDataParameters[3];
 | 
					 | 
				
			||||||
    return prnDataBufferUser;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    // Sending Text Fifo
 | 
					 | 
				
			||||||
// ONE printer doc consists of 20 x 64 byte
 | 
					 | 
				
			||||||
// #define MAXNROF_PRNBYTES   64
 | 
					 | 
				
			||||||
// #define MAXNROF_PRNBLOCKS  20
 | 
					 | 
				
			||||||
static char Sdata_PRN_TEXT[MAXNROF_PRNBLOCKS][MAXNROF_PRNBYTES];
 | 
					 | 
				
			||||||
static uint8_t pPrnDataBuff;        // points to next PRINTER_BLOCK
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
//static uint8_t pPrnDataBuff;        // points to next waiting printer text
 | 
					 | 
				
			||||||
//  defined above, needed if more then one text is stored (before sent)
 | 
					 | 
				
			||||||
// every block will be sent after 100ms, if 8 blocks are stored within this 100ms
 | 
					 | 
				
			||||||
// then pointer goes up to 8. Important: FIFO!!!!!!!!
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
void epi_resetPrinterStack(void)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    pPrnDataBuff=0;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
uint8_t epi_storePrnText(char *buf, uint8_t leng)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    // store text from Gui in next higher free memory 0....9
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    uint16_t len;
 | 
					 | 
				
			||||||
    uint8_t  pp, nn;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    pp=pPrnDataBuff;    // next free memory block with 64byte each
 | 
					 | 
				
			||||||
    if (pp>=MAXNROF_PRNBLOCKS)
 | 
					 | 
				
			||||||
        return 1;   // not possible, no free mem
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    //len=tslib_strlen(buf);    // kennt keine Binärzeichen!!!!!!
 | 
					 | 
				
			||||||
    len=leng;
 | 
					 | 
				
			||||||
    if (len>MAXNROF_PRNBYTES)
 | 
					 | 
				
			||||||
        len=MAXNROF_PRNBYTES;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    tslib_strclr(Sdata_PRN_TEXT[pp], 0, MAXNROF_PRNBYTES);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    for (nn=0; nn<len; nn++)
 | 
					 | 
				
			||||||
        Sdata_PRN_TEXT[pp][nn]=buf[nn];     // copy new text into buffer
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    if (pPrnDataBuff<MAXNROF_PRNBLOCKS)
 | 
					 | 
				
			||||||
        pPrnDataBuff++;                     // inc pointer if end not yet reached
 | 
					 | 
				
			||||||
    return 0;       // OK
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
uint8_t gpi_restorePrnText(uint8_t *retbuf)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    // read printer text and send to slave, size of retbuf == 64
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    // always read from [0] because this is the oldest (Fifo)
 | 
					 | 
				
			||||||
    // then move all text lines down by one and dec pointer
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    uint8_t  nn, pp=pPrnDataBuff;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    if (pp==0)    // next free memory block with 64byte each
 | 
					 | 
				
			||||||
        return 1;           // no text in buffer
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    // example: pp=5: then buffers [0...4] are occupied
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    for (nn=0; nn<MAXNROF_PRNBYTES; nn++)
 | 
					 | 
				
			||||||
        retbuf[nn] = uint8_t (Sdata_PRN_TEXT[0][nn]);     // restore oldest text
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    // now copy textline [1] to [0], then
 | 
					 | 
				
			||||||
    // copy textline [2] to [1], then
 | 
					 | 
				
			||||||
    // copy textline [3] to [2] .... upto [pp-1] to [pp-2]
 | 
					 | 
				
			||||||
    // hint: copying from 9....0 would delete all strings!!!!!!
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    for (nn=0; nn<(pp-1); nn++)
 | 
					 | 
				
			||||||
        tslib_strcpy(Sdata_PRN_TEXT[nn+1], Sdata_PRN_TEXT[nn], MAXNROF_PRNBYTES);
 | 
					 | 
				
			||||||
    if (pPrnDataBuff>0)
 | 
					 | 
				
			||||||
        pPrnDataBuff--;
 | 
					 | 
				
			||||||
    pp=pPrnDataBuff;
 | 
					 | 
				
			||||||
    // example: pp=4: then buffers [0...3] are still occupied, pp=0: all buffers empty
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    // now clear highest copyed line (which got free now)
 | 
					 | 
				
			||||||
    tslib_strclr(Sdata_PRN_TEXT[pp], 0, MAXNROF_PRNBYTES);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    // optionally: clear all remaining higher lines:
 | 
					 | 
				
			||||||
    for (nn=(pp+1); nn<MAXNROF_PRNBLOCKS; nn++)
 | 
					 | 
				
			||||||
         tslib_strclr(Sdata_PRN_TEXT[nn], 0, MAXNROF_PRNBYTES);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    return 0;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
uint8_t gpi_chk4remainingText(void)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    // retval: 0: no more textline left (to send)  >0: nr of 64byte-blocks
 | 
					 | 
				
			||||||
    return (pPrnDataBuff);
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// ---------------------------------------------------------------------------------
 | 
					 | 
				
			||||||
//   11.4.23 neu, Kommando direkt an "FastDevice"-protokoll senden, nicht mehr umsetzen
 | 
					 | 
				
			||||||
// ---------------------------------------------------------------------------------
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// short command, 4 data bytes
 | 
					 | 
				
			||||||
static uint8_t nextFDwrCmd[FDCMD_STACKDEPTH];
 | 
					 | 
				
			||||||
static uint8_t nextFDrdCmd[FDCMD_STACKDEPTH];
 | 
					 | 
				
			||||||
static uint8_t nextFDblkNr[FDCMD_STACKDEPTH];
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
static uint8_t  nextFDpara1[FDCMD_STACKDEPTH];
 | 
					 | 
				
			||||||
static uint8_t  nextFDpara2[FDCMD_STACKDEPTH];
 | 
					 | 
				
			||||||
static uint8_t  nextFDpara3[FDCMD_STACKDEPTH];
 | 
					 | 
				
			||||||
static uint8_t  nextFDpara4[FDCMD_STACKDEPTH];
 | 
					 | 
				
			||||||
static uint8_t  p_nextFDcmdsInQueue;
 | 
					 | 
				
			||||||
/* convention: use simple (not rotating) FIFO Stack:
 | 
					 | 
				
			||||||
Example: nrOfCmdsInQueue=4 then
 | 
					 | 
				
			||||||
    nextAsynchsendCmd0[0]=cmd1      // was stored as first
 | 
					 | 
				
			||||||
    nextAsynchsendCmd0[1]=cmd2
 | 
					 | 
				
			||||||
    nextAsynchsendCmd0[2]=cmd3
 | 
					 | 
				
			||||||
    nextAsynchsendCmd0[3]=cmd4      // came in as last
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    Send: [0] first, then move buffer 1 down:
 | 
					 | 
				
			||||||
    nextAsynchsendCmd0[0]=cmd2
 | 
					 | 
				
			||||||
    nextAsynchsendCmd0[1]=cmd3
 | 
					 | 
				
			||||||
    nextAsynchsendCmd0[2]=cmd4
 | 
					 | 
				
			||||||
    nextAsynchsendCmd0[3]=0;
 | 
					 | 
				
			||||||
    nrOfCmdsInQueue=3 now
 | 
					 | 
				
			||||||
*/
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
void sendFDcmd_clrStack(void)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    uint8_t nn;
 | 
					 | 
				
			||||||
    for (nn=0; nn<FDCMD_STACKDEPTH; nn++)
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
        nextFDwrCmd[nn]=0;
 | 
					 | 
				
			||||||
        nextFDrdCmd[nn]=0;
 | 
					 | 
				
			||||||
        nextFDblkNr[nn]=0;
 | 
					 | 
				
			||||||
        nextFDpara1[nn]=0;
 | 
					 | 
				
			||||||
        nextFDpara2[nn]=0;
 | 
					 | 
				
			||||||
        nextFDpara3[nn]=0;
 | 
					 | 
				
			||||||
        nextFDpara4[nn]=0;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    p_nextFDcmdsInQueue=0;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
bool sendFDcmd_set(uint8_t nextWrCmd, uint8_t nextRdCmd, uint8_t blockNum, uint8_t dat1, uint8_t dat2, uint8_t dat3, uint8_t dat4)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    // write Command to memory, wait for transport
 | 
					 | 
				
			||||||
    if (p_nextFDcmdsInQueue>=FDCMD_STACKDEPTH)
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
        qDebug() << "cannot save cmd because stack is full";
 | 
					 | 
				
			||||||
        return false;           // not possible
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    nextFDwrCmd[p_nextFDcmdsInQueue]=nextWrCmd;
 | 
					 | 
				
			||||||
    nextFDrdCmd[p_nextFDcmdsInQueue]=nextRdCmd;
 | 
					 | 
				
			||||||
    nextFDblkNr[p_nextFDcmdsInQueue]=blockNum;
 | 
					 | 
				
			||||||
    nextFDpara1[p_nextFDcmdsInQueue]=dat1;
 | 
					 | 
				
			||||||
    nextFDpara2[p_nextFDcmdsInQueue]=dat2;
 | 
					 | 
				
			||||||
    nextFDpara3[p_nextFDcmdsInQueue]=dat3;
 | 
					 | 
				
			||||||
    nextFDpara4[p_nextFDcmdsInQueue]=dat4;
 | 
					 | 
				
			||||||
    //qDebug() << "data with 4 data byte saved, pp=" << nrOfCmds4InQueue;
 | 
					 | 
				
			||||||
    //qDebug() << " dat1=" << nextCmd4para1[nrOfCmds4InQueue] << " dat2=" << nextCmd4para2[nrOfCmds4InQueue]
 | 
					 | 
				
			||||||
    //             << " dat3=" << nextCmd4para3[nrOfCmds4InQueue]  << " dat4=" << nextCmd4para4[nrOfCmds4InQueue];
 | 
					 | 
				
			||||||
    p_nextFDcmdsInQueue++;
 | 
					 | 
				
			||||||
    return true;                // ok, will be sent
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
bool sendFDcmd_get(uint8_t *nextWrCmd, uint8_t *nextRdCmd, uint8_t *blockNum, uint8_t *dat1, uint8_t *dat2, uint8_t *dat3, uint8_t *dat4)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    uint8_t nn, ll;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    if (p_nextFDcmdsInQueue==0 || p_nextFDcmdsInQueue>FDCMD_STACKDEPTH)
 | 
					 | 
				
			||||||
        return false;           // not possible
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    *nextWrCmd=nextFDwrCmd[0];
 | 
					 | 
				
			||||||
    *nextRdCmd=nextFDrdCmd[0];
 | 
					 | 
				
			||||||
    *blockNum=nextFDblkNr[0];
 | 
					 | 
				
			||||||
    *dat1=nextFDpara1[0];
 | 
					 | 
				
			||||||
    *dat2=nextFDpara2[0];
 | 
					 | 
				
			||||||
    *dat3=nextFDpara3[0];
 | 
					 | 
				
			||||||
    *dat4=nextFDpara4[0];
 | 
					 | 
				
			||||||
    //qDebug() << "cmd4  restored to send from [0];  pp=" << nrOfCmds4InQueue;
 | 
					 | 
				
			||||||
    //qDebug() << " data1: " << nextCmd4para1[0] << " data2: " << nextCmd4para2[0] <<
 | 
					 | 
				
			||||||
    //            " data3: " << nextCmd4para3[0] << " data4: " << nextCmd4para4[0];
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    // move Puffer down by one element
 | 
					 | 
				
			||||||
    if (FDCMD_STACKDEPTH>0)
 | 
					 | 
				
			||||||
        ll=FDCMD_STACKDEPTH-1;
 | 
					 | 
				
			||||||
    else
 | 
					 | 
				
			||||||
        ll=0;
 | 
					 | 
				
			||||||
    for (nn=0; nn<ll; nn++)
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
        nextFDwrCmd[nn]=nextFDwrCmd[nn+1];
 | 
					 | 
				
			||||||
        nextFDrdCmd[nn]=nextFDrdCmd[nn+1];
 | 
					 | 
				
			||||||
        nextFDblkNr[nn]=nextFDblkNr[nn+1];
 | 
					 | 
				
			||||||
        nextFDpara1[nn]=nextFDpara1[nn+1];
 | 
					 | 
				
			||||||
        nextFDpara2[nn]=nextFDpara2[nn+1];
 | 
					 | 
				
			||||||
        nextFDpara3[nn]=nextFDpara3[nn+1];
 | 
					 | 
				
			||||||
        nextFDpara4[nn]=nextFDpara4[nn+1];
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    if (p_nextFDcmdsInQueue>0)
 | 
					 | 
				
			||||||
        p_nextFDcmdsInQueue--;
 | 
					 | 
				
			||||||
    //qDebug() << "cmd4  after push down: pp=" << nrOfCmds4InQueue;
 | 
					 | 
				
			||||||
    return true;                // ok, will be sent
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
uint8_t check4FDshortCmd(void)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    // returns number of waiting command, max FDCMD_STACKDEPTH
 | 
					 | 
				
			||||||
    return p_nextFDcmdsInQueue;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
uint8_t check4freeFDshortCmd(void)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    // returns number of free places in short-command stack
 | 
					 | 
				
			||||||
    return FDCMD_STACKDEPTH - p_nextFDcmdsInQueue;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// long command, 64 data bytes
 | 
					 | 
				
			||||||
static uint8_t longFDwrCmd[FDLONG_STACKDEPTH];
 | 
					 | 
				
			||||||
static uint8_t longFDrdCmd[FDLONG_STACKDEPTH];
 | 
					 | 
				
			||||||
static uint8_t longFDblkNr[FDLONG_STACKDEPTH];
 | 
					 | 
				
			||||||
static uint8_t longFDlength[FDLONG_STACKDEPTH];
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
static uint8_t  longFDpara[FDLONG_STACKDEPTH][64];
 | 
					 | 
				
			||||||
static uint8_t  p_longFDcmdsInQueue;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
void longFDcmd_clrStack(void)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    uint8_t nn, mm;
 | 
					 | 
				
			||||||
    for (nn=0; nn<FDLONG_STACKDEPTH; nn++)
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
        longFDwrCmd[nn]=0;
 | 
					 | 
				
			||||||
        longFDrdCmd[nn]=0;
 | 
					 | 
				
			||||||
        longFDblkNr[nn]=0;
 | 
					 | 
				
			||||||
        longFDlength[nn]=0;
 | 
					 | 
				
			||||||
        for (mm=0; mm<64; mm++)
 | 
					 | 
				
			||||||
            longFDpara[nn][mm]=0;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    p_longFDcmdsInQueue=0;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
bool longFDcmd_set(uint8_t nextWrCmd, uint8_t nextRdCmd, uint8_t blockNum, uint8_t length, uint8_t *data)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    // write Command to memory, wait for transport
 | 
					 | 
				
			||||||
    // data buffer size always 64! data[64], padded with 0
 | 
					 | 
				
			||||||
    uint8_t nn;
 | 
					 | 
				
			||||||
    if (p_longFDcmdsInQueue>=FDLONG_STACKDEPTH)
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
        qDebug() << "cannot save cmd because stack is full";
 | 
					 | 
				
			||||||
        return false;           // not possible
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    longFDwrCmd[p_longFDcmdsInQueue]=nextWrCmd;
 | 
					 | 
				
			||||||
    longFDrdCmd[p_longFDcmdsInQueue]=nextRdCmd;
 | 
					 | 
				
			||||||
    longFDblkNr[p_longFDcmdsInQueue]=blockNum;
 | 
					 | 
				
			||||||
    longFDlength[p_longFDcmdsInQueue]=length;
 | 
					 | 
				
			||||||
    for (nn=0; nn<64; nn++)
 | 
					 | 
				
			||||||
        longFDpara[p_longFDcmdsInQueue][nn]=data[nn];
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    p_longFDcmdsInQueue++;
 | 
					 | 
				
			||||||
    return true;                // ok, will be sent
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
bool longFDcmd_get(uint8_t *nextWrCmd, uint8_t *nextRdCmd, uint8_t *blockNum, uint8_t *length, uint8_t *data)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    uint8_t nn, mm, ll;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    if (p_longFDcmdsInQueue==0 || p_longFDcmdsInQueue>FDLONG_STACKDEPTH)
 | 
					 | 
				
			||||||
        return false;           // not possible
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    *nextWrCmd= longFDwrCmd[0];
 | 
					 | 
				
			||||||
    *nextRdCmd= longFDrdCmd[0];
 | 
					 | 
				
			||||||
    *blockNum = longFDblkNr[0];
 | 
					 | 
				
			||||||
    *length   = longFDlength[0];
 | 
					 | 
				
			||||||
    for (mm=0; mm<64; mm++)
 | 
					 | 
				
			||||||
        data[mm] = longFDpara[0][mm];
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    // move Puffer down by one element
 | 
					 | 
				
			||||||
    if (FDLONG_STACKDEPTH>0)
 | 
					 | 
				
			||||||
        ll=FDLONG_STACKDEPTH-1;
 | 
					 | 
				
			||||||
    else
 | 
					 | 
				
			||||||
        ll=0;
 | 
					 | 
				
			||||||
    for (nn=0; nn<ll; nn++)
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
        longFDwrCmd[nn]  = longFDwrCmd[nn+1];
 | 
					 | 
				
			||||||
        longFDrdCmd[nn]  = longFDrdCmd[nn+1];
 | 
					 | 
				
			||||||
        longFDblkNr[nn]  = longFDblkNr[nn+1];
 | 
					 | 
				
			||||||
        longFDlength[nn] = longFDlength[nn+1];
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        for (mm=0; mm<64; mm++)
 | 
					 | 
				
			||||||
            longFDpara[nn][mm] = longFDpara[nn+1][mm];
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    if (p_longFDcmdsInQueue>0)
 | 
					 | 
				
			||||||
        p_longFDcmdsInQueue--;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    return true;                // ok, will be sent
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
uint8_t check4FDlongCmd(void)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    // returns number of waiting command
 | 
					 | 
				
			||||||
    return p_longFDcmdsInQueue;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
uint8_t check4freeFDlongCmd(void)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    // returns number of free places in command stack
 | 
					 | 
				
			||||||
    return FDLONG_STACKDEPTH - p_longFDcmdsInQueue;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
static uint8_t Sdata_DeviceParameter[64];
 | 
					 | 
				
			||||||
static uint8_t Sdata_DevParaLen;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
uint8_t epi_store64BdevParameter(uint8_t length, uint8_t *buf)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    // HWapi writes data to be stored
 | 
					 | 
				
			||||||
    uint8_t nn;
 | 
					 | 
				
			||||||
    for (nn=0; nn<length; nn++)
 | 
					 | 
				
			||||||
        Sdata_DeviceParameter[nn]=buf[nn];
 | 
					 | 
				
			||||||
    for (nn=length; nn<64; nn++)
 | 
					 | 
				
			||||||
        Sdata_DeviceParameter[nn]=0;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    Sdata_DevParaLen=length;
 | 
					 | 
				
			||||||
    return 0;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
uint8_t epi_restore64BdevParameter(uint8_t *length, uint8_t *buf)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    for (uint8_t nn=0; nn<Sdata_DevParaLen; nn++)
 | 
					 | 
				
			||||||
        buf[nn]=Sdata_DeviceParameter[nn];
 | 
					 | 
				
			||||||
    *length=Sdata_DevParaLen;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    return 0;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
@@ -1,39 +0,0 @@
 | 
				
			|||||||
#include "shared_mem_buffer.h"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#include <QDebug>
 | 
					 | 
				
			||||||
#include <atomic>
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#ifdef QT_POSIX_IPC
 | 
					 | 
				
			||||||
    // The POSIX backend can be explicitly selected using the -feature-ipc_posix
 | 
					 | 
				
			||||||
    // option to the Qt configure script. If it is enabled, the QT_POSIX_IPC
 | 
					 | 
				
			||||||
    // macro will be defined. -> we use SystemV shared memory
 | 
					 | 
				
			||||||
#error "QT_POSIX_IPC defined"
 | 
					 | 
				
			||||||
#else
 | 
					 | 
				
			||||||
#include <sys/ipc.h>    // ftok
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// std::atomic_bool SharedMemBuffer::__sharedMemLocked{false};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
QSharedMemory *SharedMemBuffer::getShm(std::size_t size) {
 | 
					 | 
				
			||||||
    static QSharedMemory shMem;
 | 
					 | 
				
			||||||
    if (size > 0) {
 | 
					 | 
				
			||||||
        static const long nativeKey = ftok("/etc/os-release", 'H');
 | 
					 | 
				
			||||||
        static const QString fkey = std::to_string(nativeKey).c_str();
 | 
					 | 
				
			||||||
        shMem.setKey(fkey);
 | 
					 | 
				
			||||||
        if (!shMem.isAttached()) {
 | 
					 | 
				
			||||||
            if (shMem.create(size)) {
 | 
					 | 
				
			||||||
                return &shMem;
 | 
					 | 
				
			||||||
            } else {
 | 
					 | 
				
			||||||
                if (shMem.error() == QSharedMemory::AlreadyExists) {
 | 
					 | 
				
			||||||
                    if (shMem.attach()) {
 | 
					 | 
				
			||||||
                        return &shMem;
 | 
					 | 
				
			||||||
                    }
 | 
					 | 
				
			||||||
                }
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
            qCritical() << shMem.nativeKey() << shMem.key() << shMem.data()
 | 
					 | 
				
			||||||
                        << shMem.error() << shMem.errorString();
 | 
					 | 
				
			||||||
            return nullptr;
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    return &shMem;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							@@ -1,598 +0,0 @@
 | 
				
			|||||||
#include "tslib.h"
 | 
					 | 
				
			||||||
#include <QThread>
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
//tslib::tslib()
 | 
					 | 
				
			||||||
//{
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
//}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/*
 | 
					 | 
				
			||||||
uint16_t tslib::uchar2uint(uint8_t Highbyte, uint8_t Lowbyte)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    uint16_t uitmp;
 | 
					 | 
				
			||||||
    uitmp=0;
 | 
					 | 
				
			||||||
    uitmp |= uint8_t(Highbyte);
 | 
					 | 
				
			||||||
    uitmp<<=8;
 | 
					 | 
				
			||||||
    uitmp |= uint8_t(Lowbyte);
 | 
					 | 
				
			||||||
    return uitmp;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
uint8_t tslib::uint2uchar(uint16_t uival, bool getHighB)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    // getHighB: low=GetLowByte
 | 
					 | 
				
			||||||
    uint16_t uitmp=uival;
 | 
					 | 
				
			||||||
    if (getHighB==0)
 | 
					 | 
				
			||||||
        return uint8_t(uitmp);
 | 
					 | 
				
			||||||
    uitmp>>=8;
 | 
					 | 
				
			||||||
    return uint8_t(uitmp);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
}*/
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
uint16_t uchar2uint(char Highbyte, char Lowbyte)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    uint16_t uitmp;
 | 
					 | 
				
			||||||
    uitmp=0;
 | 
					 | 
				
			||||||
    uitmp |= uint8_t(Highbyte);
 | 
					 | 
				
			||||||
    uitmp<<=8;
 | 
					 | 
				
			||||||
    uitmp |= uint8_t(Lowbyte);
 | 
					 | 
				
			||||||
    return uitmp;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
uint16_t uchar2uint(uint8_t Highbyte, uint8_t Lowbyte)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    uint16_t uitmp;
 | 
					 | 
				
			||||||
    uitmp=0;
 | 
					 | 
				
			||||||
    uitmp |= uint8_t(Highbyte);
 | 
					 | 
				
			||||||
    uitmp<<=8;
 | 
					 | 
				
			||||||
    uitmp |= uint8_t(Lowbyte);
 | 
					 | 
				
			||||||
    return uitmp;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
uint32_t uchar2ulong(uint8_t Highbyte, uint8_t MHbyte, uint8_t MLbyte, uint8_t Lowbyte)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    uint32_t ultmp=0;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    ultmp |= uint8_t(Highbyte);
 | 
					 | 
				
			||||||
    ultmp<<=8;
 | 
					 | 
				
			||||||
    ultmp |= uint8_t(MHbyte);
 | 
					 | 
				
			||||||
    ultmp<<=8;
 | 
					 | 
				
			||||||
    ultmp |= uint8_t(MLbyte);
 | 
					 | 
				
			||||||
    ultmp<<=8;
 | 
					 | 
				
			||||||
    ultmp |= uint8_t(Lowbyte);
 | 
					 | 
				
			||||||
    return ultmp;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
uint8_t uint2uchar(uint16_t uival, bool getHighB)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    // getHighB: low=GetLowByte
 | 
					 | 
				
			||||||
    uint16_t uitmp=uival;
 | 
					 | 
				
			||||||
    if (getHighB==0)
 | 
					 | 
				
			||||||
        return uint8_t(uitmp);
 | 
					 | 
				
			||||||
    uitmp>>=8;
 | 
					 | 
				
			||||||
    return uint8_t(uitmp);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
uint8_t ulong2uchar(uint32_t ulval, uint8_t getBytNr)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    // getBytNr: 0=LSB  3=MSB
 | 
					 | 
				
			||||||
    uint32_t ultmp=ulval;
 | 
					 | 
				
			||||||
    if (getBytNr==0)
 | 
					 | 
				
			||||||
        return uint8_t(ultmp);
 | 
					 | 
				
			||||||
    ultmp>>=8;
 | 
					 | 
				
			||||||
    if (getBytNr==1)
 | 
					 | 
				
			||||||
        return uint8_t(ultmp);
 | 
					 | 
				
			||||||
    ultmp>>=8;
 | 
					 | 
				
			||||||
    if (getBytNr==2)
 | 
					 | 
				
			||||||
        return uint8_t(ultmp);
 | 
					 | 
				
			||||||
    ultmp>>=8;
 | 
					 | 
				
			||||||
    return uint8_t(ultmp);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
void delay(uint16_t MilliSec)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    QThread::msleep(uint32_t(MilliSec));
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
void GetTimeString(uint8_t hours, uint8_t minutes, uint8_t seconds, uint8_t System12h, uint8_t ShowSec, uint8_t *buf)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
	// Zahlenwerte in String wandeln, 12/24h-Format     // 12byte für buf!
 | 
					 | 
				
			||||||
	uint8_t usa;
 | 
					 | 
				
			||||||
	uint16_t  jj;
 | 
					 | 
				
			||||||
	uint8_t hh, mm, ss, with_sec;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        // buf[0]= ganz linkes Zeichen
 | 
					 | 
				
			||||||
    hh=hours;
 | 
					 | 
				
			||||||
    mm=minutes;
 | 
					 | 
				
			||||||
    ss=seconds;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    // 15.10.12, Plausibilitätsprüfung --------------------------------------------------
 | 
					 | 
				
			||||||
    if (hh>23) hh=0;
 | 
					 | 
				
			||||||
    if (mm>59) mm=0;
 | 
					 | 
				
			||||||
    if (ss>59) ss=0;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    with_sec=ShowSec;
 | 
					 | 
				
			||||||
        for (jj=0; jj<12; jj++) buf[jj]=0;
 | 
					 | 
				
			||||||
        usa = System12h; 		// 1:12h   0:24h
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    // Stunden:
 | 
					 | 
				
			||||||
        if (usa)
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
        // 12h System
 | 
					 | 
				
			||||||
        if (hh==0 || hh==12)
 | 
					 | 
				
			||||||
        {
 | 
					 | 
				
			||||||
            // 12AM (Mitternacht) oder 12PM (Mittag)
 | 
					 | 
				
			||||||
                buf[0]=0x31;
 | 
					 | 
				
			||||||
                buf[1]=0x32;
 | 
					 | 
				
			||||||
        } else
 | 
					 | 
				
			||||||
        if (hh<12)
 | 
					 | 
				
			||||||
        {
 | 
					 | 
				
			||||||
            // 1..11AM
 | 
					 | 
				
			||||||
                buf[0]=hh/10+0x30;
 | 
					 | 
				
			||||||
                buf[1]=hh%10+0x30;
 | 
					 | 
				
			||||||
        } else
 | 
					 | 
				
			||||||
        {
 | 
					 | 
				
			||||||
            //13:00 bis 23Uhr
 | 
					 | 
				
			||||||
                buf[0]=(hh-12)/10+0x30;
 | 
					 | 
				
			||||||
                buf[1]=(hh-12)%10+0x30;
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
    } else
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
        // 24h System
 | 
					 | 
				
			||||||
        buf[0]=hh/10+0x30;
 | 
					 | 
				
			||||||
        buf[1]=hh%10+0x30;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    // Minuten:
 | 
					 | 
				
			||||||
    buf[2]=':';
 | 
					 | 
				
			||||||
    buf[3]=mm/10+0x30;
 | 
					 | 
				
			||||||
    buf[4]=mm%10+0x30;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    jj=5;
 | 
					 | 
				
			||||||
    if (with_sec)
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
        buf[jj++]=':';
 | 
					 | 
				
			||||||
        buf[jj++]=ss/10+0x30;
 | 
					 | 
				
			||||||
        buf[jj++]=ss%10+0x30;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    if (usa)
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
        buf[jj++]=' ';
 | 
					 | 
				
			||||||
        if (hh<12)
 | 
					 | 
				
			||||||
            buf[jj++]='A';
 | 
					 | 
				
			||||||
        else
 | 
					 | 
				
			||||||
            buf[jj++]='P';
 | 
					 | 
				
			||||||
        buf[jj++]='M';
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// -------------------    ********************************************************************************
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
void GetDateString(uint8_t day, uint8_t month, uint8_t yearhigh, uint8_t yearlow, uint8_t format, uint8_t sep, uint8_t *buf)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
	// generate date as ascii string from integers day/month/year
 | 
					 | 
				
			||||||
	// yearhigh: 10..29, in europe always 20 (not in arabia!) comes as hex number, e.g. 0x20
 | 
					 | 
				
			||||||
	// format=  0: dd.mm.yyyy   (deutsch)
 | 
					 | 
				
			||||||
	//          1: mm.dd.yyyy   (amerika)
 | 
					 | 
				
			||||||
    //          2: yyyy.mm.dd   (Iran, Dubai)
 | 
					 | 
				
			||||||
    //          3: dd.yyyy.mm
 | 
					 | 
				
			||||||
    //          4: mm.yyyy.dd
 | 
					 | 
				
			||||||
    //          5: yyyy.dd.mm
 | 
					 | 
				
			||||||
        // sep: 0: use . as seperator   1: use / as seperator
 | 
					 | 
				
			||||||
    // return String in *buf      // 11byte für buf!
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	uint8_t tag, mon, jahr, d10, d1, m10, m1, y1000, y100, y10, y1;
 | 
					 | 
				
			||||||
	uint8_t slash;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    y100= (yearhigh & 0x0F)+0x30;
 | 
					 | 
				
			||||||
    y1000=((yearhigh & 0xF0)>>4)+0x30;
 | 
					 | 
				
			||||||
//    if (yearhigh>=20)
 | 
					 | 
				
			||||||
//    {
 | 
					 | 
				
			||||||
//    	y1000='2';
 | 
					 | 
				
			||||||
//        y100=28+yearhigh;   // '0' + (yearhigh-20)
 | 
					 | 
				
			||||||
//    } else
 | 
					 | 
				
			||||||
//    if (yearhigh<20)
 | 
					 | 
				
			||||||
//    {
 | 
					 | 
				
			||||||
//        y1000='1';
 | 
					 | 
				
			||||||
//        y100=38-yearhigh;   // '9' - (19-yearhigh)
 | 
					 | 
				
			||||||
//    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    tag=day;
 | 
					 | 
				
			||||||
    mon=month;
 | 
					 | 
				
			||||||
    jahr=yearlow;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    if (mon>12 || mon==0) mon=1;           // 23.10.12
 | 
					 | 
				
			||||||
    if (tag>31 || tag==0) tag=1;
 | 
					 | 
				
			||||||
    if (jahr>50 || jahr<11) jahr=1;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    if (sep==0)
 | 
					 | 
				
			||||||
        slash='.';          // slash==0
 | 
					 | 
				
			||||||
    else if (sep==1)
 | 
					 | 
				
			||||||
        slash='/';
 | 
					 | 
				
			||||||
    else
 | 
					 | 
				
			||||||
    if  (sep>=0x20)
 | 
					 | 
				
			||||||
        slash=sep;
 | 
					 | 
				
			||||||
    else
 | 
					 | 
				
			||||||
        slash='.';
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    d10 =tag/10;
 | 
					 | 
				
			||||||
    d1  =tag%10;
 | 
					 | 
				
			||||||
    m10 =mon/10;
 | 
					 | 
				
			||||||
    m1  =mon%10;
 | 
					 | 
				
			||||||
    y10 =jahr/10;
 | 
					 | 
				
			||||||
    y1  =jahr%10;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	d10 +=0x30;    // in Asccii wandeln
 | 
					 | 
				
			||||||
	d1  +=0x30;
 | 
					 | 
				
			||||||
	m10 +=0x30;
 | 
					 | 
				
			||||||
	m1  +=0x30;
 | 
					 | 
				
			||||||
	y10 +=0x30;
 | 
					 | 
				
			||||||
    y1  +=0x30;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	switch (format)
 | 
					 | 
				
			||||||
	{
 | 
					 | 
				
			||||||
		    // 0: dd.mm.yyyy
 | 
					 | 
				
			||||||
	    case 0: buf[0]=d10; buf[1]=d1; buf[2]=slash; buf[3]=m10; buf[4]=m1; buf[5]=slash;
 | 
					 | 
				
			||||||
		    buf[6]=y1000; buf[7]=y100; buf[8]=y10; buf[9]=y1; break;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		    // 1: mm.dd.yyyy
 | 
					 | 
				
			||||||
	    case 1: buf[0]=m10; buf[1]=m1; buf[2]=slash; buf[3]=d10; buf[4]=d1; buf[5]=slash;
 | 
					 | 
				
			||||||
		    buf[6]=y1000; buf[7]=y100; buf[8]=y10; buf[9]=y1; break;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		// 2: yyyy.mm.dd
 | 
					 | 
				
			||||||
	    case 2: buf[0]=y1000; buf[1]=y100; buf[2]=y10; buf[3]=y1; buf[4]=slash; buf[5]=m10;
 | 
					 | 
				
			||||||
		    buf[6]=m1; buf[7]=slash; buf[8]=d10; buf[9]=d1; break;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		// 3: dd.yyyy.mm
 | 
					 | 
				
			||||||
	    case 3: buf[0]=d10; buf[1]=d1; buf[2]=slash; buf[3]=y1000; buf[4]=y100;
 | 
					 | 
				
			||||||
		    buf[5]=y10; buf[6]=y1; buf[7]=slash; buf[8]=m10; buf[9]=m1; break;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		// 4: mm.yyyy.dd
 | 
					 | 
				
			||||||
	    case 4: buf[0]=m10; buf[1]=m1; buf[2]=slash; buf[3]=y1000; buf[4]=y100;
 | 
					 | 
				
			||||||
		    buf[5]=y10; buf[6]=y1; buf[7]=slash; buf[8]=d10; buf[9]=d1; break;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		// 5: yyyy.dd.mm
 | 
					 | 
				
			||||||
	    case 5: buf[0]=y1000; buf[1]=y100; buf[2]=y10; buf[3]=y1; buf[4]=slash; buf[5]=d10;
 | 
					 | 
				
			||||||
		    buf[6]=d1; buf[7]=slash; buf[8]=m10; buf[9]=m1; break;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	buf[10]=0;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// -------------------    ********************************************************************************
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
void GetShortDateString(uint8_t day, uint8_t month, uint8_t yearlow, uint8_t format, uint8_t sep, uint8_t *buf)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
	// generate date as ascii string from integers day/month/year
 | 
					 | 
				
			||||||
	// format=  0: dd.mm.yy   (deutsch)
 | 
					 | 
				
			||||||
	//          1: mm.dd.yy   (amerika)
 | 
					 | 
				
			||||||
    //          2: yy.mm.dd   (Iran, Dubai)
 | 
					 | 
				
			||||||
    //          3: dd.yy.mm
 | 
					 | 
				
			||||||
    //          4: mm.yy.dd
 | 
					 | 
				
			||||||
    //          5: yy.dd.mm
 | 
					 | 
				
			||||||
        // sep: 0: use . as seperator   1: use / as seperator
 | 
					 | 
				
			||||||
    // return String in *buf      // 11byte für buf!
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	uint8_t tag, mon, jahr, d10, d1, m10, m1, y10, y1;
 | 
					 | 
				
			||||||
	uint8_t slash;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    tag=day;
 | 
					 | 
				
			||||||
    mon=month;
 | 
					 | 
				
			||||||
    jahr=yearlow;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    if (mon>12 || mon==0) mon=1;           // 23.10.12
 | 
					 | 
				
			||||||
    if (tag>31 || tag==0) tag=1;
 | 
					 | 
				
			||||||
    if (jahr>50 || jahr<11) jahr=1;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    if (sep==0)
 | 
					 | 
				
			||||||
        slash='.';          // slash==0
 | 
					 | 
				
			||||||
    else if (sep==1)
 | 
					 | 
				
			||||||
        slash='/';
 | 
					 | 
				
			||||||
    else if  (sep>=0x20)
 | 
					 | 
				
			||||||
        slash=sep;
 | 
					 | 
				
			||||||
    else
 | 
					 | 
				
			||||||
        slash='.';
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    d10 =tag/10;
 | 
					 | 
				
			||||||
    d1  =tag%10;
 | 
					 | 
				
			||||||
    m10 =mon/10;
 | 
					 | 
				
			||||||
    m1  =mon%10;
 | 
					 | 
				
			||||||
    y10 =jahr/10;
 | 
					 | 
				
			||||||
    y1  =jahr%10;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	d10 +=0x30;    // in Asccii wandeln
 | 
					 | 
				
			||||||
	d1  +=0x30;
 | 
					 | 
				
			||||||
	m10 +=0x30;
 | 
					 | 
				
			||||||
	m1  +=0x30;
 | 
					 | 
				
			||||||
	y10 +=0x30;
 | 
					 | 
				
			||||||
    y1  +=0x30;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	switch (format)
 | 
					 | 
				
			||||||
	{
 | 
					 | 
				
			||||||
		    // 0: dd.mm.yyyy
 | 
					 | 
				
			||||||
	    case 0: buf[0]=d10; buf[1]=d1; buf[2]=slash; buf[3]=m10; buf[4]=m1; buf[5]=slash;
 | 
					 | 
				
			||||||
		    buf[6]=y10; buf[7]=y1; break;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		    // 1: mm.dd.yyyy
 | 
					 | 
				
			||||||
	    case 1: buf[0]=m10; buf[1]=m1; buf[2]=slash; buf[3]=d10; buf[4]=d1; buf[5]=slash;
 | 
					 | 
				
			||||||
		    buf[6]=y10; buf[7]=y1; break;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		// 2: yyyy.mm.dd
 | 
					 | 
				
			||||||
	    case 2: buf[0]=y10; buf[1]=y1; buf[2]=slash; buf[3]=m10;
 | 
					 | 
				
			||||||
		    buf[4]=m1; buf[5]=slash; buf[6]=d10; buf[7]=d1; break;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		// 3: dd.yyyy.mm
 | 
					 | 
				
			||||||
	    case 3: buf[0]=d10; buf[1]=d1; buf[2]=slash;
 | 
					 | 
				
			||||||
		    buf[3]=y10; buf[4]=y1; buf[5]=slash; buf[6]=m10; buf[7]=m1; break;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		// 4: mm.yyyy.dd
 | 
					 | 
				
			||||||
	    case 4: buf[0]=m10; buf[1]=m1; buf[2]=slash;
 | 
					 | 
				
			||||||
		    buf[3]=y10; buf[4]=y1; buf[5]=slash; buf[6]=d10; buf[7]=d1; break;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		// 5: yyyy.dd.mm
 | 
					 | 
				
			||||||
	    case 5: buf[0]=y10; buf[1]=y1; buf[2]=slash; buf[3]=d10;
 | 
					 | 
				
			||||||
		    buf[4]=d1; buf[5]=slash; buf[6]=m10; buf[7]=m1; break;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	buf[8]=0;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
uint16_t tslib_strlen(char *buf)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    uint16_t nn;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    for (nn=0; nn<0xFFF0; nn++)
 | 
					 | 
				
			||||||
        if (buf[nn]==0)
 | 
					 | 
				
			||||||
            return nn;
 | 
					 | 
				
			||||||
    return 0;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
uint16_t tslib_strlen(uint8_t *buf)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    uint16_t nn;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    for (nn=0; nn<0xFFF0; nn++)
 | 
					 | 
				
			||||||
        if (buf[nn]==0)
 | 
					 | 
				
			||||||
            return nn;
 | 
					 | 
				
			||||||
    return 0;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
void tslib_strclr(char *buf, char clrsign, uint16_t len)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    uint16_t nn;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    for (nn=0; nn<len; nn++)
 | 
					 | 
				
			||||||
        buf[nn]=clrsign;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
void tslib_strclr(uint8_t *buf, char clrsign, uint16_t len)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    uint16_t nn;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    for (nn=0; nn<len; nn++)
 | 
					 | 
				
			||||||
        buf[nn]=uint8_t (clrsign);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
void tslib_strcpy(char *srcbuf, char *destbuf, uint16_t len)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    uint16_t nn;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    for (nn=0; nn<len; nn++)
 | 
					 | 
				
			||||||
        destbuf[nn]=srcbuf[nn];
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
void tslib_strcpy(char *srcbuf, uint8_t *destbuf, uint16_t len)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    uint16_t nn;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    for (nn=0; nn<len; nn++)
 | 
					 | 
				
			||||||
        destbuf[nn]=uint8_t(srcbuf[nn]);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
void tslib_strcpy(uint8_t *srcbuf, uint8_t *destbuf, uint16_t len)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    uint16_t nn;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    for (nn=0; nn<len; nn++)
 | 
					 | 
				
			||||||
        destbuf[nn]=srcbuf[nn];
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
bool tslib_isDecAsciiNumber(char sign)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    if (sign>=0x30 && sign<=0x39)
 | 
					 | 
				
			||||||
        return true;
 | 
					 | 
				
			||||||
    return false;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
bool tslib_isHexAsciiNumber(char sign)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    if (sign>=0x30 && sign<=0x39)
 | 
					 | 
				
			||||||
        return true;
 | 
					 | 
				
			||||||
    if (sign>=0x61 && sign<=0x66)   // a...f
 | 
					 | 
				
			||||||
        return true;
 | 
					 | 
				
			||||||
    if (sign>=0x41 && sign<=0x46)   // A...F
 | 
					 | 
				
			||||||
        return true;
 | 
					 | 
				
			||||||
    return false;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
int tslib_getMinimum(int val1, int val2)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    if (val1<val2)
 | 
					 | 
				
			||||||
        return val1;
 | 
					 | 
				
			||||||
    return val2;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
void tslib_text2array(QByteArray text, char *aray, uint16_t maxArayLen)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    QByteArray  sloc;
 | 
					 | 
				
			||||||
    int ii, LL=text.length();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    if (LL>maxArayLen) LL=maxArayLen;
 | 
					 | 
				
			||||||
    for (ii=0; ii<LL; ii++)
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
        aray[ii]=text.at(ii);
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    if (LL==maxArayLen)
 | 
					 | 
				
			||||||
        aray[LL-1]=0;
 | 
					 | 
				
			||||||
    else
 | 
					 | 
				
			||||||
        aray[LL]=0;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// -----------------------------------------------------------------------------------------------
 | 
					 | 
				
			||||||
// functions for DeviceController's Bootloader ---------------------------------------------------
 | 
					 | 
				
			||||||
// -----------------------------------------------------------------------------------------------
 | 
					 | 
				
			||||||
/*
 | 
					 | 
				
			||||||
uint16_t tslib_calcCrcCcitt(uint16_t BufLength, uint8_t *buf)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    uint8_t  nn, B15H, element;
 | 
					 | 
				
			||||||
    uint16_t crc = 0x84cf;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    while (BufLength--)
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
        element = *buf++;
 | 
					 | 
				
			||||||
        for (nn = 0; nn < 8; nn++)
 | 
					 | 
				
			||||||
        {
 | 
					 | 
				
			||||||
            B15H = 0;
 | 
					 | 
				
			||||||
            if(crc & 0x8000)
 | 
					 | 
				
			||||||
                B15H = 1;
 | 
					 | 
				
			||||||
            crc = (crc << 1) | ((element >> (7 - nn)) & 0x01);
 | 
					 | 
				
			||||||
            if (B15H)
 | 
					 | 
				
			||||||
            {
 | 
					 | 
				
			||||||
                crc ^= 0x1021;
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    for (nn = 0; nn < 16; nn++)
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
        B15H = 0;
 | 
					 | 
				
			||||||
        if(crc & 0x8000)
 | 
					 | 
				
			||||||
        B15H = 1;
 | 
					 | 
				
			||||||
        crc = (crc << 1) | 0x00;
 | 
					 | 
				
			||||||
        if (B15H)
 | 
					 | 
				
			||||||
        {
 | 
					 | 
				
			||||||
            crc ^= 0x1021;
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    return crc;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
static uint8_t LastBLcmd;   // stored the last sent cmd in order to analys response
 | 
					 | 
				
			||||||
                            // cmd echo'ed: error       cmd or'ed with 0x80: OK
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
uint8_t tslib_prepareDC_BLcmd(uint8_t Cmd, uint8_t SendDataLength, uint8_t *sendData, uint8_t *outBuf)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    // make BL protocol, retval = outbuf length (5...133)
 | 
					 | 
				
			||||||
    // bring data in correct form: start always with 0x02   finish with 0x03 and append checksum
 | 
					 | 
				
			||||||
    // 0x02 Cmd < ...sendData ..>  CRC  CRC 0x03
 | 
					 | 
				
			||||||
    // Data length = 0...64
 | 
					 | 
				
			||||||
    // special conversion: if data contain 2 or 3 (STX, ETX) then write two bytes:  0x1B (=ESC) and data|0x80
 | 
					 | 
				
			||||||
    // so maxlength = 5 + 2 x 64 (if all data are 2 or 3)  without 2,3: maxlength = 5 + 64
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    uint8_t  myBuf[140], pp=0, nn, uctmp, currLen=0;
 | 
					 | 
				
			||||||
    uint16_t calcCrc;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    tslib_strclr(myBuf, 0, 140);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    myBuf[pp++]=2;    // STX
 | 
					 | 
				
			||||||
    myBuf[pp++]=Cmd;
 | 
					 | 
				
			||||||
    LastBLcmd=Cmd;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    // append data:
 | 
					 | 
				
			||||||
    for (nn=0; nn<SendDataLength; nn++)
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
        uctmp=sendData[nn];
 | 
					 | 
				
			||||||
        if (uctmp==2 || uctmp==3)       // STX or ETX in normal data!
 | 
					 | 
				
			||||||
        {
 | 
					 | 
				
			||||||
            myBuf[pp++]=0x1B;       // ESC
 | 
					 | 
				
			||||||
            myBuf[pp++]=uctmp | 0x80;
 | 
					 | 
				
			||||||
        } else
 | 
					 | 
				
			||||||
            myBuf[pp++]=uctmp;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    currLen=pp;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    // calc crc: (over cmd and data, without STX)
 | 
					 | 
				
			||||||
    calcCrc=tslib_calcCrcCcitt(uint16_t(currLen), myBuf);
 | 
					 | 
				
			||||||
    myBuf[pp++]=uint8_t(calcCrc & 0x00FF);
 | 
					 | 
				
			||||||
    myBuf[pp++]=uint8_t((calcCrc>>8) & 0x00FF);
 | 
					 | 
				
			||||||
    myBuf[pp++]=3;
 | 
					 | 
				
			||||||
    currLen=pp;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    return currLen;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// some special commands (right out of bootloader manual)
 | 
					 | 
				
			||||||
uint8_t tslib_readBLversion(uint8_t *sendData)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    // minimum size of sendData-buffer: 5byte  retval: length
 | 
					 | 
				
			||||||
    uint8_t myBuf[2];
 | 
					 | 
				
			||||||
    tslib_strclr(myBuf, 0, 2);
 | 
					 | 
				
			||||||
    return tslib_prepareDC_BLcmd(0x11, 0, myBuf, sendData);
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
uint8_t tslib_readFWversion(uint8_t *sendData)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    // minimum size of sendData-buffer: 5byte  retval: length
 | 
					 | 
				
			||||||
    uint8_t myBuf[2];
 | 
					 | 
				
			||||||
    tslib_strclr(myBuf, 0, 2);
 | 
					 | 
				
			||||||
    return tslib_prepareDC_BLcmd(0x12, 0, myBuf, sendData);
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
uint8_t tslib_exitBL(uint8_t *sendData)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    // minimum size of sendData-buffer: 5byte  retval: length
 | 
					 | 
				
			||||||
    uint8_t myBuf[2];
 | 
					 | 
				
			||||||
    tslib_strclr(myBuf, 0, 2);
 | 
					 | 
				
			||||||
    return tslib_prepareDC_BLcmd(0x18, 0, myBuf, sendData);
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
uint8_t tslib_sendFlashStartAddr2BL(uint32_t startAddr, uint8_t *sendData)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    // minimum size of sendData-buffer: 13byte    retval: length (9...13)
 | 
					 | 
				
			||||||
    uint8_t myBuf[2];
 | 
					 | 
				
			||||||
    tslib_strclr(myBuf, 0, 2);
 | 
					 | 
				
			||||||
    return tslib_prepareDC_BLcmd(0x11, 0, myBuf, sendData);
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
*/
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// -----------------------------------------------------------------------------------------------
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
void biox_CopyBlock(uint8_t *src, uint16_t srcPos, uint8_t *dest, uint16_t destPos, uint16_t len)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    // both buffers starting from pos 0
 | 
					 | 
				
			||||||
    uint16_t xx,yy,zz,ii;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    xx = srcPos;
 | 
					 | 
				
			||||||
    yy = destPos;
 | 
					 | 
				
			||||||
    zz = len;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    for (ii = 0; ii < zz; ++ii)
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
        dest[yy + ii] = src[xx + ii];
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
@@ -1,49 +1,227 @@
 | 
				
			|||||||
# QT -= gui
 | 
					QT += core gui
 | 
				
			||||||
QT += core
 | 
					QT += widgets serialport network
 | 
				
			||||||
QT += widgets serialport
 | 
					 | 
				
			||||||
QT += network
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
TARGET = up_dev_ctrl
 | 
					greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
 | 
				
			||||||
 | 
					
 | 
				
			||||||
CONFIG += c++11
 | 
					TARGET = ATBUpdateTool
 | 
				
			||||||
# CONFIG -= app_bundle
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
# DEFINES+=LinuxDesktop
 | 
					# The following define makes your compiler emit warnings if you use
 | 
				
			||||||
 | 
					# any Qt feature that has been marked deprecated (the exact warnings
 | 
				
			||||||
 | 
					# depend on your compiler). Please consult the documentation of the
 | 
				
			||||||
 | 
					# deprecated API in order to know how to port your code away from it.
 | 
				
			||||||
 | 
					DEFINES += QT_DEPRECATED_WARNINGS
 | 
				
			||||||
 | 
					
 | 
				
			||||||
QMAKE_CXXFLAGS += -Wno-deprecated-copy
 | 
					# You can also make your code fail to compile if it uses deprecated APIs.
 | 
				
			||||||
 | 
					# In order to do so, uncomment the following line.
 | 
				
			||||||
 | 
					# You can also select to disable deprecated APIs only up to a certain version of Qt.
 | 
				
			||||||
 | 
					#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000    # disables all the APIs deprecated before Qt 6.0.0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# custom target for 'git subtree'
 | 
					# 1.3.6 :   Do not update device-controller/json files, but have the library
 | 
				
			||||||
# subtree.target = subtree
 | 
					#           (in a later step) do that.
 | 
				
			||||||
# subtree.commands = git subtree add --prefix DCPlugin https://git.mimbach49.de/GerhardHoffmann/DCPlugin.git master --squash
 | 
					#           Fixed sending messages to ISMAS.
 | 
				
			||||||
# subtree.depends =
 | 
					#           Always execute contents of opkg_commands-file (even if there are no
 | 
				
			||||||
# QMAKE_EXTRA_UNIX_TARGETS += subtree
 | 
					#           changes).
 | 
				
			||||||
 | 
					# 1.3.7 :   Wait forever for git-commands to finish in QProcess executing such
 | 
				
			||||||
 | 
					#           a command.
 | 
				
			||||||
 | 
					# 1.3.8 :   Remove accessing opkg_commands under file-system-path /etc/psa_update.
 | 
				
			||||||
 | 
					#           Activate download of json-configuration files.
 | 
				
			||||||
 | 
					# 1.3.9 :   Fix sendLastVersion: use configured branch and not master branch in
 | 
				
			||||||
 | 
					#               git show origin/master -s --format="c=%h m=%s d=%cI"    ==>
 | 
				
			||||||
 | 
					#               git show origin/zg1/zone1 -s --format="c=%h m=%s d=%cI"
 | 
				
			||||||
 | 
					#           Use dynamic values for os-release and apism-version when sending
 | 
				
			||||||
 | 
					#           last version info.
 | 
				
			||||||
 | 
					# 1.3.10:   Fix premature killing opkg-commands: detected timeout of 100s was
 | 
				
			||||||
 | 
					#           too small when updating apism.
 | 
				
			||||||
 | 
					#           Fix display of UPDATE_SUCCESS when opkg_command fails. Detected when
 | 
				
			||||||
 | 
					#           updating apsim failed.
 | 
				
			||||||
 | 
					# 1.3.11:   Integrate version of ATBUpdateTool in SendLastVersion-ISMAS-message.
 | 
				
			||||||
 | 
					# 1.3.12:   Add command parameters for output of yocto-infos about ATBUpdateTool.
 | 
				
			||||||
 | 
					#           Use 'git pull' instead of 'git fetch'.
 | 
				
			||||||
 | 
					#           Use 'git clone --filter=blob:none' instead of 'git clone' to speed
 | 
				
			||||||
 | 
					#           up cloning of customer repository.
 | 
				
			||||||
 | 
					# 1.3.13:   Fix: if the customer repository is corrupted, remove it and re-clone
 | 
				
			||||||
 | 
					#           the repository (without checking the ISMAS-trigger (WAIT-)button.
 | 
				
			||||||
 | 
					# 1.3.14:   Add additional check for sanity of customer repository using
 | 
				
			||||||
 | 
					#           "git fsck".
 | 
				
			||||||
 | 
					#           Stream-lined code of update process: massive refactoring.
 | 
				
			||||||
 | 
					#           Added functionality: If WAIT button is not active, then an existing
 | 
				
			||||||
 | 
					#           customer repository will be repaired, or a not existing repository
 | 
				
			||||||
 | 
					#           will be cloned. The process stops then.
 | 
				
			||||||
 | 
					#           However, if the WAIT button is active, the at least the commands in
 | 
				
			||||||
 | 
					#           opkg_commands will be executed. Changed files in the customer
 | 
				
			||||||
 | 
					#           repository will be worked on: tariff-files will be synced with the
 | 
				
			||||||
 | 
					#           local filesystem, json-files will be downloaded to firmware.
 | 
				
			||||||
 | 
					#           The device-controller firmware will be handled in a later version.
 | 
				
			||||||
 | 
					# 1.3.15:   Bug fixes found during testing.
 | 
				
			||||||
 | 
					#           Do not disable Exit-button during update-process.
 | 
				
			||||||
 | 
					#           Removed worker-thread with an own event-loop: only the GUI thread
 | 
				
			||||||
 | 
					#           has an event loop. Tested JSON-downloads several times successfully
 | 
				
			||||||
 | 
					#           (using the slave lib where the CA helper tool was active as master).
 | 
				
			||||||
 | 
					#           Turned previous worker-object into its own thread, but without any
 | 
				
			||||||
 | 
					#           own event-loop (so it cannot block anything inside the CA-plugin).
 | 
				
			||||||
 | 
					# 1.3.16:   Bug fixes found during testing.
 | 
				
			||||||
 | 
					# 1.3.17:   Add ATBUpdateTool.ini and custom command line parser. Settings
 | 
				
			||||||
 | 
					#           given in ATBUpdateTool.ini can be overwritten on the command-line.
 | 
				
			||||||
 | 
					# 1.3.18:   Bug fixes found during testing.
 | 
				
			||||||
 | 
					# 1.3.19:   Bug fixes found during testing.
 | 
				
			||||||
 | 
					# 1.3.20:   Bug fixes found during testing.
 | 
				
			||||||
 | 
					# 1.3.21:   Bug fixes found during testing:
 | 
				
			||||||
 | 
					#           Fix directory of ATBUpdateTool.ini to be the working directory of
 | 
				
			||||||
 | 
					#           the application rather than just ".".
 | 
				
			||||||
 | 
					#           Check existance of etc-directory inside customer repository.
 | 
				
			||||||
 | 
					#           Check for valid ISMAS trigger (button) 15x (=90s).
 | 
				
			||||||
 | 
					#           NOTE: if the customer repository is cloned (or repaired and cloned
 | 
				
			||||||
 | 
					#           again), and if the settings always-download-config=true and
 | 
				
			||||||
 | 
					#           always-download-dc=true in the ATBUpdateTool.ini file, the download
 | 
				
			||||||
 | 
					#           the printer-json files and the device controller file, even without
 | 
				
			||||||
 | 
					#           an activated ISMAS trigger (button). The tariff-files are rsynced to
 | 
				
			||||||
 | 
					#           the local filesystem for such clone.
 | 
				
			||||||
 | 
					#           Set new filename for device controller: dc2c.bin.
 | 
				
			||||||
 | 
					# 1.3.22:   Bug fixes found during testing:
 | 
				
			||||||
 | 
					#           Fix the path-names of the json-files and the device-controller.
 | 
				
			||||||
 | 
					#           Set automatic download of json-file in ATBUpdateTool.ini file for
 | 
				
			||||||
 | 
					#           a fresh clone of the repository.
 | 
				
			||||||
 | 
					# 1.3.23:   Added a 'break' to prevent a possible endless loop when checking if
 | 
				
			||||||
 | 
					#           the device is alive.
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					# NOTE:     The versioning info has to be shifted up by one version, i.e. what
 | 
				
			||||||
 | 
					#           happened for 1.3.23 was actually done in 1.3.24.
 | 
				
			||||||
 | 
					# 1.3.24
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					# 1.3._24_: Special version for szeged using a old dc-controller (4.42):
 | 
				
			||||||
 | 
					#           Changes:
 | 
				
			||||||
 | 
					#               (1) the ini-File now uses the libCAmaster.so.
 | 
				
			||||||
 | 
					# 1.3._25_: Again special version for szeged, using interface.h, version 4.4.
 | 
				
			||||||
 | 
					# 1.4.0   : Start with version at 1.4.0 (mainly to see a difference with Szeged)
 | 
				
			||||||
 | 
					#           Set hash-value in EVENT-objects. Set location (project), version
 | 
				
			||||||
 | 
					#           and info in send-last-version.
 | 
				
			||||||
 | 
					#           If the customer repository does not exist, then do not check the
 | 
				
			||||||
 | 
					#           ISMAS trigger, but proceed with the update procedure. Otherwise,
 | 
				
			||||||
 | 
					#           check the ISMAS update-trigger as first step.
 | 
				
			||||||
 | 
					#           If the current time is between 0.00 - 4.00 o'clock, then a wrong
 | 
				
			||||||
 | 
					#           trigger-value will result in an UPDATE_STEP_NOT_NECESSARY.
 | 
				
			||||||
 | 
					#           Move final processing to subclass UpdateProcessRunning.
 | 
				
			||||||
 | 
					#           Disable EXIT-button for the whole update-process, except for the
 | 
				
			||||||
 | 
					#           checking of the ISMAS-trigger-button (aka WAIT-button).
 | 
				
			||||||
 | 
					# 2.0.0     Download device-controller using reporting-/download-thread.
 | 
				
			||||||
 | 
					VERSION="2.0.0"
 | 
				
			||||||
 | 
					# PLANNED TODOS:
 | 
				
			||||||
 | 
					#   1:  Das Repository wird repariert bwz. neu geklont. Unabhaengig vom WAIT.
 | 
				
			||||||
 | 
					#   2:  Wenn der WAIT-Button aktiv ist, dann wird ein Repository repariert (neu
 | 
				
			||||||
 | 
					#       geklont), aber zusaetzlich werden alle verfuegbaren Dateien als neu
 | 
				
			||||||
 | 
					#       angesehen und die entsprechenden Aktionen durchgefuehrt: tariff-files
 | 
				
			||||||
 | 
					#       spiegeln, json-files laden und dc laden. Also VORSICHT: das repository
 | 
				
			||||||
 | 
					#       muss in diesem fall wirklich in ordnung sein.
 | 
				
			||||||
 | 
					#   3:  Wurde keine Datei geaendert, kein initiales Clone und der WAIT-button
 | 
				
			||||||
 | 
					#       nicht aktiv, so (passiert natuerlich nichts) kann man davon ausgehen,
 | 
				
			||||||
 | 
					#       dass es sich um ein automatisches Update handelt. Dann koennte man im
 | 
				
			||||||
 | 
					#       ISMAS eine entsprechende Meldung anzeigen als Teil von SEND-LAST-VERSION.
 | 
				
			||||||
 | 
					#       Wenn der WAIT-button aktiv ist, dann werden zumindest die opkg-commands
 | 
				
			||||||
 | 
					#       ausgefuehrt.
 | 
				
			||||||
 | 
					#   4:  rsync: immer alle Dateien soiegeln (bis auf opkg-commands)
 | 
				
			||||||
 | 
					#   5:  Falls das Tool mal abstuerzt, dann einen Signal-Handler (fuer TERM)
 | 
				
			||||||
 | 
					#       installieren, sodass zumnidest SEND-LAST-VERSION mit rausgeht.
 | 
				
			||||||
 | 
					#   6:  rsync: explizites Binary, nicht das in busybox enthaltene.
 | 
				
			||||||
 | 
					#   7:  Versionen der Json-Files lassen sich auslesen.
 | 
				
			||||||
 | 
					#       Problem: Einstellungen in den Json-Files lassen sich auch mittels
 | 
				
			||||||
 | 
					#       Funktionen in der CD-Library ueberschreiben. Damit ist dann wieder nicht
 | 
				
			||||||
 | 
					#       mehr so klar, was jetzt eigentlich aktiv ist.
 | 
				
			||||||
 | 
					#   8:  m_alwaysDownloadConfig und m_alwaysDownloadDC: vorbereitet: man koennte
 | 
				
			||||||
 | 
					#       es so arrangieren, dass der DC plus die Json-files im Repository immer
 | 
				
			||||||
 | 
					#       runtergeladen werden, obwohl sich im Repository gar nicts veraendert
 | 
				
			||||||
 | 
					#       hat. Eeventuell nuetzlich beim initialen Setuo eines PSA.
 | 
				
			||||||
 | 
					#   9:  Das Kunden-Repository sollte immer gezogen werden, unabhaengig von der
 | 
				
			||||||
 | 
					#       Stellung des WAIT-Button. Grund: es koennte sein, dass andernfalls ein
 | 
				
			||||||
 | 
					#       PSA weit hiter anderen steht, und dann ploetzlich einmal alle vorher-
 | 
				
			||||||
 | 
					#       gehenden Aenderungen anzieht, die gar nicht fuer ihn gemeint waren.
 | 
				
			||||||
 | 
					#  10:  Bei einer Neuinstallation (Neuhauser) immer JSON files runterladen,
 | 
				
			||||||
 | 
					#       Tariff-Files syncen (d.h. nur wenn noch kein Repo vorhanden ist), und
 | 
				
			||||||
 | 
					#       zwar auch ohne WAIT-Button.
 | 
				
			||||||
 | 
					#  11:  Das Edit-Fenster teilen um die Anzeige zu verbessern.
 | 
				
			||||||
 | 
					#  12:  Bei einem Update muss immer ersichtlich sein, warum es ueberhaupt
 | 
				
			||||||
 | 
					#       angestossen wurde. Steht kein "WAIT" im ISMAS-Trigger, dann kann man
 | 
				
			||||||
 | 
					#       davon ausgehen, dass es sich um ein automatisches Update handelt.
 | 
				
			||||||
 | 
					#       In jedem Fall wird bei einem automatischen Update, bei dem der WAIT-
 | 
				
			||||||
 | 
					#       Button nicht gesetzt war, ein "OK" gesendet, falls sonst nichts weiter
 | 
				
			||||||
 | 
					#       zu tun ist. Beachte aber: wir haben auch noch den Fall, dass eine SD-
 | 
				
			||||||
 | 
					#       Karte gesteckt wird. In diesem Fall wird ein komplettes Update gefahren,
 | 
				
			||||||
 | 
					#       und zwar explizit auch ohne WAIT-Button.
 | 
				
			||||||
 | 
					#       Am Ende eines Updates steht im ISMAS entweder ein "OK" oder ein "FAIL".
 | 
				
			||||||
 | 
					# 13:   SendLastVersion: fuer jedes erfolgreich installierte Paket eine
 | 
				
			||||||
 | 
					#       Send-Last-Version-Nachricht an ISMAS. Dadurch entsteht im ISMAS eine
 | 
				
			||||||
 | 
					#       History (Christian darueber informieren).
 | 
				
			||||||
 | 
					# 14:   Installiert werden nur Dateien, die neu sind oder geaendert wurden.
 | 
				
			||||||
 | 
					#       Nicht etwas Dateien, die geloescht wurden: sicherstellen, dass man hier
 | 
				
			||||||
 | 
					#       immer direkt im repository arbeitet, nicht auf dem Filesystem.
 | 
				
			||||||
 | 
					#       Ferner: der DeviceController heisst dc2c.bin, auch fuer die Jsons
 | 
				
			||||||
 | 
					#       sind Dtandard-Namen vergeben. Alternativ: alle vorhandenen Jsons
 | 
				
			||||||
 | 
					#       werden runtergeladen: Thomas ist eh fuer deren Inhalte verantworlich.
 | 
				
			||||||
 | 
					#       WICHTIG: immer ueberpruefen, ob die Dateien im Customer-Repository
 | 
				
			||||||
 | 
					#       wirklich die richtigen Dateien sind.
 | 
				
			||||||
 | 
					# 15:   Der WAIT-Button laesst sich auf WAIT zuruecksetzen (etwa wenn git
 | 
				
			||||||
 | 
					#       selber Probleme hatte).
 | 
				
			||||||
 | 
					# 16:   Der Download-Thread sollte sowohl die auto-Variable auf false setzen
 | 
				
			||||||
 | 
					#       als auch den cycle-Timer stoppen, damit sichergestellt ist, dass der
 | 
				
			||||||
 | 
					#       Download des DC nicht gestoert wird.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
! exists(DCPlugin) {
 | 
					
 | 
				
			||||||
    $$system("git subtree add --prefix DCPlugin https://git.mimbach49.de/GerhardHoffmann/DCPlugin.git master --squash")
 | 
					win32 {
 | 
				
			||||||
 | 
					    BUILD_DATE=$$system("date /t")
 | 
				
			||||||
 | 
					    BUILD_TIME=$$system("time /t")
 | 
				
			||||||
} else {
 | 
					} else {
 | 
				
			||||||
    # $$system("git subtree pull --prefix DCPlugin https://git.mimbach49.de/GerhardHoffmann/DCPlugin.git master --squash")
 | 
					    BUILD_DATE=$$system("date +%d-%m-%y")
 | 
				
			||||||
 | 
					    BUILD_TIME=$$system("date +%H:%M:%S")
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# You can make your code fail to compile if it uses deprecated APIs.
 | 
					GIT_COMMIT=$$system("git log -1 --format=oneline | cut -d' ' -f1")
 | 
				
			||||||
# In order to do so, uncomment the following line.
 | 
					
 | 
				
			||||||
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000    # disables all the APIs deprecated before Qt 6.0.0
 | 
					EXTENDED_VERSION="$${VERSION}-$${GIT_COMMIT}"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					!contains(CONFIG, INCLUDEINTERFACES) {
 | 
				
			||||||
 | 
					    INCLUDEINTERFACES=/opt/ptu5/opt/DCLibraries/include
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					INCLUDEPATH += plugins $${INCLUDEINTERFACES}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					CONFIG += c++17
 | 
				
			||||||
 | 
					# CONFIG -= app_bundle
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					DEFINES+=APP_VERSION=\\\"$$VERSION\\\"
 | 
				
			||||||
 | 
					DEFINES+=APP_BUILD_DATE=\\\"$$BUILD_DATE\\\"
 | 
				
			||||||
 | 
					DEFINES+=APP_BUILD_TIME=\\\"$$BUILD_TIME\\\"
 | 
				
			||||||
 | 
					DEFINES+=APP_EXTENDED_VERSION=\\\"$$EXTENDED_VERSION\\\"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# keep comments, as /* fall through */
 | 
				
			||||||
 | 
					QMAKE_CXXFLAGS += -C
 | 
				
			||||||
 | 
					QMAKE_CXXFLAGS += -g
 | 
				
			||||||
 | 
					QMAKE_CXXFLAGS += -Wno-deprecated-copy -O
 | 
				
			||||||
 | 
					
 | 
				
			||||||
contains( CONFIG, PTU5 ) {
 | 
					contains( CONFIG, PTU5 ) {
 | 
				
			||||||
    greaterThan(QT_MAJOR_VERSION, 4): QT += serialport
 | 
					    greaterThan(QT_MAJOR_VERSION, 4): QT += serialport
 | 
				
			||||||
    CONFIG += link_pkgconfig
 | 
					    CONFIG += link_pkgconfig
 | 
				
			||||||
    lessThan(QT_MAJOR_VERSION, 5):   PKGCONFIG += qextserialport
 | 
					    lessThan(QT_MAJOR_VERSION, 5):   PKGCONFIG += qextserialport
 | 
				
			||||||
    QMAKE_CXXFLAGS += -std=c++11   # for GCC >= 4.7
 | 
					    QMAKE_CXXFLAGS += -O2 -std=c++17   # for GCC >= 4.7
 | 
				
			||||||
    QMAKE_CXXFLAGS += -Wno-deprecated-copy
 | 
					    # QMAKE_CXXFLAGS += -Wno-deprecated-copy
 | 
				
			||||||
    ARCH = PTU5
 | 
					    ARCH = PTU5
 | 
				
			||||||
    DEFINES+=PTU5
 | 
					    DEFINES+=PTU5
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					contains( CONFIG, PTU5_YOCTO ) {
 | 
				
			||||||
 | 
					    greaterThan(QT_MAJOR_VERSION, 4): QT += serialport
 | 
				
			||||||
 | 
					    QMAKE_CXXFLAGS += -std=c++17   # for GCC >= 4.7
 | 
				
			||||||
 | 
					    # QMAKE_CXXFLAGS += -Wno-deprecated-copy
 | 
				
			||||||
 | 
					    PTU5BASEPATH = /opt/devel/ptu5
 | 
				
			||||||
 | 
					    ARCH = PTU5
 | 
				
			||||||
 | 
					    DEFINES+=PTU5
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    # add qmqtt lib
 | 
				
			||||||
 | 
					    #LIBS += -lQt5Qmqtt
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
contains( CONFIG, DesktopLinux ) {
 | 
					contains( CONFIG, DesktopLinux ) {
 | 
				
			||||||
    greaterThan(QT_MAJOR_VERSION, 4): QT += serialport
 | 
					    greaterThan(QT_MAJOR_VERSION, 4): QT += serialport
 | 
				
			||||||
    lessThan(QT_MAJOR_VERSION, 5):    CONFIG += extserialport
 | 
					    lessThan(QT_MAJOR_VERSION, 5):    CONFIG += extserialport
 | 
				
			||||||
    # QMAKE_CC = ccache $$QMAKE_CC
 | 
					    # QMAKE_CC = ccache $$QMAKE_CC
 | 
				
			||||||
    # QMAKE_CXX = ccache $$QMAKE_CXX
 | 
					    # QMAKE_CXX = ccache $$QMAKE_CXX
 | 
				
			||||||
    QMAKE_CXXFLAGS += -std=c++11
 | 
					    QMAKE_CXXFLAGS += -std=c++17
 | 
				
			||||||
    QMAKE_CXXFLAGS += -Wno-deprecated-copy
 | 
					    # QMAKE_CXXFLAGS += -Wno-deprecated-copy
 | 
				
			||||||
    linux-clang {  QMAKE_CXXFLAGS += -Qunused-arguments   }
 | 
					    linux-clang {  QMAKE_CXXFLAGS += -Qunused-arguments   }
 | 
				
			||||||
    ARCH = DesktopLinux
 | 
					    ARCH = DesktopLinux
 | 
				
			||||||
    DEFINES+=DesktopLinux
 | 
					    DEFINES+=DesktopLinux
 | 
				
			||||||
@@ -51,23 +229,43 @@ contains( CONFIG, DesktopLinux ) {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
SOURCES += \
 | 
					SOURCES += \
 | 
				
			||||||
        main.cpp \
 | 
					        main.cpp \
 | 
				
			||||||
 | 
					        progress_event.cpp \
 | 
				
			||||||
 | 
					        update_dc_event.cpp \
 | 
				
			||||||
 | 
					        mainwindow.cpp \
 | 
				
			||||||
 | 
					        utils.cpp \
 | 
				
			||||||
        update.cpp \
 | 
					        update.cpp \
 | 
				
			||||||
        message_handler.cpp
 | 
					        git/git_client.cpp \
 | 
				
			||||||
 | 
					        ismas/ismas_client.cpp \
 | 
				
			||||||
 | 
					        process/command.cpp \
 | 
				
			||||||
 | 
					        message_handler.cpp \
 | 
				
			||||||
 | 
					        worker.cpp \
 | 
				
			||||||
 | 
					        commandline_parser.cpp
 | 
				
			||||||
 | 
					
 | 
				
			||||||
HEADERS += \
 | 
					HEADERS += \
 | 
				
			||||||
        update.h \
 | 
					        update.h \
 | 
				
			||||||
 | 
					        progress_event.h \
 | 
				
			||||||
 | 
					        update_dc_event.h \
 | 
				
			||||||
 | 
					        utils.h \
 | 
				
			||||||
 | 
					        mainwindow.h \
 | 
				
			||||||
 | 
					        git/git_client.h \
 | 
				
			||||||
 | 
					        apism/ismas_data.h \
 | 
				
			||||||
 | 
					        ismas/ismas_client.h \
 | 
				
			||||||
 | 
					        process/command.h \
 | 
				
			||||||
        message_handler.h \
 | 
					        message_handler.h \
 | 
				
			||||||
        DCPlugin/include/interfaces.h
 | 
					        worker.h \
 | 
				
			||||||
 | 
					        commandline_parser.h
 | 
				
			||||||
 | 
					
 | 
				
			||||||
OTHER_FILES += \
 | 
					OTHER_FILES += \
 | 
				
			||||||
    /opt/app/tools/atbupdate/update_log.csv
 | 
					    ATBUpdateTool.ini
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# https://blog.developer.atlassian.com/the-power-of-git-subtree/?_ga=2-71978451-1385799339-1568044055-1068396449-1567112770
 | 
					FORMS += \
 | 
				
			||||||
# git subtree add --prefix DCPlugin https://git.mimbach49.de/GerhardHoffmann/DCPlugin.git master --squash
 | 
					    mainwindow.ui
 | 
				
			||||||
# git subtree pull --prefix DCPlugin https://git.mimbach49.de/GerhardHoffmann/DCPlugin.git master --squash
 | 
					 | 
				
			||||||
include(./DCPlugin/DCPlugin.pri)
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
# Default rules for deployment.
 | 
					
 | 
				
			||||||
 | 
					##########################################################################################
 | 
				
			||||||
 | 
					# for running program on target through QtCreator
 | 
				
			||||||
 | 
					contains( CONFIG, PTU5 ) {
 | 
				
			||||||
   qnx: target.path = /tmp/$${TARGET}/bin
 | 
					   qnx: target.path = /tmp/$${TARGET}/bin
 | 
				
			||||||
else: unix:!android: target.path = /opt/$${TARGET}/bin
 | 
					   else: unix:!android: target.path = /opt/app/tools/atbupdate/
 | 
				
			||||||
   !isEmpty(target.path): INSTALLS += target
 | 
					   !isEmpty(target.path): INSTALLS += target
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,56 +0,0 @@
 | 
				
			|||||||
# QT -= gui
 | 
					 | 
				
			||||||
QT += core
 | 
					 | 
				
			||||||
QT += widgets serialport
 | 
					 | 
				
			||||||
QT += network
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
TARGET = up_dev_ctrl
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
CONFIG += c++11
 | 
					 | 
				
			||||||
# CONFIG -= app_bundle
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
# DEFINES+=LinuxDesktop
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
QMAKE_CXXFLAGS += -Wno-deprecated-copy
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
# You can make your code fail to compile if it uses deprecated APIs.
 | 
					 | 
				
			||||||
# In order to do so, uncomment the following line.
 | 
					 | 
				
			||||||
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000    # disables all the APIs deprecated before Qt 6.0.0
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
contains( CONFIG, PTU5 ) {
 | 
					 | 
				
			||||||
    greaterThan(QT_MAJOR_VERSION, 4): QT += serialport
 | 
					 | 
				
			||||||
    CONFIG += link_pkgconfig
 | 
					 | 
				
			||||||
    lessThan(QT_MAJOR_VERSION, 5):   PKGCONFIG += qextserialport
 | 
					 | 
				
			||||||
    QMAKE_CXXFLAGS += -std=c++11   # for GCC >= 4.7
 | 
					 | 
				
			||||||
    QMAKE_CXXFLAGS += -Wno-deprecated-copy
 | 
					 | 
				
			||||||
    ARCH = PTU5
 | 
					 | 
				
			||||||
    DEFINES+=PTU5
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
contains( CONFIG, DesktopLinux ) {
 | 
					 | 
				
			||||||
    greaterThan(QT_MAJOR_VERSION, 4): QT += serialport
 | 
					 | 
				
			||||||
    lessThan(QT_MAJOR_VERSION, 5):    CONFIG += extserialport
 | 
					 | 
				
			||||||
    # QMAKE_CC = ccache $$QMAKE_CC
 | 
					 | 
				
			||||||
    # QMAKE_CXX = ccache $$QMAKE_CXX
 | 
					 | 
				
			||||||
    QMAKE_CXXFLAGS += -std=c++11
 | 
					 | 
				
			||||||
    QMAKE_CXXFLAGS += -Wno-deprecated-copy
 | 
					 | 
				
			||||||
    linux-clang {  QMAKE_CXXFLAGS += -Qunused-arguments   }
 | 
					 | 
				
			||||||
    ARCH = DesktopLinux
 | 
					 | 
				
			||||||
    DEFINES+=DesktopLinux
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
SOURCES += \
 | 
					 | 
				
			||||||
        main.cpp \
 | 
					 | 
				
			||||||
        message_handler.cpp
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
HEADERS += \
 | 
					 | 
				
			||||||
        message_handler.h \
 | 
					 | 
				
			||||||
        DCPlugin/include/interfaces.h
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
# https://blog.developer.atlassian.com/the-power-of-git-subtree/?_ga=2-71978451-1385799339-1568044055-1068396449-1567112770
 | 
					 | 
				
			||||||
# git subtree add --prefix DCPlugin https://git.mimbach49.de/GerhardHoffmann/DCPlugin.git master --squash
 | 
					 | 
				
			||||||
# git subtree pull --prefix DCPlugin https://git.mimbach49.de/GerhardHoffmann/DCPlugin.git master --squash
 | 
					 | 
				
			||||||
include(./DCPlugin/DCPlugin.pri)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
# Default rules for deployment.
 | 
					 | 
				
			||||||
qnx: target.path = /tmp/$${TARGET}/bin
 | 
					 | 
				
			||||||
else: unix:!android: target.path = /opt/$${TARGET}/bin
 | 
					 | 
				
			||||||
!isEmpty(target.path): INSTALLS += target
 | 
					 | 
				
			||||||
							
								
								
									
										126
									
								
								allgemein.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										126
									
								
								allgemein.txt
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,126 @@
 | 
				
			|||||||
 | 
					0:
 | 
				
			||||||
 | 
					    Zunaechst wir immer nachgesehen, ob das Repository bereits geklont wurde.
 | 
				
			||||||
 | 
					    Wenn nein, dann wird geklont. Im Master-Branch befinden sich Dateinen, die
 | 
				
			||||||
 | 
					    in allen anderen Branches gemeinsam genutzt werden. Das sollte wohl auf
 | 
				
			||||||
 | 
					    jeden Fall fuer den DeviceController gelten.
 | 
				
			||||||
 | 
					1:
 | 
				
			||||||
 | 
					    Anfrage bei ISMAS ob neue Daten da sind. Hier faengt die ganze Sache an.
 | 
				
			||||||
 | 
					    Da man nicht weiss, on ISMAS ueberhaupt antworten wird braucht es einen
 | 
				
			||||||
 | 
					    Timer. Man kann die Sache dann auch gleich mehrfach versuchen.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    Die Anfrage geht also per Signal an den Apism-Client. Im Signal wird der
 | 
				
			||||||
 | 
					    Zustand mitgegeben:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        ISMAS_UPDATE_REQUEST_PENDING
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    und im Slot dann entsprechend uebernommen. Der Timer sollte nicht im Worker
 | 
				
			||||||
 | 
					    stehen, sondern im Apism-Client. Der Worker sollte damit nicht belastet
 | 
				
			||||||
 | 
					    sein. Der wird dann vom Apism-Client entsprechend benachrichtigt.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        ISMAS_UPDATE_REQUEST_FAILURE
 | 
				
			||||||
 | 
					            ISMAS_UPDATE_REQUEST_TIMEOUT
 | 
				
			||||||
 | 
					        ISMAS_UPDATE_REQUEST_SUCCESS
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    Im 1./2.Fall wird dann ein Fehlerhandling durchgefuehrt. Insbesondere
 | 
				
			||||||
 | 
					    wird Apism ueber den DB-Kanal darueber informiert (U0003). Am Ende wie
 | 
				
			||||||
 | 
					    dann wie immer SendCmdVersion und beenden der Applikation.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    Im Erfolgsfall muss in der Antwort der Branch enthalten sein, fuer den das
 | 
				
			||||||
 | 
					    Update durchgefuhrt werden soll. Das ist auch bereits so (Location).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    Ein Sonderfall waere der -m-Modus, da hier niemand auf der ISMAS-Seite
 | 
				
			||||||
 | 
					    aktiv eingreift. Hier braucht es dann einen Ubergabeparameter an 
 | 
				
			||||||
 | 
					    ATBUpdateTool: --branch-name
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    Normalfall ist aber die Aktivierung via ISMAS. Dann muss der in der Antwort
 | 
				
			||||||
 | 
					    enthaltene Branch zunaechst ausgecheckt werden.
 | 
				
			||||||
 | 
					2: 
 | 
				
			||||||
 | 
					    Dazu wird ein entsprechendes Signal an den GitClient gesandet.
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					        GIT_CHECKOUT_BRANCH_REQUEST
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    Der GitClient sieht jetzt erstmal nach, ob es diesen Branch ueberhaupt
 | 
				
			||||||
 | 
					    gibt.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        Falls nein:    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        GIT_CHECKOUT_BRANCH_REQUEST_FAILURE
 | 
				
			||||||
 | 
					            BRANCH_NOT_EXIST
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					        Falls ja:
 | 
				
			||||||
 | 
					            der GitClient versucht nun den Branch auszuchecken. 
 | 
				
			||||||
 | 
					            Geht das gut?
 | 
				
			||||||
 | 
					            Falls nein:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                GIT_CHECKOUT_BRANCH_REQUEST_FAILURE
 | 
				
			||||||
 | 
					                    BRANCH_CHECKOUT_ERROR
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            Falls ja:
 | 
				
			||||||
 | 
					                GIT_CHECKOUT_BRANCH_REQUEST_SUCCESS
 | 
				
			||||||
 | 
					                    -> eventl. koennte man den Namen des Branches mitgeben
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        Signal an den Worker. Im entsprechenden Slot wird jetzt der eigentliche
 | 
				
			||||||
 | 
					        UpdateProzess angeworfen.
 | 
				
			||||||
 | 
					 3:
 | 
				
			||||||
 | 
					    Mittels git fetch werden jetzt die Aenderungen ermittelt.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        GIT_FETCH_UPDATES_REQUEST
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					        GIT_FETCH_UPDATES_REQUEST_FAILURE
 | 
				
			||||||
 | 
					            -> Worker informieren damit Fehlerbehandlung aktiviert wird
 | 
				
			||||||
 | 
					        GIT_FETCH_UPDATES_REQUEST_SUCCESS
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        GIT_DIFF_UPDATES
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        Die Liste der geaenderten Dateien geht an den Worker. Der kann jetzt
 | 
				
			||||||
 | 
					        noch Test machen, ob das Sinn macht. Evtl. eine Statusmeldung ausgeben
 | 
				
			||||||
 | 
					        drueber was gleich passieren wird.
 | 
				
			||||||
 | 
					4:
 | 
				
			||||||
 | 
					    Mittels git merge/pull werden nun die Dateien tatsaechlich im Branch 
 | 
				
			||||||
 | 
					    aktualisiert.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        GIT_PULL_UPDATES_REQUEST
 | 
				
			||||||
 | 
					        GIT_PULL_UPDATES_REQUEST_FAILURE
 | 
				
			||||||
 | 
					            -> Worker informieren damit Fehlerbehandlung aktiviert wird
 | 
				
			||||||
 | 
					        GIT_PULL_UPDATES_REQUEST_SUCCESS
 | 
				
			||||||
 | 
					            -> Worker informieren
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    Sind die Daten vorhanden, dann werden sie mittels rsync ins Dateisystem
 | 
				
			||||||
 | 
					    kopiert.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        RSYNC_UPDATES 
 | 
				
			||||||
 | 
					        RSYNC_UPDATES_FAILURE
 | 
				
			||||||
 | 
					        RSYNC_UPDATES_SUCCESS
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    Fuer jede kopierte Datei geht eine Nachricht raus ans ISMAS.
 | 
				
			||||||
 | 
					5:
 | 
				
			||||||
 | 
					    Sind die Daten dann kopiert, so werden sie auf den DC kopiert (falls
 | 
				
			||||||
 | 
					    notwendig): hier gehen dann wieder Nachrichten an ISMAS raus:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        DC_UPDATE 
 | 
				
			||||||
 | 
					        DC_UPDATE_FAILURE
 | 
				
			||||||
 | 
					        DC_UPDATE_SUCCESS
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        JSON_UPDATE
 | 
				
			||||||
 | 
					        JSON_UPDATE_FAILURE
 | 
				
			||||||
 | 
					        JSON_UPDATE_SUCCESS
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					        Hier fuer jedes Json-File.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    Schliesslich noch eine Zusammenfasung an ISMAS:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        ISMAS_UPDATE_INFO_CONFIRM
 | 
				
			||||||
 | 
					        ISMAS_UPDATE_INFO_CONFIRM_FAILURE
 | 
				
			||||||
 | 
					            -> Worker informieren damit Fehlerbehandlung aktiviert wird
 | 
				
			||||||
 | 
					        ISMAS_UPDATE_INFO_CONFIRM_SUCCESS
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    und schliesslich der abschliessende Status an ISMAS zurueckgemeldet:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        ISMAS_CURRENT_PSA_STATUS_CONFIRM
 | 
				
			||||||
 | 
					        ISMAS_CURRENT_PSA_STATUS_CONFIRM_FAILURE
 | 
				
			||||||
 | 
					        ISMAS_CURRENT_PSA_STATUS_CONFIRM_SUCCESS
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
							
								
								
									
										137
									
								
								apism/ismas_data.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										137
									
								
								apism/ismas_data.h
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,137 @@
 | 
				
			|||||||
 | 
					#ifndef ISMASDATA_H
 | 
				
			||||||
 | 
					#define ISMASDATA_H
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <QJsonObject>
 | 
				
			||||||
 | 
					#include <QJsonArray>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					namespace ISMAS {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    struct TransferData : public QJsonObject {
 | 
				
			||||||
 | 
					        struct : public QJsonObject {
 | 
				
			||||||
 | 
					            QJsonValue tariffId;
 | 
				
			||||||
 | 
					            QJsonValue group;
 | 
				
			||||||
 | 
					            QJsonValue zone;
 | 
				
			||||||
 | 
					        } device;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        struct : public QJsonObject {
 | 
				
			||||||
 | 
					            QJsonValue state;
 | 
				
			||||||
 | 
					            QJsonValue uid;
 | 
				
			||||||
 | 
					            QJsonValue seq_tick_number;
 | 
				
			||||||
 | 
					            QJsonValue timestamp;
 | 
				
			||||||
 | 
					            QJsonValue userText;
 | 
				
			||||||
 | 
					            QJsonValue userTextType;
 | 
				
			||||||
 | 
					        } transaction;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        struct : public QJsonObject {
 | 
				
			||||||
 | 
					            // TODO: check what is really used at the moment
 | 
				
			||||||
 | 
					            QJsonValue id;          // unique article id
 | 
				
			||||||
 | 
					            QJsonValue name;        // name
 | 
				
			||||||
 | 
					            QJsonValue price;       // price in cent
 | 
				
			||||||
 | 
					            QJsonValue currency;    //
 | 
				
			||||||
 | 
					            QJsonValue startTime;   // start time
 | 
				
			||||||
 | 
					            QJsonValue endTime;     // end time
 | 
				
			||||||
 | 
					            QJsonValue userText;    // additional info
 | 
				
			||||||
 | 
					            QJsonValue parkingTime;
 | 
				
			||||||
 | 
					            QJsonValue printText;
 | 
				
			||||||
 | 
					            // QJsonValue discount;
 | 
				
			||||||
 | 
					        } item;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        struct : public QJsonObject {
 | 
				
			||||||
 | 
					            struct : public QJsonObject {
 | 
				
			||||||
 | 
					                QJsonValue coins;     // total amount of coins value
 | 
				
			||||||
 | 
					                // QJsonValue notes;     // total amount of notes value
 | 
				
			||||||
 | 
					                QJsonValue overpaid;  // in cent
 | 
				
			||||||
 | 
					                QJsonValue currency;
 | 
				
			||||||
 | 
					                QJsonValue change;
 | 
				
			||||||
 | 
					            } cash;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            struct : public QJsonObject {
 | 
				
			||||||
 | 
					                QJsonValue cardNumber;
 | 
				
			||||||
 | 
					                QJsonValue value;           // buchungsbetrag
 | 
				
			||||||
 | 
					                QJsonValue cardType;
 | 
				
			||||||
 | 
					                QJsonValue currency;
 | 
				
			||||||
 | 
					                QJsonValue tid;
 | 
				
			||||||
 | 
					                QJsonValue tresult;
 | 
				
			||||||
 | 
					            } card;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            struct : public QJsonObject {
 | 
				
			||||||
 | 
					                QJsonValue cardNumber;
 | 
				
			||||||
 | 
					                QJsonValue cardType;
 | 
				
			||||||
 | 
					                QJsonValue value;
 | 
				
			||||||
 | 
					                QJsonValue valueOld;
 | 
				
			||||||
 | 
					                QJsonValue valueNew;
 | 
				
			||||||
 | 
					                QJsonValue time;
 | 
				
			||||||
 | 
					                QJsonValue timeOld;
 | 
				
			||||||
 | 
					                QJsonValue timeNew;
 | 
				
			||||||
 | 
					            } prePaidCard;
 | 
				
			||||||
 | 
					        } payment;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        struct : public QJsonObject {
 | 
				
			||||||
 | 
					            QJsonValue delivery;    // PRINT, OnlineTicket
 | 
				
			||||||
 | 
					            QJsonValue result;      // SUCCESS, ERROR
 | 
				
			||||||
 | 
					            QJsonValue errorCode;   // 0=OK, 1=...
 | 
				
			||||||
 | 
					            QJsonValue errorMsg;
 | 
				
			||||||
 | 
					        } result;
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    struct AccountData : public QJsonObject {
 | 
				
			||||||
 | 
					        struct : public QJsonObject {
 | 
				
			||||||
 | 
					            QJsonValue UID;
 | 
				
			||||||
 | 
					            QJsonValue ChangeNumber;
 | 
				
			||||||
 | 
					            QJsonValue Process;         // Vorgang
 | 
				
			||||||
 | 
					            QJsonValue startDateTime;
 | 
				
			||||||
 | 
					            QJsonValue endDateTime;
 | 
				
			||||||
 | 
					            QJsonValue startHash;
 | 
				
			||||||
 | 
					            QJsonValue endHash;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            struct : public QJsonObject {
 | 
				
			||||||
 | 
					                QJsonValue value;          // coin value
 | 
				
			||||||
 | 
					                QJsonValue numberOfCoins;  // number of coins
 | 
				
			||||||
 | 
					                QJsonValue currency;
 | 
				
			||||||
 | 
					            } coin;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        } coinBox;                  // Münzkasse
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    struct EventData : public QJsonObject {
 | 
				
			||||||
 | 
					        struct : public QJsonObject {
 | 
				
			||||||
 | 
					            QJsonValue eventID;
 | 
				
			||||||
 | 
					            QJsonValue deviceName;
 | 
				
			||||||
 | 
					            QJsonValue reason;
 | 
				
			||||||
 | 
					            QJsonValue event;
 | 
				
			||||||
 | 
					            QJsonValue eventState;
 | 
				
			||||||
 | 
					            QJsonValue timeStamp;
 | 
				
			||||||
 | 
					            QJsonValue parameter;
 | 
				
			||||||
 | 
					            QJsonValue secondLevelInfo;
 | 
				
			||||||
 | 
					        } machineEvent;                  //
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    struct StateData : public QJsonObject {
 | 
				
			||||||
 | 
					        QJsonValue Timestamp;
 | 
				
			||||||
 | 
					        QJsonArray HW_States;
 | 
				
			||||||
 | 
					        struct : public QJsonObject {
 | 
				
			||||||
 | 
					            QJsonValue name;
 | 
				
			||||||
 | 
					            QJsonValue value;
 | 
				
			||||||
 | 
					            QJsonValue unit;
 | 
				
			||||||
 | 
					        } machineState;                  //
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    enum class REQUEST : quint8 {
 | 
				
			||||||
 | 
					        NO_REQUEST,
 | 
				
			||||||
 | 
					        START,
 | 
				
			||||||
 | 
					        STOP,
 | 
				
			||||||
 | 
					        PING,
 | 
				
			||||||
 | 
					        SELF,
 | 
				
			||||||
 | 
					        ISMAS_PARAMETER
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#endif // ISMASDATA_H
 | 
				
			||||||
							
								
								
									
										266
									
								
								commandline_parser.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										266
									
								
								commandline_parser.cpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,266 @@
 | 
				
			|||||||
 | 
					#include "commandline_parser.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <QDir>
 | 
				
			||||||
 | 
					#include <QSettings>
 | 
				
			||||||
 | 
					#include <QDebug>
 | 
				
			||||||
 | 
					#include <QFile>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					CommandLineParser::CommandLineParser()
 | 
				
			||||||
 | 
					  : m_repositoryUrl("https://git.mimbach49.de/GerhardHoffmann")
 | 
				
			||||||
 | 
					  , m_plugInDir("/usr/lib/")
 | 
				
			||||||
 | 
					  , m_plugInName("libCAslave.so")
 | 
				
			||||||
 | 
					  , m_workingDir("/opt/app/tools/atbupdate/")
 | 
				
			||||||
 | 
					  , m_dryRun("false")
 | 
				
			||||||
 | 
					  , m_noUpdatePsaHardware("false")
 | 
				
			||||||
 | 
					  , m_showYoctoVersion("false")
 | 
				
			||||||
 | 
					  , m_showYoctoInstallStatus("false")
 | 
				
			||||||
 | 
					  , m_showExtendedVersion("false")
 | 
				
			||||||
 | 
					  , m_iniFileName("ATBUpdateTool.ini")
 | 
				
			||||||
 | 
					  , m_alwaysDownloadConfig("false")
 | 
				
			||||||
 | 
					  , m_alwaysDownloadDC("false")
 | 
				
			||||||
 | 
					  , m_repositoryUrlOption(
 | 
				
			||||||
 | 
					        QCommandLineOption(
 | 
				
			||||||
 | 
					            QStringList() << "repository-url" << "repository-url",
 | 
				
			||||||
 | 
					            QCoreApplication::translate("main", "Where to find a customer repository."),
 | 
				
			||||||
 | 
					            QCoreApplication::translate("main", "directory")))
 | 
				
			||||||
 | 
					  , m_iniFileDirectoryOption(
 | 
				
			||||||
 | 
					        QCommandLineOption(
 | 
				
			||||||
 | 
					            QStringList() << "ini-directory" << "ini-directory",
 | 
				
			||||||
 | 
					            QCoreApplication::translate("main", "Where to find an ini-file."),
 | 
				
			||||||
 | 
					            QCoreApplication::translate("main", "directory")))
 | 
				
			||||||
 | 
					  , m_iniFileNameOption(
 | 
				
			||||||
 | 
					        QCommandLineOption(
 | 
				
			||||||
 | 
					            QStringList() << "ini-filename" << "ini-filename",
 | 
				
			||||||
 | 
					            QCoreApplication::translate("main", "Name of ini-file."),
 | 
				
			||||||
 | 
					            QCoreApplication::translate("main", "file")))
 | 
				
			||||||
 | 
					  , m_pluginDirectoryOption(
 | 
				
			||||||
 | 
					        QCommandLineOption(
 | 
				
			||||||
 | 
					            QStringList() << "plugin-directory" << "plugin-directory",
 | 
				
			||||||
 | 
					            QCoreApplication::translate("main", "Where to find dc-plugin."),
 | 
				
			||||||
 | 
					            QCoreApplication::translate("main", "directory")))
 | 
				
			||||||
 | 
					  , m_pluginNameOption(
 | 
				
			||||||
 | 
					        QCommandLineOption(
 | 
				
			||||||
 | 
					            QStringList() << "plugin-name" << "plugin-name",
 | 
				
			||||||
 | 
					            QCoreApplication::translate("main", "Name of dc-plugin."),
 | 
				
			||||||
 | 
					            QCoreApplication::translate("main", "directory")))
 | 
				
			||||||
 | 
					  , m_noDownloadOption(
 | 
				
			||||||
 | 
					        QCommandLineOption(
 | 
				
			||||||
 | 
					            "no-psa-hardware-update",
 | 
				
			||||||
 | 
					            QCoreApplication::translate("main", "Do not update the PSA firmware (json, device-controller).")))
 | 
				
			||||||
 | 
					  , m_alwaysDownloadConfigOption(
 | 
				
			||||||
 | 
					        QCommandLineOption(
 | 
				
			||||||
 | 
					            "always-download-config",
 | 
				
			||||||
 | 
					            QCoreApplication::translate("main", "Always download the (json-)configs to DC).")))
 | 
				
			||||||
 | 
					  , m_alwaysDownloadDCOption(
 | 
				
			||||||
 | 
					        QCommandLineOption(
 | 
				
			||||||
 | 
					            "always-download-dc",
 | 
				
			||||||
 | 
					            QCoreApplication::translate("main", "Always download the dc-bin-file to DC).")))
 | 
				
			||||||
 | 
					  , m_workingDirectoryOption(
 | 
				
			||||||
 | 
					        QCommandLineOption(
 | 
				
			||||||
 | 
					            QStringList() << "working-directory" << "working-directory",
 | 
				
			||||||
 | 
					            QCoreApplication::translate("main", "working directory of update-script."),
 | 
				
			||||||
 | 
					            QCoreApplication::translate("main", "directory")))
 | 
				
			||||||
 | 
					  , m_dryRunOption(
 | 
				
			||||||
 | 
					        QCommandLineOption(
 | 
				
			||||||
 | 
					            QStringList() << "d" << "dry-run",
 | 
				
			||||||
 | 
					            QCoreApplication::translate("main", "Start ATBUpdateTool in dry-run-mode. No actual actions.")))
 | 
				
			||||||
 | 
					  , m_extendedVersionOption(
 | 
				
			||||||
 | 
					        QCommandLineOption(
 | 
				
			||||||
 | 
					            QStringList() << "V" << "extended-version",
 | 
				
			||||||
 | 
					            QCoreApplication::translate("main", "Show extended version (including last git commit).")))
 | 
				
			||||||
 | 
					  , m_yoctoVersionOption(
 | 
				
			||||||
 | 
					        QCommandLineOption(
 | 
				
			||||||
 | 
					            QStringList() << "y" << "yocto-version",
 | 
				
			||||||
 | 
					            QCoreApplication::translate("main", "Show yocto version of ATBUpdateTool.")))
 | 
				
			||||||
 | 
					  , m_yoctoInstallStatusOption(
 | 
				
			||||||
 | 
					        QCommandLineOption(
 | 
				
			||||||
 | 
					            QStringList() << "Y" << "yocto-install",
 | 
				
			||||||
 | 
					            QCoreApplication::translate("main", "Show yocto install status of ATBUpdateTool."))) {
 | 
				
			||||||
 | 
					    configure();
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void CommandLineParser::configure() {
 | 
				
			||||||
 | 
					    m_parser.setApplicationDescription("Download tool for downloading device controller firmware, printer json-files and executing opkg-commands.");
 | 
				
			||||||
 | 
					    m_parser.addHelpOption();
 | 
				
			||||||
 | 
					    m_parser.addVersionOption();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    m_repositoryUrlOption.setDefaultValue("https://git.mimbach49.de/GerhardHoffmann");
 | 
				
			||||||
 | 
					    m_parser.addOption(m_repositoryUrlOption);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    m_iniFileDirectoryOption.setDefaultValue(QCoreApplication::applicationDirPath());
 | 
				
			||||||
 | 
					    m_parser.addOption(m_iniFileDirectoryOption);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    m_iniFileNameOption.setDefaultValue("ATBUpdateTool.ini");
 | 
				
			||||||
 | 
					    m_parser.addOption(m_iniFileNameOption);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    m_pluginDirectoryOption.setDefaultValue("/usr/lib/");
 | 
				
			||||||
 | 
					    m_parser.addOption(m_pluginDirectoryOption);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    m_pluginNameOption.setDefaultValue("libCAslave.so");
 | 
				
			||||||
 | 
					    m_parser.addOption(m_pluginNameOption);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    m_alwaysDownloadConfigOption.setDefaultValue("false");
 | 
				
			||||||
 | 
					    m_parser.addOption(m_alwaysDownloadConfigOption);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    m_alwaysDownloadDCOption.setDefaultValue("false");
 | 
				
			||||||
 | 
					    m_parser.addOption(m_alwaysDownloadDCOption);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    m_noDownloadOption.setDefaultValue("false");
 | 
				
			||||||
 | 
					    m_parser.addOption(m_noDownloadOption);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    m_workingDirectoryOption.setDefaultValue("/opt/app/tools/atbupdate/");
 | 
				
			||||||
 | 
					    m_parser.addOption(m_workingDirectoryOption);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    m_dryRunOption.setDefaultValue("false");
 | 
				
			||||||
 | 
					    m_parser.addOption(m_dryRunOption);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    m_extendedVersionOption.setDefaultValue("false");
 | 
				
			||||||
 | 
					    m_parser.addOption(m_extendedVersionOption);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    m_yoctoVersionOption.setDefaultValue("false");
 | 
				
			||||||
 | 
					    m_parser.addOption(m_yoctoVersionOption);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    m_yoctoInstallStatusOption.setDefaultValue("false");
 | 
				
			||||||
 | 
					    m_parser.addOption(m_yoctoInstallStatusOption);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void CommandLineParser::readSettings() {
 | 
				
			||||||
 | 
					    QString const iniFileDir = m_parser.value(m_iniFileDirectoryOption);
 | 
				
			||||||
 | 
					    QString const iniFileName = m_parser.value(m_iniFileNameOption);
 | 
				
			||||||
 | 
					    m_iniFileName = QDir::cleanPath(iniFileDir + QDir::separator() + iniFileName);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    qCritical() << __PRETTY_FUNCTION__ << " iniFileDir" << iniFileDir;
 | 
				
			||||||
 | 
					    qCritical() << __PRETTY_FUNCTION__ << "iniFileName" << m_iniFileName;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (!m_iniFileName.isEmpty()) {
 | 
				
			||||||
 | 
					        if (QFile(m_iniFileName).exists()) {
 | 
				
			||||||
 | 
					            QSettings settings(m_iniFileName, QSettings::IniFormat);
 | 
				
			||||||
 | 
					            QStringList keys = settings.allKeys();
 | 
				
			||||||
 | 
					            for (QString const &key: keys) {
 | 
				
			||||||
 | 
					                QVariant v = settings.value(key);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                qCritical() << __PRETTY_FUNCTION__
 | 
				
			||||||
 | 
					                            << key << " -> " << v.toString();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                if (key.contains("repository-url")) {
 | 
				
			||||||
 | 
					                    m_repositoryUrl = v.toString();
 | 
				
			||||||
 | 
					                } else
 | 
				
			||||||
 | 
					                if (key.contains("plugin-directory")) {
 | 
				
			||||||
 | 
					                    m_plugInDir = v.toString();
 | 
				
			||||||
 | 
					                } else
 | 
				
			||||||
 | 
					                if (key.contains("working-directory")) {
 | 
				
			||||||
 | 
					                    m_workingDir = v.toString();
 | 
				
			||||||
 | 
					                } else
 | 
				
			||||||
 | 
					                if (key.contains("dry-run")) {
 | 
				
			||||||
 | 
					                    m_dryRun = (v.toBool() ? "true" : "false");
 | 
				
			||||||
 | 
					                } else
 | 
				
			||||||
 | 
					                if (key.contains("extended-version")) {
 | 
				
			||||||
 | 
					                    m_showExtendedVersion = (v.toBool() ? "true" : "false");
 | 
				
			||||||
 | 
					                } else
 | 
				
			||||||
 | 
					                if (key.contains("no-psa-hardware-update")) {
 | 
				
			||||||
 | 
					                    m_noUpdatePsaHardware = (v.toBool() ? "true" : "false");
 | 
				
			||||||
 | 
					                } else
 | 
				
			||||||
 | 
					                if (key.contains("always-download-config")) {
 | 
				
			||||||
 | 
					                    m_alwaysDownloadConfig = (v.toBool() ? "true" : "false");
 | 
				
			||||||
 | 
					                } else
 | 
				
			||||||
 | 
					                if (key.contains("always-download-dc")) {
 | 
				
			||||||
 | 
					                    m_alwaysDownloadDC = (v.toBool() ? "true" : "false");
 | 
				
			||||||
 | 
					                } else
 | 
				
			||||||
 | 
					                if (key.contains("yocto-install")) {
 | 
				
			||||||
 | 
					                    m_showYoctoInstallStatus = (v.toBool() ? "true" : "false");
 | 
				
			||||||
 | 
					                } else
 | 
				
			||||||
 | 
					                if (key.contains("yocto-version")) {
 | 
				
			||||||
 | 
					                    m_showYoctoVersion = (v.toBool() ? "true" : "false");
 | 
				
			||||||
 | 
					                } else
 | 
				
			||||||
 | 
					                if (key.contains("plugin-name")) {
 | 
				
			||||||
 | 
					                    m_plugInName = v.toString();
 | 
				
			||||||
 | 
					                } else {
 | 
				
			||||||
 | 
					                    qCritical() << __PRETTY_FUNCTION__
 | 
				
			||||||
 | 
					                                << key << " -> (UNKNOWN) " << v.toString();
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        } else {
 | 
				
			||||||
 | 
					            qCritical() << __PRETTY_FUNCTION__ << "iniFileName" << m_iniFileName
 | 
				
			||||||
 | 
					                        << "DOES NOT EXIST";
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					QString CommandLineParser::repositoryUrl() {
 | 
				
			||||||
 | 
					    if (m_parser.isSet(m_repositoryUrlOption)) {
 | 
				
			||||||
 | 
					        m_repositoryUrl = m_parser.value(m_repositoryUrlOption);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    return m_repositoryUrl;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					QString CommandLineParser::plugInDir() {
 | 
				
			||||||
 | 
					    if (m_parser.isSet(m_pluginDirectoryOption)) {
 | 
				
			||||||
 | 
					        m_plugInDir = m_parser.value(m_pluginDirectoryOption);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    return m_plugInDir;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					QString CommandLineParser::plugInName() {
 | 
				
			||||||
 | 
					    if (m_parser.isSet(m_pluginNameOption)) {
 | 
				
			||||||
 | 
					        m_plugInName = m_parser.value(m_pluginNameOption);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    return m_plugInName;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					QString CommandLineParser::workingDir() {
 | 
				
			||||||
 | 
					    if (m_parser.isSet(m_workingDirectoryOption)) {
 | 
				
			||||||
 | 
					        m_workingDir = m_parser.value(m_workingDirectoryOption);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    return m_workingDir;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					bool CommandLineParser::dryRun() {
 | 
				
			||||||
 | 
					    if (m_parser.isSet(m_dryRunOption)) {
 | 
				
			||||||
 | 
					        m_dryRun = m_parser.value(m_dryRunOption);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    return m_dryRun == "false" ? false : true;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					bool CommandLineParser::noUpdatePsaHardware() {
 | 
				
			||||||
 | 
					    if (m_parser.isSet(m_noDownloadOption)) {
 | 
				
			||||||
 | 
					        m_noUpdatePsaHardware = m_parser.value(m_noDownloadOption);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    return m_noUpdatePsaHardware == "false" ? false : true;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					bool CommandLineParser::yoctoVersion() {
 | 
				
			||||||
 | 
					    if (m_parser.isSet(m_yoctoVersionOption)) {
 | 
				
			||||||
 | 
					        m_showYoctoVersion = m_parser.value(m_yoctoVersionOption);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    return m_showYoctoVersion == "false" ? false : true;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					bool CommandLineParser::yoctoInstallStatus() {
 | 
				
			||||||
 | 
					    if (m_parser.isSet(m_yoctoInstallStatusOption)) {
 | 
				
			||||||
 | 
					        m_showYoctoInstallStatus = m_parser.value(m_yoctoInstallStatusOption);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    return m_showYoctoInstallStatus == "false" ? false : true;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					bool CommandLineParser::extendedVersion() {
 | 
				
			||||||
 | 
					    if (m_parser.isSet(m_extendedVersionOption)) {
 | 
				
			||||||
 | 
					        m_showExtendedVersion = m_parser.value(m_extendedVersionOption);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    return m_showExtendedVersion == "false" ? false : true;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					bool CommandLineParser::alwaysDownloadConfig() {
 | 
				
			||||||
 | 
					    if (m_parser.isSet(m_alwaysDownloadConfigOption)) {
 | 
				
			||||||
 | 
					        m_alwaysDownloadConfig = m_parser.value(m_alwaysDownloadConfigOption);
 | 
				
			||||||
 | 
					        qCritical() << "m_alwaysDownloadConfigOption IS SET" << m_alwaysDownloadConfig;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    qCritical() << "m_alwaysDownloadConfig" << m_alwaysDownloadConfig;
 | 
				
			||||||
 | 
					    return m_alwaysDownloadConfig == "false" ? false : true;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					bool CommandLineParser::alwaysDownloadDC() {
 | 
				
			||||||
 | 
					    if (m_parser.isSet(m_alwaysDownloadDCOption)) {
 | 
				
			||||||
 | 
					        m_alwaysDownloadDC = m_parser.value(m_alwaysDownloadDCOption);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    return m_alwaysDownloadDC == "false" ? false : true;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										63
									
								
								commandline_parser.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										63
									
								
								commandline_parser.h
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,63 @@
 | 
				
			|||||||
 | 
					#ifndef COMMAND_LINE_PARSER_H_INCLUDED
 | 
				
			||||||
 | 
					#define COMMAND_LINE_PARSER_H_INCLUDED
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <QCoreApplication>
 | 
				
			||||||
 | 
					#include <QCommandLineParser>
 | 
				
			||||||
 | 
					#include <QCommandLineOption>
 | 
				
			||||||
 | 
					#include <QString>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class CommandLineParser : public QCommandLineParser {
 | 
				
			||||||
 | 
					    QString m_repositoryUrl;
 | 
				
			||||||
 | 
					    QString m_plugInDir;
 | 
				
			||||||
 | 
					    QString m_plugInName;
 | 
				
			||||||
 | 
					    QString m_workingDir;
 | 
				
			||||||
 | 
					    QString m_dryRun;
 | 
				
			||||||
 | 
					    QString m_noUpdatePsaHardware;
 | 
				
			||||||
 | 
					    QString m_showYoctoVersion;
 | 
				
			||||||
 | 
					    QString m_showYoctoInstallStatus;
 | 
				
			||||||
 | 
					    QString m_showExtendedVersion;
 | 
				
			||||||
 | 
					    QString m_iniFileName;
 | 
				
			||||||
 | 
					    QString m_alwaysDownloadConfig;
 | 
				
			||||||
 | 
					    QString m_alwaysDownloadDC;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    QCommandLineOption m_repositoryUrlOption;
 | 
				
			||||||
 | 
					    QCommandLineOption m_iniFileDirectoryOption;
 | 
				
			||||||
 | 
					    QCommandLineOption m_iniFileNameOption;
 | 
				
			||||||
 | 
					    QCommandLineOption m_pluginDirectoryOption;
 | 
				
			||||||
 | 
					    QCommandLineOption m_pluginNameOption;
 | 
				
			||||||
 | 
					    QCommandLineOption m_noDownloadOption;
 | 
				
			||||||
 | 
					    QCommandLineOption m_alwaysDownloadConfigOption;
 | 
				
			||||||
 | 
					    QCommandLineOption m_alwaysDownloadDCOption;
 | 
				
			||||||
 | 
					    QCommandLineOption m_workingDirectoryOption;
 | 
				
			||||||
 | 
					    QCommandLineOption m_dryRunOption;
 | 
				
			||||||
 | 
					    QCommandLineOption m_extendedVersionOption;
 | 
				
			||||||
 | 
					    QCommandLineOption m_yoctoVersionOption;
 | 
				
			||||||
 | 
					    QCommandLineOption m_yoctoInstallStatusOption;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    QCommandLineParser m_parser;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    void configure();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					public:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    explicit CommandLineParser();
 | 
				
			||||||
 | 
					    ~CommandLineParser() = default;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    QCommandLineParser &parser() { return m_parser; }
 | 
				
			||||||
 | 
					    QCommandLineParser const &parser() const { return m_parser; }
 | 
				
			||||||
 | 
					    void process(const QCoreApplication &app) { m_parser.process(app); }
 | 
				
			||||||
 | 
					    QString const &iniFileName() const { return m_iniFileName; }
 | 
				
			||||||
 | 
					    void readSettings();
 | 
				
			||||||
 | 
					    QString repositoryUrl();
 | 
				
			||||||
 | 
					    QString plugInDir();
 | 
				
			||||||
 | 
					    QString plugInName();
 | 
				
			||||||
 | 
					    QString workingDir();
 | 
				
			||||||
 | 
					    bool dryRun();
 | 
				
			||||||
 | 
					    bool noUpdatePsaHardware();
 | 
				
			||||||
 | 
					    bool yoctoVersion();
 | 
				
			||||||
 | 
					    bool yoctoInstallStatus();
 | 
				
			||||||
 | 
					    bool extendedVersion();
 | 
				
			||||||
 | 
					    bool alwaysDownloadConfig();
 | 
				
			||||||
 | 
					    bool alwaysDownloadDC();
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					#endif // COMMAND_LINE_PARSER_H_INCLUDED
 | 
				
			||||||
							
								
								
									
										230
									
								
								doc/ATBUpdateTool.drawio
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										230
									
								
								doc/ATBUpdateTool.drawio
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,230 @@
 | 
				
			|||||||
 | 
					<mxfile host="www.draw.io" modified="2023-11-07T10:37:35.350Z" agent="Mozilla/5.0 (X11; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/118.0" etag="ldmgaDoAxcOIqmOptaKH" version="22.0.8" type="device">
 | 
				
			||||||
 | 
					  <diagram id="C5RBs43oDa-KdzZeNtuy" name="Page-1">
 | 
				
			||||||
 | 
					    <mxGraphModel dx="1042" dy="633" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="827" pageHeight="1169" math="0" shadow="0">
 | 
				
			||||||
 | 
					      <root>
 | 
				
			||||||
 | 
					        <mxCell id="WIyWlLk6GJQsqaUBKTNV-0" />
 | 
				
			||||||
 | 
					        <mxCell id="WIyWlLk6GJQsqaUBKTNV-1" parent="WIyWlLk6GJQsqaUBKTNV-0" />
 | 
				
			||||||
 | 
					        <mxCell id="WIyWlLk6GJQsqaUBKTNV-2" value="" style="rounded=0;html=1;jettySize=auto;orthogonalLoop=1;fontSize=11;endArrow=block;endFill=0;endSize=8;strokeWidth=1;shadow=0;labelBackgroundColor=none;edgeStyle=orthogonalEdgeStyle;" parent="WIyWlLk6GJQsqaUBKTNV-1" source="WIyWlLk6GJQsqaUBKTNV-3" target="WIyWlLk6GJQsqaUBKTNV-6" edge="1">
 | 
				
			||||||
 | 
					          <mxGeometry relative="1" as="geometry" />
 | 
				
			||||||
 | 
					        </mxCell>
 | 
				
			||||||
 | 
					        <mxCell id="WIyWlLk6GJQsqaUBKTNV-3" value="START" style="rounded=1;whiteSpace=wrap;html=1;fontSize=12;glass=0;strokeWidth=1;shadow=0;" parent="WIyWlLk6GJQsqaUBKTNV-1" vertex="1">
 | 
				
			||||||
 | 
					          <mxGeometry x="350" y="10" width="120" height="40" as="geometry" />
 | 
				
			||||||
 | 
					        </mxCell>
 | 
				
			||||||
 | 
					        <mxCell id="KwNStDcgQ-FNAQaH3l0E-82" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" edge="1" parent="WIyWlLk6GJQsqaUBKTNV-1" source="WIyWlLk6GJQsqaUBKTNV-6">
 | 
				
			||||||
 | 
					          <mxGeometry relative="1" as="geometry">
 | 
				
			||||||
 | 
					            <mxPoint x="220" y="180" as="targetPoint" />
 | 
				
			||||||
 | 
					          </mxGeometry>
 | 
				
			||||||
 | 
					        </mxCell>
 | 
				
			||||||
 | 
					        <mxCell id="WIyWlLk6GJQsqaUBKTNV-6" value="<div><br></div><div>Existent customer repository</div><div>?</div>" style="rhombus;whiteSpace=wrap;html=1;shadow=0;fontFamily=Helvetica;fontSize=12;align=center;strokeWidth=1;spacing=6;spacingTop=-4;" parent="WIyWlLk6GJQsqaUBKTNV-1" vertex="1">
 | 
				
			||||||
 | 
					          <mxGeometry x="170" y="60" width="100" height="90" as="geometry" />
 | 
				
			||||||
 | 
					        </mxCell>
 | 
				
			||||||
 | 
					        <object label="" id="KwNStDcgQ-FNAQaH3l0E-18">
 | 
				
			||||||
 | 
					          <mxCell style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" edge="1" parent="WIyWlLk6GJQsqaUBKTNV-1" source="WIyWlLk6GJQsqaUBKTNV-7" target="KwNStDcgQ-FNAQaH3l0E-9">
 | 
				
			||||||
 | 
					            <mxGeometry relative="1" as="geometry" />
 | 
				
			||||||
 | 
					          </mxCell>
 | 
				
			||||||
 | 
					        </object>
 | 
				
			||||||
 | 
					        <mxCell id="WIyWlLk6GJQsqaUBKTNV-7" value="Clone customer repository" style="rounded=1;whiteSpace=wrap;html=1;fontSize=12;glass=0;strokeWidth=1;shadow=0;points=[[0,0,0,0,0],[0,0.25,0,0,0],[0,0.5,0,0,0],[0,0.75,0,0,0],[0,1,0,0,0],[0.25,0,0,0,0],[0.25,1,0,0,0],[0.5,0,0,0,0],[0.5,1,0,0,0],[0.75,0,0,0,0],[0.75,1,0,0,0],[1,0,0,0,0],[1,0.25,0,0,0],[1,0.5,0,0,0],[1,0.75,0,0,0],[1,1,0,0,0]];" parent="WIyWlLk6GJQsqaUBKTNV-1" vertex="1">
 | 
				
			||||||
 | 
					          <mxGeometry x="310" y="130" width="120" height="40" as="geometry" />
 | 
				
			||||||
 | 
					        </mxCell>
 | 
				
			||||||
 | 
					        <mxCell id="WIyWlLk6GJQsqaUBKTNV-10" value="<div><br></div><div>Repository corrupted</div><div>?</div>" style="rhombus;whiteSpace=wrap;html=1;shadow=0;fontFamily=Helvetica;fontSize=12;align=center;strokeWidth=1;spacing=6;spacingTop=-4;movable=1;resizable=1;rotatable=1;deletable=1;editable=1;locked=0;connectable=1;" parent="WIyWlLk6GJQsqaUBKTNV-1" vertex="1">
 | 
				
			||||||
 | 
					          <mxGeometry x="170" y="180" width="100" height="80" as="geometry" />
 | 
				
			||||||
 | 
					        </mxCell>
 | 
				
			||||||
 | 
					        <mxCell id="KwNStDcgQ-FNAQaH3l0E-19" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=0.15;entryY=0.55;entryDx=0;entryDy=0;entryPerimeter=0;" edge="1" parent="WIyWlLk6GJQsqaUBKTNV-1" source="KwNStDcgQ-FNAQaH3l0E-9" target="KwNStDcgQ-FNAQaH3l0E-110">
 | 
				
			||||||
 | 
					          <mxGeometry relative="1" as="geometry">
 | 
				
			||||||
 | 
					            <mxPoint x="600" y="150" as="targetPoint" />
 | 
				
			||||||
 | 
					          </mxGeometry>
 | 
				
			||||||
 | 
					        </mxCell>
 | 
				
			||||||
 | 
					        <mxCell id="KwNStDcgQ-FNAQaH3l0E-9" value="<div><br></div><div>Repository corrupted</div><div>?</div>" style="rhombus;whiteSpace=wrap;html=1;shadow=0;fontFamily=Helvetica;fontSize=12;align=center;strokeWidth=1;spacing=6;spacingTop=-4;" vertex="1" parent="WIyWlLk6GJQsqaUBKTNV-1">
 | 
				
			||||||
 | 
					          <mxGeometry x="480" y="150" width="90" height="80" as="geometry" />
 | 
				
			||||||
 | 
					        </mxCell>
 | 
				
			||||||
 | 
					        <mxCell id="KwNStDcgQ-FNAQaH3l0E-11" value="FAIL" style="strokeWidth=2;html=1;shape=mxgraph.flowchart.terminator;whiteSpace=wrap;" vertex="1" parent="WIyWlLk6GJQsqaUBKTNV-1">
 | 
				
			||||||
 | 
					          <mxGeometry x="585" y="10" width="100" height="40" as="geometry" />
 | 
				
			||||||
 | 
					        </mxCell>
 | 
				
			||||||
 | 
					        <UserObject label="Yes" placeholders="1" name="Variable" id="KwNStDcgQ-FNAQaH3l0E-20">
 | 
				
			||||||
 | 
					          <mxCell style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;overflow=hidden;" vertex="1" parent="WIyWlLk6GJQsqaUBKTNV-1">
 | 
				
			||||||
 | 
					            <mxGeometry x="560" y="160" width="80" height="20" as="geometry" />
 | 
				
			||||||
 | 
					          </mxCell>
 | 
				
			||||||
 | 
					        </UserObject>
 | 
				
			||||||
 | 
					        <mxCell id="KwNStDcgQ-FNAQaH3l0E-23" value="<div>No</div><div><br></div>" style="text;strokeColor=none;align=center;fillColor=none;html=1;verticalAlign=middle;whiteSpace=wrap;rounded=0;" vertex="1" parent="WIyWlLk6GJQsqaUBKTNV-1">
 | 
				
			||||||
 | 
					          <mxGeometry x="430" y="280" width="60" height="20" as="geometry" />
 | 
				
			||||||
 | 
					        </mxCell>
 | 
				
			||||||
 | 
					        <mxCell id="KwNStDcgQ-FNAQaH3l0E-25" value="Delete corrupted repository" style="rounded=1;whiteSpace=wrap;html=1;fontSize=12;glass=0;strokeWidth=1;shadow=0;points=[[0,0,0,0,0],[0,0.25,0,0,0],[0,0.5,0,0,0],[0,0.75,0,0,0],[0,1,0,0,0],[0.25,0,0,0,0],[0.25,1,0,0,0],[0.5,0,0,0,0],[0.5,1,0,0,0],[0.75,0,0,0,0],[0.75,1,0,0,0],[1,0,0,0,0],[1,0.25,0,0,0],[1,0.5,0,0,0],[1,0.75,0,0,0],[1,1,0,0,0]];" vertex="1" parent="WIyWlLk6GJQsqaUBKTNV-1">
 | 
				
			||||||
 | 
					          <mxGeometry x="310" y="200" width="120" height="40" as="geometry" />
 | 
				
			||||||
 | 
					        </mxCell>
 | 
				
			||||||
 | 
					        <mxCell id="KwNStDcgQ-FNAQaH3l0E-26" value="" style="edgeStyle=none;orthogonalLoop=1;jettySize=auto;html=1;rounded=0;movable=1;resizable=1;rotatable=1;deletable=1;editable=1;locked=0;connectable=1;entryX=0;entryY=0.5;entryDx=0;entryDy=0;entryPerimeter=0;" edge="1" parent="WIyWlLk6GJQsqaUBKTNV-1" target="KwNStDcgQ-FNAQaH3l0E-25">
 | 
				
			||||||
 | 
					          <mxGeometry width="80" relative="1" as="geometry">
 | 
				
			||||||
 | 
					            <mxPoint x="270" y="220" as="sourcePoint" />
 | 
				
			||||||
 | 
					            <mxPoint x="310" y="220" as="targetPoint" />
 | 
				
			||||||
 | 
					            <Array as="points" />
 | 
				
			||||||
 | 
					          </mxGeometry>
 | 
				
			||||||
 | 
					        </mxCell>
 | 
				
			||||||
 | 
					        <mxCell id="KwNStDcgQ-FNAQaH3l0E-27" value="" style="edgeStyle=none;orthogonalLoop=1;jettySize=auto;html=1;rounded=0;exitX=0.5;exitY=0;exitDx=0;exitDy=0;exitPerimeter=0;entryX=0.5;entryY=1;entryDx=0;entryDy=0;entryPerimeter=0;" edge="1" parent="WIyWlLk6GJQsqaUBKTNV-1" source="KwNStDcgQ-FNAQaH3l0E-25" target="WIyWlLk6GJQsqaUBKTNV-7">
 | 
				
			||||||
 | 
					          <mxGeometry width="80" relative="1" as="geometry">
 | 
				
			||||||
 | 
					            <mxPoint x="540" y="240" as="sourcePoint" />
 | 
				
			||||||
 | 
					            <mxPoint x="620" y="240" as="targetPoint" />
 | 
				
			||||||
 | 
					            <Array as="points" />
 | 
				
			||||||
 | 
					          </mxGeometry>
 | 
				
			||||||
 | 
					        </mxCell>
 | 
				
			||||||
 | 
					        <mxCell id="KwNStDcgQ-FNAQaH3l0E-93" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" edge="1" parent="WIyWlLk6GJQsqaUBKTNV-1" source="KwNStDcgQ-FNAQaH3l0E-28" target="KwNStDcgQ-FNAQaH3l0E-92">
 | 
				
			||||||
 | 
					          <mxGeometry relative="1" as="geometry" />
 | 
				
			||||||
 | 
					        </mxCell>
 | 
				
			||||||
 | 
					        <mxCell id="KwNStDcgQ-FNAQaH3l0E-28" value="<div><br></div><div>ISMAS trigger</div><div><b>WAIT</b><br></div><div>?<b><br></b></div>" style="rhombus;whiteSpace=wrap;html=1;shadow=0;fontFamily=Helvetica;fontSize=12;align=center;strokeWidth=1;spacing=6;spacingTop=-4;" vertex="1" parent="WIyWlLk6GJQsqaUBKTNV-1">
 | 
				
			||||||
 | 
					          <mxGeometry x="300" y="380" width="140" height="90" as="geometry" />
 | 
				
			||||||
 | 
					        </mxCell>
 | 
				
			||||||
 | 
					        <mxCell id="KwNStDcgQ-FNAQaH3l0E-29" value="" style="edgeStyle=none;orthogonalLoop=1;jettySize=auto;html=1;rounded=0;exitX=0.5;exitY=1;exitDx=0;exitDy=0;" edge="1" parent="WIyWlLk6GJQsqaUBKTNV-1" source="KwNStDcgQ-FNAQaH3l0E-9" target="KwNStDcgQ-FNAQaH3l0E-78">
 | 
				
			||||||
 | 
					          <mxGeometry width="80" relative="1" as="geometry">
 | 
				
			||||||
 | 
					            <mxPoint x="540" y="240" as="sourcePoint" />
 | 
				
			||||||
 | 
					            <mxPoint x="420" y="300" as="targetPoint" />
 | 
				
			||||||
 | 
					            <Array as="points">
 | 
				
			||||||
 | 
					              <mxPoint x="525" y="300" />
 | 
				
			||||||
 | 
					            </Array>
 | 
				
			||||||
 | 
					          </mxGeometry>
 | 
				
			||||||
 | 
					        </mxCell>
 | 
				
			||||||
 | 
					        <mxCell id="KwNStDcgQ-FNAQaH3l0E-34" value="" style="edgeStyle=none;orthogonalLoop=1;jettySize=auto;html=1;rounded=0;entryX=1;entryY=1;entryDx=0;entryDy=0;" edge="1" parent="WIyWlLk6GJQsqaUBKTNV-1" target="KwNStDcgQ-FNAQaH3l0E-37">
 | 
				
			||||||
 | 
					          <mxGeometry width="80" relative="1" as="geometry">
 | 
				
			||||||
 | 
					            <mxPoint x="220" y="260" as="sourcePoint" />
 | 
				
			||||||
 | 
					            <mxPoint x="320" y="300" as="targetPoint" />
 | 
				
			||||||
 | 
					            <Array as="points">
 | 
				
			||||||
 | 
					              <mxPoint x="220" y="300" />
 | 
				
			||||||
 | 
					            </Array>
 | 
				
			||||||
 | 
					          </mxGeometry>
 | 
				
			||||||
 | 
					        </mxCell>
 | 
				
			||||||
 | 
					        <mxCell id="KwNStDcgQ-FNAQaH3l0E-37" value="<div>No</div><div><br></div>" style="text;strokeColor=none;align=center;fillColor=none;html=1;verticalAlign=middle;whiteSpace=wrap;rounded=0;" vertex="1" parent="WIyWlLk6GJQsqaUBKTNV-1">
 | 
				
			||||||
 | 
					          <mxGeometry x="250" y="280" width="120" height="20" as="geometry" />
 | 
				
			||||||
 | 
					        </mxCell>
 | 
				
			||||||
 | 
					        <mxCell id="KwNStDcgQ-FNAQaH3l0E-42" value="" style="edgeStyle=none;orthogonalLoop=1;jettySize=auto;html=1;rounded=0;exitX=0;exitY=0.5;exitDx=0;exitDy=0;" edge="1" parent="WIyWlLk6GJQsqaUBKTNV-1" source="KwNStDcgQ-FNAQaH3l0E-28" target="KwNStDcgQ-FNAQaH3l0E-72">
 | 
				
			||||||
 | 
					          <mxGeometry width="80" relative="1" as="geometry">
 | 
				
			||||||
 | 
					            <mxPoint x="260" y="430" as="sourcePoint" />
 | 
				
			||||||
 | 
					            <mxPoint x="99" y="560" as="targetPoint" />
 | 
				
			||||||
 | 
					            <Array as="points">
 | 
				
			||||||
 | 
					              <mxPoint x="40" y="425" />
 | 
				
			||||||
 | 
					              <mxPoint x="40" y="570" />
 | 
				
			||||||
 | 
					            </Array>
 | 
				
			||||||
 | 
					          </mxGeometry>
 | 
				
			||||||
 | 
					        </mxCell>
 | 
				
			||||||
 | 
					        <mxCell id="KwNStDcgQ-FNAQaH3l0E-43" value="<div>Yes</div><div><br></div>" style="text;strokeColor=none;align=center;fillColor=none;html=1;verticalAlign=middle;whiteSpace=wrap;rounded=0;" vertex="1" parent="WIyWlLk6GJQsqaUBKTNV-1">
 | 
				
			||||||
 | 
					          <mxGeometry x="240" y="405" width="60" height="20" as="geometry" />
 | 
				
			||||||
 | 
					        </mxCell>
 | 
				
			||||||
 | 
					        <mxCell id="KwNStDcgQ-FNAQaH3l0E-65" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" edge="1" parent="WIyWlLk6GJQsqaUBKTNV-1" target="KwNStDcgQ-FNAQaH3l0E-45">
 | 
				
			||||||
 | 
					          <mxGeometry relative="1" as="geometry">
 | 
				
			||||||
 | 
					            <mxPoint x="120" y="585" as="sourcePoint" />
 | 
				
			||||||
 | 
					          </mxGeometry>
 | 
				
			||||||
 | 
					        </mxCell>
 | 
				
			||||||
 | 
					        <mxCell id="KwNStDcgQ-FNAQaH3l0E-66" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" edge="1" parent="WIyWlLk6GJQsqaUBKTNV-1" target="KwNStDcgQ-FNAQaH3l0E-46">
 | 
				
			||||||
 | 
					          <mxGeometry relative="1" as="geometry">
 | 
				
			||||||
 | 
					            <mxPoint x="120" y="670" as="sourcePoint" />
 | 
				
			||||||
 | 
					          </mxGeometry>
 | 
				
			||||||
 | 
					        </mxCell>
 | 
				
			||||||
 | 
					        <mxCell id="KwNStDcgQ-FNAQaH3l0E-63" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=0.5;entryY=0;entryDx=0;entryDy=0;entryPerimeter=0;" edge="1" parent="WIyWlLk6GJQsqaUBKTNV-1" target="KwNStDcgQ-FNAQaH3l0E-44">
 | 
				
			||||||
 | 
					          <mxGeometry relative="1" as="geometry">
 | 
				
			||||||
 | 
					            <mxPoint x="120" y="510" as="sourcePoint" />
 | 
				
			||||||
 | 
					          </mxGeometry>
 | 
				
			||||||
 | 
					        </mxCell>
 | 
				
			||||||
 | 
					        <mxCell id="KwNStDcgQ-FNAQaH3l0E-76" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.994;exitY=0.491;exitDx=0;exitDy=0;exitPerimeter=0;" edge="1" parent="WIyWlLk6GJQsqaUBKTNV-1" source="KwNStDcgQ-FNAQaH3l0E-75" target="KwNStDcgQ-FNAQaH3l0E-107">
 | 
				
			||||||
 | 
					          <mxGeometry relative="1" as="geometry">
 | 
				
			||||||
 | 
					            <mxPoint x="760" y="445" as="targetPoint" />
 | 
				
			||||||
 | 
					            <mxPoint x="730" y="580" as="sourcePoint" />
 | 
				
			||||||
 | 
					          </mxGeometry>
 | 
				
			||||||
 | 
					        </mxCell>
 | 
				
			||||||
 | 
					        <mxCell id="KwNStDcgQ-FNAQaH3l0E-79" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" edge="1" parent="WIyWlLk6GJQsqaUBKTNV-1" source="KwNStDcgQ-FNAQaH3l0E-78" target="KwNStDcgQ-FNAQaH3l0E-28">
 | 
				
			||||||
 | 
					          <mxGeometry relative="1" as="geometry" />
 | 
				
			||||||
 | 
					        </mxCell>
 | 
				
			||||||
 | 
					        <mxCell id="KwNStDcgQ-FNAQaH3l0E-78" value="" style="shape=waypoint;sketch=0;fillStyle=solid;size=6;pointerEvents=1;points=[];fillColor=none;resizable=0;rotatable=0;perimeter=centerPerimeter;snapToPoint=1;" vertex="1" parent="WIyWlLk6GJQsqaUBKTNV-1">
 | 
				
			||||||
 | 
					          <mxGeometry x="360" y="290" width="20" height="20" as="geometry" />
 | 
				
			||||||
 | 
					        </mxCell>
 | 
				
			||||||
 | 
					        <mxCell id="KwNStDcgQ-FNAQaH3l0E-81" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=0.5;entryY=0;entryDx=0;entryDy=0;entryPerimeter=0;" edge="1" parent="WIyWlLk6GJQsqaUBKTNV-1" source="WIyWlLk6GJQsqaUBKTNV-6" target="WIyWlLk6GJQsqaUBKTNV-7">
 | 
				
			||||||
 | 
					          <mxGeometry relative="1" as="geometry" />
 | 
				
			||||||
 | 
					        </mxCell>
 | 
				
			||||||
 | 
					        <mxCell id="KwNStDcgQ-FNAQaH3l0E-83" value="<div>No</div><div><br></div>" style="text;strokeColor=none;align=center;fillColor=none;html=1;verticalAlign=middle;whiteSpace=wrap;rounded=0;" vertex="1" parent="WIyWlLk6GJQsqaUBKTNV-1">
 | 
				
			||||||
 | 
					          <mxGeometry x="290" y="90" width="60" height="30" as="geometry" />
 | 
				
			||||||
 | 
					        </mxCell>
 | 
				
			||||||
 | 
					        <mxCell id="KwNStDcgQ-FNAQaH3l0E-84" value="<div><br></div><div><br></div><div>Yes</div><div><br></div><div><br></div>" style="text;strokeColor=none;align=center;fillColor=none;html=1;verticalAlign=middle;whiteSpace=wrap;rounded=0;" vertex="1" parent="WIyWlLk6GJQsqaUBKTNV-1">
 | 
				
			||||||
 | 
					          <mxGeometry x="170" y="140" width="60" height="30" as="geometry" />
 | 
				
			||||||
 | 
					        </mxCell>
 | 
				
			||||||
 | 
					        <mxCell id="KwNStDcgQ-FNAQaH3l0E-86" value="opkg_commands always counts as a file to update" style="shape=note;whiteSpace=wrap;html=1;backgroundOutline=1;fontColor=#000000;darkOpacity=0.05;fillColor=#FFF9B2;strokeColor=none;fillStyle=solid;direction=west;gradientDirection=north;gradientColor=#FFF2A1;shadow=1;size=20;pointerEvents=1;" vertex="1" parent="WIyWlLk6GJQsqaUBKTNV-1">
 | 
				
			||||||
 | 
					          <mxGeometry x="240" y="610" width="120" height="100" as="geometry" />
 | 
				
			||||||
 | 
					        </mxCell>
 | 
				
			||||||
 | 
					        <mxCell id="KwNStDcgQ-FNAQaH3l0E-87" value="in case someone has changed the zone (which means changed the branch)" style="shape=note;whiteSpace=wrap;html=1;backgroundOutline=1;fontColor=#000000;darkOpacity=0.05;fillColor=#FFF9B2;strokeColor=none;fillStyle=solid;direction=west;gradientDirection=north;gradientColor=#FFF2A1;shadow=1;size=20;pointerEvents=1;" vertex="1" parent="WIyWlLk6GJQsqaUBKTNV-1">
 | 
				
			||||||
 | 
					          <mxGeometry x="90" y="610" width="140" height="100" as="geometry" />
 | 
				
			||||||
 | 
					        </mxCell>
 | 
				
			||||||
 | 
					        <mxCell id="KwNStDcgQ-FNAQaH3l0E-88" value="Update Json-configuration files) and the device controller firmware." style="shape=note;whiteSpace=wrap;html=1;backgroundOutline=1;fontColor=#000000;darkOpacity=0.05;fillColor=#FFF9B2;strokeColor=none;fillStyle=solid;direction=west;gradientDirection=north;gradientColor=#FFF2A1;shadow=1;size=20;pointerEvents=1;" vertex="1" parent="WIyWlLk6GJQsqaUBKTNV-1">
 | 
				
			||||||
 | 
					          <mxGeometry x="370" y="610" width="180" height="100" as="geometry" />
 | 
				
			||||||
 | 
					        </mxCell>
 | 
				
			||||||
 | 
					        <mxCell id="KwNStDcgQ-FNAQaH3l0E-89" value="Sync tariff-files and ini-files with local filesystem." style="shape=note;whiteSpace=wrap;html=1;backgroundOutline=1;fontColor=#000000;darkOpacity=0.05;fillColor=#FFF9B2;strokeColor=none;fillStyle=solid;direction=west;gradientDirection=north;gradientColor=#FFF2A1;shadow=1;size=20;pointerEvents=1;" vertex="1" parent="WIyWlLk6GJQsqaUBKTNV-1">
 | 
				
			||||||
 | 
					          <mxGeometry x="560" y="610" width="160" height="100" as="geometry" />
 | 
				
			||||||
 | 
					        </mxCell>
 | 
				
			||||||
 | 
					        <mxCell id="KwNStDcgQ-FNAQaH3l0E-90" value="Make sure the customer repository is in place and useable." style="shape=note;whiteSpace=wrap;html=1;backgroundOutline=1;fontColor=#000000;darkOpacity=0.05;fillColor=#FFF9B2;strokeColor=none;fillStyle=solid;direction=west;gradientDirection=north;gradientColor=#FFF2A1;shadow=1;size=20;pointerEvents=1;" vertex="1" parent="WIyWlLk6GJQsqaUBKTNV-1">
 | 
				
			||||||
 | 
					          <mxGeometry x="20" y="110" width="140" height="95" as="geometry" />
 | 
				
			||||||
 | 
					        </mxCell>
 | 
				
			||||||
 | 
					        <mxCell id="KwNStDcgQ-FNAQaH3l0E-91" value="<b>NEVER</b> do any real update-steps without an active ISMAS trigger." style="shape=note;whiteSpace=wrap;html=1;backgroundOutline=1;fontColor=#000000;darkOpacity=0.05;fillColor=#FFF9B2;strokeColor=none;fillStyle=solid;direction=west;gradientDirection=north;gradientColor=#FFF2A1;shadow=1;size=20;pointerEvents=1;" vertex="1" parent="WIyWlLk6GJQsqaUBKTNV-1">
 | 
				
			||||||
 | 
					          <mxGeometry x="20" y="320" width="140" height="80" as="geometry" />
 | 
				
			||||||
 | 
					        </mxCell>
 | 
				
			||||||
 | 
					        <mxCell id="KwNStDcgQ-FNAQaH3l0E-92" value="<div><br></div><div>Initial/repaired</div><div>clone</div><div>?<br></div>" style="strokeWidth=2;html=1;shape=mxgraph.flowchart.decision;whiteSpace=wrap;" vertex="1" parent="WIyWlLk6GJQsqaUBKTNV-1">
 | 
				
			||||||
 | 
					          <mxGeometry x="585" y="375" width="100" height="100" as="geometry" />
 | 
				
			||||||
 | 
					        </mxCell>
 | 
				
			||||||
 | 
					        <mxCell id="KwNStDcgQ-FNAQaH3l0E-96" value="SUCCESS" style="strokeWidth=2;html=1;shape=mxgraph.flowchart.terminator;whiteSpace=wrap;" vertex="1" parent="WIyWlLk6GJQsqaUBKTNV-1">
 | 
				
			||||||
 | 
					          <mxGeometry x="710" y="10" width="100" height="40" as="geometry" />
 | 
				
			||||||
 | 
					        </mxCell>
 | 
				
			||||||
 | 
					        <mxCell id="KwNStDcgQ-FNAQaH3l0E-132" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" edge="1" parent="WIyWlLk6GJQsqaUBKTNV-1" source="KwNStDcgQ-FNAQaH3l0E-97" target="KwNStDcgQ-FNAQaH3l0E-11">
 | 
				
			||||||
 | 
					          <mxGeometry relative="1" as="geometry" />
 | 
				
			||||||
 | 
					        </mxCell>
 | 
				
			||||||
 | 
					        <mxCell id="KwNStDcgQ-FNAQaH3l0E-97" value="<div>Send Last Version</div>" style="rounded=1;whiteSpace=wrap;html=1;fontSize=12;glass=0;strokeWidth=1;shadow=0;points=[[0,0,0,0,0],[0,0.25,0,0,0],[0,0.5,0,0,0],[0,0.75,0,0,0],[0,1,0,0,0],[0.25,0,0,0,0],[0.25,1,0,0,0],[0.5,0,0,0,0],[0.5,1,0,0,0],[0.75,0,0,0,0],[0.75,1,0,0,0],[1,0,0,0,0],[1,0.25,0,0,0],[1,0.5,0,0,0],[1,0.75,0,0,0],[1,1,0,0,0]];" vertex="1" parent="WIyWlLk6GJQsqaUBKTNV-1">
 | 
				
			||||||
 | 
					          <mxGeometry x="580" y="100" width="110" height="30" as="geometry" />
 | 
				
			||||||
 | 
					        </mxCell>
 | 
				
			||||||
 | 
					        <mxCell id="KwNStDcgQ-FNAQaH3l0E-99" value="No" style="text;strokeColor=none;align=center;fillColor=none;html=1;verticalAlign=middle;whiteSpace=wrap;rounded=0;" vertex="1" parent="WIyWlLk6GJQsqaUBKTNV-1">
 | 
				
			||||||
 | 
					          <mxGeometry x="450" y="400" width="60" height="20" as="geometry" />
 | 
				
			||||||
 | 
					        </mxCell>
 | 
				
			||||||
 | 
					        <mxCell id="KwNStDcgQ-FNAQaH3l0E-103" value="No" style="text;strokeColor=none;align=center;fillColor=none;html=1;verticalAlign=middle;whiteSpace=wrap;rounded=0;" vertex="1" parent="WIyWlLk6GJQsqaUBKTNV-1">
 | 
				
			||||||
 | 
					          <mxGeometry x="580" y="330" width="60" height="20" as="geometry" />
 | 
				
			||||||
 | 
					        </mxCell>
 | 
				
			||||||
 | 
					        <mxCell id="KwNStDcgQ-FNAQaH3l0E-104" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=0.15;entryY=0.4;entryDx=0;entryDy=0;entryPerimeter=0;" edge="1" parent="WIyWlLk6GJQsqaUBKTNV-1" source="KwNStDcgQ-FNAQaH3l0E-92" target="KwNStDcgQ-FNAQaH3l0E-107">
 | 
				
			||||||
 | 
					          <mxGeometry relative="1" as="geometry">
 | 
				
			||||||
 | 
					            <mxPoint x="700" y="425" as="targetPoint" />
 | 
				
			||||||
 | 
					          </mxGeometry>
 | 
				
			||||||
 | 
					        </mxCell>
 | 
				
			||||||
 | 
					        <mxCell id="KwNStDcgQ-FNAQaH3l0E-106" value="" style="group" vertex="1" connectable="0" parent="WIyWlLk6GJQsqaUBKTNV-1">
 | 
				
			||||||
 | 
					          <mxGeometry x="50" y="540" width="770" height="57" as="geometry" />
 | 
				
			||||||
 | 
					        </mxCell>
 | 
				
			||||||
 | 
					        <mxCell id="KwNStDcgQ-FNAQaH3l0E-72" value="<div><br></div><div>&nbsp;&nbsp; Checkout branch</div><div><br></div>" style="shape=step;perimeter=stepPerimeter;fixedSize=1;points=[];whiteSpace=wrap;html=1;" vertex="1" parent="KwNStDcgQ-FNAQaH3l0E-106">
 | 
				
			||||||
 | 
					          <mxGeometry width="130" height="57" as="geometry" />
 | 
				
			||||||
 | 
					        </mxCell>
 | 
				
			||||||
 | 
					        <mxCell id="KwNStDcgQ-FNAQaH3l0E-73" value="<div>Update files</div><div>(Json, DeviceController)<br></div>" style="shape=step;perimeter=stepPerimeter;fixedSize=1;points=[];whiteSpace=wrap;html=1;" vertex="1" parent="KwNStDcgQ-FNAQaH3l0E-106">
 | 
				
			||||||
 | 
					          <mxGeometry x="350" width="194" height="57" as="geometry" />
 | 
				
			||||||
 | 
					        </mxCell>
 | 
				
			||||||
 | 
					        <mxCell id="KwNStDcgQ-FNAQaH3l0E-74" value="<div>Compute files <br></div><div>to update<br></div>" style="shape=step;perimeter=stepPerimeter;fixedSize=1;points=[];whiteSpace=wrap;html=1;" vertex="1" parent="KwNStDcgQ-FNAQaH3l0E-106">
 | 
				
			||||||
 | 
					          <mxGeometry x="110" width="140" height="57" as="geometry" />
 | 
				
			||||||
 | 
					        </mxCell>
 | 
				
			||||||
 | 
					        <mxCell id="KwNStDcgQ-FNAQaH3l0E-75" value="<div>(R)Sync with local</div><div>filesystem<br></div>" style="shape=step;perimeter=stepPerimeter;fixedSize=1;points=[];whiteSpace=wrap;html=1;" vertex="1" parent="KwNStDcgQ-FNAQaH3l0E-106">
 | 
				
			||||||
 | 
					          <mxGeometry x="520" width="170" height="57" as="geometry" />
 | 
				
			||||||
 | 
					        </mxCell>
 | 
				
			||||||
 | 
					        <mxCell id="KwNStDcgQ-FNAQaH3l0E-105" value="<div>Exec</div><div>opkg-commands</div>" style="shape=step;perimeter=stepPerimeter;fixedSize=1;points=[];whiteSpace=wrap;html=1;" vertex="1" parent="KwNStDcgQ-FNAQaH3l0E-106">
 | 
				
			||||||
 | 
					          <mxGeometry x="230" width="140" height="57" as="geometry" />
 | 
				
			||||||
 | 
					        </mxCell>
 | 
				
			||||||
 | 
					        <mxCell id="KwNStDcgQ-FNAQaH3l0E-107" value="" style="shape=waypoint;sketch=0;fillStyle=solid;size=6;pointerEvents=1;points=[];fillColor=none;resizable=0;rotatable=0;perimeter=centerPerimeter;snapToPoint=1;" vertex="1" parent="WIyWlLk6GJQsqaUBKTNV-1">
 | 
				
			||||||
 | 
					          <mxGeometry x="750" y="415" width="20" height="20" as="geometry" />
 | 
				
			||||||
 | 
					        </mxCell>
 | 
				
			||||||
 | 
					        <mxCell id="KwNStDcgQ-FNAQaH3l0E-109" value="<div>Yes</div><div><br></div>" style="text;strokeColor=none;align=center;fillColor=none;html=1;verticalAlign=middle;whiteSpace=wrap;rounded=0;" vertex="1" parent="WIyWlLk6GJQsqaUBKTNV-1">
 | 
				
			||||||
 | 
					          <mxGeometry x="690" y="415" width="60" height="20" as="geometry" />
 | 
				
			||||||
 | 
					        </mxCell>
 | 
				
			||||||
 | 
					        <mxCell id="KwNStDcgQ-FNAQaH3l0E-120" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=0.5;entryY=1;entryDx=0;entryDy=0;entryPerimeter=0;" edge="1" parent="WIyWlLk6GJQsqaUBKTNV-1" source="KwNStDcgQ-FNAQaH3l0E-110" target="KwNStDcgQ-FNAQaH3l0E-97">
 | 
				
			||||||
 | 
					          <mxGeometry relative="1" as="geometry" />
 | 
				
			||||||
 | 
					        </mxCell>
 | 
				
			||||||
 | 
					        <mxCell id="KwNStDcgQ-FNAQaH3l0E-110" value="" style="shape=waypoint;sketch=0;fillStyle=solid;size=6;pointerEvents=1;points=[];fillColor=none;resizable=0;rotatable=0;perimeter=centerPerimeter;snapToPoint=1;" vertex="1" parent="WIyWlLk6GJQsqaUBKTNV-1">
 | 
				
			||||||
 | 
					          <mxGeometry x="625" y="180" width="20" height="20" as="geometry" />
 | 
				
			||||||
 | 
					        </mxCell>
 | 
				
			||||||
 | 
					        <mxCell id="KwNStDcgQ-FNAQaH3l0E-129" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=0.95;entryY=0.95;entryDx=0;entryDy=0;entryPerimeter=0;" edge="1" parent="WIyWlLk6GJQsqaUBKTNV-1" source="KwNStDcgQ-FNAQaH3l0E-92" target="KwNStDcgQ-FNAQaH3l0E-110">
 | 
				
			||||||
 | 
					          <mxGeometry relative="1" as="geometry" />
 | 
				
			||||||
 | 
					        </mxCell>
 | 
				
			||||||
 | 
					        <mxCell id="KwNStDcgQ-FNAQaH3l0E-135" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" edge="1" parent="WIyWlLk6GJQsqaUBKTNV-1" source="KwNStDcgQ-FNAQaH3l0E-130" target="KwNStDcgQ-FNAQaH3l0E-96">
 | 
				
			||||||
 | 
					          <mxGeometry relative="1" as="geometry" />
 | 
				
			||||||
 | 
					        </mxCell>
 | 
				
			||||||
 | 
					        <mxCell id="KwNStDcgQ-FNAQaH3l0E-130" value="<div>Send Last Version</div>" style="rounded=1;whiteSpace=wrap;html=1;fontSize=12;glass=0;strokeWidth=1;shadow=0;points=[[0,0,0,0,0],[0,0.25,0,0,0],[0,0.5,0,0,0],[0,0.75,0,0,0],[0,1,0,0,0],[0.25,0,0,0,0],[0.25,1,0,0,0],[0.5,0,0,0,0],[0.5,1,0,0,0],[0.75,0,0,0,0],[0.75,1,0,0,0],[1,0,0,0,0],[1,0.25,0,0,0],[1,0.5,0,0,0],[1,0.75,0,0,0],[1,1,0,0,0]];" vertex="1" parent="WIyWlLk6GJQsqaUBKTNV-1">
 | 
				
			||||||
 | 
					          <mxGeometry x="705" y="100" width="110" height="30" as="geometry" />
 | 
				
			||||||
 | 
					        </mxCell>
 | 
				
			||||||
 | 
					        <mxCell id="KwNStDcgQ-FNAQaH3l0E-131" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=0.5;entryY=1;entryDx=0;entryDy=0;entryPerimeter=0;" edge="1" parent="WIyWlLk6GJQsqaUBKTNV-1" source="KwNStDcgQ-FNAQaH3l0E-107" target="KwNStDcgQ-FNAQaH3l0E-130">
 | 
				
			||||||
 | 
					          <mxGeometry relative="1" as="geometry" />
 | 
				
			||||||
 | 
					        </mxCell>
 | 
				
			||||||
 | 
					      </root>
 | 
				
			||||||
 | 
					    </mxGraphModel>
 | 
				
			||||||
 | 
					  </diagram>
 | 
				
			||||||
 | 
					</mxfile>
 | 
				
			||||||
							
								
								
									
										
											BIN
										
									
								
								doc/ATBUpdateTool.drawio-3.pdf
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								doc/ATBUpdateTool.drawio-3.pdf
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										
											BIN
										
									
								
								doc/ATBUpdateTool.drawio-4.pdf
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								doc/ATBUpdateTool.drawio-4.pdf
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										
											BIN
										
									
								
								doc/ATBUpdateTool4.pdf
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								doc/ATBUpdateTool4.pdf
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
										
											Binary file not shown.
										
									
								
							@@ -2,6 +2,7 @@
 | 
				
			|||||||
\usepackage{euler}
 | 
					\usepackage{euler}
 | 
				
			||||||
\usepackage[english]{babel}
 | 
					\usepackage[english]{babel}
 | 
				
			||||||
\usepackage{lipsum}
 | 
					\usepackage{lipsum}
 | 
				
			||||||
 | 
					\usepackage{multirow}
 | 
				
			||||||
\usepackage[colorlinks=true, urlcolor=blue, linkcolor=red]{hyperref}
 | 
					\usepackage[colorlinks=true, urlcolor=blue, linkcolor=red]{hyperref}
 | 
				
			||||||
\newcounter{Chapcounter}
 | 
					\newcounter{Chapcounter}
 | 
				
			||||||
\newcommand\showmycounter{\addtocounter{Chapcounter}{1}\themycounter}
 | 
					\newcommand\showmycounter{\addtocounter{Chapcounter}{1}\themycounter}
 | 
				
			||||||
@@ -19,13 +20,15 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
\begin{document}
 | 
					\begin{document}
 | 
				
			||||||
\maketitle
 | 
					\maketitle
 | 
				
			||||||
\chapter{Introduction}
 | 
					% \chapter{Introduction}
 | 
				
			||||||
\section{Motivation}
 | 
					\section{Motivation}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
The two main components of a PSA are
 | 
					The two main components of a PSA are
 | 
				
			||||||
\begin{itemize}
 | 
					\begin{itemize}
 | 
				
			||||||
    \item PTU software.
 | 
					    \item PTU software.
 | 
				
			||||||
    \item Device controller (DC) firmware.
 | 
					    \item Device controller (DC) firmware.
 | 
				
			||||||
\end{itemize}
 | 
					\end{itemize}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
While the DC firmware is basically the same for each PSA (even for different
 | 
					While the DC firmware is basically the same for each PSA (even for different
 | 
				
			||||||
customers), the PTU software is highly dependent on customer requirements.\par
 | 
					customers), the PTU software is highly dependent on customer requirements.\par
 | 
				
			||||||
Hence, each customer is assigned an own git-repository, which will be loaded
 | 
					Hence, each customer is assigned an own git-repository, which will be loaded
 | 
				
			||||||
@@ -36,6 +39,7 @@
 | 
				
			|||||||
script [{\bf \nameref{UpdateScript}}]), work together to finish a PSA installation.\par 
 | 
					script [{\bf \nameref{UpdateScript}}]), work together to finish a PSA installation.\par 
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
\section{PSA: Initial configuration}
 | 
					\section{PSA: Initial configuration}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
For the initial configuration, a PSA loads a customer-specific git-repository,
 | 
					For the initial configuration, a PSA loads a customer-specific git-repository,
 | 
				
			||||||
which structure is detailed below [{\bf \nameref{repostructure}}].\par
 | 
					which structure is detailed below [{\bf \nameref{repostructure}}].\par
 | 
				
			||||||
The "git clone" for the repository is done by the UpdateScript [{\bf \nameref{UpdateScript}}].
 | 
					The "git clone" for the repository is done by the UpdateScript [{\bf \nameref{UpdateScript}}].
 | 
				
			||||||
@@ -46,17 +50,28 @@
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
\end{center}
 | 
					\end{center}
 | 
				
			||||||
which will be interpreted by the UpdateController [{\bf \nameref{UpdateTool}}].
 | 
					which will be interpreted by the UpdateController [{\bf \nameref{UpdateTool}}].
 | 
				
			||||||
        The structure of {\bf update\_log.csv} is detailed below [{\bf \nameref{updatelogcsv}}].\par
 | 
					The structure of [{\bf \nameref{updatelogcsv}}] is detailed below.\par
 | 
				
			||||||
        Each line of {\bf update\_log.csv} represents a command for the UpdateController,
 | 
					Each line of update\_log.csv represents a command for the UpdateController,
 | 
				
			||||||
which will either download certain files to the DC or execute some
 | 
					which will either download certain files to the DC or execute some
 | 
				
			||||||
\href{https://openwrt.org/docs/guide-user/additional-software/opkg}{opkg}
 | 
					\href{https://openwrt.org/docs/guide-user/additional-software/opkg}{opkg}
 | 
				
			||||||
commands [{\bf \nameref{opkg}}].
 | 
					commands [{\bf \nameref{opkg}}].
 | 
				
			||||||
        
 | 
					        
 | 
				
			||||||
\section{PSA: Update}
 | 
					\section{PSA: Update}
 | 
				
			||||||
   
 | 
					   
 | 
				
			||||||
    \newpage
 | 
					The update of a PSA is basically managed by \href{https://git-scm.com/}{git}, a
 | 
				
			||||||
 | 
					free and open source distributed version control system. Like many other Version
 | 
				
			||||||
 | 
					Control Systems, git has a way to fire off custom scripts when certain important
 | 
				
			||||||
 | 
					actions occur, so-called \href{https://git-scm.com/book/en/v2/Customizing-Git-Git-Hooks}{hooks}.
 | 
				
			||||||
 | 
					The hooks used for a PSA update are called {\bf post-checkout} and {\bf post-merge}.\par
 | 
				
			||||||
 | 
					The post-checkout hook is called when checking out some branch of the customer-repository
 | 
				
			||||||
 | 
					(for instance when cloning the customer repository for the first time). In contrast,
 | 
				
			||||||
 | 
					the post-merge hook is called when a \href{https://www.git-scm.com/docs/git-pull}{git pull}
 | 
				
			||||||
 | 
					operation has been issued (more precisely, a \href {https://www.git-scm.com/docs/git-fetch}{git-fetch}
 | 
				
			||||||
 | 
					followed by a \href{https://www.git-scm.com/docs/git-merge}{git-merge}).\par
 | 
				
			||||||
 | 
					Both hooks update the file [{\bf \nameref{updatelogcsv}}], which is interpreted
 | 
				
			||||||
 | 
					by the UpdateController in a second step.
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
\chapter{Update-Tool "up\_dev\_ctrl"}
 | 
					% \chapter{Update-Tool "up\_dev\_ctrl"}
 | 
				
			||||||
    \section{up\_dev\_ctrl}
 | 
					    \section{up\_dev\_ctrl}
 | 
				
			||||||
    \label{UpdateTool}
 | 
					    \label{UpdateTool}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -79,7 +94,7 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    \newpage
 | 
					    \newpage
 | 
				
			||||||
 | 
					
 | 
				
			||||||
\chapter{Update-Script "update\_psa"}
 | 
					% \chapter{Update-Script "update\_psa"}
 | 
				
			||||||
    \section{update\_psa}
 | 
					    \section{update\_psa}
 | 
				
			||||||
    \label{UpdateScript}
 | 
					    \label{UpdateScript}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -98,13 +113,60 @@
 | 
				
			|||||||
        \end{itemize}
 | 
					        \end{itemize}
 | 
				
			||||||
    \newpage
 | 
					    \newpage
 | 
				
			||||||
 | 
					
 | 
				
			||||||
\chapter{Annex}
 | 
					%\chapter{Annex}
 | 
				
			||||||
    \section{Structure of a customer git-repository}
 | 
					    \section{Structure of a customer git-repository}
 | 
				
			||||||
    \label{repostructure}
 | 
					    \label{repostructure}
 | 
				
			||||||
 | 
					    \subsection{The post-checkout hook}
 | 
				
			||||||
 | 
					TODO: checkout\_history
 | 
				
			||||||
 | 
					    \subsection{The post-merge hook}
 | 
				
			||||||
 | 
					They are both located under the {\bf .githooks}-directory
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
    \section{Structure of "update\_log.csv"}
 | 
					\section{update\_log.csv}
 | 
				
			||||||
\label{updatelogcsv}
 | 
					\label{updatelogcsv}
 | 
				
			||||||
 | 
					    \begin{table}[h!]
 | 
				
			||||||
 | 
					        \begin{center}
 | 
				
			||||||
 | 
					        \caption{Initial state of update\_log.csv}
 | 
				
			||||||
 | 
					        \label{tab:initial_state}
 | 
				
			||||||
 | 
					        \begin{tabular}{llll}
 | 
				
			||||||
 | 
					            \textbf{Request} & \textbf{Name} & \textbf{Date} & \textbf{Status}\\
 | 
				
			||||||
 | 
					            \hline
 | 
				
			||||||
 | 
					            \multicolumn{4}{c}{}\\
 | 
				
			||||||
 | 
					            DOWNLOAD & /etc/dc/dc2c4.21.bin                & 2023-05-01T12:00:00 & N/A\\
 | 
				
			||||||
 | 
					            DOWNLOAD & /etc/psa\_config/DC2C\_print01.json & 2023-05-01T12:00:00 & N/A\\
 | 
				
			||||||
 | 
					            DOWNLOAD & /etc/psa\_config/DC2C\_print02.json & 2023-05-01T12:00:00 & N/A\\
 | 
				
			||||||
 | 
					            DOWNLOAD & /etc/psa\_config/DC2C\_print03.json & 2023-05-01T12:00:00 & N/A\\
 | 
				
			||||||
 | 
					            DOWNLOAD & /etc/psa\_config/DC2C\_print04.json & 2023-05-01T12:00:00 & N/A\\
 | 
				
			||||||
 | 
					            DOWNLOAD & /etc/psa\_config/DC2C\_print29.json & 2023-05-01T12:00:00 & N/A\\
 | 
				
			||||||
 | 
					            DOWNLOAD & /etc/psa\_config/DC2C\_print32.json & 2023-05-01T12:00:00 & N/A\\
 | 
				
			||||||
 | 
					            EXECUTE  & opkg update                         & 2023-05-01T12:00:00 & N/A\\
 | 
				
			||||||
 | 
					        \end{tabular}
 | 
				
			||||||
 | 
					        \end{center}
 | 
				
			||||||
 | 
					    \end{table}    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    \begin{table}[h!]
 | 
				
			||||||
 | 
					        \begin{center}
 | 
				
			||||||
 | 
					        \caption{State of update\_log.csv after updating}
 | 
				
			||||||
 | 
					        \label{tab:initial_state}
 | 
				
			||||||
 | 
					        \begin{tabular}{llll}
 | 
				
			||||||
 | 
					            \textbf{Request} & \textbf{Name} & \textbf{Date} & \textbf{Status}\\
 | 
				
			||||||
 | 
					            \hline
 | 
				
			||||||
 | 
					            \multicolumn{4}{c}{}\\
 | 
				
			||||||
 | 
					            DONE & /etc/dc/dc2c4.21.bin                & 2023-05-01T12:00:00 & N/A\\
 | 
				
			||||||
 | 
					            DONE & /etc/psa\_config/DC2C\_print01.json & 2023-05-01T12:00:00 & N/A\\
 | 
				
			||||||
 | 
					            DONE & /etc/psa\_config/DC2C\_print02.json & 2023-05-01T12:00:00 & N/A\\
 | 
				
			||||||
 | 
					            DONE & /etc/psa\_config/DC2C\_print03.json & 2023-05-01T12:00:00 & N/A\\
 | 
				
			||||||
 | 
					            DONE & /etc/psa\_config/DC2C\_print04.json & 2023-05-01T12:00:00 & N/A\\
 | 
				
			||||||
 | 
					            DONE & /etc/psa\_config/DC2C\_print29.json & 2023-05-01T12:00:00 & N/A\\
 | 
				
			||||||
 | 
					            DONE & /etc/psa\_config/DC2C\_print32.json & 2023-05-01T12:00:00 & N/A\\
 | 
				
			||||||
 | 
					            DONE & opkg update                         & 2023-05-01T12:00:00 & N/A\\
 | 
				
			||||||
 | 
					        \end{tabular}
 | 
				
			||||||
 | 
					        \end{center}
 | 
				
			||||||
 | 
					    \end{table}    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    \newpage
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
    \section{The package manager "opkg"}
 | 
					    \section{The package manager "opkg"}
 | 
				
			||||||
    \label{opkg}
 | 
					    \label{opkg}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    \section{Known problems}
 | 
				
			||||||
\end{document}
 | 
					\end{document}
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										434
									
								
								git/git_client.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										434
									
								
								git/git_client.cpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,434 @@
 | 
				
			|||||||
 | 
					#include "git_client.h"
 | 
				
			||||||
 | 
					#include "update.h"
 | 
				
			||||||
 | 
					#include "worker.h"
 | 
				
			||||||
 | 
					#include "utils.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <QRegularExpression>
 | 
				
			||||||
 | 
					#include <QDebug>
 | 
				
			||||||
 | 
					#include <QDir>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					GitClient::GitClient(QString const &customerNrStr,
 | 
				
			||||||
 | 
					                     QString const &customerRepository,
 | 
				
			||||||
 | 
					                     QString const &workingDirectory,
 | 
				
			||||||
 | 
					                     QString const &branchName,
 | 
				
			||||||
 | 
					                     QObject *parent)
 | 
				
			||||||
 | 
					  : QObject(parent)
 | 
				
			||||||
 | 
					  , m_worker(qobject_cast<Worker *>(parent))
 | 
				
			||||||
 | 
					  , m_repositoryPath(QString("https://git.mimbach49.de/GerhardHoffmann/%1.git").arg(customerNrStr))
 | 
				
			||||||
 | 
					  , m_customerNr(customerNrStr)
 | 
				
			||||||
 | 
					  , m_workingDirectory(workingDirectory)
 | 
				
			||||||
 | 
					  , m_branchName(branchName)
 | 
				
			||||||
 | 
					  , m_customerRepository(customerRepository) {
 | 
				
			||||||
 | 
					    if (!m_worker) {
 | 
				
			||||||
 | 
					        qCritical() << "ERROR CASTING PARENT TO WORKER FAILED";
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					bool GitClient::gitCloneCustomerRepository() {
 | 
				
			||||||
 | 
					    /*  Blobless clone
 | 
				
			||||||
 | 
					        ==============
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        When using the --filter=blob:none option, the initial git clone will
 | 
				
			||||||
 | 
					        download all reachable commits and trees, and only download the blobs
 | 
				
			||||||
 | 
					        for commits when you do a git checkout. This includes the first checkout
 | 
				
			||||||
 | 
					        inside the git clone operation.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        The important thing to notice is that we have a copy of every blob at
 | 
				
			||||||
 | 
					        HEAD but the blobs in the history are not present. If your repository
 | 
				
			||||||
 | 
					        has a deep history full of large blobs, then this option can
 | 
				
			||||||
 | 
					        significantly reduce your git clone times. The commit and tree data is
 | 
				
			||||||
 | 
					        still present, so any subsequent git checkout only needs to download
 | 
				
			||||||
 | 
					        the missing blobs. The Git client knows how to batch these requests to
 | 
				
			||||||
 | 
					        ask the server only for the missing blobs.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        Further, when running git fetch in a blobless clone, the server only
 | 
				
			||||||
 | 
					        sends the new commits and trees. The new blobs are downloaded only
 | 
				
			||||||
 | 
					        after a git checkout. Note that git pull runs git fetch and then git
 | 
				
			||||||
 | 
					        merge, so it will download the necessary blobs during the git merge
 | 
				
			||||||
 | 
					        command.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        When using a blobless clone, you will trigger a blob download whenever
 | 
				
			||||||
 | 
					        you need the contents of a file, but you will not need one if you only
 | 
				
			||||||
 | 
					        need the OID (object-id) of a file. This means that git log can detect
 | 
				
			||||||
 | 
					        which commits changed a given path without needing to download extra
 | 
				
			||||||
 | 
					        data.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        This means that blobless clones can perform commands like git
 | 
				
			||||||
 | 
					        merge-base, git log, or even git log -- <path> with the same performance
 | 
				
			||||||
 | 
					        as a full clone.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        Commands like git diff or git blame <path> require the contents of the
 | 
				
			||||||
 | 
					        paths to compute diffs, so these will trigger blob downloads the first
 | 
				
			||||||
 | 
					        time they are run. However, the good news is that after that you will
 | 
				
			||||||
 | 
					        have those blobs in your repository and do not need to download them a
 | 
				
			||||||
 | 
					        second time. Most developers only need to run git blame on a small
 | 
				
			||||||
 | 
					        number of files, so this tradeoff of a slightly slower git blame command
 | 
				
			||||||
 | 
					        is worth the faster clone and fetch times.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        Note: git v2.18 does not support treeless clones: --filter=tree:0.
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // Note: for some reason it is necessary to pass "--progress ---v",
 | 
				
			||||||
 | 
					    // otherwise QProcess returns an error of 128 = 0x80 for the command.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    QString gitCommand("git clone --progress -vvv --filter=blob:none ");
 | 
				
			||||||
 | 
					    gitCommand += m_repositoryPath;
 | 
				
			||||||
 | 
					    Command c(gitCommand);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    qInfo() << "IN CURRENT WD" << m_workingDirectory
 | 
				
			||||||
 | 
					            << "CLONE VIA COMMAND" << gitCommand;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (c.execute(m_workingDirectory)) { // execute the command in wd
 | 
				
			||||||
 | 
					        QString const result = c.getCommandResult();
 | 
				
			||||||
 | 
					        if (!result.isEmpty()) {
 | 
				
			||||||
 | 
					            // Cloning into 'customer_281'...\n
 | 
				
			||||||
 | 
					            int customer = -1;
 | 
				
			||||||
 | 
					            int cloning = result.indexOf("Cloning", 0, Qt::CaseInsensitive);
 | 
				
			||||||
 | 
					            if (cloning != -1) {
 | 
				
			||||||
 | 
					                customer = result.indexOf("customer_", cloning, Qt::CaseInsensitive);
 | 
				
			||||||
 | 
					                if (customer != -1) {
 | 
				
			||||||
 | 
					                    QString customerNr = result.mid(customer);
 | 
				
			||||||
 | 
					                    static constexpr char const ch = '\'';
 | 
				
			||||||
 | 
					                    int i = customerNr.indexOf(QChar(ch));
 | 
				
			||||||
 | 
					                    if (i != -1) {
 | 
				
			||||||
 | 
					                        if ((customerNr = customerNr.mid(0, i)) == m_customerNr) {
 | 
				
			||||||
 | 
					                            qInfo() << "CLONING" << m_repositoryPath << "OK";
 | 
				
			||||||
 | 
					                            return true;
 | 
				
			||||||
 | 
					                        }
 | 
				
			||||||
 | 
					                        Utils::printCriticalErrorMsg(
 | 
				
			||||||
 | 
					                            QString("ERROR CLONE RESULT HAS WRONG CUSTOMER-NR. (%1 != %2) CLONE_RESULT=%3")
 | 
				
			||||||
 | 
					                                .arg(customerNr)
 | 
				
			||||||
 | 
					                                .arg(m_customerNr)
 | 
				
			||||||
 | 
					                                .arg(result));
 | 
				
			||||||
 | 
					                        return false;
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            Utils::printCriticalErrorMsg(
 | 
				
			||||||
 | 
					                QString("ERROR CLONE RESULT HAS WRONG FORMAT. CLONING=%1 CUSTOMER=%2 CLONE_RESULT=%3")
 | 
				
			||||||
 | 
					                    .arg(cloning)
 | 
				
			||||||
 | 
					                    .arg(customer)
 | 
				
			||||||
 | 
					                    .arg(result));
 | 
				
			||||||
 | 
					            return false;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        Utils::printCriticalErrorMsg("ERROR CLONE RESULT IS EMPTY");
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    return false;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					bool GitClient::copyGitConfigFromMaster() { // only allowed when called in
 | 
				
			||||||
 | 
					                                            // master branch (???)
 | 
				
			||||||
 | 
					    if (QDir(m_customerRepository).exists()) {
 | 
				
			||||||
 | 
					        QString const cp = QString("cp .gitconfig .git/config");
 | 
				
			||||||
 | 
					        Command c("bash");
 | 
				
			||||||
 | 
					        if (c.execute(m_customerRepository, QStringList() << "-c" << cp)) {
 | 
				
			||||||
 | 
					            qInfo() << "cp .gitconfig .git/config OK";
 | 
				
			||||||
 | 
					            return true;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        qCritical() << "ERROR cp .gitconfig .git/config";
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    return false;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					QStringList GitClient::gitBranchNames() {
 | 
				
			||||||
 | 
					    // git config --global pager.branch false
 | 
				
			||||||
 | 
					    QStringList bNames;
 | 
				
			||||||
 | 
					    if (QDir(m_customerRepository).exists()) {
 | 
				
			||||||
 | 
					        QString gitCommand("git branch -a");
 | 
				
			||||||
 | 
					        Command c(gitCommand);
 | 
				
			||||||
 | 
					        if (c.execute(m_customerRepository)) {
 | 
				
			||||||
 | 
					            QString const result = c.getCommandResult();
 | 
				
			||||||
 | 
					            return result.split('\n');
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    return bNames;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					bool GitClient::gitCheckoutBranch() {
 | 
				
			||||||
 | 
					    // TODO: nachsehen, ob der Branch ueberhaupt existiert
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (QDir(m_customerRepository).exists()) {
 | 
				
			||||||
 | 
					        int zoneNr = Utils::read1stLineOfFile("/mnt/system_data/zone_nr");
 | 
				
			||||||
 | 
					        m_branchName = (zoneNr != 0)
 | 
				
			||||||
 | 
					            ? QString("zg1/zone%1").arg(zoneNr) : "master";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        QString gitCommand("git checkout ");
 | 
				
			||||||
 | 
					        gitCommand += m_branchName;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        Command c(gitCommand);
 | 
				
			||||||
 | 
					        return c.execute(m_customerRepository); // execute command in customerRepo
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    Utils::printCriticalErrorMsg(QString("ERROR ") + m_customerRepository + " DOES NOT EXIST");
 | 
				
			||||||
 | 
					    return false;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					bool GitClient::gitCloneAndCheckoutBranch() {
 | 
				
			||||||
 | 
					    qInfo() << "CLONE" << m_repositoryPath << "AND CHECKOUT" << m_branchName;
 | 
				
			||||||
 | 
					    if (gitCloneCustomerRepository()) {
 | 
				
			||||||
 | 
					        //if (copyGitConfigFromMaster()) {
 | 
				
			||||||
 | 
					            if (gitCheckoutBranch()) {
 | 
				
			||||||
 | 
					                return true;
 | 
				
			||||||
 | 
					            } else {
 | 
				
			||||||
 | 
					                // TODO
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        //}
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    Utils::printCriticalErrorMsg(QString("CLONE ") + m_repositoryPath + " AND CHECKOUT FAILED");
 | 
				
			||||||
 | 
					    return false;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					QStringList GitClient::gitShowReason(QString branchName) {
 | 
				
			||||||
 | 
					    QStringList lst;
 | 
				
			||||||
 | 
					    if (QDir(m_customerRepository).exists()) {
 | 
				
			||||||
 | 
					        // %h: commit (short form)
 | 
				
			||||||
 | 
					        // %s: commit message
 | 
				
			||||||
 | 
					        // %cI: commit date, strict ISO 8601 format
 | 
				
			||||||
 | 
					        // Note: branch with branchName has to exist: format zg1/zone1
 | 
				
			||||||
 | 
					        Command c(QString("git show origin/%1 -s --format=\"c=%h m=%s d=%cI\"").arg(branchName));
 | 
				
			||||||
 | 
					        if (c.execute(m_customerRepository)) {
 | 
				
			||||||
 | 
					            QString const s = c.getCommandResult().trimmed();
 | 
				
			||||||
 | 
					            int const c = s.indexOf("c=");
 | 
				
			||||||
 | 
					            int const m = s.indexOf("m=");
 | 
				
			||||||
 | 
					            int const d = s.indexOf("d=");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            QString msg = IsmasClient::getReasonForLastSendVersion();
 | 
				
			||||||
 | 
					            QString commit{""}, date{""};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            if (c != -1) {
 | 
				
			||||||
 | 
					                int start = c + 2;
 | 
				
			||||||
 | 
					                if (m >= start) {
 | 
				
			||||||
 | 
					                    int length = m - start;
 | 
				
			||||||
 | 
					                    commit = s.mid(start, length).trimmed();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    start = m + 2;
 | 
				
			||||||
 | 
					                    if (d >= start) {
 | 
				
			||||||
 | 
					                        length = d - start;
 | 
				
			||||||
 | 
					                        msg += " (";
 | 
				
			||||||
 | 
					                        msg = s.mid(start, length).trimmed();
 | 
				
			||||||
 | 
					                        msg += ")";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                        start = d + 2;
 | 
				
			||||||
 | 
					                        date = s.mid(start);
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                if (!commit.isEmpty() && !msg.isEmpty() && !date.isEmpty()) {
 | 
				
			||||||
 | 
					                    lst << commit << msg << date;
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    } else {
 | 
				
			||||||
 | 
					        qCritical() << "CUSTOMER_REPOSITORY" << m_customerRepository
 | 
				
			||||||
 | 
					                    << "DOES NOT EXIST";
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    return lst;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					 Zu beachten: wird eine datei neu hinzugefuegt (git add/commit) dann aber gleich
 | 
				
			||||||
 | 
					 wieder geloscht, so wird sie im diff nicht angezeigt.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					std::optional<QStringList> GitClient::gitDiff(QString const &commits) {
 | 
				
			||||||
 | 
					    if (QDir(m_customerRepository).exists()) {
 | 
				
			||||||
 | 
					        // 409f198..6c22726
 | 
				
			||||||
 | 
					        QString gitCommand("git diff --compact-summary ");
 | 
				
			||||||
 | 
					        gitCommand += commits;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        Command c(gitCommand);
 | 
				
			||||||
 | 
					        if (c.execute(m_customerRepository)) { // execute command in local customerRepo
 | 
				
			||||||
 | 
					            QString s = c.getCommandResult().trimmed();
 | 
				
			||||||
 | 
					            Utils::printInfoMsg("GIT DIFF RESULT " + s);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            QStringList lines = Update::split(s, '\n');
 | 
				
			||||||
 | 
					            QStringList fileNames;
 | 
				
			||||||
 | 
					            // each line has the format "etc/psa_config/DC2C_print01.json | 1 +
 | 
				
			||||||
 | 
					            // or the format            "etc/psa_config/DC2C_print01.json (new) | 1 +
 | 
				
			||||||
 | 
					            // the filenames are relativ to the repository
 | 
				
			||||||
 | 
					            for (int i = 0; i < lines.size(); ++i) {
 | 
				
			||||||
 | 
					                QString const &line = lines.at(i);
 | 
				
			||||||
 | 
					                int newIndex = line.indexOf("(new");    // for new files
 | 
				
			||||||
 | 
					                int goneIndex = line.indexOf("(gone");  // for removed files
 | 
				
			||||||
 | 
					                int modeIndex = line.indexOf("(mode");
 | 
				
			||||||
 | 
					                int pipeIndex = line.indexOf('|');
 | 
				
			||||||
 | 
					                if (newIndex != -1) {
 | 
				
			||||||
 | 
					                    QString file = line.left(newIndex).trimmed();
 | 
				
			||||||
 | 
					                    qInfo() << "FILE (NEW)" << file;
 | 
				
			||||||
 | 
					                    fileNames << file;
 | 
				
			||||||
 | 
					                } else
 | 
				
			||||||
 | 
					                if (modeIndex != -1) {
 | 
				
			||||||
 | 
					                    QString const file = line.left(modeIndex).trimmed();
 | 
				
			||||||
 | 
					                    qInfo() << "FILE (MODE)" << file;
 | 
				
			||||||
 | 
					                    fileNames << file;
 | 
				
			||||||
 | 
					                } else
 | 
				
			||||||
 | 
					                if (goneIndex != -1) {
 | 
				
			||||||
 | 
					                    QString const file = line.left(goneIndex).trimmed();
 | 
				
			||||||
 | 
					                    qCritical() << "FILE (GONE)" << file;
 | 
				
			||||||
 | 
					                } else
 | 
				
			||||||
 | 
					                if (pipeIndex != -1) {
 | 
				
			||||||
 | 
					                    QString const file = line.left(pipeIndex).trimmed();
 | 
				
			||||||
 | 
					                    qInfo() << "FILE (PIPE)" << file;
 | 
				
			||||||
 | 
					                    fileNames << file;
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            if (!fileNames.isEmpty()) {
 | 
				
			||||||
 | 
					                return fileNames;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    return std::nullopt;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					bool GitClient::gitFsck() {
 | 
				
			||||||
 | 
					    bool r = false;
 | 
				
			||||||
 | 
					    if (QDir(m_customerRepository).exists()) {
 | 
				
			||||||
 | 
					        Command c("git fsck");
 | 
				
			||||||
 | 
					        if ((r = c.execute(m_customerRepository)) == false) {
 | 
				
			||||||
 | 
					            QString const &s = c.getCommandResult().trimmed();
 | 
				
			||||||
 | 
					            Utils::printCriticalErrorMsg(QString("GIT FSCK FAILED: %1").arg(s));
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    return r;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					 Hat sich nichts geaendert, so werden auch keine Commits <>..<> angezeigt
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					std::optional<QString> GitClient::gitPull() {
 | 
				
			||||||
 | 
					    if (QDir(m_customerRepository).exists()) {
 | 
				
			||||||
 | 
					        qInfo() << "BRANCH NAME" << m_branchName;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        Command c("git pull");
 | 
				
			||||||
 | 
					        if (c.execute(m_customerRepository)) {
 | 
				
			||||||
 | 
					            QString const s = c.getCommandResult().trimmed();
 | 
				
			||||||
 | 
					            if (!s.isEmpty()) {
 | 
				
			||||||
 | 
					                QStringList lines = Update::split(s, '\n');
 | 
				
			||||||
 | 
					                worker()->CONSOLE(lines) << Worker::UPDATE_STEP::UPDATE_REPOSITORY;
 | 
				
			||||||
 | 
					                if (!lines.empty()) {
 | 
				
			||||||
 | 
					                    static const QRegularExpression alreadyUpToDate("^\\s*Already\\s+up\\s+to\\s+date.*$");
 | 
				
			||||||
 | 
					                    if (std::none_of(lines.cbegin(), lines.cend(),
 | 
				
			||||||
 | 
					                        [](QString const &s) { return s.contains(alreadyUpToDate); })) {
 | 
				
			||||||
 | 
					                        int zoneNr = Utils::read1stLineOfFile("/mnt/system_data/zone_nr");
 | 
				
			||||||
 | 
					                        m_branchName = (zoneNr != 0) ? QString("zg1/zone%1").arg(zoneNr) : "master";
 | 
				
			||||||
 | 
					                        // lines can look like this:
 | 
				
			||||||
 | 
					                        // From https://git.mimbach49.de/GerhardHoffmann/customer_281
 | 
				
			||||||
 | 
					                        //   41ec581..5d25ac3  master     -> origin/master
 | 
				
			||||||
 | 
					                        //   ff10f57..43530a1  zg1/zone1  -> origin/zg1/zone1
 | 
				
			||||||
 | 
					                        //   6ed893f..5d9882c  zg1/zone2  -> origin/zg1/zone2
 | 
				
			||||||
 | 
					                        //   4384d17..77045d8  zg1/zone3  -> origin/zg1/zone3
 | 
				
			||||||
 | 
					                        //   89d2812..36a0d74  zg1/zone5  -> origin/zg1/zone5
 | 
				
			||||||
 | 
					                        bool found = false;
 | 
				
			||||||
 | 
					                        for (int i=0; i < lines.size(); ++i) {
 | 
				
			||||||
 | 
					                            if (lines.at(i).contains(m_branchName)) {
 | 
				
			||||||
 | 
					                                found = true;
 | 
				
			||||||
 | 
					                                // 409f198..6c22726  zg1/zone1  -> origin/zg1/zone1
 | 
				
			||||||
 | 
					                                static QRegularExpression re("(^\\s*)([0-9A-Fa-f]+..[0-9A-Fa-f]+)(.*$)");
 | 
				
			||||||
 | 
					                                QRegularExpressionMatch match = re.match(lines.at(i));
 | 
				
			||||||
 | 
					                                if (match.hasMatch()) {
 | 
				
			||||||
 | 
					                                    if (re.captureCount() == 3) { // start with full match (0), then the other 3 matches
 | 
				
			||||||
 | 
					                                        QString const matchCaptured = match.captured(2);
 | 
				
			||||||
 | 
					                                        worker()->CONSOLE(QStringList(matchCaptured)) << Worker::UPDATE_STEP::UPDATE_REPOSITORY;
 | 
				
			||||||
 | 
					                                        return matchCaptured;
 | 
				
			||||||
 | 
					                                    } else {
 | 
				
			||||||
 | 
					                                        QStringList lst(QString("(wrong capture count (%1)").arg(re.captureCount()));
 | 
				
			||||||
 | 
					                                        worker()->GUI(lst) << (worker()->CONSOLE(lst) << Worker::UPDATE_STEP::UPDATE_REPOSITORY_FAILURE);
 | 
				
			||||||
 | 
					                                    }
 | 
				
			||||||
 | 
					                                } else {
 | 
				
			||||||
 | 
					                                    QStringList lst("no regex-match for commits");
 | 
				
			||||||
 | 
					                                    worker()->GUI(lst) << (worker()->CONSOLE(lst) << Worker::UPDATE_STEP::UPDATE_REPOSITORY_FAILURE);
 | 
				
			||||||
 | 
					                                }
 | 
				
			||||||
 | 
					                            }
 | 
				
			||||||
 | 
					                        }
 | 
				
			||||||
 | 
					                        if (!found) {
 | 
				
			||||||
 | 
					                            QStringList lst(QString("unknown branch name ") + m_branchName);
 | 
				
			||||||
 | 
					                            worker()->GUI(lst) << (worker()->CONSOLE(lst) << Worker::UPDATE_STEP::UPDATE_REPOSITORY_FAILURE);
 | 
				
			||||||
 | 
					                        }
 | 
				
			||||||
 | 
					                    } else {
 | 
				
			||||||
 | 
					                        return "Already up to date";
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                } else {
 | 
				
			||||||
 | 
					                    QStringList lst(QString("WRONG FORMAT FOR RESULT OF 'GIT PULL' ") + s);
 | 
				
			||||||
 | 
					                    worker()->GUI(lst) << (worker()->CONSOLE(lst) << Worker::UPDATE_STEP::UPDATE_REPOSITORY_FAILURE);
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            } else {
 | 
				
			||||||
 | 
					                QStringList lst("EMPTY RESULT FOR 'GIT PULL'");
 | 
				
			||||||
 | 
					                worker()->GUI(lst) << (worker()->CONSOLE(lst) << Worker::UPDATE_STEP::UPDATE_REPOSITORY_FAILURE);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    } else {
 | 
				
			||||||
 | 
					        QStringList lst(QString("REPOSITORY ") + m_customerRepository + " DOES NOT EXIST");
 | 
				
			||||||
 | 
					        worker()->GUI(lst) << (worker()->CONSOLE(lst) << Worker::UPDATE_STEP::UPDATE_REPOSITORY_FAILURE);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    return std::nullopt;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					std::optional<QStringList> GitClient::gitMerge() {
 | 
				
			||||||
 | 
					    Command c("git merge");
 | 
				
			||||||
 | 
					    if (c.execute(m_workingDirectory)) {
 | 
				
			||||||
 | 
					        QString s = c.getCommandResult();
 | 
				
			||||||
 | 
					        QStringList lst = Update::split(s, '\n');
 | 
				
			||||||
 | 
					        return lst;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    return std::nullopt;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					QString GitClient::gitLastCommit(QString fileName) {
 | 
				
			||||||
 | 
					    if (QDir(m_customerRepository).exists()) {
 | 
				
			||||||
 | 
					        QString const filePath
 | 
				
			||||||
 | 
					            = QDir::cleanPath(m_customerRepository + QDir::separator() + fileName);
 | 
				
			||||||
 | 
					        if (QFile(filePath).exists()) {
 | 
				
			||||||
 | 
					            QString const gitCommand = QString("git log %1 | head -n 1").arg(fileName);
 | 
				
			||||||
 | 
					            Command c("bash");
 | 
				
			||||||
 | 
					            if (c.execute(m_customerRepository, QStringList() << "-c" << gitCommand)) {
 | 
				
			||||||
 | 
					                QString const r = c.getCommandResult();
 | 
				
			||||||
 | 
					                int const idx = r.indexOf("commit ");
 | 
				
			||||||
 | 
					                if (idx != -1) {
 | 
				
			||||||
 | 
					                    return r.mid(idx + 8).trimmed();
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    return "";
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// fileName has to an absolute path
 | 
				
			||||||
 | 
					QString GitClient::gitBlob(QString fileName) {
 | 
				
			||||||
 | 
					    QFileInfo fi(fileName);
 | 
				
			||||||
 | 
					    if (fi.exists()) {
 | 
				
			||||||
 | 
					        QString const gitCommand = QString("git hash-object %1").arg(fileName);
 | 
				
			||||||
 | 
					        Command c(gitCommand);
 | 
				
			||||||
 | 
					        if (c.execute("/tmp")) {
 | 
				
			||||||
 | 
					            return c.getCommandResult().trimmed();
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    return "N/A";
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					QString GitClient::gitCommitForBlob(QString blob) {
 | 
				
			||||||
 | 
					    if (QDir(m_customerRepository).exists()) {
 | 
				
			||||||
 | 
					        QString const gitCommand
 | 
				
			||||||
 | 
					            = QString("git whatchanged --all --find-object=%1 | head -n 1").arg(blob);
 | 
				
			||||||
 | 
					        Command c(gitCommand);
 | 
				
			||||||
 | 
					        if (c.execute(m_customerRepository)) {
 | 
				
			||||||
 | 
					            return c.getCommandResult();
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    return "";
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					bool GitClient::gitIsFileTracked(QString fName) {
 | 
				
			||||||
 | 
					    if (QDir(m_customerRepository).exists()) {
 | 
				
			||||||
 | 
					        QString const gitCommand
 | 
				
			||||||
 | 
					            = QString("git ls-files --error-unmatch %1").arg(fName);
 | 
				
			||||||
 | 
					        Command c(gitCommand);
 | 
				
			||||||
 | 
					        return c.execute(m_customerRepository);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    return false;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//get_commit_for_blob () {
 | 
				
			||||||
 | 
					//    # search for the blob in all commits for the file(name) $1
 | 
				
			||||||
 | 
					//    echo $(git log --all --pretty=format:%H -- $2   |
 | 
				
			||||||
 | 
					//           xargs -I{} bash -c "git ls-tree {} -- $2 |
 | 
				
			||||||
 | 
					//           grep -q $1 && echo -n {} && head -n 1")
 | 
				
			||||||
 | 
					//}
 | 
				
			||||||
							
								
								
									
										62
									
								
								git/git_client.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										62
									
								
								git/git_client.h
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,62 @@
 | 
				
			|||||||
 | 
					#ifndef GIT_CLIENT_H_INCLUDED
 | 
				
			||||||
 | 
					#define GIT_CLIENT_H_INCLUDED
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <QObject>
 | 
				
			||||||
 | 
					#include <QStringList>
 | 
				
			||||||
 | 
					#include <optional>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "process/command.h"
 | 
				
			||||||
 | 
					#include "ismas/ismas_client.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class Worker;
 | 
				
			||||||
 | 
					class GitClient : public QObject {
 | 
				
			||||||
 | 
					    Q_OBJECT
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    Worker *m_worker;
 | 
				
			||||||
 | 
					    QString const m_repositoryPath;
 | 
				
			||||||
 | 
					    QString const m_customerNr;
 | 
				
			||||||
 | 
					    QString const m_workingDirectory;
 | 
				
			||||||
 | 
					    QString m_branchName;
 | 
				
			||||||
 | 
					    QString const m_customerRepository;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    bool copyGitConfigFromMaster();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  public:
 | 
				
			||||||
 | 
					    explicit GitClient(QString const &customerNrStr,
 | 
				
			||||||
 | 
					                       QString const &repositoryPath,
 | 
				
			||||||
 | 
					                       QString const &workingDirectory = QCoreApplication::applicationDirPath(),
 | 
				
			||||||
 | 
					                       QString const &branchName = "master",
 | 
				
			||||||
 | 
					                       QObject *parent = 0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    bool gitCloneCustomerRepository();
 | 
				
			||||||
 | 
					    bool gitCheckoutBranch();
 | 
				
			||||||
 | 
					    QStringList gitBranchNames();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    QString const workingDirectory() const { return m_workingDirectory; }
 | 
				
			||||||
 | 
					    QString workingDirectory() { return m_workingDirectory; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    QString const branchName() const { return m_branchName; }
 | 
				
			||||||
 | 
					    QString branchName() { return m_branchName; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    QString repositoryPath() { return m_repositoryPath; }
 | 
				
			||||||
 | 
					    QString const repositoryPath() const { return m_repositoryPath; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    bool gitCloneAndCheckoutBranch();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    Worker *worker() { return m_worker; }
 | 
				
			||||||
 | 
					    Worker const *worker() const { return m_worker; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    std::optional<QString> gitPull();
 | 
				
			||||||
 | 
					    std::optional<QStringList> gitDiff(QString const &commit);
 | 
				
			||||||
 | 
					    std::optional<QStringList> gitMerge();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    bool gitFsck();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    QString gitLastCommit(QString fileName);
 | 
				
			||||||
 | 
					    QStringList gitShowReason(QString branchName);
 | 
				
			||||||
 | 
					    static QString gitBlob(QString fileName);
 | 
				
			||||||
 | 
					    QString gitCommitForBlob(QString blob);
 | 
				
			||||||
 | 
					    bool gitIsFileTracked(QString file2name);
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#endif // GIT_CLIENT_H_INCLUDED
 | 
				
			||||||
							
								
								
									
										2492
									
								
								interfaces.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										2492
									
								
								interfaces.h
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										1088
									
								
								ismas/ismas_client.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1088
									
								
								ismas/ismas_client.cpp
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										272
									
								
								ismas/ismas_client.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										272
									
								
								ismas/ismas_client.h
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,272 @@
 | 
				
			|||||||
 | 
					#ifndef ISMAS_CLIENT_H_INCLUDED
 | 
				
			||||||
 | 
					#define ISMAS_CLIENT_H_INCLUDED
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <QObject>
 | 
				
			||||||
 | 
					#include <QString>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <optional>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct PSAInstalled {
 | 
				
			||||||
 | 
					    struct VersionInfo {
 | 
				
			||||||
 | 
					        QString created;
 | 
				
			||||||
 | 
					        QString reason;
 | 
				
			||||||
 | 
					        QString lastCommit;
 | 
				
			||||||
 | 
					    } versionInfo;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    struct Tariff {
 | 
				
			||||||
 | 
					        // VersionInfo versionInfo;
 | 
				
			||||||
 | 
					        QString name;
 | 
				
			||||||
 | 
					        QString version;
 | 
				
			||||||
 | 
					        QString project;
 | 
				
			||||||
 | 
					        int zone;
 | 
				
			||||||
 | 
					        int size;
 | 
				
			||||||
 | 
					        QString blob;
 | 
				
			||||||
 | 
					        QString lastCommit;
 | 
				
			||||||
 | 
					        QString info;
 | 
				
			||||||
 | 
					        QString loadTime;
 | 
				
			||||||
 | 
					    } tariff;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    struct HardWare {
 | 
				
			||||||
 | 
					        QString linuxVersion;
 | 
				
			||||||
 | 
					        QString cpuSerial;
 | 
				
			||||||
 | 
					    } hw;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    struct Opkg {
 | 
				
			||||||
 | 
					        // VersionInfo versionInfo;
 | 
				
			||||||
 | 
					        int size;
 | 
				
			||||||
 | 
					        QString blob;
 | 
				
			||||||
 | 
					        QString lastCommit;
 | 
				
			||||||
 | 
					        QString loadTime;
 | 
				
			||||||
 | 
					    } opkg;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    struct DC {
 | 
				
			||||||
 | 
					        // VersionInfo versionInfo;
 | 
				
			||||||
 | 
					        QString versionHW;
 | 
				
			||||||
 | 
					        QString versionSW;
 | 
				
			||||||
 | 
					        QString gitBlob;
 | 
				
			||||||
 | 
					        QString gitLastCommit;
 | 
				
			||||||
 | 
					        int size;
 | 
				
			||||||
 | 
					    } dc;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    struct SoftWare {
 | 
				
			||||||
 | 
					        QString apismVersion;
 | 
				
			||||||
 | 
					        QString atbQTVersion;
 | 
				
			||||||
 | 
					        QString atbUpdateToolVersion;
 | 
				
			||||||
 | 
					    } sw;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    struct PluginVersion {
 | 
				
			||||||
 | 
					        QString deviceController;
 | 
				
			||||||
 | 
					        QString ingenicoISelfCC;
 | 
				
			||||||
 | 
					        QString mobilisisCalculatePrice;
 | 
				
			||||||
 | 
					        QString mobilisisCalculatePriceConfigUi;
 | 
				
			||||||
 | 
					        QString prmCalculatePrice;
 | 
				
			||||||
 | 
					        QString prmCalculatePriceConfigUi;
 | 
				
			||||||
 | 
					        QString tcpZVT;
 | 
				
			||||||
 | 
					    } pluginVersion;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    struct DC2C {
 | 
				
			||||||
 | 
					        // VersionInfo versionInfo;
 | 
				
			||||||
 | 
					        QString name;
 | 
				
			||||||
 | 
					        QString blob;
 | 
				
			||||||
 | 
					        int size;
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    DC2C cash;
 | 
				
			||||||
 | 
					    DC2C conf;
 | 
				
			||||||
 | 
					    DC2C device;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    DC2C print[32];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    explicit PSAInstalled() {
 | 
				
			||||||
 | 
					        tariff.name = "N/A";
 | 
				
			||||||
 | 
					        tariff.version = "N/A";
 | 
				
			||||||
 | 
					        tariff.project = "N/A";
 | 
				
			||||||
 | 
					        tariff.zone = -1;
 | 
				
			||||||
 | 
					        tariff.size = -1;
 | 
				
			||||||
 | 
					        tariff.blob = "N/A";
 | 
				
			||||||
 | 
					        tariff.info = "N/A";
 | 
				
			||||||
 | 
					        tariff.loadTime = "N/A";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        hw.linuxVersion = "N/A";
 | 
				
			||||||
 | 
					        hw.cpuSerial = "N/A";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        opkg.size = -1;
 | 
				
			||||||
 | 
					        opkg.blob = "N/A";
 | 
				
			||||||
 | 
					        opkg.lastCommit = "N/A";
 | 
				
			||||||
 | 
					        opkg.loadTime = "N/A";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        dc.versionHW = "N/A";
 | 
				
			||||||
 | 
					        dc.versionSW = "N/A";
 | 
				
			||||||
 | 
					        dc.gitBlob = "N/A";
 | 
				
			||||||
 | 
					        dc.gitLastCommit = "N/A";
 | 
				
			||||||
 | 
					        dc.size = -1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        sw.apismVersion = "N/A";
 | 
				
			||||||
 | 
					        sw.atbQTVersion = "N/A";
 | 
				
			||||||
 | 
					        sw.atbUpdateToolVersion = "N/A";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        pluginVersion.deviceController = "N/A";
 | 
				
			||||||
 | 
					        pluginVersion.ingenicoISelfCC = "N/A";
 | 
				
			||||||
 | 
					        pluginVersion.mobilisisCalculatePrice = "N/A";
 | 
				
			||||||
 | 
					        pluginVersion.mobilisisCalculatePriceConfigUi = "N/A";
 | 
				
			||||||
 | 
					        pluginVersion.prmCalculatePrice = "N/A";
 | 
				
			||||||
 | 
					        pluginVersion.prmCalculatePriceConfigUi = "N/A";
 | 
				
			||||||
 | 
					        pluginVersion.tcpZVT = "N/A";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        cash.name = "N/A";
 | 
				
			||||||
 | 
					        cash.blob = "N/A";
 | 
				
			||||||
 | 
					        cash.size = -1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        conf.name = "N/A";
 | 
				
			||||||
 | 
					        conf.blob = "N/A";
 | 
				
			||||||
 | 
					        conf.size = -1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        device.size = -1;
 | 
				
			||||||
 | 
					        device.blob = "N/A";
 | 
				
			||||||
 | 
					        device.size = -1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        for (int i=0; i < 32; ++i) {
 | 
				
			||||||
 | 
					            print[i].size = -1;
 | 
				
			||||||
 | 
					            print[i].blob = "N/A";
 | 
				
			||||||
 | 
					            print[i].size = -1;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class IsmasClient : public QObject {
 | 
				
			||||||
 | 
					    Q_OBJECT
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    int m_progressInPercent;
 | 
				
			||||||
 | 
					public:
 | 
				
			||||||
 | 
					    explicit IsmasClient() : m_progressInPercent(1) {}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    enum APISM {
 | 
				
			||||||
 | 
					        DB_PORT = 7777,
 | 
				
			||||||
 | 
					        DIRECT_PORT = 7778
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    enum RESULT_CODE {
 | 
				
			||||||
 | 
					        SUCCESS=0,
 | 
				
			||||||
 | 
					        NO_UPDATE_NECESSARY=1,
 | 
				
			||||||
 | 
					        BACKUP_FAILED=2,
 | 
				
			||||||
 | 
					        WRONG_PACKAGE=3,
 | 
				
			||||||
 | 
					        INSTALL_ERROR=4};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    enum REASON {
 | 
				
			||||||
 | 
					        TIME_TRIGGERED = 0,
 | 
				
			||||||
 | 
					        SERVICE,
 | 
				
			||||||
 | 
					        DEV_TEST,
 | 
				
			||||||
 | 
					        ENTRIES
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    static char const *reason[REASON::ENTRIES];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    static std::optional<QString>
 | 
				
			||||||
 | 
					        sendRequestReceiveResponse(int port, QString const &request);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    static QString getReasonForLastSendVersion();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    int getProgressInPercent() const {return m_progressInPercent; }
 | 
				
			||||||
 | 
					    void setProgressInPercent(int procent) { m_progressInPercent = procent; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    QString updateNewsToIsmas(char const *event,
 | 
				
			||||||
 | 
					                              int percent,
 | 
				
			||||||
 | 
					                              int resultCode,
 | 
				
			||||||
 | 
					                              char const *step,
 | 
				
			||||||
 | 
					                              char const *step_result,
 | 
				
			||||||
 | 
					                              char const *version);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    QString updateOfPSAStarted(QString const &version = QString());   // start of update process
 | 
				
			||||||
 | 
					    QString cloneAndCheckoutCustomerRepository(QString const &info, QString const &version = QString());   // clone and checkout customer repository
 | 
				
			||||||
 | 
					    QString checkoutBranch(QString const &info, QString const &version = QString());   // checkout branch
 | 
				
			||||||
 | 
					    QString errorBackendNotConnected(QString const &info, QString const &version = QString());   // checkout branch
 | 
				
			||||||
 | 
					    QString errorGitClone(QString const &info, QString const &version = QString());
 | 
				
			||||||
 | 
					    QString backendConnected(QString const &info, QString const &version = QString());
 | 
				
			||||||
 | 
					    QString updateTriggerSet(QString const &info, QString const &version = QString());
 | 
				
			||||||
 | 
					    QString errorUpdateTrigger(QString const &info, QString const &version = QString());
 | 
				
			||||||
 | 
					    QString gitFetch(QString const &info, QString const &version = QString());
 | 
				
			||||||
 | 
					    QString execOpkgCommand(QString const &info, QString const &version = QString());
 | 
				
			||||||
 | 
					    QString rsyncFile(QString const &info, QString const &version = QString());
 | 
				
			||||||
 | 
					    QString errorGitFetch(int resultCode, QString const &info, QString const &version = QString());
 | 
				
			||||||
 | 
					    QString updateOfPSAActivated(QString const &version = QString());
 | 
				
			||||||
 | 
					                                    // and update accepted
 | 
				
			||||||
 | 
					    QString updateOfPSASucceeded(QString const &version = QString()); // update process succeeded
 | 
				
			||||||
 | 
					    QString updateOfPSAContinues(QString currentStage, QString currentStageInfo, QString const &version = QString());
 | 
				
			||||||
 | 
					    QString updateOfPSAFailed(int resultCode, QString step, QString reason, QString const &version = QString());
 | 
				
			||||||
 | 
					    QString sanityCheckFailed(int resultCode, QString reason, QString const &version = QString());
 | 
				
			||||||
 | 
					    QString jsonParseFailed(int resultCode, QString reason, QString const &version = QString());
 | 
				
			||||||
 | 
					    std::optional<QString> finalResult(int resultCode, QString reason, QString const &version = QString());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // legacy
 | 
				
			||||||
 | 
					    QString updateOfPSASendVersion(PSAInstalled const &psa);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#if 0
 | 
				
			||||||
 | 
					    enum class UPDATE_COMPONENT {
 | 
				
			||||||
 | 
					        TARIFF,
 | 
				
			||||||
 | 
					        SOFTWARE_ATBQT,
 | 
				
			||||||
 | 
					        SOFTWARE_APISM,
 | 
				
			||||||
 | 
					        SOFTWARE_ATB_UPDATE_TOOL,
 | 
				
			||||||
 | 
					        CONFIG_PTU5_CPU_SERIAL,
 | 
				
			||||||
 | 
					        CONFIG_DEVICE_CONTROLLER,
 | 
				
			||||||
 | 
					        CONFIG_PRINTER,
 | 
				
			||||||
 | 
					        CONFIG_BNA,
 | 
				
			||||||
 | 
					        PLUGIN_ATB_DEVICE_CONTROLLER,
 | 
				
			||||||
 | 
					        PLUGIN_INGENICO_CC,
 | 
				
			||||||
 | 
					        PLUGIN_MOBILISIS_CALC_PRICE,
 | 
				
			||||||
 | 
					        PLUGIN_MOBILISIS_CALC_PRICE_UI,
 | 
				
			||||||
 | 
					        PLUGIN_PRM_CALC_PRICE,
 | 
				
			||||||
 | 
					        PLUGIN_PRM_CALC_PRICE_UI,
 | 
				
			||||||
 | 
					        PLUGIN_TCP_ZVT_CC,
 | 
				
			||||||
 | 
					        OPKG_COMMANDS,
 | 
				
			||||||
 | 
					        HARDWARE_DEVICES,
 | 
				
			||||||
 | 
					        OS,
 | 
				
			||||||
 | 
					        DC2C_CASH_JSON,
 | 
				
			||||||
 | 
					        DC2C_CONF_JSON,
 | 
				
			||||||
 | 
					        DC2C_DEVICE_JSON,
 | 
				
			||||||
 | 
					        DC2C_PRINT01_JSON,
 | 
				
			||||||
 | 
					        DC2C_PRINT02_JSON,
 | 
				
			||||||
 | 
					        DC2C_PRINT03_JSON,
 | 
				
			||||||
 | 
					        DC2C_PRINT04_JSON,
 | 
				
			||||||
 | 
					        DC2C_PRINT05_JSON,
 | 
				
			||||||
 | 
					        DC2C_PRINT06_JSON,
 | 
				
			||||||
 | 
					        DC2C_PRINT07_JSON,
 | 
				
			||||||
 | 
					        DC2C_PRINT08_JSON,
 | 
				
			||||||
 | 
					        DC2C_PRINT09_JSON,
 | 
				
			||||||
 | 
					        DC2C_PRINT10_JSON,
 | 
				
			||||||
 | 
					        DC2C_PRINT11_JSON,
 | 
				
			||||||
 | 
					        DC2C_PRINT12_JSON,
 | 
				
			||||||
 | 
					        DC2C_PRINT13_JSON,
 | 
				
			||||||
 | 
					        DC2C_PRINT14_JSON,
 | 
				
			||||||
 | 
					        DC2C_PRINT15_JSON,
 | 
				
			||||||
 | 
					        DC2C_PRINT16_JSON,
 | 
				
			||||||
 | 
					        DC2C_PRINT17_JSON,
 | 
				
			||||||
 | 
					        DC2C_PRINT18_JSON,
 | 
				
			||||||
 | 
					        DC2C_PRINT19_JSON,
 | 
				
			||||||
 | 
					        DC2C_PRINT20_JSON,
 | 
				
			||||||
 | 
					        DC2C_PRINT21_JSON,
 | 
				
			||||||
 | 
					        DC2C_PRINT22_JSON,
 | 
				
			||||||
 | 
					        DC2C_PRINT23_JSON,
 | 
				
			||||||
 | 
					        DC2C_PRINT24_JSON,
 | 
				
			||||||
 | 
					        DC2C_PRINT25_JSON,
 | 
				
			||||||
 | 
					        DC2C_PRINT26_JSON,
 | 
				
			||||||
 | 
					        DC2C_PRINT27_JSON,
 | 
				
			||||||
 | 
					        DC2C_PRINT28_JSON,
 | 
				
			||||||
 | 
					        DC2C_PRINT29_JSON,
 | 
				
			||||||
 | 
					        DC2C_PRINT30_JSON,
 | 
				
			||||||
 | 
					        DC2C_PRINT31_JSON,
 | 
				
			||||||
 | 
					        DC2C_PRINT32_JSON,
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					    QString sendLastVersion(UPDATE_COMPONENT comp, PSAInstalled const &psa);
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  private:
 | 
				
			||||||
 | 
					    static void printDebugMessage(int port, QString const &clientIP, int clientPort,
 | 
				
			||||||
 | 
					                                  QString const &message);
 | 
				
			||||||
 | 
					    static void printInfoMessage(int port, QString const &clientIP, int clientPort,
 | 
				
			||||||
 | 
					                                 QString const &message);
 | 
				
			||||||
 | 
					    static void printErrorMessage(int port, QString const &clientIP, int clientPort,
 | 
				
			||||||
 | 
					                                  QString const &message);
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#endif // ISMAS_CLIENT_H_INCLUDED
 | 
				
			||||||
							
								
								
									
										161
									
								
								main.cpp
									
									
									
									
									
								
							
							
						
						
									
										161
									
								
								main.cpp
									
									
									
									
									
								
							@@ -4,19 +4,42 @@
 | 
				
			|||||||
#include <QTimer>
 | 
					#include <QTimer>
 | 
				
			||||||
#include <QFileInfo>
 | 
					#include <QFileInfo>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef __linux__
 | 
				
			||||||
 | 
					#include <stdlib.h> // system()
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "message_handler.h"
 | 
					#include "message_handler.h"
 | 
				
			||||||
#include "interfaces.h"
 | 
					#include "plugins/interfaces.h"
 | 
				
			||||||
#include "DCPlugin/include/hwapi.h"
 | 
					#include "commandline_parser.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <unistd.h>
 | 
					#include <unistd.h>
 | 
				
			||||||
#include <thread>
 | 
					 | 
				
			||||||
#include <memory>
 | 
					#include <memory>
 | 
				
			||||||
#include <QSharedMemory>
 | 
					#include <QSharedMemory>
 | 
				
			||||||
#include <QRunnable>
 | 
					#include <QRunnable>
 | 
				
			||||||
#include <QThreadPool>
 | 
					#include <QThreadPool>
 | 
				
			||||||
#include <QDir>
 | 
					#include <QDir>
 | 
				
			||||||
 | 
					#include <QProcess>
 | 
				
			||||||
 | 
					#include <QCommandLineParser>
 | 
				
			||||||
 | 
					#include <QStandardPaths>
 | 
				
			||||||
 | 
					#include <QMainWindow>
 | 
				
			||||||
 | 
					#include <QSettings>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "update.h"
 | 
					#include "update.h"
 | 
				
			||||||
 | 
					#include "git/git_client.h"
 | 
				
			||||||
 | 
					#include "ismas/ismas_client.h"
 | 
				
			||||||
 | 
					#include "worker_thread.h"
 | 
				
			||||||
 | 
					#include "worker.h"
 | 
				
			||||||
 | 
					#include "mainwindow.h"
 | 
				
			||||||
 | 
					#include "utils.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <QThread>
 | 
				
			||||||
 | 
					#include <QtWidgets>
 | 
				
			||||||
 | 
					#include <QScopedPointer>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#if defined (Q_OS_UNIX) || defined (Q_OS_LINUX)
 | 
				
			||||||
 | 
					#include <unistd.h>
 | 
				
			||||||
 | 
					#include <errno.h>
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef PTU5
 | 
					#ifdef PTU5
 | 
				
			||||||
#define SERIAL_PORT "ttymxc2"
 | 
					#define SERIAL_PORT "ttymxc2"
 | 
				
			||||||
@@ -24,45 +47,117 @@
 | 
				
			|||||||
#define SERIAL_PORT "ttyUSB0"
 | 
					#define SERIAL_PORT "ttyUSB0"
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class Work : public QRunnable {
 | 
					 | 
				
			||||||
    QString m_update_ctrl_file;
 | 
					 | 
				
			||||||
    QString m_workingDir;
 | 
					 | 
				
			||||||
public:
 | 
					 | 
				
			||||||
    explicit Work(QString update_ctrl_file, QString workingDir)
 | 
					 | 
				
			||||||
      : m_update_ctrl_file(update_ctrl_file)
 | 
					 | 
				
			||||||
        , m_workingDir(workingDir) {
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    void run() {
 | 
					 | 
				
			||||||
        Update m_update(m_update_ctrl_file, m_workingDir);
 | 
					 | 
				
			||||||
        // if (m_update.doUpdate()) {
 | 
					 | 
				
			||||||
        // }
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// argv[1]: file to send to dc
 | 
					// argv[1]: file to send to dc
 | 
				
			||||||
int main(int argc, char *argv[]) {
 | 
					int main(int argc, char *argv[]) {
 | 
				
			||||||
 | 
					    QByteArray const value = qgetenv("LC_ALL");
 | 
				
			||||||
 | 
					    if (value != "C") {
 | 
				
			||||||
 | 
					        qputenv("LC_ALL", "C");
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    // qputenv("XDG_RUNTIME_DIR", "/var/run/user/0");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    openlog("ATB-UPDATE", LOG_PERROR | LOG_PID | LOG_CONS, LOG_USER);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    QApplication a(argc, argv);
 | 
					    QApplication a(argc, argv);
 | 
				
			||||||
 | 
					    QApplication::setApplicationName("ATBUpdateTool");
 | 
				
			||||||
 | 
					    QApplication::setApplicationVersion(APP_VERSION);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (!messageHandlerInstalled()) { // change internal qt-QDebug-handling
 | 
					    if (!messageHandlerInstalled()) { // change internal qt-QDebug-handling
 | 
				
			||||||
        atbInstallMessageHandler(atbDebugOutput);
 | 
					        atbInstallMessageHandler(atbDebugOutput);
 | 
				
			||||||
        setDebugLevel(QtMsgType::QtDebugMsg);
 | 
					        setDebugLevel(LOG_NOTICE);
 | 
				
			||||||
        //setDebugLevel(QtMsgType::QtDebugMsg);
 | 
					 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    QByteArray const value = qgetenv("XDG_RUNTIME_DIR");
 | 
					    CommandLineParser parser;
 | 
				
			||||||
    if (value.size() == 0) {
 | 
					    parser.process(a);
 | 
				
			||||||
        qputenv("XDG_RUNTIME_DIR", "/run/user/0");
 | 
					    parser.readSettings();
 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    QString const update_ctrl_file = "/opt/app/tools/atbupdate/update_log.csv";
 | 
					    QString repositoryUrl = parser.repositoryUrl();
 | 
				
			||||||
    QString const workingDir = (argc == 2) ? argv[1] : ".";
 | 
					    QString plugInDir = parser.plugInDir();
 | 
				
			||||||
 | 
					    QString plugInName = parser.plugInName();
 | 
				
			||||||
 | 
					    QString workingDir = parser.workingDir();
 | 
				
			||||||
 | 
					    QString iniFileName = parser.iniFileName();
 | 
				
			||||||
 | 
					    bool const dryRun = parser.dryRun();
 | 
				
			||||||
 | 
					    bool const noUpdatePsaHardware = parser.noUpdatePsaHardware();
 | 
				
			||||||
 | 
					    bool const showYoctoVersion = parser.yoctoVersion();
 | 
				
			||||||
 | 
					    bool const showYoctoInstallStatus = parser.yoctoInstallStatus();
 | 
				
			||||||
 | 
					    bool const showExtendedVersion = parser.extendedVersion();
 | 
				
			||||||
 | 
					    bool const alwaysDownloadConfig = parser.alwaysDownloadConfig();
 | 
				
			||||||
 | 
					    bool const alwaysDownloadDC = parser.alwaysDownloadDC();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    Work work(update_ctrl_file, workingDir);
 | 
					    QString const rtPath = QCoreApplication::applicationDirPath();
 | 
				
			||||||
    work.setAutoDelete(false);
 | 
					
 | 
				
			||||||
    QThreadPool *threadPool = QThreadPool::globalInstance();
 | 
					    int const machineNr = Utils::read1stLineOfFile("/mnt/system_data/machine_nr");
 | 
				
			||||||
    threadPool->start(&work);
 | 
					    int const customerNr = Utils::read1stLineOfFile("/mnt/system_data/cust_nr");
 | 
				
			||||||
    if (!threadPool->waitForDone()) {
 | 
					    int const zoneNr = Utils::read1stLineOfFile("/mnt/system_data/zone_nr");
 | 
				
			||||||
        return -1;
 | 
					    QString const branchName = (zoneNr != 0)
 | 
				
			||||||
    }
 | 
					            ? QString("zg1/zone%1").arg(zoneNr) : "master";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    qInfo() << "pwd ......................" << rtPath;
 | 
				
			||||||
 | 
					    qInfo() << "repositoryUrl ............" << repositoryUrl;
 | 
				
			||||||
 | 
					    qInfo() << "plugInDir ................" << plugInDir;
 | 
				
			||||||
 | 
					    qInfo() << "plugInName ..............." << plugInName;
 | 
				
			||||||
 | 
					    qInfo() << "workingDir ..............." << workingDir;
 | 
				
			||||||
 | 
					    qInfo() << "dryRun ..................." << dryRun;
 | 
				
			||||||
 | 
					    qInfo() << "noUpdatePsaHardware ......" << noUpdatePsaHardware;
 | 
				
			||||||
 | 
					    qInfo() << "alwaysDownloadConfig ....." << alwaysDownloadConfig;
 | 
				
			||||||
 | 
					    qInfo() << "alwaysDownloadDC ........." << alwaysDownloadDC;
 | 
				
			||||||
 | 
					    qInfo() << "showYoctoVersion ........." << showYoctoVersion;
 | 
				
			||||||
 | 
					    qInfo() << "showYoctoInstallStatus ..." << showYoctoInstallStatus;
 | 
				
			||||||
 | 
					    qInfo() << "showExtendedVersion ......" << showExtendedVersion;
 | 
				
			||||||
 | 
					    qInfo() << "iniFileName .............." << iniFileName;
 | 
				
			||||||
 | 
					    qInfo() << "extended-version ........." << APP_EXTENDED_VERSION;
 | 
				
			||||||
 | 
					    qInfo() << "machineNr ................" << machineNr;
 | 
				
			||||||
 | 
					    qInfo() << "customerNr ..............." << customerNr;
 | 
				
			||||||
 | 
					    qInfo() << "zoneNr ..................." << zoneNr;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (showExtendedVersion) {
 | 
				
			||||||
 | 
					        printf(APP_EXTENDED_VERSION"\n");
 | 
				
			||||||
        return 0;
 | 
					        return 0;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					    if (showYoctoVersion) {
 | 
				
			||||||
 | 
					        printf("%s\n", Worker::getATBUpdateToolYoctoVersion().toStdString().c_str());
 | 
				
			||||||
 | 
					        return 0;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    if (showYoctoInstallStatus) {
 | 
				
			||||||
 | 
					        printf("%s\n", Worker::getATBUpdateToolYoctoInstallationStatus().toStdString().c_str());
 | 
				
			||||||
 | 
					        return 0;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    QThread::currentThread()->setObjectName("main thread");
 | 
				
			||||||
 | 
					    qInfo() << "Main thread" << QThread::currentThreadId();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (!QDir(plugInDir).exists()) {
 | 
				
			||||||
 | 
					        qCritical() << plugInDir
 | 
				
			||||||
 | 
					                    << "does not exists, but has to contain dc-library";
 | 
				
			||||||
 | 
					        exit(-1);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // before loading the library, delete all possible shared memory segments
 | 
				
			||||||
 | 
					#if defined Q_OS_LINUX || defined Q_OS_UNIX
 | 
				
			||||||
 | 
					    // system("rm -rf /tmp/qipc*");
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
					#error "Only tested under UNIX/LINUX"
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    Worker worker(customerNr,
 | 
				
			||||||
 | 
					                  machineNr,
 | 
				
			||||||
 | 
					                  zoneNr,
 | 
				
			||||||
 | 
					                  repositoryUrl,
 | 
				
			||||||
 | 
					                  branchName,
 | 
				
			||||||
 | 
					                  plugInDir,
 | 
				
			||||||
 | 
					                  plugInName,
 | 
				
			||||||
 | 
					                  workingDir,
 | 
				
			||||||
 | 
					                  noUpdatePsaHardware,
 | 
				
			||||||
 | 
					                  alwaysDownloadConfig,
 | 
				
			||||||
 | 
					                  alwaysDownloadDC,
 | 
				
			||||||
 | 
					                  dryRun);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    MainWindow mw(&worker);
 | 
				
			||||||
 | 
					    worker.setMainWindow(&mw);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    mw.setWindowFlags(Qt::Window | Qt::FramelessWindowHint);
 | 
				
			||||||
 | 
					    mw.showFullScreen();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return a.exec();
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										81
									
								
								main.cpp.bck
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										81
									
								
								main.cpp.bck
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,81 @@
 | 
				
			|||||||
 | 
					#include <QCoreApplication>
 | 
				
			||||||
 | 
					#include <QApplication>
 | 
				
			||||||
 | 
					#include <QDebug>
 | 
				
			||||||
 | 
					#include <QTimer>
 | 
				
			||||||
 | 
					#include <QFileInfo>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "message_handler.h"
 | 
				
			||||||
 | 
					#include "plugins/interfaces.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "DCPlugin/include/hwapi.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <unistd.h>
 | 
				
			||||||
 | 
					#include <thread>
 | 
				
			||||||
 | 
					#include <memory>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static void updateBinary(std::unique_ptr<hwinf> hw,     // update d2dc*.bin
 | 
				
			||||||
 | 
					                         char const *fileToSendToDC,
 | 
				
			||||||
 | 
					                         char const *baudrate,
 | 
				
			||||||
 | 
					                         char const *serialInterface) {
 | 
				
			||||||
 | 
					    for (int i=0; i < 1;++i) {
 | 
				
			||||||
 | 
					        hw->dc_updateDC(fileToSendToDC, baudrate, serialInterface);
 | 
				
			||||||
 | 
					        std::this_thread::sleep_for(std::chrono::milliseconds(3000));
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    QCoreApplication::quit();
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static void updatePrinterConf(std::unique_ptr<hwinf> hw, // update printer-file
 | 
				
			||||||
 | 
					                              char const *fileToSendToDC,
 | 
				
			||||||
 | 
					                              char const *baudrate,
 | 
				
			||||||
 | 
					                              char const *serialInterface) {
 | 
				
			||||||
 | 
					    for (int i=0; i < 1;++i) {
 | 
				
			||||||
 | 
					        hw->dc_updateDC(fileToSendToDC, baudrate, serialInterface);
 | 
				
			||||||
 | 
					        std::this_thread::sleep_for(std::chrono::milliseconds(3000));
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    QCoreApplication::quit();
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int main(int argc, char *argv[]) {
 | 
				
			||||||
 | 
					    QApplication a(argc, argv);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (!messageHandlerInstalled()) { // change internal qt-QDebug-handling
 | 
				
			||||||
 | 
					        atbInstallMessageHandler(atbDebugOutput);
 | 
				
			||||||
 | 
					        setDebugLevel(QtMsgType::QtDebugMsg);
 | 
				
			||||||
 | 
					        //setDebugLevel(QtMsgType::QtDebugMsg);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (argc > 2) {
 | 
				
			||||||
 | 
					        qCritical() << "Usage: " << argv[0] << "<file to send to dc>";
 | 
				
			||||||
 | 
					        return -1;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    std::unique_ptr<hwinf> hw(new hwapi());
 | 
				
			||||||
 | 
					    QFileInfo fileInfo(argv[1]);
 | 
				
			||||||
 | 
					    QString fname(fileInfo.fileName());
 | 
				
			||||||
 | 
					    int ret = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (fname.startsWith("dc") && fname.endsWith(".bin")) {
 | 
				
			||||||
 | 
					#ifdef PTU5
 | 
				
			||||||
 | 
					        std::thread t(updateBinary, std::move(hw),
 | 
				
			||||||
 | 
					                      fname.toStdString().c_str(), "115200", "ttymxc2");
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
					        std::thread t(updateBinary, std::move(hw),
 | 
				
			||||||
 | 
					                      fname.toStdString().c_str(), "115200", "ttyUSB0");
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					        ret = a.exec();
 | 
				
			||||||
 | 
					        t.join();
 | 
				
			||||||
 | 
					    } else
 | 
				
			||||||
 | 
					    if (fname.startsWith("DC") && fname.endsWith(".json")) {
 | 
				
			||||||
 | 
					#ifdef PTU5
 | 
				
			||||||
 | 
					        std::thread t(updatePrinterConf, std::move(hw),
 | 
				
			||||||
 | 
					                      fname.toStdString().c_str(), "115200", "ttymxc2");
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
					        std::thread t(updatePrinterConf, std::move(hw),
 | 
				
			||||||
 | 
					                      fname.toStdString().c_str(), "115200", "ttyUSB0");
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					        ret = a.exec();
 | 
				
			||||||
 | 
					        t.join();
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return ret;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										54
									
								
								main.cpp.bck2
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										54
									
								
								main.cpp.bck2
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,54 @@
 | 
				
			|||||||
 | 
					#include <QCoreApplication>
 | 
				
			||||||
 | 
					#include <QApplication>
 | 
				
			||||||
 | 
					#include <QDebug>
 | 
				
			||||||
 | 
					#include <QTimer>
 | 
				
			||||||
 | 
					#include <QFileInfo>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "message_handler.h"
 | 
				
			||||||
 | 
					#include "interfaces.h"
 | 
				
			||||||
 | 
					#include "DCPlugin/include/hwapi.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <unistd.h>
 | 
				
			||||||
 | 
					#include <thread>
 | 
				
			||||||
 | 
					#include <memory>
 | 
				
			||||||
 | 
					#include <QSharedMemory>
 | 
				
			||||||
 | 
					#include <QRunnable>
 | 
				
			||||||
 | 
					#include <QThreadPool>
 | 
				
			||||||
 | 
					#include <QDir>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "update.h"
 | 
				
			||||||
 | 
					#include "worker_thread.h"
 | 
				
			||||||
 | 
					#include "worker.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef PTU5
 | 
				
			||||||
 | 
					#define SERIAL_PORT "ttymxc2"
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
					#define SERIAL_PORT "ttyUSB0"
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// argv[1]: file to send to dc
 | 
				
			||||||
 | 
					int main(int argc, char *argv[]) {
 | 
				
			||||||
 | 
					    QApplication a(argc, argv);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (!messageHandlerInstalled()) { // change internal qt-QDebug-handling
 | 
				
			||||||
 | 
					        atbInstallMessageHandler(atbDebugOutput);
 | 
				
			||||||
 | 
					        setDebugLevel(QtMsgType::QtDebugMsg);
 | 
				
			||||||
 | 
					        //setDebugLevel(QtMsgType::QtDebugMsg);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    QByteArray const value = qgetenv("XDG_RUNTIME_DIR");
 | 
				
			||||||
 | 
					    if (value.size() == 0) {
 | 
				
			||||||
 | 
					        qputenv("XDG_RUNTIME_DIR", "/run/user/0");
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    QString const update_ctrl_file = "/opt/app/tools/atbupdate/update_log.csv";
 | 
				
			||||||
 | 
					    QString const workingDir = (argc == 2) ? argv[1] : ".";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    Worker worker(update_ctrl_file, workingDir);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    qCritical() << "starting main event loop";
 | 
				
			||||||
 | 
					    int ret = a.exec();
 | 
				
			||||||
 | 
					    qCritical() << "stopping main event loop" << ret;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return ret;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										62
									
								
								main.cpp.bck3
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										62
									
								
								main.cpp.bck3
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,62 @@
 | 
				
			|||||||
 | 
					#include <QCoreApplication>
 | 
				
			||||||
 | 
					#include <QApplication>
 | 
				
			||||||
 | 
					#include <QDebug>
 | 
				
			||||||
 | 
					#include <QTimer>
 | 
				
			||||||
 | 
					#include <QFileInfo>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "message_handler.h"
 | 
				
			||||||
 | 
					#include "plugins/interfaces.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <unistd.h>
 | 
				
			||||||
 | 
					#include <thread>
 | 
				
			||||||
 | 
					#include <memory>
 | 
				
			||||||
 | 
					#include <QSharedMemory>
 | 
				
			||||||
 | 
					#include <QRunnable>
 | 
				
			||||||
 | 
					#include <QThreadPool>
 | 
				
			||||||
 | 
					#include <QDir>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "update.h"
 | 
				
			||||||
 | 
					#include "worker_thread.h"
 | 
				
			||||||
 | 
					#include "worker.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <thread>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef PTU5
 | 
				
			||||||
 | 
					#define SERIAL_PORT "ttymxc2"
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
					#define SERIAL_PORT "ttyUSB0"
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static void doWork(QString update_ctrl_file, QString workingDir) {
 | 
				
			||||||
 | 
					    std::this_thread::sleep_for(std::chrono::milliseconds(2000));
 | 
				
			||||||
 | 
					    Update update(update_ctrl_file, workingDir);
 | 
				
			||||||
 | 
					    update.doUpdate();
 | 
				
			||||||
 | 
					    std::this_thread::sleep_for(std::chrono::milliseconds(2000));
 | 
				
			||||||
 | 
					    QCoreApplication::quit();
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// argv[1]: file to send to dc
 | 
				
			||||||
 | 
					int main(int argc, char *argv[]) {
 | 
				
			||||||
 | 
					    QApplication a(argc, argv);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (!messageHandlerInstalled()) { // change internal qt-QDebug-handling
 | 
				
			||||||
 | 
					        atbInstallMessageHandler(atbDebugOutput);
 | 
				
			||||||
 | 
					        setDebugLevel(QtMsgType::QtDebugMsg);
 | 
				
			||||||
 | 
					        //setDebugLevel(QtMsgType::QtDebugMsg);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    QByteArray const value = qgetenv("XDG_RUNTIME_DIR");
 | 
				
			||||||
 | 
					    if (value.size() == 0) {
 | 
				
			||||||
 | 
					        qputenv("XDG_RUNTIME_DIR", "/run/user/0");
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // QString const update_ctrl_file = "/opt/app/tools/atbupdate/update_log.csv";
 | 
				
			||||||
 | 
					    // QString const workingDir = (argc == 2) ? argv[1] : ".";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // std::thread t(doWork, update_ctrl_file, workingDir);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    int ret = a.exec();
 | 
				
			||||||
 | 
					    // t.join();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return ret;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										308
									
								
								mainwindow.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										308
									
								
								mainwindow.cpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,308 @@
 | 
				
			|||||||
 | 
					#include "mainwindow.h"
 | 
				
			||||||
 | 
					#include "ui_mainwindow.h"
 | 
				
			||||||
 | 
					#include "worker.h"
 | 
				
			||||||
 | 
					#include "utils.h"
 | 
				
			||||||
 | 
					#include "progress_event.h"
 | 
				
			||||||
 | 
					#include "update_dc_event.h"
 | 
				
			||||||
 | 
					#include "plugins/interfaces.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <QDateTime>
 | 
				
			||||||
 | 
					#include <QMessageBox>
 | 
				
			||||||
 | 
					#include <QDebug>
 | 
				
			||||||
 | 
					#include <QScrollBar>
 | 
				
			||||||
 | 
					#include <QEvent>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					MainWindow::MainWindow(Worker *worker, QWidget *parent)
 | 
				
			||||||
 | 
					    : QMainWindow(parent)
 | 
				
			||||||
 | 
					    , ui(new Ui::MainWindow)
 | 
				
			||||||
 | 
					    , m_worker(worker)
 | 
				
			||||||
 | 
					    , m_width(70)
 | 
				
			||||||
 | 
					    , m_progressRunning(false)
 | 
				
			||||||
 | 
					    , m_updateStep(UpdateDcEvent::UpdateStep::NONE) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    this->setStatusBar(new QStatusBar(this));
 | 
				
			||||||
 | 
					    QFont f;
 | 
				
			||||||
 | 
					    f.setStyleHint(QFont::Monospace);
 | 
				
			||||||
 | 
					    f.setWeight(QFont::Bold);
 | 
				
			||||||
 | 
					    f.setFamily("Misc Fixed");
 | 
				
			||||||
 | 
					    f.setPixelSize(12);
 | 
				
			||||||
 | 
					    this->statusBar()->setFont(f);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    ui->setupUi(this);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    ui->updateProgress->setRange(0, 100);
 | 
				
			||||||
 | 
					    ui->updateProgress->reset();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    QStringList lst;
 | 
				
			||||||
 | 
					    QString start = QDateTime::currentDateTime().toString(Qt::ISODate);
 | 
				
			||||||
 | 
					    lst << QString("Start: ") + start.leftJustified(m_width-10);
 | 
				
			||||||
 | 
					    lst << QString("").leftJustified(m_width-3, '=');
 | 
				
			||||||
 | 
					    lst << QString("Update tool version: %1 - %2 %3").arg(APP_VERSION).arg(APP_BUILD_DATE).arg(APP_BUILD_TIME).leftJustified(m_width-3);
 | 
				
			||||||
 | 
					    lst << QString("Machine number     : %1 ").arg(m_worker->machineNr()).leftJustified(m_width-3);
 | 
				
			||||||
 | 
					    lst << QString("Customer number    : %1 ").arg(m_worker->customerNr()).leftJustified(m_width-3);
 | 
				
			||||||
 | 
					    lst << QString("Zone number        : %1 (%2)").arg(m_worker->zoneNr()).arg(Utils::zoneName(m_worker->zoneNr())).leftJustified(m_width-3);
 | 
				
			||||||
 | 
					    lst << QString("APISM version      : %1").arg(m_worker->apismVersion()).leftJustified(m_width-3);
 | 
				
			||||||
 | 
					    lst << QString("").leftJustified(m_width-3, '=');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    ui->updateStatus->setText(lst.join('\n'));
 | 
				
			||||||
 | 
					    ui->updateStatus->setEnabled(true);
 | 
				
			||||||
 | 
					    // ui->updateStatus->installEventFilter(this);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    m_startTimer = new QTimer(this);
 | 
				
			||||||
 | 
					    connect(m_startTimer, SIGNAL(timeout()), m_worker, SLOT(start()));
 | 
				
			||||||
 | 
					    m_startTimer->setSingleShot(true);
 | 
				
			||||||
 | 
					    m_startTimer->start(1000);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    m_exitTimer = new QTimer(this);
 | 
				
			||||||
 | 
					    connect(m_exitTimer, SIGNAL(timeout()), ui->exit, SLOT(click()));
 | 
				
			||||||
 | 
					    m_exitTimer->setSingleShot(true);
 | 
				
			||||||
 | 
					    m_exitTimer->start(1800 * 1000);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    connect(ui->exit, SIGNAL(clicked()),this,SLOT(onQuit()));
 | 
				
			||||||
 | 
					    connect(m_worker, SIGNAL(disableExit()),this,SLOT(onDisableExit()));
 | 
				
			||||||
 | 
					    connect(m_worker, SIGNAL(enableExit()),this,SLOT(onEnableExit()));
 | 
				
			||||||
 | 
					    connect(m_worker, SIGNAL(stopStartTimer()),this,SLOT(onStopStartTimer()));
 | 
				
			||||||
 | 
					    connect(m_worker, SIGNAL(restartExitTimer()),this,SLOT(onRestartExitTimer()));
 | 
				
			||||||
 | 
					    connect(m_worker, SIGNAL(appendText(QString,QString)),this,SLOT(onAppendText(QString,QString)));
 | 
				
			||||||
 | 
					    connect(m_worker, SIGNAL(showErrorMessage(QString,QString)),this, SLOT(onShowErrorMessage(QString,QString)));
 | 
				
			||||||
 | 
					    connect(m_worker, SIGNAL(showStatusMessage(QString,QString)),this, SLOT(onShowStatusMessage(QString,QString)));
 | 
				
			||||||
 | 
					    connect(m_worker, SIGNAL(showErrorMessage(QStringList)),this, SLOT(onShowErrorMessage(QStringList)));
 | 
				
			||||||
 | 
					    connect(m_worker, SIGNAL(showStatusMessage(QString,QString)),this, SLOT(onShowStatusMessage(QString,QString)));
 | 
				
			||||||
 | 
					    connect(m_worker, SIGNAL(replaceLast(QString,QString)),this,SLOT(onReplaceLast(QString,QString)));
 | 
				
			||||||
 | 
					    connect(m_worker, SIGNAL(replaceLast(QStringList,QString)),this, SLOT(onReplaceLast(QStringList,QString)));
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					MainWindow::~MainWindow() {
 | 
				
			||||||
 | 
					    delete m_startTimer;
 | 
				
			||||||
 | 
					    delete m_exitTimer;
 | 
				
			||||||
 | 
					    delete ui;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void MainWindow::customEvent(QEvent *event) {
 | 
				
			||||||
 | 
					    if (event->type() == ProgressEvent::type()) {
 | 
				
			||||||
 | 
					        ProgressEvent *pevent = (ProgressEvent *)event;
 | 
				
			||||||
 | 
					        int const progress = pevent->progressPercent();
 | 
				
			||||||
 | 
					        QObject const *sender = pevent->sender();
 | 
				
			||||||
 | 
					        if (sender == this) {
 | 
				
			||||||
 | 
					            switch(progress) {
 | 
				
			||||||
 | 
					            case 0: {
 | 
				
			||||||
 | 
					                ui->updateProgress->reset();
 | 
				
			||||||
 | 
					            } break;
 | 
				
			||||||
 | 
					            case START_PROGRESS_LOOP: {
 | 
				
			||||||
 | 
					                m_progressRunning = true;
 | 
				
			||||||
 | 
					                ui->updateProgress->reset();
 | 
				
			||||||
 | 
					                // m_progressValue = 10;
 | 
				
			||||||
 | 
					                QApplication::postEvent(this, new ProgressEvent(this, 1));
 | 
				
			||||||
 | 
					            } break;
 | 
				
			||||||
 | 
					            case STOP_PROGRESS_LOOP: {
 | 
				
			||||||
 | 
					                m_progressRunning = false;
 | 
				
			||||||
 | 
					                // m_progressValue -= 10;
 | 
				
			||||||
 | 
					                // m_worker->setProgress(m_progressValue/10);
 | 
				
			||||||
 | 
					            } break;
 | 
				
			||||||
 | 
					            default: {
 | 
				
			||||||
 | 
					                if (m_progressRunning) {
 | 
				
			||||||
 | 
					                    // m_progressValue = progress;
 | 
				
			||||||
 | 
					                    ui->updateProgress->setValue(progress);
 | 
				
			||||||
 | 
					                    // ueberpruefen: hauptfenster schickt sich selber ein event
 | 
				
			||||||
 | 
					                    // QApplication::postEvent(this, new ProgressEvent(this, progress));
 | 
				
			||||||
 | 
					                    // QThread::msleep(500);
 | 
				
			||||||
 | 
					                }}
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        } else
 | 
				
			||||||
 | 
					        if (sender == m_worker) {
 | 
				
			||||||
 | 
					            switch(progress) {
 | 
				
			||||||
 | 
					            case 0: {
 | 
				
			||||||
 | 
					                ui->updateProgress->reset();
 | 
				
			||||||
 | 
					            } break;
 | 
				
			||||||
 | 
					            case START_PROGRESS_LOOP: {
 | 
				
			||||||
 | 
					                QApplication::postEvent(this, new ProgressEvent(this, START_PROGRESS_LOOP));
 | 
				
			||||||
 | 
					            } break;
 | 
				
			||||||
 | 
					            case STOP_PROGRESS_LOOP: {
 | 
				
			||||||
 | 
					                QApplication::postEvent(this, new ProgressEvent(this, STOP_PROGRESS_LOOP));
 | 
				
			||||||
 | 
					            } break;
 | 
				
			||||||
 | 
					            default:{
 | 
				
			||||||
 | 
					                ui->updateProgress->setValue(progress);
 | 
				
			||||||
 | 
					            }}
 | 
				
			||||||
 | 
					        } else {
 | 
				
			||||||
 | 
					            qCritical() << "!!! UNKNOWN SENDER !!!";
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    QThread::yieldCurrentThread();
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void MainWindow::onStopStartTimer() {
 | 
				
			||||||
 | 
					    m_startTimer->stop();
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void MainWindow::onDisableExit() {
 | 
				
			||||||
 | 
					   ui->exit->setEnabled(false);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void MainWindow::onEnableExit() {
 | 
				
			||||||
 | 
					   ui->exit->setEnabled(true);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void MainWindow::onRestartExitTimer() {
 | 
				
			||||||
 | 
					    m_exitTimer->stop();
 | 
				
			||||||
 | 
					    m_exitTimer->start(5 * 1000);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    scrollDownTextEdit();
 | 
				
			||||||
 | 
					    ui->updateStatus->setEnabled(false);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void MainWindow::onQuit() {
 | 
				
			||||||
 | 
					    m_exitTimer->stop();
 | 
				
			||||||
 | 
					    int errorCode = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    qCritical()
 | 
				
			||||||
 | 
					        << QString("ON QUIT: CURRENT STEP %1")
 | 
				
			||||||
 | 
					            .arg(m_worker->getSmap()[m_worker->currentStep()]);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // TODO: replace SEND_LAST_VERSION with UPDATE_SUCCEEDED
 | 
				
			||||||
 | 
					    if (m_worker->currentStep() != Worker::UPDATE_STEP::SEND_LAST_VERSION) {
 | 
				
			||||||
 | 
					        errorCode = -1;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    qCritical() << QString("ON QUIT: EXIT CODE %1").arg(errorCode);
 | 
				
			||||||
 | 
					    qApp->exit(errorCode);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void MainWindow::scrollDownTextEdit() {
 | 
				
			||||||
 | 
					    // Utils::printInfoMsg(QString("SCROLL-DOWN-TEXT_EDIT CALLED AT ")
 | 
				
			||||||
 | 
					    //    + QDateTime::currentDateTime().toString(Qt::ISODateWithMs));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    ui->updateStatus->setEnabled(true);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    QTextCursor tmpCursor = ui->updateStatus->textCursor();
 | 
				
			||||||
 | 
					    tmpCursor.movePosition(QTextCursor::End);
 | 
				
			||||||
 | 
					    ui->updateStatus->setTextCursor(tmpCursor);
 | 
				
			||||||
 | 
					    ui->updateStatus->ensureCursorVisible();
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void MainWindow::onAppendText(QString text, QString suffix) {
 | 
				
			||||||
 | 
					    // Utils::printInfoMsg(QString("ON APPEND CALLED AT ")
 | 
				
			||||||
 | 
					    //    + QDateTime::currentDateTime().toString(Qt::ISODateWithMs));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    QString editText = ui->updateStatus->toPlainText();
 | 
				
			||||||
 | 
					    scrollDownTextEdit();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (!suffix.isNull() && suffix.size() > 0) {
 | 
				
			||||||
 | 
					        //qInfo() << "TEXT" << text << "SUFFIX" << suffix;
 | 
				
			||||||
 | 
					        if (suffix == Worker::UPDATE_STEP_SUCCESS || suffix == Worker::UPDATE_STEP_FAIL) {
 | 
				
			||||||
 | 
					            ui->updateStatus->insertPlainText(QString("\n").leftJustified(m_width-3, '=') + " ");
 | 
				
			||||||
 | 
					            // editText += QString("\n").leftJustified(m_width-3, '=');
 | 
				
			||||||
 | 
					            // editText += " ";
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        QString const &add = (QString("\n") + text).leftJustified(m_width - (2 + suffix.size())) + suffix;
 | 
				
			||||||
 | 
					        ui->updateStatus->insertPlainText(add);
 | 
				
			||||||
 | 
					        // editText += add;
 | 
				
			||||||
 | 
					    } else {
 | 
				
			||||||
 | 
					        QString const &add = text.leftJustified(m_width-9);
 | 
				
			||||||
 | 
					        ui->updateStatus->insertPlainText(add);
 | 
				
			||||||
 | 
					        //editText += add;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // debug
 | 
				
			||||||
 | 
					    // QString editText = ui->updateStatus->toPlainText();
 | 
				
			||||||
 | 
					    // Utils::printLineEditInfo(editText.split('\n', QString::SplitBehavior::SkipEmptyParts));
 | 
				
			||||||
 | 
					    // ui->updateStatus->setText(editText.trimmed());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    scrollDownTextEdit();
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void MainWindow::onReplaceLast(QStringList newTextLines, QString suffix) {
 | 
				
			||||||
 | 
					    // Utils::printInfoMsg(QString("ON REPLACE LAST (LIST) CALLED AT ")
 | 
				
			||||||
 | 
					    //    + QDateTime::currentDateTime().toString(Qt::ISODateWithMs));
 | 
				
			||||||
 | 
					    int const s = newTextLines.size();
 | 
				
			||||||
 | 
					    if (s > 0) {
 | 
				
			||||||
 | 
					        QString editText = ui->updateStatus->toPlainText();
 | 
				
			||||||
 | 
					        QStringList lines = editText.split('\n', QString::SplitBehavior::SkipEmptyParts);
 | 
				
			||||||
 | 
					        QString newText;
 | 
				
			||||||
 | 
					        if (lines.size() >= s) {
 | 
				
			||||||
 | 
					            for (int i = 0; i < s; ++i) {
 | 
				
			||||||
 | 
					                lines.removeLast();
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            if (lines.size() > 0) {
 | 
				
			||||||
 | 
					                newText = lines.join('\n');
 | 
				
			||||||
 | 
					                newText += '\n';
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            QStringList newLines;
 | 
				
			||||||
 | 
					            for (int i = 0; i < s; ++i) {
 | 
				
			||||||
 | 
					                if (i == 0 && !suffix.isNull() && suffix.size() > 0 && suffix != "\n") {
 | 
				
			||||||
 | 
					                    newLines += Utils::rstrip(newTextLines.at(i).leftJustified(m_width-10) + suffix);
 | 
				
			||||||
 | 
					                } else {
 | 
				
			||||||
 | 
					                    newLines += Utils::rstrip(newTextLines.at(i).leftJustified(m_width-10));
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            lines += newLines;
 | 
				
			||||||
 | 
					            newText += newLines.join(' ');
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        ui->updateStatus->setText(newText);
 | 
				
			||||||
 | 
					        Utils::printLineEditInfo(lines);
 | 
				
			||||||
 | 
					        scrollDownTextEdit();
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void MainWindow::onReplaceLast(QString text, QString suffix) {
 | 
				
			||||||
 | 
					    // Utils::printInfoMsg(QString("ON REPLACE LAST (TEXT) CALLED AT ")
 | 
				
			||||||
 | 
					    //    + QDateTime::currentDateTime().toString(Qt::ISODateWithMs));
 | 
				
			||||||
 | 
					    QString editText = ui->updateStatus->toPlainText();
 | 
				
			||||||
 | 
					    QStringList lines = editText.split('\n', QString::SplitBehavior::SkipEmptyParts);
 | 
				
			||||||
 | 
					    if (lines.size() > 0) {
 | 
				
			||||||
 | 
					        // removing the last line is really meant for refreshing the last line
 | 
				
			||||||
 | 
					        // with a string very similar than the original one, typically only
 | 
				
			||||||
 | 
					        // followed by a suffix.
 | 
				
			||||||
 | 
					        if (lines.last().contains(text)) {
 | 
				
			||||||
 | 
					            lines.removeLast();
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        if (!suffix.isNull() && suffix.size() > 0 && suffix != "\n") {
 | 
				
			||||||
 | 
					            QString const add = text.leftJustified(m_width-10) + suffix;
 | 
				
			||||||
 | 
					            if (!add.isEmpty()) {
 | 
				
			||||||
 | 
					                lines += text.leftJustified(m_width-10) + suffix;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        } else {
 | 
				
			||||||
 | 
					            QString const add = text.leftJustified(m_width-10);
 | 
				
			||||||
 | 
					            if (!add.isEmpty()) {
 | 
				
			||||||
 | 
					                lines += text.leftJustified(m_width-10);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    Utils::printLineEditInfo(lines);
 | 
				
			||||||
 | 
					    ui->updateStatus->setText(lines.join('\n').trimmed());
 | 
				
			||||||
 | 
					    scrollDownTextEdit();
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void MainWindow::onShowMessage(QString title, QString text) {
 | 
				
			||||||
 | 
					    this->statusBar()->clearMessage();
 | 
				
			||||||
 | 
					    this->statusBar()->showMessage( // timeout: 10000
 | 
				
			||||||
 | 
					        QString(title + " " + text).leftJustified(80, ' '), 10000);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void MainWindow::onShowErrorMessage(QString title, QString text) {
 | 
				
			||||||
 | 
					    onShowMessage(title, text);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void MainWindow::onShowStatusMessage(QString title, QString text) {
 | 
				
			||||||
 | 
					    onShowMessage(title, text);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void MainWindow::onShowErrorMessage(QStringList lst) {
 | 
				
			||||||
 | 
					    if (lst.size() >= 2) {
 | 
				
			||||||
 | 
					        onShowMessage(lst.at(0), lst.at(1));
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    if (lst.size() == 1) {
 | 
				
			||||||
 | 
					        onShowMessage(lst.at(0), "");
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void MainWindow::onShowStatusMessage(QStringList lst) {
 | 
				
			||||||
 | 
					    if (lst.size() >= 2) {
 | 
				
			||||||
 | 
					        onShowMessage(lst.at(0), lst.at(1));
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    if (lst.size() == 1) {
 | 
				
			||||||
 | 
					        onShowMessage(lst.at(0), "");
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										77
									
								
								mainwindow.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										77
									
								
								mainwindow.h
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,77 @@
 | 
				
			|||||||
 | 
					#ifndef MAINWINDOW_H
 | 
				
			||||||
 | 
					#define MAINWINDOW_H
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <QMainWindow>
 | 
				
			||||||
 | 
					#include <QTimer>
 | 
				
			||||||
 | 
					#include <QStatusBar>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					QT_BEGIN_NAMESPACE
 | 
				
			||||||
 | 
					namespace Ui { class MainWindow; }
 | 
				
			||||||
 | 
					QT_END_NAMESPACE
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "worker.h"
 | 
				
			||||||
 | 
					#include "update.h"
 | 
				
			||||||
 | 
					#include "update_dc_event.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define EMERGENCY_LEAVE_BL 0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class hwinf;
 | 
				
			||||||
 | 
					class MainWindow : public QMainWindow {
 | 
				
			||||||
 | 
					    Q_OBJECT
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					protected:
 | 
				
			||||||
 | 
					    void customEvent(QEvent *event) override;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					public:
 | 
				
			||||||
 | 
					    MainWindow(Worker *worker, QWidget *parent = nullptr);
 | 
				
			||||||
 | 
					    ~MainWindow();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    static const int START_PROGRESS_LOOP = -1;
 | 
				
			||||||
 | 
					    static const int STOP_PROGRESS_LOOP = -2;
 | 
				
			||||||
 | 
					    static const int BL_START_COUNT = 5;
 | 
				
			||||||
 | 
					    static const int BL_CHECK_COUNT = 5;
 | 
				
			||||||
 | 
					    static const int BL_IS_UP_COUNT = 5;
 | 
				
			||||||
 | 
					    static const int BL_STOP_COUNT = 5;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    UpdateDcEvent::UpdateStep updateStep() const { return m_updateStep; }
 | 
				
			||||||
 | 
					    void setUpdateStep(UpdateDcEvent::UpdateStep updateStep) { m_updateStep = updateStep; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					public slots:
 | 
				
			||||||
 | 
					    void onAppendText(QString, QString suffix = "");
 | 
				
			||||||
 | 
					    void onReplaceLast(QStringList, QString suffix = "");
 | 
				
			||||||
 | 
					    void onReplaceLast(QString, QString suffix = "");
 | 
				
			||||||
 | 
					    void onShowErrorMessage(QString, QString);
 | 
				
			||||||
 | 
					    void onShowStatusMessage(QString, QString);
 | 
				
			||||||
 | 
					    void onShowErrorMessage(QStringList);
 | 
				
			||||||
 | 
					    void onShowStatusMessage(QStringList);
 | 
				
			||||||
 | 
					    void onStopStartTimer();
 | 
				
			||||||
 | 
					    void onRestartExitTimer();
 | 
				
			||||||
 | 
					    void onEnableExit();
 | 
				
			||||||
 | 
					    void onDisableExit();
 | 
				
			||||||
 | 
					#if EMERGENCY_LEAVE_BL==1
 | 
				
			||||||
 | 
					    void emergencyLeaveBL();
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					signals:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#if EMERGENCY_LEAVE_BL==1
 | 
				
			||||||
 | 
					    void leaveBL();
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					private slots:
 | 
				
			||||||
 | 
					    void onQuit();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					private:
 | 
				
			||||||
 | 
					    void scrollDownTextEdit();
 | 
				
			||||||
 | 
					    void onShowMessage(QString, QString);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    Ui::MainWindow *ui;
 | 
				
			||||||
 | 
					    Worker *m_worker;
 | 
				
			||||||
 | 
					    int const m_width;
 | 
				
			||||||
 | 
					    QTimer *m_startTimer;
 | 
				
			||||||
 | 
					    QTimer *m_exitTimer;
 | 
				
			||||||
 | 
					    bool m_progressRunning;
 | 
				
			||||||
 | 
					    //int m_progressValue;
 | 
				
			||||||
 | 
					    UpdateDcEvent::UpdateStep m_updateStep;
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					#endif // MAINWINDOW_H
 | 
				
			||||||
							
								
								
									
										75
									
								
								mainwindow.ui
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										75
									
								
								mainwindow.ui
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,75 @@
 | 
				
			|||||||
 | 
					<?xml version="1.0" encoding="UTF-8"?>
 | 
				
			||||||
 | 
					<ui version="4.0">
 | 
				
			||||||
 | 
					 <class>MainWindow</class>
 | 
				
			||||||
 | 
					 <widget class="QMainWindow" name="MainWindow">
 | 
				
			||||||
 | 
					  <property name="geometry">
 | 
				
			||||||
 | 
					   <rect>
 | 
				
			||||||
 | 
					    <x>0</x>
 | 
				
			||||||
 | 
					    <y>0</y>
 | 
				
			||||||
 | 
					    <width>800</width>
 | 
				
			||||||
 | 
					    <height>480</height>
 | 
				
			||||||
 | 
					   </rect>
 | 
				
			||||||
 | 
					  </property>
 | 
				
			||||||
 | 
					  <property name="font">
 | 
				
			||||||
 | 
					   <font>
 | 
				
			||||||
 | 
					    <family>Source Code Pro</family>
 | 
				
			||||||
 | 
					   </font>
 | 
				
			||||||
 | 
					  </property>
 | 
				
			||||||
 | 
					  <property name="windowTitle">
 | 
				
			||||||
 | 
					   <string>MainWindow</string>
 | 
				
			||||||
 | 
					  </property>
 | 
				
			||||||
 | 
					  <widget class="QWidget" name="centralwidget">
 | 
				
			||||||
 | 
					   <widget class="QWidget" name="layoutWidget">
 | 
				
			||||||
 | 
					    <property name="geometry">
 | 
				
			||||||
 | 
					     <rect>
 | 
				
			||||||
 | 
					      <x>10</x>
 | 
				
			||||||
 | 
					      <y>10</y>
 | 
				
			||||||
 | 
					      <width>781</width>
 | 
				
			||||||
 | 
					      <height>441</height>
 | 
				
			||||||
 | 
					     </rect>
 | 
				
			||||||
 | 
					    </property>
 | 
				
			||||||
 | 
					    <layout class="QGridLayout" name="gridLayout">
 | 
				
			||||||
 | 
					     <item row="3" column="2">
 | 
				
			||||||
 | 
					      <widget class="QPushButton" name="exit">
 | 
				
			||||||
 | 
					       <property name="text">
 | 
				
			||||||
 | 
					        <string>Exit</string>
 | 
				
			||||||
 | 
					       </property>
 | 
				
			||||||
 | 
					      </widget>
 | 
				
			||||||
 | 
					     </item>
 | 
				
			||||||
 | 
					     <item row="3" column="1">
 | 
				
			||||||
 | 
					      <widget class="QProgressBar" name="updateProgress">
 | 
				
			||||||
 | 
					       <property name="value">
 | 
				
			||||||
 | 
					        <number>1</number>
 | 
				
			||||||
 | 
					       </property>
 | 
				
			||||||
 | 
					      </widget>
 | 
				
			||||||
 | 
					     </item>
 | 
				
			||||||
 | 
					     <item row="0" column="0" rowspan="3" colspan="3">
 | 
				
			||||||
 | 
					      <widget class="QTextEdit" name="updateStatus">
 | 
				
			||||||
 | 
					       <property name="enabled">
 | 
				
			||||||
 | 
					        <bool>true</bool>
 | 
				
			||||||
 | 
					       </property>
 | 
				
			||||||
 | 
					       <property name="font">
 | 
				
			||||||
 | 
					        <font>
 | 
				
			||||||
 | 
					         <family>Misc Fixed</family>
 | 
				
			||||||
 | 
					         <pointsize>11</pointsize>
 | 
				
			||||||
 | 
					         <bold>true</bold>
 | 
				
			||||||
 | 
					        </font>
 | 
				
			||||||
 | 
					       </property>
 | 
				
			||||||
 | 
					       <property name="verticalScrollBarPolicy">
 | 
				
			||||||
 | 
					        <enum>Qt::ScrollBarAsNeeded</enum>
 | 
				
			||||||
 | 
					       </property>
 | 
				
			||||||
 | 
					       <property name="horizontalScrollBarPolicy">
 | 
				
			||||||
 | 
					        <enum>Qt::ScrollBarAsNeeded</enum>
 | 
				
			||||||
 | 
					       </property>
 | 
				
			||||||
 | 
					       <property name="sizeAdjustPolicy">
 | 
				
			||||||
 | 
					        <enum>QAbstractScrollArea::AdjustToContents</enum>
 | 
				
			||||||
 | 
					       </property>
 | 
				
			||||||
 | 
					      </widget>
 | 
				
			||||||
 | 
					     </item>
 | 
				
			||||||
 | 
					    </layout>
 | 
				
			||||||
 | 
					   </widget>
 | 
				
			||||||
 | 
					  </widget>
 | 
				
			||||||
 | 
					 </widget>
 | 
				
			||||||
 | 
					 <resources/>
 | 
				
			||||||
 | 
					 <connections/>
 | 
				
			||||||
 | 
					</ui>
 | 
				
			||||||
@@ -2,15 +2,17 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
#include <QDateTime>
 | 
					#include <QDateTime>
 | 
				
			||||||
#include <cstring>
 | 
					#include <cstring>
 | 
				
			||||||
 | 
					#include <QString>
 | 
				
			||||||
#define OUTPUT_LEN (20)
 | 
					#include <QFileInfo>
 | 
				
			||||||
 | 
					#include <QMessageLogContext>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static char const *DBG_NAME[] = { "DBG  ", "WARN ", "CRIT ", "FATAL", "INFO " };
 | 
				
			||||||
static bool installedMsgHandler = false;
 | 
					static bool installedMsgHandler = false;
 | 
				
			||||||
static QtMsgType debugLevel = QtInfoMsg;
 | 
					static int debugLevel = LOG_NOTICE;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
QtMsgType getDebugLevel() { return debugLevel; }
 | 
					int getDebugLevel() { return debugLevel; }
 | 
				
			||||||
void setDebugLevel(QtMsgType newDebugLevel) {
 | 
					void setDebugLevel(int newDebugLevel) {
 | 
				
			||||||
    debugLevel = newDebugLevel;
 | 
					    debugLevel = newDebugLevel;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -41,108 +43,53 @@ QtMessageHandler atbInstallMessageHandler(QtMessageHandler handler) {
 | 
				
			|||||||
///     return app.exec();
 | 
					///     return app.exec();
 | 
				
			||||||
///  }
 | 
					///  }
 | 
				
			||||||
///
 | 
					///
 | 
				
			||||||
#if QT_VERSION < QT_VERSION_CHECK(5, 0, 0)
 | 
					#if (QT_VERSION > QT_VERSION_CHECK(5, 0, 0) && QT_VERSION < QT_VERSION_CHECK(6, 0, 0))
 | 
				
			||||||
void atbDebugOutput(QtMsgType type, const char *msg) {
 | 
					 | 
				
			||||||
    switch (type) {
 | 
					 | 
				
			||||||
        case QtDebugMsg: {
 | 
					 | 
				
			||||||
            if (debugLevel <= QtDebugMsg) {
 | 
					 | 
				
			||||||
                fprintf(stderr, "%*.*s Debug: %s\n", OUTPUT_LEN, OUTPUT_LEN,
 | 
					 | 
				
			||||||
                    QDateTime::currentDateTime().toString(Qt::ISODate).toStdString().c_str(), msg);
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
        } break;
 | 
					 | 
				
			||||||
        case QtInfoMsg: {
 | 
					 | 
				
			||||||
            if (debugLevel <= QtInfoMsg) {
 | 
					 | 
				
			||||||
                fprintf(stderr, "%*.*s Info: %s\n", OUTPUT_LEN, OUTPUT_LEN,
 | 
					 | 
				
			||||||
                    QDateTime::currentDateTime().toString(Qt::ISODate).toStdString().c_str(), msg);
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
        } break;
 | 
					 | 
				
			||||||
        case QtWarningMsg: {
 | 
					 | 
				
			||||||
            if (debugLevel <= QtWarningMsg) {
 | 
					 | 
				
			||||||
                fprintf(stderr, "%*.*s Warning: %s\n", OUTPUT_LEN, OUTPUT_LEN,
 | 
					 | 
				
			||||||
                    QDateTime::currentDateTime().toString(Qt::ISODate).toStdString().c_str(), msg);
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
        } break;
 | 
					 | 
				
			||||||
        case QtCriticalMsg: {
 | 
					 | 
				
			||||||
            if (debugLevel <= QtCriticalMsg) {
 | 
					 | 
				
			||||||
                fprintf(stderr, "%*.*s Critical: %s\n", OUTPUT_LEN, OUTPUT_LEN,
 | 
					 | 
				
			||||||
                    QDateTime::currentDateTime().toString(Qt::ISODate).toStdString().c_str(), msg);
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
        } break;
 | 
					 | 
				
			||||||
        case QtFatalMsg: {
 | 
					 | 
				
			||||||
            if (debugLevel <= QtFatalMsg) {
 | 
					 | 
				
			||||||
                fprintf(stderr, "%*.*s Fatal: %s\n", OUTPUT_LEN, OUTPUT_LEN,
 | 
					 | 
				
			||||||
                    QDateTime::currentDateTime().toString(Qt::ISODate).toStdString().c_str(), msg);
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
            // abort();
 | 
					 | 
				
			||||||
        } break;
 | 
					 | 
				
			||||||
        default: {
 | 
					 | 
				
			||||||
            fprintf(stderr, "%*.*s No ErrorLevel defined! %s\n", OUTPUT_LEN, OUTPUT_LEN,
 | 
					 | 
				
			||||||
                QDateTime::currentDateTime().toString(Qt::ISODate).toStdString().c_str(), msg);
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
#elif QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
 | 
					 | 
				
			||||||
void atbDebugOutput(QtMsgType type, const QMessageLogContext &context, const QString &msg) {
 | 
					void atbDebugOutput(QtMsgType type, const QMessageLogContext &context, const QString &msg) {
 | 
				
			||||||
    static constexpr const char *format = "dd.MM.yyyy hh:mm:ss";
 | 
					    Q_UNUSED(context);
 | 
				
			||||||
    QByteArray localMsg = msg.toLocal8Bit();
 | 
					    QString const localMsg = QString(DBG_NAME[type]) + msg.toLocal8Bit();
 | 
				
			||||||
    const char *file = context.file ? context.file : "";
 | 
					
 | 
				
			||||||
    const char *function = context.function ? context.function : "";
 | 
					    switch (debugLevel) {
 | 
				
			||||||
    const char *p = std::strstr(function, "::");
 | 
					        case LOG_DEBUG: { // debug-level message
 | 
				
			||||||
    if (p) {
 | 
					            syslog(LOG_DEBUG, "%s", localMsg.toStdString().c_str());
 | 
				
			||||||
        function = p + 2;
 | 
					        } break;
 | 
				
			||||||
    }
 | 
					        case LOG_INFO: { // informational message
 | 
				
			||||||
    char const* output = std::strrchr(file, '/');
 | 
					            if (type != QtDebugMsg) {
 | 
				
			||||||
    if (output) {
 | 
					                syslog(LOG_DEBUG, "%s", localMsg.toStdString().c_str());
 | 
				
			||||||
        file = output + 1;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    qint64 const currentMSecsSinceEpoch = QDateTime::currentMSecsSinceEpoch();
 | 
					 | 
				
			||||||
    int const fractional_part = currentMSecsSinceEpoch % 1000;
 | 
					 | 
				
			||||||
    QDateTime const datetime = QDateTime::fromMSecsSinceEpoch(currentMSecsSinceEpoch);
 | 
					 | 
				
			||||||
    switch (type) {
 | 
					 | 
				
			||||||
        case QtDebugMsg: {
 | 
					 | 
				
			||||||
            if (debugLevel <= QtDebugMsg) {
 | 
					 | 
				
			||||||
                // fprintf(stderr, "%*.*s          CTX %s (%s:%u) ->\n", OUTPUT_LEN, OUTPUT_LEN,
 | 
					 | 
				
			||||||
                //        "", function, file, context.line);
 | 
					 | 
				
			||||||
                //fprintf(stderr, "%*.*s.%03d DEBG %s\n", OUTPUT_LEN, OUTPUT_LEN,
 | 
					 | 
				
			||||||
                //        datetime.toString(format).toStdString().c_str(), fractional_part,
 | 
					 | 
				
			||||||
                //        localMsg.constData());
 | 
					 | 
				
			||||||
                fprintf(stderr, "%*.*s.%03d DEBUG %s (%s:%u)\n", OUTPUT_LEN, OUTPUT_LEN,
 | 
					 | 
				
			||||||
                        datetime.toString(format).toStdString().c_str(), fractional_part,
 | 
					 | 
				
			||||||
                        localMsg.constData(), file, context.line);
 | 
					 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        } break;
 | 
					        } break;
 | 
				
			||||||
        case QtInfoMsg: {
 | 
					        case LOG_NOTICE: { // normal, but significant, condition
 | 
				
			||||||
            if (debugLevel <= QtInfoMsg) {
 | 
					            if (type != QtDebugMsg) {
 | 
				
			||||||
                fprintf(stderr, "%*.*s.%03d INFO %s (%s:%u)\n", OUTPUT_LEN, OUTPUT_LEN,
 | 
					                syslog(LOG_DEBUG, "%s", localMsg.toStdString().c_str());
 | 
				
			||||||
                        datetime.toString(format).toStdString().c_str(), fractional_part,
 | 
					 | 
				
			||||||
                        localMsg.constData(), file, context.line);
 | 
					 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        } break;
 | 
					        } break;
 | 
				
			||||||
        case QtWarningMsg: {
 | 
					        case LOG_WARNING: { // warning conditions
 | 
				
			||||||
            if (debugLevel <= QtWarningMsg) {
 | 
					            if (type != QtInfoMsg && type != QtDebugMsg) {
 | 
				
			||||||
                fprintf(stderr, "%*.*s.%03d WARN %s (%s:%u)\n", OUTPUT_LEN, OUTPUT_LEN,
 | 
					                syslog(LOG_DEBUG, "%s", localMsg.toStdString().c_str());
 | 
				
			||||||
                        datetime.toString(format).toStdString().c_str(), fractional_part,
 | 
					 | 
				
			||||||
                        localMsg.constData(), file, context.line);
 | 
					 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        } break;
 | 
					        } break;
 | 
				
			||||||
        case QtCriticalMsg: {
 | 
					        case LOG_ERR: { // error conditions
 | 
				
			||||||
            if (debugLevel <= QtCriticalMsg) {
 | 
					            if (type != QtInfoMsg && type != QtDebugMsg && type != QtWarningMsg) {
 | 
				
			||||||
                fprintf(stderr, "%*.*s.%03d CRIT %s (%s:%u)\n", OUTPUT_LEN, OUTPUT_LEN,
 | 
					                syslog(LOG_DEBUG, "%s", localMsg.toStdString().c_str());
 | 
				
			||||||
                        datetime.toString(format).toStdString().c_str(), fractional_part,
 | 
					 | 
				
			||||||
                        localMsg.constData(), file, context.line);
 | 
					 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        } break;
 | 
					        } break;
 | 
				
			||||||
        case QtFatalMsg: {
 | 
					        case LOG_CRIT: { // critical conditions
 | 
				
			||||||
            if (debugLevel <= QtFatalMsg) {
 | 
					            if (type != QtInfoMsg && type != QtDebugMsg && type != QtWarningMsg) {
 | 
				
			||||||
                fprintf(stderr, "%*.*s.%03d FATAL %s (%s:%u)\n", OUTPUT_LEN, OUTPUT_LEN,
 | 
					                syslog(LOG_DEBUG, "%s", localMsg.toStdString().c_str());
 | 
				
			||||||
                        datetime.toString(format).toStdString().c_str(), fractional_part,
 | 
					            }
 | 
				
			||||||
                        localMsg.constData(), file, context.line);
 | 
					        } break;
 | 
				
			||||||
 | 
					        case LOG_ALERT: { // action must be taken immediately
 | 
				
			||||||
 | 
					            if (type != QtInfoMsg && type != QtDebugMsg && type != QtWarningMsg) {
 | 
				
			||||||
 | 
					                syslog(LOG_DEBUG, "%s", localMsg.toStdString().c_str());
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        } break;
 | 
				
			||||||
 | 
					        case LOG_EMERG: { // system is unusable
 | 
				
			||||||
 | 
					            if (type != QtInfoMsg && type != QtDebugMsg && type != QtWarningMsg) {
 | 
				
			||||||
 | 
					                syslog(LOG_DEBUG, "%s", localMsg.toStdString().c_str());
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        } break;
 | 
					        } break;
 | 
				
			||||||
        default: {
 | 
					        default: {
 | 
				
			||||||
            fprintf(stderr, "%*.*s.%03d No ErrorLevel defined! %s\n", OUTPUT_LEN, OUTPUT_LEN,
 | 
					            //fprintf(stderr, "%s No ErrorLevel defined! %s\n",
 | 
				
			||||||
                datetime.toString(format).toStdString().c_str(), fractional_part,
 | 
					            //    datetime.toStdString().c_str(), msg.toStdString().c_str());
 | 
				
			||||||
                msg.toStdString().c_str());
 | 
					 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -2,9 +2,12 @@
 | 
				
			|||||||
#define MESSAGE_HANDLER_H_INCLUDED
 | 
					#define MESSAGE_HANDLER_H_INCLUDED
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <QtGlobal>
 | 
					#include <QtGlobal>
 | 
				
			||||||
 | 
					#ifdef __linux__
 | 
				
			||||||
 | 
					#include <syslog.h>
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
QtMsgType getDebugLevel();
 | 
					int getDebugLevel();
 | 
				
			||||||
void setDebugLevel(QtMsgType newDebugLevel);
 | 
					void setDebugLevel(int newDebugLevel);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
bool messageHandlerInstalled();
 | 
					bool messageHandlerInstalled();
 | 
				
			||||||
QtMessageHandler atbInstallMessageHandler(QtMessageHandler handler);
 | 
					QtMessageHandler atbInstallMessageHandler(QtMessageHandler handler);
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										2934
									
								
								plugins/interfaces.h
									
									
									
									
									
								
							
							
						
						
									
										2934
									
								
								plugins/interfaces.h
									
									
									
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										
											BIN
										
									
								
								plugins/libCAmaster.so
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								plugins/libCAmaster.so
									
									
									
									
									
										Executable file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										
											BIN
										
									
								
								plugins/libCAslave.so
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								plugins/libCAslave.so
									
									
									
									
									
										Executable file
									
								
							
										
											Binary file not shown.
										
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										124
									
								
								process/command.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										124
									
								
								process/command.cpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,124 @@
 | 
				
			|||||||
 | 
					#include "command.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <QProcess>
 | 
				
			||||||
 | 
					#include <QDebug>
 | 
				
			||||||
 | 
					#include <QDir>
 | 
				
			||||||
 | 
					#include <QRegularExpression>
 | 
				
			||||||
 | 
					#include <QDateTime>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Command::Command(QString const &command, int start_timeout, int finish_timeout)
 | 
				
			||||||
 | 
					    : m_command(command.trimmed())
 | 
				
			||||||
 | 
					    , m_commandResult("")
 | 
				
			||||||
 | 
					    , m_waitForStartTimeout(start_timeout)
 | 
				
			||||||
 | 
					    , m_waitForFinishTimeout(finish_timeout)
 | 
				
			||||||
 | 
					    , m_exitCode(-1) {
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					QString Command::getCommandResult() const {
 | 
				
			||||||
 | 
					    return m_commandResult;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void Command::readyReadStandardOutput() {
 | 
				
			||||||
 | 
					    QProcess *p = (QProcess *)sender();
 | 
				
			||||||
 | 
					    m_commandResult += p->readAllStandardOutput();
 | 
				
			||||||
 | 
					    // qCritical() << m_commandResult;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void Command::readyReadStandardError() {
 | 
				
			||||||
 | 
					    QProcess *p = (QProcess *)sender();
 | 
				
			||||||
 | 
					    QByteArray buf = p->readAllStandardError();
 | 
				
			||||||
 | 
					    qCritical() << buf;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void Command::finished(int /*exitCode*/, QProcess::ExitStatus /*exitStatus*/) {
 | 
				
			||||||
 | 
					    QProcess *p = (QProcess *)sender();
 | 
				
			||||||
 | 
					    // read all remaining data sent to the process, just in case
 | 
				
			||||||
 | 
					    QString d = p->readAllStandardOutput();
 | 
				
			||||||
 | 
					    if (!d.isEmpty()) {
 | 
				
			||||||
 | 
					        m_commandResult += d;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    disconnect(p, SIGNAL(finished(int,QProcess::ExitStatus)), this, SLOT(readyReadStandardOutput()));
 | 
				
			||||||
 | 
					    disconnect(p, SIGNAL(finished(int,QProcess::ExitStatus)), this, SLOT(readyReadStandardError()));
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					bool Command::execute(QString workingDirectory, QStringList args) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (!QDir::setCurrent(workingDirectory)) {
 | 
				
			||||||
 | 
					        qCritical() << "SET WORKING_DIRECTORY" << workingDirectory
 | 
				
			||||||
 | 
					                    << "FAILED FOR" << m_command;
 | 
				
			||||||
 | 
					        return false;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    QScopedPointer<QProcess> p(new QProcess(this));
 | 
				
			||||||
 | 
					    p->setWorkingDirectory(workingDirectory);
 | 
				
			||||||
 | 
					    p->setProcessChannelMode(QProcess::MergedChannels);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    connect(&(*p), SIGNAL(readyReadStandardOutput()), this, SLOT(readyReadStandardOutput()));
 | 
				
			||||||
 | 
					    connect(&(*p), SIGNAL(readyReadStandardError()), this, SLOT(readyReadStandardError()));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (!args.isEmpty()) {
 | 
				
			||||||
 | 
					        qDebug() << "START COMMAND" << m_command << "WITH ARGS" << args
 | 
				
			||||||
 | 
					                 << "IN" << p->workingDirectory();
 | 
				
			||||||
 | 
					        p->start(m_command, args);
 | 
				
			||||||
 | 
					    } else {
 | 
				
			||||||
 | 
					        qDebug() << "START COMMAND" << m_command
 | 
				
			||||||
 | 
					                 << "IN" << p->workingDirectory();
 | 
				
			||||||
 | 
					        p->start(m_command);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    qint64 const start = QDateTime::currentDateTime().toMSecsSinceEpoch();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (p->waitForStarted(m_waitForStartTimeout)) {
 | 
				
			||||||
 | 
					        qDebug() << "PROCESS" << m_command << "STARTED IN" << p->workingDirectory();
 | 
				
			||||||
 | 
					        if (p->state() == QProcess::ProcessState::Running) {
 | 
				
			||||||
 | 
					            qDebug() << "PROCESS" << m_command << "RUNNING IN" << p->workingDirectory();
 | 
				
			||||||
 | 
					            // wait forever for git/opkg-commands to finish
 | 
				
			||||||
 | 
					            int wait = m_waitForFinishTimeout;
 | 
				
			||||||
 | 
					            if (m_command.trimmed().startsWith("git", Qt::CaseInsensitive) ||
 | 
				
			||||||
 | 
					                m_command.trimmed().startsWith("opkg", Qt::CaseInsensitive)) {
 | 
				
			||||||
 | 
					                wait = -1;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            bool const no_timeout = p->waitForFinished(wait);
 | 
				
			||||||
 | 
					            if (no_timeout) {
 | 
				
			||||||
 | 
					                qDebug() << "PROCESS" << m_command << "FINISHED IN" << p->workingDirectory();
 | 
				
			||||||
 | 
					                if (p->exitStatus() == QProcess::NormalExit) {
 | 
				
			||||||
 | 
					                    if ((m_exitCode = p->exitCode()) == 0) {
 | 
				
			||||||
 | 
					                        qint64 const end = QDateTime::currentDateTime().toMSecsSinceEpoch();
 | 
				
			||||||
 | 
					                        qDebug() << "EXECUTED" << m_command
 | 
				
			||||||
 | 
					                                 << QString("(runtime %1ms)").arg(end-start)
 | 
				
			||||||
 | 
					                                 << "with code" << m_exitCode
 | 
				
			||||||
 | 
					                                 << "IN" << p->workingDirectory();
 | 
				
			||||||
 | 
					                        return true;
 | 
				
			||||||
 | 
					                    } else {
 | 
				
			||||||
 | 
					                        qint64 const end = QDateTime::currentDateTime().toMSecsSinceEpoch();
 | 
				
			||||||
 | 
					                        qCritical() << "EXECUTED" << m_command
 | 
				
			||||||
 | 
					                                    << QString("(runtime %1ms)").arg(end-start)
 | 
				
			||||||
 | 
					                                    << "with code" << m_exitCode
 | 
				
			||||||
 | 
					                                    << "IN" << p->workingDirectory();
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                } else {
 | 
				
			||||||
 | 
					                    qint64 const end = QDateTime::currentDateTime().toMSecsSinceEpoch();
 | 
				
			||||||
 | 
					                    qCritical() << "PROCESS" << m_command << "CRASHED with code"
 | 
				
			||||||
 | 
					                                << p->exitCode()
 | 
				
			||||||
 | 
					                                << QString("(after %1ms)").arg(end-start)
 | 
				
			||||||
 | 
					                                << "IN" << p->workingDirectory();
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            } else {
 | 
				
			||||||
 | 
					                qint64 const end = QDateTime::currentDateTime().toMSecsSinceEpoch();
 | 
				
			||||||
 | 
					                qCritical() << "PROCESS" << m_command
 | 
				
			||||||
 | 
					                            << "DID NOT FINISH WITH" << wait
 | 
				
			||||||
 | 
					                            << "MS IN" << p->workingDirectory()
 | 
				
			||||||
 | 
					                            << QString("(runtime %1ms)").arg(end-start);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        } else {
 | 
				
			||||||
 | 
					            qCritical() << "WRONG PROCESS STATE" << p->state()
 | 
				
			||||||
 | 
					                        << "IN" << p->workingDirectory();
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    } else {
 | 
				
			||||||
 | 
					        qint64 const end = QDateTime::currentDateTime().toMSecsSinceEpoch();
 | 
				
			||||||
 | 
					        qCritical() << "PROCESS" << m_command << "TIMEOUT AT START"
 | 
				
			||||||
 | 
					                    << QString("(runtime %1ms)").arg(end-start)
 | 
				
			||||||
 | 
					                    << "IN" << p->workingDirectory();
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    return false;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										35
									
								
								process/command.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										35
									
								
								process/command.h
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,35 @@
 | 
				
			|||||||
 | 
					#ifndef COMMAND_H_INCLUDED
 | 
				
			||||||
 | 
					#define COMMAND_H_INCLUDED
 | 
				
			||||||
 | 
					#endif // COMMAND_H_INCLUDED
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <QObject>
 | 
				
			||||||
 | 
					#include <QCoreApplication>
 | 
				
			||||||
 | 
					#include <QString>
 | 
				
			||||||
 | 
					#include <QStringList>
 | 
				
			||||||
 | 
					#include <QProcess>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class Command : public QObject {
 | 
				
			||||||
 | 
					    Q_OBJECT
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    QString m_command;
 | 
				
			||||||
 | 
					    QString m_commandResult;
 | 
				
			||||||
 | 
					    int m_waitForStartTimeout;
 | 
				
			||||||
 | 
					    int m_waitForFinishTimeout;
 | 
				
			||||||
 | 
					    int m_exitCode;
 | 
				
			||||||
 | 
					public:
 | 
				
			||||||
 | 
					    explicit Command(QString const &command,
 | 
				
			||||||
 | 
					                     int start_timeout = 100000,
 | 
				
			||||||
 | 
					                     int finish_timeout = 100000);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    QString getCommandResult() const;
 | 
				
			||||||
 | 
					    QString command() const { return m_command; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    bool execute(QString workingDirectory, QStringList args = QStringList());
 | 
				
			||||||
 | 
					    int exitCode() const { return m_exitCode; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					private slots:
 | 
				
			||||||
 | 
					    void readyReadStandardOutput();
 | 
				
			||||||
 | 
					    void readyReadStandardError();
 | 
				
			||||||
 | 
					    void finished(int exitCode, QProcess::ExitStatus exitStatus);
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
							
								
								
									
										20
									
								
								progress_event.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										20
									
								
								progress_event.cpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,20 @@
 | 
				
			|||||||
 | 
					#include "progress_event.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					QEvent::Type ProgressEvent::customEventType = QEvent::None;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					ProgressEvent::ProgressEvent(QObject const *sender, int progressPercent)
 | 
				
			||||||
 | 
					    : QEvent(ProgressEvent::type())
 | 
				
			||||||
 | 
					    , m_sender(sender)
 | 
				
			||||||
 | 
					    , m_progressPercent(progressPercent) {
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					ProgressEvent::~ProgressEvent() {
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					QEvent::Type ProgressEvent::type() {
 | 
				
			||||||
 | 
					    if (customEventType == QEvent::None) {
 | 
				
			||||||
 | 
					        int generatedType = QEvent::registerEventType();
 | 
				
			||||||
 | 
					        customEventType = static_cast<QEvent::Type>(generatedType);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    return customEventType;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										26
									
								
								progress_event.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										26
									
								
								progress_event.h
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,26 @@
 | 
				
			|||||||
 | 
					#ifndef PROGRESS_EVENT_H_INCLUDED
 | 
				
			||||||
 | 
					#define PROGRESS_EVENT_H_INCLUDED
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <QEvent>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class ProgressEvent : public QEvent {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    QObject const *m_sender;
 | 
				
			||||||
 | 
					    int m_progressPercent;
 | 
				
			||||||
 | 
					public:
 | 
				
			||||||
 | 
					    explicit ProgressEvent(QObject const *sender, int progressPercent);
 | 
				
			||||||
 | 
					    virtual ~ProgressEvent();
 | 
				
			||||||
 | 
					    static QEvent::Type type();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    QObject const *sender() { return m_sender; }
 | 
				
			||||||
 | 
					    QObject const *sender() const { return m_sender; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    void setProgress(int progressPercent) { m_progressPercent = progressPercent; }
 | 
				
			||||||
 | 
					    int progressPercent() { return m_progressPercent; }
 | 
				
			||||||
 | 
					    int progressPercent() const { return m_progressPercent; }
 | 
				
			||||||
 | 
					private:
 | 
				
			||||||
 | 
					    static QEvent::Type customEventType;
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#endif // PROGRESS_EVENT_H_INCLUDED
 | 
				
			||||||
							
								
								
									
										901
									
								
								update.cpp
									
									
									
									
									
								
							
							
						
						
									
										901
									
								
								update.cpp
									
									
									
									
									
								
							@@ -1,4 +1,8 @@
 | 
				
			|||||||
#include "update.h"
 | 
					#include "update.h"
 | 
				
			||||||
 | 
					#include "worker.h"
 | 
				
			||||||
 | 
					#include "utils.h"
 | 
				
			||||||
 | 
					#include "update_dc_event.h"
 | 
				
			||||||
 | 
					#include "mainwindow.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <QCoreApplication>
 | 
					#include <QCoreApplication>
 | 
				
			||||||
#include <QApplication>
 | 
					#include <QApplication>
 | 
				
			||||||
@@ -7,132 +11,491 @@
 | 
				
			|||||||
#include <QDebug>
 | 
					#include <QDebug>
 | 
				
			||||||
#include <QTextStream>
 | 
					#include <QTextStream>
 | 
				
			||||||
#include <QRegularExpression>
 | 
					#include <QRegularExpression>
 | 
				
			||||||
 | 
					#include <QRegExp>
 | 
				
			||||||
 | 
					#include <QApplication>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "interfaces.h"
 | 
					#if defined (Q_OS_UNIX) || defined (Q_OS_LINUX)
 | 
				
			||||||
#include "DCPlugin/include/hwapi.h"
 | 
					#include "unistd.h"
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "plugins/interfaces.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <QSharedMemory>
 | 
					#include <QSharedMemory>
 | 
				
			||||||
#include <QScopedPointer>
 | 
					#include <QScopedPointer>
 | 
				
			||||||
#include <QProcess>
 | 
					 | 
				
			||||||
#include <QDir>
 | 
					#include <QDir>
 | 
				
			||||||
 | 
					#include <QThread>
 | 
				
			||||||
 | 
					#include <QDateTime>
 | 
				
			||||||
 | 
					#include <QPluginLoader>
 | 
				
			||||||
 | 
					#include <QMap>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define COLUMN_REQUEST      (0)
 | 
					#define UPDATE_OPKG                 (1)
 | 
				
			||||||
#define COLUMN_NAME         (1)
 | 
					#define UPDATE_DC                   (0)
 | 
				
			||||||
#define COLUMN_DATE_TIME    (2)
 | 
					 | 
				
			||||||
#define COLUMN_RESULT       (3)
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
void ScopedPointerCustomDeleter::cleanup(Update *update) {
 | 
					static const QMap<QString, int> baudrateMap = {
 | 
				
			||||||
    if (update->m_delete) {
 | 
					  {"1200"   ,   0}, {"9600"   ,   1}, {"19200"  ,   2}, {"38400"  ,   3},
 | 
				
			||||||
        delete update;
 | 
					  {"57600"  ,   4}, {"115200" ,   5}
 | 
				
			||||||
    }
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					QPluginLoader Update::pluginLoader;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					hwinf *Update::loadDCPlugin(QDir const &plugInDir, QString const &fname) {
 | 
				
			||||||
 | 
					    hwinf *hw = nullptr;
 | 
				
			||||||
 | 
					    if (plugInDir.exists()) {
 | 
				
			||||||
 | 
					        QString pluginLibName(fname);
 | 
				
			||||||
 | 
					        pluginLibName = plugInDir.absoluteFilePath(pluginLibName);
 | 
				
			||||||
 | 
					        QFileInfo info(pluginLibName);
 | 
				
			||||||
 | 
					        if (info.exists()) {
 | 
				
			||||||
 | 
					            pluginLibName = plugInDir.absoluteFilePath(pluginLibName);
 | 
				
			||||||
 | 
					            pluginLoader.setFileName(pluginLibName);
 | 
				
			||||||
 | 
					            // static QPluginLoader pluginLoader(pluginLibName);
 | 
				
			||||||
 | 
					            if (!pluginLoader.load()) {
 | 
				
			||||||
 | 
					                qCritical() << "in directory" << plugInDir.absolutePath();
 | 
				
			||||||
 | 
					                qCritical() << "cannot load plugin" << pluginLoader.fileName();
 | 
				
			||||||
 | 
					                qCritical() << pluginLoader.errorString();
 | 
				
			||||||
 | 
					                exit(-1);
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Update::Update(QString update_ctrl_file,
 | 
					            qCritical() << "loadDCPlugin() plugin directory:" << plugInDir.absolutePath();
 | 
				
			||||||
 | 
					            qCritical() << "loadDCPlugin() plugin file name:" << pluginLoader.fileName();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            if (!pluginLoader.isLoaded()) {
 | 
				
			||||||
 | 
					                qCritical() << pluginLoader.errorString();
 | 
				
			||||||
 | 
					                exit(-2);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            QObject *plugin = pluginLoader.instance();
 | 
				
			||||||
 | 
					            if (!plugin) {
 | 
				
			||||||
 | 
					                qCritical() << "cannot start instance";
 | 
				
			||||||
 | 
					                exit(-3);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            if (! (hw = qobject_cast<hwinf *>(plugin))) {
 | 
				
			||||||
 | 
					                qCritical() << "cannot cast plugin" << plugin << "to hwinf";
 | 
				
			||||||
 | 
					                exit(-4);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        } else {
 | 
				
			||||||
 | 
					            qCritical() << pluginLibName << "does not exist";
 | 
				
			||||||
 | 
					            exit(-5);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    } else {
 | 
				
			||||||
 | 
					        qCritical() << "plugins directory" << plugInDir.absolutePath()
 | 
				
			||||||
 | 
					                    << "does not exist";
 | 
				
			||||||
 | 
					        exit(-6);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    return hw;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					bool Update::unloadDCPlugin() {
 | 
				
			||||||
 | 
					    if (pluginLoader.unload()) {
 | 
				
			||||||
 | 
					        qCritical() << "unloaded plugin" << pluginLoader.fileName();
 | 
				
			||||||
 | 
					        // Note: will re-instantiate the library !
 | 
				
			||||||
 | 
					        // QObject *rootObject = pluginLoader.instance();
 | 
				
			||||||
 | 
					        // if (rootObject) {
 | 
				
			||||||
 | 
					        //    qCritical() << "reloaded plugin: root object again available";
 | 
				
			||||||
 | 
					        //    return false;
 | 
				
			||||||
 | 
					        // }
 | 
				
			||||||
 | 
					        // qCritical()unloaded plugin: root object gone";
 | 
				
			||||||
 | 
					        return true;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    return false;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class hwapi;
 | 
				
			||||||
 | 
					Update::Update(Worker *worker,
 | 
				
			||||||
 | 
					               QString customerRepository,
 | 
				
			||||||
 | 
					               QString customerNrStr,
 | 
				
			||||||
 | 
					               QString branchName,
 | 
				
			||||||
 | 
					               QString plugInDir,
 | 
				
			||||||
 | 
					               QString pluginName,
 | 
				
			||||||
               QString workingDir,
 | 
					               QString workingDir,
 | 
				
			||||||
 | 
					               bool dryRun,
 | 
				
			||||||
               QObject *parent,
 | 
					               QObject *parent,
 | 
				
			||||||
               hwinf *hw,
 | 
					 | 
				
			||||||
               char const *serialInterface,
 | 
					               char const *serialInterface,
 | 
				
			||||||
               char const *baudrate)
 | 
					               char const *baudrate)
 | 
				
			||||||
    : QObject(parent)
 | 
					    : QObject(parent)
 | 
				
			||||||
    , m_hw(hw != nullptr ? hw : new hwapi())
 | 
					    , m_hw(loadDCPlugin(QDir(plugInDir), pluginName))
 | 
				
			||||||
 | 
					    , m_worker(worker)
 | 
				
			||||||
    , m_serialInterface(serialInterface)
 | 
					    , m_serialInterface(serialInterface)
 | 
				
			||||||
    , m_baudrate(baudrate)
 | 
					    , m_baudrate(baudrate)
 | 
				
			||||||
    , m_update_ctrl_file(update_ctrl_file)
 | 
					    , m_customerRepository(customerRepository)
 | 
				
			||||||
    , m_update_ctrl_file_copy(update_ctrl_file + ".copy")
 | 
					    , m_customerNrStr(customerNrStr)
 | 
				
			||||||
 | 
					    , m_branchName(branchName)
 | 
				
			||||||
 | 
					    , m_pluginName(pluginName)
 | 
				
			||||||
    , m_workingDir(workingDir)
 | 
					    , m_workingDir(workingDir)
 | 
				
			||||||
    , m_init(true)
 | 
					    , m_dryRun(dryRun)
 | 
				
			||||||
    , m_delete(hw == nullptr) {
 | 
					    , m_sys_areDCdataValid(false) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    execUpdateScript();
 | 
					    if (!m_hw) {
 | 
				
			||||||
 | 
					        qCritical() << "(" << __func__ << ":" << __LINE__ << ") m_hw == nullptr -> ca-slave plugin loaded ???";
 | 
				
			||||||
 | 
					    } else {
 | 
				
			||||||
 | 
					        int tries = 20;
 | 
				
			||||||
 | 
					        while ((m_sys_areDCdataValid = m_hw->sys_areDCdataValid()) == false) {
 | 
				
			||||||
 | 
					            // must deliver 'true', only then are all data from hwapi valid
 | 
				
			||||||
 | 
					            if (--tries < 0) {
 | 
				
			||||||
 | 
					                qCritical() << "ERROR!!! DC DATA NOT VALID -> CA-MASTER-PLUGIN NOT CONNECTED";
 | 
				
			||||||
 | 
					                break;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            m_hw->dc_autoRequest(true);
 | 
				
			||||||
 | 
					            QThread::msleep(500);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (!m_update_ctrl_file.exists()) {
 | 
					        qCritical() << "(" << __func__ << ":" << __LINE__ << ") m_sys_areDCDataValid ..."
 | 
				
			||||||
        qCritical() << "Update-file" << m_update_ctrl_file.fileName()
 | 
					                    << m_sys_areDCdataValid;
 | 
				
			||||||
                    << "does not exist";
 | 
					
 | 
				
			||||||
        m_init = false;
 | 
					        QObject const *obj = m_hw->getAPI();
 | 
				
			||||||
 | 
					        Q_ASSERT(obj != nullptr);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        QDebug critical = qCritical();
 | 
				
			||||||
 | 
					        critical << "connect() to onReportDCDownloadStatus() ...";
 | 
				
			||||||
 | 
					        if (!connect(obj,
 | 
				
			||||||
 | 
					                     SIGNAL(hwapi_reportDCDownloadStatus(QString const&)),
 | 
				
			||||||
 | 
					                     this,
 | 
				
			||||||
 | 
					                     SLOT(onReportDCDownloadStatus(QString const &)))) {
 | 
				
			||||||
 | 
					            critical << "FAILED";
 | 
				
			||||||
 | 
					        } else critical << "DONE";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        critical = qCritical();
 | 
				
			||||||
 | 
					        critical << "connect() to onReportDCDownloadSuccess() ...";
 | 
				
			||||||
 | 
					        if (!connect(obj,
 | 
				
			||||||
 | 
					            SIGNAL(hwapi_reportDCDownloadSuccess(QString const&)), this,
 | 
				
			||||||
 | 
					            SLOT(onReportDCDownloadSuccess(QString const &)))) {
 | 
				
			||||||
 | 
					            critical << "FAILED";
 | 
				
			||||||
 | 
					        } else critical << "DONE";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        critical = qCritical();
 | 
				
			||||||
 | 
					        critical << "connect() to onReportDCDownloadFailure() ...";
 | 
				
			||||||
 | 
					        if (!connect(obj,
 | 
				
			||||||
 | 
					            SIGNAL(hwapi_reportDCDownloadFailure(QString const &)), this,
 | 
				
			||||||
 | 
					            SLOT(onReportDCDownloadFailure(QString const &)))) {
 | 
				
			||||||
 | 
					            critical << "FAILED";
 | 
				
			||||||
 | 
					        } else critical << "DONE";
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    if (!m_update_ctrl_file_copy.exists()) {
 | 
					 | 
				
			||||||
        qCritical() << "Update-file-copy" << m_update_ctrl_file_copy.fileName()
 | 
					 | 
				
			||||||
                    << "does not exist";
 | 
					 | 
				
			||||||
        m_init = false;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    if (!m_update_ctrl_file.open(QIODevice::ReadWrite | QIODevice::Text)) {
 | 
					 | 
				
			||||||
        qCritical() << "can not open " << m_update_ctrl_file.fileName();
 | 
					 | 
				
			||||||
        m_init = false;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    qDebug() << "Opened" << m_update_ctrl_file.fileName();
 | 
					 | 
				
			||||||
    if (!m_update_ctrl_file_copy.open(QIODevice::ReadWrite | QIODevice::Text)) {
 | 
					 | 
				
			||||||
        qCritical() << "can not open " << m_update_ctrl_file_copy.fileName();
 | 
					 | 
				
			||||||
        m_init = false;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    qDebug() << "Opened" << m_update_ctrl_file_copy.fileName();
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Update::~Update() {
 | 
					Update::~Update() {
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
bool Update::execUpdateScript() {
 | 
					void Update::onReportDCDownloadStatus(QString const &status) {
 | 
				
			||||||
    // path of update-script 'update_psa'
 | 
					    emit m_worker->showStatusMessage("DL", status);
 | 
				
			||||||
    QString update_psa("/opt/app/tools/atbupdate/update_psa --wdir ");
 | 
					}
 | 
				
			||||||
    update_psa += m_workingDir;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    //QStringList const params(QStringList() << "-c" << update_psa);
 | 
					void Update::onReportDCDownloadSuccess(QString const &msg) {
 | 
				
			||||||
 | 
					    qCritical() << "msg" << msg;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    QScopedPointer<QProcess> p(new QProcess(this));
 | 
					void Update::onReportDCDownloadFailure(QString const &errorMsg) {
 | 
				
			||||||
    p->setProcessChannelMode(QProcess::MergedChannels);
 | 
					    qCritical() << "msg" << errorMsg;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    p->start(update_psa);
 | 
					
 | 
				
			||||||
    if (p->waitForStarted(1000)) {
 | 
					
 | 
				
			||||||
        if (p->state() == QProcess::ProcessState::Running) {
 | 
					// br is a index into a table, used for historical reasons.
 | 
				
			||||||
            if (p->waitForFinished(60000)) {
 | 
					bool Update::openSerial(int br, QString baudrate, QString comPort) const {
 | 
				
			||||||
                QString output = p->readAllStandardOutput().toStdString().c_str();
 | 
					    qDebug() << "opening serial" << br << baudrate << comPort << "...";
 | 
				
			||||||
                QStringList lst = output.split('\n');
 | 
					    if (m_hw->dc_openSerial(br, baudrate, comPort, 1) == true) { // 1 for connect
 | 
				
			||||||
                for (int i = 0; i < lst.size(); ++i) {
 | 
					        Utils::printInfoMsg(
 | 
				
			||||||
                    qDebug() << lst[i];
 | 
					            QString("OPENING SERIAL %1").arg(br)
 | 
				
			||||||
                }
 | 
					                  + " " + baudrate + " " + comPort + "...OK");
 | 
				
			||||||
                qInfo() << "EXECUTED" << update_psa;
 | 
					
 | 
				
			||||||
                return ((p->exitStatus() == QProcess::NormalExit)
 | 
					        // m_hw->dc_autoRequest(true);
 | 
				
			||||||
                     && (p->exitCode() == 0));
 | 
					        m_hw->dc_autoRequest(false);
 | 
				
			||||||
            }
 | 
					        QThread::sleep(1);
 | 
				
			||||||
        }
 | 
					
 | 
				
			||||||
 | 
					        Utils::printInfoMsg(QString("IS PORT OPEN %1").arg(m_hw->dc_isPortOpen()));
 | 
				
			||||||
 | 
					        return true;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    Utils::printCriticalErrorMsg(
 | 
				
			||||||
 | 
					        QString("OPENING SERIAL %1").arg(br)
 | 
				
			||||||
 | 
					              + " " + baudrate + " " + comPort + "...FAILED");
 | 
				
			||||||
    return false;
 | 
					    return false;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
bool Update::updateBinary(char const *fileToSendToDC) {
 | 
					void Update::closeSerial() const {
 | 
				
			||||||
    return m_hw->dc_updateDC(fileToSendToDC, m_baudrate, m_serialInterface);
 | 
					    qInfo() << "CLOSED SERIAL" << m_baudrate << m_serialInterface;
 | 
				
			||||||
 | 
					    m_hw->dc_closeSerial();
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
bool Update::updatePrinterConf(int nrOfTemplate, char const *fileToSendToDC) {
 | 
					bool Update::isSerialOpen() const {
 | 
				
			||||||
    QVector<int> printTemplates{ nrOfTemplate };
 | 
					    return m_hw->dc_isPortOpen();
 | 
				
			||||||
    QVector<QString> filesToSend{ fileToSendToDC };
 | 
					 | 
				
			||||||
    return m_hw->dc_updatePrinterTemplate(hwapi::FileTypeJson::PRINTER,
 | 
					 | 
				
			||||||
                                          printTemplates, filesToSend,
 | 
					 | 
				
			||||||
                                          QString(m_baudrate),
 | 
					 | 
				
			||||||
                                          QString(m_serialInterface));
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
QStringList Update::getOpenLines() {
 | 
					/*
 | 
				
			||||||
    QStringList openLines;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    QTextStream in(&m_update_ctrl_file);
 | 
					 ///////////////////////////////////////////////////////////////////////////////
 | 
				
			||||||
    while (!in.atEnd()) {
 | 
					 //
 | 
				
			||||||
        QString line = in.readLine().trimmed();
 | 
					 //                        USING THE DC BOOTLOADER
 | 
				
			||||||
        if (line.startsWith("DONE")) {
 | 
					 //
 | 
				
			||||||
            m_update_ctrl_file_copy.write(line.toUtf8().constData());
 | 
					 ///////////////////////////////////////////////////////////////////////////////
 | 
				
			||||||
            m_update_ctrl_file_copy.write("\n");
 | 
					
 | 
				
			||||||
 | 
					 1  :   bl_reboot()     // send to application, want DC2 to reset (in order to
 | 
				
			||||||
 | 
					                        // start the bootloader)
 | 
				
			||||||
 | 
					                        //
 | 
				
			||||||
 | 
					                        // NOTE: this function is NOT reliable !!! Sometimes it
 | 
				
			||||||
 | 
					                        // simply does not work, in which case bl_startBL,
 | 
				
			||||||
 | 
					                        // bl_checkBL and bl_isUp do not work as well.
 | 
				
			||||||
 | 
					                        // Alas, there is no feedback if bl_reboot worked!
 | 
				
			||||||
 | 
					                        //
 | 
				
			||||||
 | 
					                        // NOTE: this function can be called only once per
 | 
				
			||||||
 | 
					                        // minute, because once called again, the controller
 | 
				
			||||||
 | 
					                        // performs some self-checks consuming some time.
 | 
				
			||||||
 | 
					                        //
 | 
				
			||||||
 | 
					                        // NOTE: after a successful bl_reboot(), the device is
 | 
				
			||||||
 | 
					                        // waiting about 4 seconds in the bootloader. To stay in
 | 
				
			||||||
 | 
					                        // the bootloader, we have to send the command
 | 
				
			||||||
 | 
					                        // bl_startBL(), which is kind of a misnomer, as it
 | 
				
			||||||
 | 
					                        // should be bl_doNotLeaveBL().
 | 
				
			||||||
 | 
					                        //
 | 
				
			||||||
 | 
					 2  :   bl_startBL():   // send within 4s after DC power-on, otherwise
 | 
				
			||||||
 | 
					                        // bootloader is left.
 | 
				
			||||||
 | 
					                        //
 | 
				
			||||||
 | 
					                        // NOTE: a running bootloader is a MUST for the download
 | 
				
			||||||
 | 
					                        // process of a device controller firmware as it does
 | 
				
			||||||
 | 
					                        // the actual writing of the memory (the bl_reboot()
 | 
				
			||||||
 | 
					                        // from above erases the available memory).
 | 
				
			||||||
 | 
					                        //
 | 
				
			||||||
 | 
					 3  :   bl_check():     // send command to verify if bl is up
 | 
				
			||||||
 | 
					                        //
 | 
				
			||||||
 | 
					                        // NOTE: this command is kind of a request that we want
 | 
				
			||||||
 | 
					                        // to check if the bootloader is up. The device
 | 
				
			||||||
 | 
					                        // (actually the bootloader) responds with its version.
 | 
				
			||||||
 | 
					                        //
 | 
				
			||||||
 | 
					 4  :   bl_isUp():      // returns true if bl is up and running
 | 
				
			||||||
 | 
					                        //
 | 
				
			||||||
 | 
					                        // NOTE: we know what the bootloader version actually is
 | 
				
			||||||
 | 
					                        // as the bootloader does not change. By comparing the
 | 
				
			||||||
 | 
					                        // string received in the previous step with this known
 | 
				
			||||||
 | 
					                        // version string we know if the bootloader is up.
 | 
				
			||||||
 | 
					                        //
 | 
				
			||||||
 | 
					                        // NOTE FOR ALL PREVIOUS STEPS: execute them in their
 | 
				
			||||||
 | 
					                        // own slots each to be sure to receive any possible
 | 
				
			||||||
 | 
					                        // responds from the device.
 | 
				
			||||||
 | 
					                        //
 | 
				
			||||||
 | 
					 5  :   bl_sendAddress(blockNumber)
 | 
				
			||||||
 | 
					                        // send start address, nr of 64-byte block, start with 0
 | 
				
			||||||
 | 
					                        // will be sent only for following block-numbers:
 | 
				
			||||||
 | 
					                        // 0, 1024, 2048, 3072 and 4096, so basically every
 | 
				
			||||||
 | 
					                        // 64kByte.
 | 
				
			||||||
 | 
					                        // for other addresses nothing happens
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 6  :   bl_wasSendingAddOK()
 | 
				
			||||||
 | 
					                        // return val:  0: no response by now
 | 
				
			||||||
 | 
					                        //              1: error
 | 
				
			||||||
 | 
					                        //             10: OK
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 7  :   bl_sendDataBlock()
 | 
				
			||||||
 | 
					                        // send 64 byte from bin file
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 8  :   bl_sendLastBlock()
 | 
				
			||||||
 | 
					                        // send this command after all data are transferred
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 9  :   bl_wasSendingDataOK()
 | 
				
			||||||
 | 
					                        // return val:  0: no response by now
 | 
				
			||||||
 | 
					                        //              1: error
 | 
				
			||||||
 | 
					                        //             10: OK
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 10 :   bl_stopBL()     // leave bl and start (the new) application
 | 
				
			||||||
 | 
					                        //
 | 
				
			||||||
 | 
					                        // NOTE: this function MUST work under all conditions.
 | 
				
			||||||
 | 
					                        // Alas, there is no direct result for this command, so
 | 
				
			||||||
 | 
					                        // the only way of knowing it was successful is to ask
 | 
				
			||||||
 | 
					                        // the device if the bootloader is still running.
 | 
				
			||||||
 | 
					                        // There is no problem to repeat this command until the
 | 
				
			||||||
 | 
					                        // bootloader is really not running anymore.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					bool Update::updateBinary(QString const &fileToSendToDC) {
 | 
				
			||||||
 | 
					    qInfo() << "UPDATING DEVICE CONTROLLER FIRMWARE BINARY" << fileToSendToDC;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return false;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#if 0
 | 
				
			||||||
 | 
					    QFile fn(fileToSendToDC);
 | 
				
			||||||
 | 
					    if (!fn.exists()) {
 | 
				
			||||||
 | 
					        // output via CONSOLE() etc
 | 
				
			||||||
 | 
					        return false;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    bool bl_isUp = false;
 | 
				
			||||||
 | 
					    if (m_hw->bl_completeStart()) {
 | 
				
			||||||
 | 
					        int cnt = 5;
 | 
				
			||||||
 | 
					        while (--cnt > 0) {
 | 
				
			||||||
 | 
					            if (m_hw->bl_isUp()) {
 | 
				
			||||||
 | 
					                bl_isUp = true;
 | 
				
			||||||
 | 
					                break;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (!bl_isUp) {
 | 
				
			||||||
 | 
					        return false;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (!m_hw->bl_storeFirmware(fileToSendToDC)) {
 | 
				
			||||||
 | 
					        m_hw->bl_stopBL();
 | 
				
			||||||
 | 
					        return false;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    uint16_t const nrOfFirmwareBlocks = m_hw->bl_getNrOfFirmwareBlocks();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    for (uint16_t blockNr = 0; blockNr <= nrOfFirmwareBlocks; ++blockNr) {
 | 
				
			||||||
 | 
					        m_hw->bl_blockAutoLoad(blockNr);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        int sleepTime = 0;
 | 
				
			||||||
 | 
					        while (1) {
 | 
				
			||||||
 | 
					            if (sleepTime > 1500) {
 | 
				
			||||||
 | 
					                m_hw->bl_stopBL();
 | 
				
			||||||
 | 
					                return false;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            int8_t const r = m_hw->bl_blockAutoResponse();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            // after every "bl_blockAutoLoad()" call this until response
 | 
				
			||||||
 | 
					            // retval  0: wait   1: OK, blk was sent    2: OK, transfer complete
 | 
				
			||||||
 | 
					            //         3: error despite repeating, cancel. probably bin file corrupted
 | 
				
			||||||
 | 
					            //      Max duration: 3x no response from BL = 900ms
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            switch(r) {
 | 
				
			||||||
 | 
					            case 1:
 | 
				
			||||||
 | 
					            /* fall through */
 | 
				
			||||||
 | 
					            case 2:
 | 
				
			||||||
 | 
					                sleepTime = 0;
 | 
				
			||||||
 | 
					                break;
 | 
				
			||||||
 | 
					            case 0: {
 | 
				
			||||||
 | 
					                QThread::msleep(100);
 | 
				
			||||||
 | 
					                sleepTime += 100;
 | 
				
			||||||
 | 
					            } break;
 | 
				
			||||||
 | 
					            case 3:
 | 
				
			||||||
 | 
					                m_hw->bl_stopBL();
 | 
				
			||||||
 | 
					                return false;
 | 
				
			||||||
 | 
					            default:
 | 
				
			||||||
 | 
					                m_hw->bl_stopBL();
 | 
				
			||||||
 | 
					                return false; // unknown error code
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        m_hw->bl_stopBL();
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return true;
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					QString Update::jsonType(enum FileTypeJson type) {
 | 
				
			||||||
 | 
					    switch (type) {
 | 
				
			||||||
 | 
					    case FileTypeJson::CASH: return "CASH";
 | 
				
			||||||
 | 
					    case FileTypeJson::CONFIG: return "CONFIG";
 | 
				
			||||||
 | 
					    case FileTypeJson::PRINTER: return "PRINTER";
 | 
				
			||||||
 | 
					    case FileTypeJson::SERIAL: return "SERIAL";
 | 
				
			||||||
 | 
					    case FileTypeJson::DEVICE: return "DEVICE";
 | 
				
			||||||
 | 
					    case FileTypeJson::TIME: return "TIME";
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    return "N/A";
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					bool Update::downloadJson(enum FileTypeJson type,
 | 
				
			||||||
 | 
					                          int templateIdx,
 | 
				
			||||||
 | 
					                          QString jsFileToSendToDC) const {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    m_hw->dc_autoRequest(true); // downloading Json needs the AutoEmission flag
 | 
				
			||||||
 | 
					    qDebug() << "SET AUTO-REQUEST=TRUE";
 | 
				
			||||||
 | 
					    QThread::sleep(1);  // make sure the auto-request flag is acknowledged
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    bool ready = false;
 | 
				
			||||||
 | 
					    int nTry = 25;
 | 
				
			||||||
 | 
					    while ((ready = m_hw->sys_ready4sending()) == false) {
 | 
				
			||||||
 | 
					        QThread::msleep(200);
 | 
				
			||||||
 | 
					        if (--nTry <= 0) {
 | 
				
			||||||
 | 
					            Utils::printCriticalErrorMsg("SYS NOT READY FOR SENDING AFTER 5 SECONDS");
 | 
				
			||||||
 | 
					            break;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    bool ret = false;
 | 
				
			||||||
 | 
					    if (ready) {
 | 
				
			||||||
 | 
					        QFile file(jsFileToSendToDC);
 | 
				
			||||||
 | 
					        QFileInfo fi(jsFileToSendToDC); // max. size of template file is 800 bytes
 | 
				
			||||||
 | 
					        if (file.exists()) {
 | 
				
			||||||
 | 
					            if (file.open(QIODevice::ReadOnly)) {
 | 
				
			||||||
 | 
					                if (fi.size() > 0 && fi.size() <= 800) {
 | 
				
			||||||
 | 
					                    QByteArray ba = file.readAll();
 | 
				
			||||||
 | 
					                    // kindOfFile: 1=config, 2=device, 3=cash, 4=serial, 5=time, 6=printer
 | 
				
			||||||
 | 
					                    //      nrOfTemplate=1...32 if kindOfFile==6
 | 
				
			||||||
 | 
					                    //      content = content of the Json file, max 800byte ascii signs
 | 
				
			||||||
 | 
					                    if (m_hw->sys_sendJsonFileToDc((uint8_t)(type),
 | 
				
			||||||
 | 
					                                                   templateIdx,
 | 
				
			||||||
 | 
					                                                   (uint8_t *)ba.data())) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                        /*
 | 
				
			||||||
 | 
					                         *  Note: the machine id is contained in DC2C_conf.json.
 | 
				
			||||||
 | 
					                         *  The idea was to use this to check if the download of
 | 
				
			||||||
 | 
					                         *  the json-file was correct. It did not work, as the
 | 
				
			||||||
 | 
					                         *  update of the PSA (to reflect a change in the
 | 
				
			||||||
 | 
					                         *  machine id) did not happen immediately.
 | 
				
			||||||
 | 
					                         *
 | 
				
			||||||
 | 
					                            m_hw->dc_autoRequest(true);
 | 
				
			||||||
 | 
					                            QThread::msleep(500);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                            // testing
 | 
				
			||||||
 | 
					                            m_hw->request_ReadbackMachineID();
 | 
				
			||||||
 | 
					                            QThread::msleep(500);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                            uint8_t data[64];
 | 
				
			||||||
 | 
					                            memset(data, 0x00, sizeof(data));
 | 
				
			||||||
 | 
					                            uint8_t length = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                            m_hw->readback_machineIDdata(&length, data);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                            QThread::msleep(500);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                            QByteArray ba((const char*)data, length);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                            qCritical() << length << "MACHINE ID =" << ba.toHex(':');
 | 
				
			||||||
 | 
					                        */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                        ret = true;
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
                } else {
 | 
					                } else {
 | 
				
			||||||
            openLines << line;
 | 
					                    Utils::printCriticalErrorMsg(
 | 
				
			||||||
 | 
					                        QString("SIZE OF %1 TOO BIG (%2 BYTES)")
 | 
				
			||||||
 | 
					                            .arg(jsFileToSendToDC).arg(fi.size()));
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
 | 
					            } else {
 | 
				
			||||||
 | 
					                Utils::printCriticalErrorMsg(
 | 
				
			||||||
 | 
					                    QString("CAN NOT OPEN ") + jsFileToSendToDC + " FOR READING");
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        } else {
 | 
				
			||||||
 | 
					            Utils::printCriticalErrorMsg(
 | 
				
			||||||
 | 
					                QString(jsFileToSendToDC) + " DOES NOT EXIST");
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    return openLines;
 | 
					 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
QStringList Update::split(QString line) {
 | 
					    m_hw->dc_autoRequest(false);
 | 
				
			||||||
 | 
					    qDebug() << "SET AUTO-REQUEST=FALSE";
 | 
				
			||||||
 | 
					    QThread::sleep(1);  // make sure the auto-request flag is acknowledged
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return ret;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					bool Update::updatePrinterTemplate(int templateIdx, QString jsFile) const {
 | 
				
			||||||
 | 
					    return downloadJson(FileTypeJson::PRINTER, templateIdx, jsFile);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					bool Update::updateConfig(QString jsFile) {
 | 
				
			||||||
 | 
					    return downloadJson(FileTypeJson::CONFIG, 0, jsFile);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					bool Update::updateCashConf(QString jsFile) {
 | 
				
			||||||
 | 
					    return downloadJson(FileTypeJson::CASH, 0, jsFile);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					bool Update::updateDeviceConf(QString jsFile) {
 | 
				
			||||||
 | 
					    return downloadJson(FileTypeJson::DEVICE, 0, jsFile);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					QStringList Update::split(QString line, QChar sep) {
 | 
				
			||||||
    QStringList lst;
 | 
					    QStringList lst;
 | 
				
			||||||
    QString next;
 | 
					    QString next;
 | 
				
			||||||
    int start = 0, end;
 | 
					    int start = 0, end;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    while ((end = line.indexOf(QChar(','), start)) != -1) {
 | 
					    while ((end = line.indexOf(sep, start)) != -1) {
 | 
				
			||||||
        next = line.mid(start, end - start).trimmed();
 | 
					        next = line.mid(start, end - start).trimmed();
 | 
				
			||||||
        lst << next;
 | 
					        lst << next;
 | 
				
			||||||
        start = end + 1;
 | 
					        start = end + 1;
 | 
				
			||||||
@@ -143,123 +506,309 @@ QStringList Update::split(QString line) {
 | 
				
			|||||||
    return lst;
 | 
					    return lst;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
bool Update::doUpdate() {
 | 
					void Update::readyReadStandardOutput() {
 | 
				
			||||||
    /*
 | 
					    QProcess *p = (QProcess *)sender();
 | 
				
			||||||
        The file referred to by 'update_data' has the following structure for
 | 
					    QByteArray buf = p->readAllStandardOutput();
 | 
				
			||||||
        each line:
 | 
					    qCritical() << buf;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        # ======================================================================
 | 
					void Update::readyReadStandardError() {
 | 
				
			||||||
        # REQUEST    |  NAME  |   DATE  |  RESULT
 | 
					    QProcess *p = (QProcess *)sender();
 | 
				
			||||||
        # ======================================================================
 | 
					    QByteArray buf = p->readAllStandardError();
 | 
				
			||||||
        # where
 | 
					    qCritical() << buf;
 | 
				
			||||||
        #
 | 
					}
 | 
				
			||||||
        # STATUS: DOWNLOAD, EXECUTE or DONE
 | 
					
 | 
				
			||||||
        # NAME  : If starting with 'opkg' it is an opkg-command to be executed.
 | 
					void Update::finished(int /*exitCode*/, QProcess::ExitStatus /*exitStatus*/) {
 | 
				
			||||||
        #         Otherwise its the name of a file which has to be updated.
 | 
					    QProcess *p = (QProcess *)sender();
 | 
				
			||||||
        # DATE  : 0000-00-00T00:00:00
 | 
					    disconnect(p, SIGNAL(finished(int,QProcess::ExitStatus)), this, SLOT(readyReadStandardOutput()));
 | 
				
			||||||
        # RESULT: SUCCESS or ERROR (possibly with description)
 | 
					    disconnect(p, SIGNAL(finished(int,QProcess::ExitStatus)), this, SLOT(readyReadStandardError()));
 | 
				
			||||||
        #
 | 
					}
 | 
				
			||||||
     */
 | 
					
 | 
				
			||||||
    if (!m_init) {
 | 
					QStringList Update::getDcSoftAndHardWareVersion() {
 | 
				
			||||||
 | 
					    m_hw->dc_autoRequest(true);
 | 
				
			||||||
 | 
					    QThread::sleep(1); // make sure the timer-slots are active
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    for (int i=0; i < 3; ++i) { // send explicit reuests to get
 | 
				
			||||||
 | 
					                                // current SW/HW-versions
 | 
				
			||||||
 | 
					        m_hw->request_DC2_SWversion();
 | 
				
			||||||
 | 
					        m_hw->request_DC2_HWversion();
 | 
				
			||||||
 | 
					        QThread::sleep(1);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    QString const &hwVersion = m_hw->dc_getHWversion().toLower().trimmed();
 | 
				
			||||||
 | 
					    QString const &swVersion = m_hw->dc_getSWversion().toLower().trimmed();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    m_hw->dc_autoRequest(false);
 | 
				
			||||||
 | 
					    QThread::sleep(1); // make sure the timer-slots are inactive
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (!hwVersion.isEmpty() && !swVersion.isEmpty()) {
 | 
				
			||||||
 | 
					        return QStringList() << hwVersion << swVersion;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return QStringList() << "DC HW-version not available"
 | 
				
			||||||
 | 
					                         << "DC SW-version not available";
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					QString Update::getFileVersion(QString const& jsonFileName) {
 | 
				
			||||||
 | 
					    // "version":"15.10.2023 14:55 02.00.06",
 | 
				
			||||||
 | 
					    static const QRegularExpression re("^.*(\\\"version\\\":)(.*)$");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    QString fileVersion;
 | 
				
			||||||
 | 
					    QFile inputFile(jsonFileName);
 | 
				
			||||||
 | 
					    if (inputFile.open(QIODevice::ReadOnly)) {
 | 
				
			||||||
 | 
					       QTextStream in(&inputFile);
 | 
				
			||||||
 | 
					       while (!in.atEnd()) {
 | 
				
			||||||
 | 
					          QString line = in.readLine();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					          QRegularExpressionMatch match;
 | 
				
			||||||
 | 
					          int idx = line.indexOf(re, 0, &match);
 | 
				
			||||||
 | 
					          if (idx != -1) {
 | 
				
			||||||
 | 
					              fileVersion = match.captured(match.lastCapturedIndex());
 | 
				
			||||||
 | 
					              break;
 | 
				
			||||||
 | 
					          }
 | 
				
			||||||
 | 
					       }
 | 
				
			||||||
 | 
					       inputFile.close();
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return fileVersion;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					bool Update::checkDownloadedJsonVersions(QStringList const& jsonFileNames) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    for (QStringList::size_type i=0; i < jsonFileNames.size(); ++i) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        uint8_t jsonNr = 0;
 | 
				
			||||||
 | 
					        QFileInfo fInfo(jsonFileNames[i]);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if (fInfo.fileName().endsWith("conf.json")) {
 | 
				
			||||||
 | 
					            jsonNr = 1;
 | 
				
			||||||
 | 
					        } else
 | 
				
			||||||
 | 
					        if (fInfo.fileName().endsWith("device.json")) {
 | 
				
			||||||
 | 
					            jsonNr = 2;
 | 
				
			||||||
 | 
					        } else
 | 
				
			||||||
 | 
					        if (fInfo.fileName().endsWith("cash.json")) {
 | 
				
			||||||
 | 
					            jsonNr = 3;
 | 
				
			||||||
 | 
					        } else {
 | 
				
			||||||
 | 
					            QRegularExpressionMatch match;
 | 
				
			||||||
 | 
					            static const QRegularExpression re("^(.*print)([0-3][0-9])\\.json\\s*$");
 | 
				
			||||||
 | 
					            int idx = fInfo.fileName().indexOf(re, 0, &match);
 | 
				
			||||||
 | 
					            if (idx != -1) {
 | 
				
			||||||
 | 
					                QString captured = match.captured(match.lastCapturedIndex());
 | 
				
			||||||
 | 
					                bool ok = false;
 | 
				
			||||||
 | 
					                int n = captured.toInt(&ok);
 | 
				
			||||||
 | 
					                if (ok) {
 | 
				
			||||||
 | 
					                    jsonNr = n + 4;
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if (jsonNr != 0) {
 | 
				
			||||||
 | 
					#if 0
 | 
				
			||||||
 | 
					            m_hw->sys_requestJsonVersions(jsonNr);
 | 
				
			||||||
 | 
					            QThread::msleep(500);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            char buf[64];
 | 
				
			||||||
 | 
					            memset(buf, 0x00, sizeof(buf));
 | 
				
			||||||
 | 
					            m_hw->sys_getJsonVersions(jsonNr, buf);
 | 
				
			||||||
 | 
					            buf[sizeof(buf)-1] = '\0';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            QString const installedVersion(buf);
 | 
				
			||||||
 | 
					            QString const fileVersion = getFileVersion(jsonFileNames[i]);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            qCritical() << "installed version:" << installedVersion;
 | 
				
			||||||
 | 
					            qCritical() << "     file version:" << fileVersion;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            if (installedVersion == fileVersion) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        } else {
 | 
				
			||||||
 | 
					            qCritical() << "CANNOT FIND JSON-NR FOR" << jsonFileNames[i];
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return false;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					bool Update::doUpdate(int &displayIndex, QStringList const &filesToWorkOn) {
 | 
				
			||||||
 | 
					    if (m_sys_areDCdataValid == false) {
 | 
				
			||||||
 | 
					        qCritical() << "ERROR!!! DC DATA NOT VALID -> CA-MASTER-PLUGIN NOT CONNECTED";
 | 
				
			||||||
        return false;
 | 
					        return false;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    QStringList openLines = getOpenLines();
 | 
					    bool res = false;
 | 
				
			||||||
 | 
					    bool dcDownloadPossible = true;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    QList<QString>::const_iterator it;
 | 
					    QList<QString>::const_iterator it;
 | 
				
			||||||
    for (it = openLines.cbegin(); it != openLines.cend(); ++it) {
 | 
					    for (it = filesToWorkOn.cbegin(); it != filesToWorkOn.cend(); ++it) {
 | 
				
			||||||
        bool res = false;
 | 
					        m_worker->startProgressLoop();
 | 
				
			||||||
        QString line = (*it).trimmed();
 | 
					        QString const &fToWorkOn = QDir::cleanPath(m_customerRepository + QDir::separator() + it->trimmed());
 | 
				
			||||||
        if (line.size() == 0 || line.startsWith(QChar('#'))) {
 | 
					        if (fToWorkOn.endsWith("/dc2c.bin") && dcDownloadPossible) {
 | 
				
			||||||
 | 
					            // download for dc possible only once
 | 
				
			||||||
 | 
					            // download of device-controller should always be the last step
 | 
				
			||||||
 | 
					            dcDownloadPossible = false;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            if (!m_hw->dcDownloadRequest(fToWorkOn)) {  // initiate download process
 | 
				
			||||||
 | 
					                qCritical() << "DOWNLOAD-REQUEST-ERROR FOR" << fToWorkOn;
 | 
				
			||||||
                continue;
 | 
					                continue;
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        QStringList lst = split(line.trimmed());
 | 
					
 | 
				
			||||||
        if (lst.size() != 4) {
 | 
					            QThread::sleep(2);
 | 
				
			||||||
            qCritical() << "Parsing error for" << m_update_ctrl_file.fileName();
 | 
					
 | 
				
			||||||
            return false;
 | 
					            int tries = 5;
 | 
				
			||||||
 | 
					            while (!m_hw->dcDownloadRunning()) { // may take some time
 | 
				
			||||||
 | 
					                if (--tries < 0) {
 | 
				
			||||||
 | 
					                    qCritical() << QDateTime::currentDateTime().toString(Qt::ISODate)
 | 
				
			||||||
 | 
					                                << "(" << __func__ << ":" << __LINE__ << ") DOWNLOAD NOT RUNNING";
 | 
				
			||||||
 | 
					                    break;
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
        QString const &request = lst[COLUMN_REQUEST];
 | 
					                QThread::sleep(1);
 | 
				
			||||||
        QString const &name = lst[COLUMN_NAME];
 | 
					                continue;
 | 
				
			||||||
        // QString const &datetime = lst[COLUMN_DATE_TIME];
 | 
					 | 
				
			||||||
        QString const &result = lst[COLUMN_RESULT];
 | 
					 | 
				
			||||||
        if ((!request.contains("DOWNLOAD") && !request.contains("EXECUTE")) ||
 | 
					 | 
				
			||||||
            !result.contains("N/A")) {
 | 
					 | 
				
			||||||
            qCritical() << "Parsing error for" << m_update_ctrl_file.fileName();
 | 
					 | 
				
			||||||
            return false;
 | 
					 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        if (name.contains("dc2c") && name.endsWith(".bin")) {
 | 
					
 | 
				
			||||||
            if ((res = updateBinary(name.toStdString().c_str())) == true) {
 | 
					            qCritical() << QDateTime::currentDateTime().toString(Qt::ISODate)
 | 
				
			||||||
                qInfo() << "Downloaded" << name;
 | 
					                        << "(" << __func__ << ":" << __LINE__ << ") DOWNLOAD RUNNING";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            QThread::sleep(2);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            tries = 5;
 | 
				
			||||||
 | 
					            while (!m_hw->dcDownloadReportThreadStart()) { // may take some time
 | 
				
			||||||
 | 
					                if (--tries < 0) {
 | 
				
			||||||
 | 
					                    qCritical() << QDateTime::currentDateTime().toString(Qt::ISODate)
 | 
				
			||||||
 | 
					                                << "(" << __func__ << ":" << __LINE__ << ") REPORT THREAD NOT STARTED";
 | 
				
			||||||
 | 
					                    break;
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
        } else
 | 
					                continue;
 | 
				
			||||||
        if (name.contains("DC2C_print") && name.endsWith(".json")) {
 | 
					 | 
				
			||||||
            int i = name.indexOf("DC2C_print");
 | 
					 | 
				
			||||||
            int templateIdx = name.mid(i).midRef(10, 2).toInt();
 | 
					 | 
				
			||||||
            if ((res = updatePrinterConf(templateIdx, name.toStdString().c_str())) == true) {
 | 
					 | 
				
			||||||
                qInfo() << "Downloaded" << name;
 | 
					 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        } else
 | 
					
 | 
				
			||||||
        if (name.contains("tariff") && name.endsWith(".json")) {
 | 
					            qCritical() << QDateTime::currentDateTime().toString(Qt::ISODate)
 | 
				
			||||||
            int i = name.indexOf("tariff");
 | 
					                        << "(" << __func__ << ":" << __LINE__ << ") REPORT THREAD STARTED";
 | 
				
			||||||
            int templateIdx = name.mid(i).midRef(6, 2).toInt();
 | 
					
 | 
				
			||||||
            if ((res = updatePrinterConf(templateIdx, name.toStdString().c_str())) == true) {
 | 
					            QThread::sleep(2);
 | 
				
			||||||
                qInfo() << "Downloaded" << name;
 | 
					
 | 
				
			||||||
 | 
					            tries = 5;
 | 
				
			||||||
 | 
					            while (!m_hw->dcDownloadReportRunning()) {     // may take some time
 | 
				
			||||||
 | 
					                if (--tries < 0) {
 | 
				
			||||||
 | 
					                    qCritical() << QDateTime::currentDateTime().toString(Qt::ISODate)
 | 
				
			||||||
 | 
					                                << "(" << __func__ << ":" << __LINE__ << ") DOWNLOAD REPORT NOT RUNNING";
 | 
				
			||||||
 | 
					                    break;
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
        } else
 | 
					                continue;
 | 
				
			||||||
        if (name.contains("opkg")) {
 | 
					            }
 | 
				
			||||||
            int i = name.indexOf("opkg ");
 | 
					
 | 
				
			||||||
            QString rest = name.mid(i+5).trimmed();
 | 
					            qCritical() << QDateTime::currentDateTime().toString(Qt::ISODate)
 | 
				
			||||||
            QScopedPointer<QProcess> p(new QProcess(this));
 | 
					                        << "(" << __func__ << ":" << __LINE__ << ") DOWNLOAD REPORT RUNNING";
 | 
				
			||||||
            p->setProcessChannelMode(QProcess::MergedChannels);
 | 
					
 | 
				
			||||||
            p->start("opkg", QStringList() << rest);
 | 
					            tries = 1200;
 | 
				
			||||||
            if (p->waitForStarted(1000)) {
 | 
					            while (m_hw->dcDownloadReportRunning()) {
 | 
				
			||||||
                if (p->state() == QProcess::ProcessState::Running) {
 | 
					                QThread::msleep(1000);
 | 
				
			||||||
                    if (p->waitForFinished(10000)) {
 | 
					                if (--tries < 0) {
 | 
				
			||||||
                        QByteArray output = p->readAllStandardOutput();
 | 
					                    qCritical() << QDateTime::currentDateTime().toString(Qt::ISODate)
 | 
				
			||||||
                        qDebug() << output;
 | 
					                                << "(" << __func__ << ":" << __LINE__
 | 
				
			||||||
 | 
					                                << ") DOWNLOAD REPORT STILL RUNNING AFTER 20mins";
 | 
				
			||||||
 | 
					                    break;
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            bool updateBinaryRes = true;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            // CONSOLE()
 | 
				
			||||||
 | 
					#if 0
 | 
				
			||||||
 | 
					            m_hw->dc_autoRequest(false);// default: turn auto-request setting off
 | 
				
			||||||
 | 
					            QThread::sleep(1);          // wait to be sure that there are no more
 | 
				
			||||||
 | 
					                                        // commands sent to dc-hardware
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            if ((updateBinaryRes = updateBinary(fToWorkOn)) == true) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                // qCritical() << "downloaded binary" << fToWorkOn;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                ++displayIndex;
 | 
				
			||||||
 | 
					                emit m_worker->appendText(QString("\n(") + QString("%1").arg(displayIndex).rightJustified(2, ' ') + QString(")")
 | 
				
			||||||
 | 
					                    + QString(" Update ") + QFileInfo(fToWorkOn).fileName(),
 | 
				
			||||||
 | 
					                    Worker::UPDATE_STEP_DONE);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            m_hw->dc_autoRequest(true); // turn auto-request setting on
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            // qInfo() << "SET AUTO-REQUEST=TRUE";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            QStringList const &versions = Update::getDcSoftAndHardWareVersion();
 | 
				
			||||||
 | 
					            if (versions.size() >= 2) {
 | 
				
			||||||
 | 
					                if (updateBinaryRes == true) {
 | 
				
			||||||
 | 
					                    qInfo() << "dc-hardware-version (UPDATED)" << versions[0];
 | 
				
			||||||
 | 
					                    qInfo() << "dc-firmware-version (UPDATED)" << versions[1];
 | 
				
			||||||
 | 
					                } else {
 | 
				
			||||||
 | 
					                    qInfo() << "dc-hardware-version (NOT UPDATED)" << versions[0];
 | 
				
			||||||
 | 
					                    qInfo() << "dc-firmware-version (NOT UPDATED)" << versions[1];
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					            res = updateBinaryRes;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        } else if (fToWorkOn.contains("DC2C_print", Qt::CaseInsensitive)
 | 
				
			||||||
 | 
					                && fToWorkOn.endsWith(".json", Qt::CaseInsensitive)) {
 | 
				
			||||||
            res = true;
 | 
					            res = true;
 | 
				
			||||||
                        qInfo() << "EXECUTED" << name;
 | 
					            int i = fToWorkOn.indexOf("DC2C_print", Qt::CaseInsensitive);
 | 
				
			||||||
 | 
					            int const templateIdx = fToWorkOn.mid(i).midRef(10, 2).toInt();
 | 
				
			||||||
 | 
					            if ((templateIdx < 1) || (templateIdx > 32)) {
 | 
				
			||||||
 | 
					                qCritical() << "WRONG TEMPLATE INDEX" << templateIdx;
 | 
				
			||||||
 | 
					                res = false;
 | 
				
			||||||
 | 
					            } else {
 | 
				
			||||||
 | 
					                if ((res = updatePrinterTemplate(templateIdx, fToWorkOn))) {
 | 
				
			||||||
 | 
					                    Utils::printInfoMsg(
 | 
				
			||||||
 | 
					                        QString("DOWNLOADED PRINTER TEMPLATE %1 WITH INDEX=%2")
 | 
				
			||||||
 | 
					                            .arg(fToWorkOn)
 | 
				
			||||||
 | 
					                            .arg(templateIdx));
 | 
				
			||||||
 | 
					                    ++displayIndex;
 | 
				
			||||||
 | 
					                    emit m_worker->appendText(QString("\n(") + QString("%1").arg(displayIndex).rightJustified(3, ' ') + QString(")")
 | 
				
			||||||
 | 
					                          + QString(" Update ") + QFileInfo(fToWorkOn).fileName(),
 | 
				
			||||||
 | 
					                            Worker::UPDATE_STEP_DONE);
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
 | 
					        } else if (fToWorkOn.contains("DC2C_cash", Qt::CaseInsensitive)
 | 
				
			||||||
 | 
					                && fToWorkOn.endsWith(".json", Qt::CaseInsensitive)) {
 | 
				
			||||||
 | 
					            res = true;
 | 
				
			||||||
 | 
					            if ((res = updateCashConf(fToWorkOn))) {
 | 
				
			||||||
 | 
					                Utils::printInfoMsg(QString("DOWNLOADED CASH TEMPLATE %1").arg(fToWorkOn));
 | 
				
			||||||
 | 
					                ++displayIndex;
 | 
				
			||||||
 | 
					                emit m_worker->appendText(QString("\n(") + QString("%1").arg(displayIndex).rightJustified(3, ' ') + QString(")")
 | 
				
			||||||
 | 
					                      + QString(" Update ") + QFileInfo(fToWorkOn).fileName(),
 | 
				
			||||||
 | 
					                        Worker::UPDATE_STEP_DONE);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        } else if (fToWorkOn.contains("DC2C_conf", Qt::CaseInsensitive)
 | 
				
			||||||
 | 
					                && fToWorkOn.endsWith(".json", Qt::CaseInsensitive)) {
 | 
				
			||||||
 | 
					            res = true;
 | 
				
			||||||
 | 
					            if ((res= updateConfig(fToWorkOn))) {
 | 
				
			||||||
 | 
					                Utils::printInfoMsg(QString("DOWNLOADED CONFIG TEMPLATE %1").arg(fToWorkOn));
 | 
				
			||||||
 | 
					                ++displayIndex;
 | 
				
			||||||
 | 
					                emit m_worker->appendText(QString("\n(") + QString("%1").arg(displayIndex).rightJustified(3, ' ') + QString(")")
 | 
				
			||||||
 | 
					                      + QString(" Update ") + QFileInfo(fToWorkOn).fileName(),
 | 
				
			||||||
 | 
					                        Worker::UPDATE_STEP_DONE);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        } else if (fToWorkOn.contains("DC2C_device", Qt::CaseInsensitive)
 | 
				
			||||||
 | 
					                && fToWorkOn.endsWith(".json", Qt::CaseInsensitive)) {
 | 
				
			||||||
 | 
					            res = true;
 | 
				
			||||||
 | 
					            if ((res = updateDeviceConf(fToWorkOn))) {
 | 
				
			||||||
 | 
					                Utils::printInfoMsg(QString("DOWNLOADED DEVICE TEMPLATE %1").arg(fToWorkOn));
 | 
				
			||||||
 | 
					                ++displayIndex;
 | 
				
			||||||
 | 
					                emit m_worker->appendText(QString("\n(") + QString("%1").arg(displayIndex).rightJustified(3, ' ') + QString(")")
 | 
				
			||||||
 | 
					                      + QString(" Update ") + QFileInfo(fToWorkOn).fileName(),
 | 
				
			||||||
 | 
					                        Worker::UPDATE_STEP_DONE);
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        } else {
 | 
					        } else {
 | 
				
			||||||
            // TODO
 | 
					            qCritical() << "UNKNOWN JSON FILE NAME" << fToWorkOn;
 | 
				
			||||||
 | 
					            res = false;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        char buf[80];
 | 
					        // m_worker->stopProgressLoop();
 | 
				
			||||||
        int const bytesWritten =
 | 
					        // m_worker->setProgress(100);
 | 
				
			||||||
            snprintf(buf, sizeof(buf)-1, "DONE, %*.*s, %*.*s, %*.*s\n",
 | 
					
 | 
				
			||||||
                 35, 35, name.toStdString().c_str(),
 | 
					        if (res == false) {
 | 
				
			||||||
                 20, 20, QDateTime::currentDateTime().toString(Qt::ISODate).toStdString().c_str(),
 | 
					            break;
 | 
				
			||||||
                 10, 10, (res == true) ? "SUCCESS" : "ERROR");
 | 
					 | 
				
			||||||
        if (bytesWritten < 80) {
 | 
					 | 
				
			||||||
            buf[bytesWritten] = '\0';
 | 
					 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        m_update_ctrl_file_copy.write(buf);
 | 
					 | 
				
			||||||
    } // for (it = openLines.cbegin(); it != openLines.end(); ++it) {
 | 
					    } // for (it = openLines.cbegin(); it != openLines.end(); ++it) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return finishUpdate(openLines.size() > 0);
 | 
					    m_hw->dc_autoRequest(true);  // ALWAYS turn autoRequest ON
 | 
				
			||||||
}
 | 
					    qDebug() << "SET AUTO-REQUEST=TRUE";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
bool Update::finishUpdate(bool swapCtrlFiles) {
 | 
					    return res;
 | 
				
			||||||
    if (swapCtrlFiles) {
 | 
					 | 
				
			||||||
        m_update_ctrl_file.close();
 | 
					 | 
				
			||||||
        m_update_ctrl_file_copy.close();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        QString const &fn = m_update_ctrl_file.fileName();
 | 
					 | 
				
			||||||
        QString const &fn_tmp = m_update_ctrl_file.fileName() + ".tmp";
 | 
					 | 
				
			||||||
        QString const &fn_copy = m_update_ctrl_file_copy.fileName();
 | 
					 | 
				
			||||||
        QFile tmp(fn_tmp);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        if (tmp.exists()) {
 | 
					 | 
				
			||||||
            tmp.remove();
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        if (m_update_ctrl_file.rename(fn_tmp)) {
 | 
					 | 
				
			||||||
            if (m_update_ctrl_file_copy.rename(fn)) {
 | 
					 | 
				
			||||||
                return m_update_ctrl_file.rename(fn_copy);
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
        return false;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    return true;
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										98
									
								
								update.h
									
									
									
									
									
								
							
							
						
						
									
										98
									
								
								update.h
									
									
									
									
									
								
							@@ -4,9 +4,12 @@
 | 
				
			|||||||
#include <QObject>
 | 
					#include <QObject>
 | 
				
			||||||
#include <QString>
 | 
					#include <QString>
 | 
				
			||||||
#include <QFile>
 | 
					#include <QFile>
 | 
				
			||||||
 | 
					#include <QDir>
 | 
				
			||||||
 | 
					#include <QByteArray>
 | 
				
			||||||
 | 
					#include <QProcess>
 | 
				
			||||||
 | 
					#include <QPluginLoader>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "interfaces.h"
 | 
					#include "plugins/interfaces.h"
 | 
				
			||||||
#include "DCPlugin/include/hwapi.h"
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef PTU5
 | 
					#ifdef PTU5
 | 
				
			||||||
#define SERIAL_PORT "ttymxc2"
 | 
					#define SERIAL_PORT "ttymxc2"
 | 
				
			||||||
@@ -14,44 +17,85 @@
 | 
				
			|||||||
#define SERIAL_PORT "ttyUSB0"
 | 
					#define SERIAL_PORT "ttyUSB0"
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class Update;
 | 
					class Worker;
 | 
				
			||||||
struct ScopedPointerCustomDeleter {
 | 
					 | 
				
			||||||
    static void cleanup(Update *pointer);
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// TODO: check hardware compatibility
 | 
					 | 
				
			||||||
// TODO: opkg commandos
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
class Update : public QObject {
 | 
					class Update : public QObject {
 | 
				
			||||||
    Q_OBJECT
 | 
					    Q_OBJECT
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    QScopedPointer<hwinf> m_hw;
 | 
					    hwinf *m_hw = nullptr;
 | 
				
			||||||
 | 
					    Worker *m_worker = nullptr;
 | 
				
			||||||
    char const *m_serialInterface;
 | 
					    char const *m_serialInterface;
 | 
				
			||||||
    char const *m_baudrate;
 | 
					    char const *m_baudrate;
 | 
				
			||||||
    QFile m_update_ctrl_file;
 | 
					    QString m_customerRepository;
 | 
				
			||||||
    QFile m_update_ctrl_file_copy;
 | 
					    QString m_customerNrStr;
 | 
				
			||||||
 | 
					    QString m_branchName;
 | 
				
			||||||
 | 
					    QString m_pluginName;
 | 
				
			||||||
    QString m_workingDir;
 | 
					    QString m_workingDir;
 | 
				
			||||||
 | 
					    bool m_maintenanceMode;
 | 
				
			||||||
 | 
					    bool m_dryRun;
 | 
				
			||||||
 | 
					    bool m_sys_areDCdataValid;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    bool m_init;
 | 
					    static QPluginLoader pluginLoader;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    bool updateBinary(char const *fileToSendToDC);
 | 
					 | 
				
			||||||
    bool updatePrinterConf(int nrOfTemplate, char const *fileToSendToDC);
 | 
					 | 
				
			||||||
    bool finishUpdate(bool finish);
 | 
					 | 
				
			||||||
    QStringList getOpenLines();
 | 
					 | 
				
			||||||
    QStringList split(QString line);
 | 
					 | 
				
			||||||
    static constexpr QChar SEPARATOR = QChar(',');
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    bool execUpdateScript();
 | 
					 | 
				
			||||||
public:
 | 
					public:
 | 
				
			||||||
    explicit Update(QString update_ctrl_file,
 | 
					    enum class DownloadResult {OK, ERROR, TIMEOUT, NOP};
 | 
				
			||||||
                    QString workingDir = ".",
 | 
					    enum class FileTypeJson {CONFIG=1, DEVICE=2, CASH=3, SERIAL=4, TIME=5, PRINTER=6};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    static hwinf *loadDCPlugin(QDir const &plugInDir, QString const &fn);
 | 
				
			||||||
 | 
					    static bool unloadDCPlugin();
 | 
				
			||||||
 | 
					    static QStringList split(QString line, QChar sep = ',');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    explicit Update(Worker *worker,
 | 
				
			||||||
 | 
					                    QString customerRepository,
 | 
				
			||||||
 | 
					                    QString customerNrStr,
 | 
				
			||||||
 | 
					                    QString branchName,
 | 
				
			||||||
 | 
					                    QString plugInDir,
 | 
				
			||||||
 | 
					                    QString pluginName,
 | 
				
			||||||
 | 
					                    QString workingDir,
 | 
				
			||||||
 | 
					                    bool dryRun = false,
 | 
				
			||||||
                    QObject *parent = nullptr,
 | 
					                    QObject *parent = nullptr,
 | 
				
			||||||
                    hwinf *hw = nullptr,
 | 
					 | 
				
			||||||
                    char const *serialInterface = SERIAL_PORT,
 | 
					                    char const *serialInterface = SERIAL_PORT,
 | 
				
			||||||
                    char const *baudrate = "115200");
 | 
					                    char const *baudrate = "115200");
 | 
				
			||||||
    virtual ~Update() override;
 | 
					    virtual ~Update() override;
 | 
				
			||||||
    bool doUpdate();
 | 
					    bool doUpdate(int &displayIndex, QStringList const &linesToWorkOn);
 | 
				
			||||||
 | 
					    bool checkDownloadedJsonVersions(QStringList const& jsonFileNames);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    bool const m_delete;
 | 
					    hwinf *hw() { return m_hw; }
 | 
				
			||||||
 | 
					    hwinf const *hw() const { return m_hw; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    //QString customerId() { return m_customerId; }
 | 
				
			||||||
 | 
					    //QString const customerId() const { return m_customerId; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    QString branchName() { return m_branchName; }
 | 
				
			||||||
 | 
					    QString const branchName() const { return m_branchName; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    //QString repositoryPath() { return m_repositoryPath; }
 | 
				
			||||||
 | 
					    //QString const repositoryPath() const { return m_repositoryPath; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					private:
 | 
				
			||||||
 | 
					    static QString jsonType(enum FileTypeJson type);
 | 
				
			||||||
 | 
					    bool openSerial(int br, QString baudrate, QString comPort) const;
 | 
				
			||||||
 | 
					    void closeSerial() const;
 | 
				
			||||||
 | 
					    bool isSerialOpen() const;
 | 
				
			||||||
 | 
					    bool resetDeviceController() const;
 | 
				
			||||||
 | 
					    QByteArray loadBinaryDCFile(QString filename) const;
 | 
				
			||||||
 | 
					    bool downloadBinaryToDC(QString const &bFile) const;
 | 
				
			||||||
 | 
					    bool updatePrinterTemplate(int templateIdx, QString fname) const;
 | 
				
			||||||
 | 
					    bool updateBinary(QString const &fileToSendToDC);
 | 
				
			||||||
 | 
					    bool updateConfig(QString jsFileToSendToDC);
 | 
				
			||||||
 | 
					    bool updateCashConf(QString jsFileToSendToDC);
 | 
				
			||||||
 | 
					    bool updateDeviceConf(QString jsFileToSendToDC);
 | 
				
			||||||
 | 
					    bool downloadJson(enum FileTypeJson type, int templateIdx,
 | 
				
			||||||
 | 
					                      QString jsFileToSendToDC) const;
 | 
				
			||||||
 | 
					    QStringList getDcSoftAndHardWareVersion();
 | 
				
			||||||
 | 
					    QString getFileVersion(QString const& jsonFile);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					private slots:
 | 
				
			||||||
 | 
					    void readyReadStandardOutput();
 | 
				
			||||||
 | 
					    void readyReadStandardError();
 | 
				
			||||||
 | 
					    void finished(int exitCode, QProcess::ExitStatus exitStatus);
 | 
				
			||||||
 | 
					    void onReportDCDownloadStatus(QString const &status);
 | 
				
			||||||
 | 
					    void onReportDCDownloadSuccess(QString const &msg);
 | 
				
			||||||
 | 
					    void onReportDCDownloadFailure(QString const &errorMsg);
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
#endif // UPDATE_H_INCLUDED
 | 
					#endif // UPDATE_H_INCLUDED
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										25
									
								
								update_dc_event.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										25
									
								
								update_dc_event.cpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,25 @@
 | 
				
			|||||||
 | 
					#include "update_dc_event.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					QEvent::Type UpdateDcEvent::customEventType = QEvent::None;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					UpdateDcEvent::UpdateDcEvent(QObject const *sender,
 | 
				
			||||||
 | 
					                             UpdateStep updateStep,
 | 
				
			||||||
 | 
					                             int count,
 | 
				
			||||||
 | 
					                             QDateTime const &sendDateTime)
 | 
				
			||||||
 | 
					    : QEvent(UpdateDcEvent::type())
 | 
				
			||||||
 | 
					    , m_sender(sender)
 | 
				
			||||||
 | 
					    , m_updateStep(updateStep)
 | 
				
			||||||
 | 
					    , m_count(count)
 | 
				
			||||||
 | 
					    , m_sendDateTime(sendDateTime) {
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					UpdateDcEvent::~UpdateDcEvent() {
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					QEvent::Type UpdateDcEvent::type() {
 | 
				
			||||||
 | 
					    if (customEventType == QEvent::None) {
 | 
				
			||||||
 | 
					        int generatedType = QEvent::registerEventType();
 | 
				
			||||||
 | 
					        customEventType = static_cast<QEvent::Type>(generatedType);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    return customEventType;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										40
									
								
								update_dc_event.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										40
									
								
								update_dc_event.h
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,40 @@
 | 
				
			|||||||
 | 
					#ifndef UPDATE_DC_EVENT_H_INCLUDED
 | 
				
			||||||
 | 
					#define UPDATE_DC_EVENT_H_INCLUDED
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <QEvent>
 | 
				
			||||||
 | 
					#include <QDateTime>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class UpdateDcEvent : public QEvent {
 | 
				
			||||||
 | 
					public:
 | 
				
			||||||
 | 
					    enum UpdateStep { NONE, DC_REBOOT, BL_START, BL_CHECK, BL_CHECK_AFTER_STOP, BL_IS_UP, BL_IS_DOWN, BL_STOP};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					private:
 | 
				
			||||||
 | 
					    QObject const *m_sender;
 | 
				
			||||||
 | 
					    UpdateStep m_updateStep;
 | 
				
			||||||
 | 
					    int m_count;
 | 
				
			||||||
 | 
					    QDateTime m_sendDateTime;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					public:
 | 
				
			||||||
 | 
					    explicit UpdateDcEvent(QObject const *sender, UpdateStep updateStep,
 | 
				
			||||||
 | 
					                           int count,
 | 
				
			||||||
 | 
					                           QDateTime const &sendDateTime = QDateTime::currentDateTime());
 | 
				
			||||||
 | 
					    virtual ~UpdateDcEvent();
 | 
				
			||||||
 | 
					    static QEvent::Type type();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    QObject const *sender() { return m_sender; }
 | 
				
			||||||
 | 
					    QObject const *sender() const { return m_sender; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    void setUpdateStep(UpdateStep updateStep) { m_updateStep = updateStep; }
 | 
				
			||||||
 | 
					    UpdateStep updateStep() { return m_updateStep; }
 | 
				
			||||||
 | 
					    UpdateStep updateStep() const { return m_updateStep; }
 | 
				
			||||||
 | 
					    int count() const { return m_count; }
 | 
				
			||||||
 | 
					    void setCount(int count) { m_count = count; }
 | 
				
			||||||
 | 
					    QDateTime &sendDateTime() { return m_sendDateTime; }
 | 
				
			||||||
 | 
					    QDateTime const &sendDateTime() const { return m_sendDateTime; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					private:
 | 
				
			||||||
 | 
					    static QEvent::Type customEventType;
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#endif // PROGRESS_EVENT_H_INCLUDED
 | 
				
			||||||
							
								
								
									
										509
									
								
								utils.cpp
									
									
									
									
									
								
							
							
						
						
									
										509
									
								
								utils.cpp
									
									
									
									
									
								
							@@ -1,201 +1,380 @@
 | 
				
			|||||||
#include "utils.h"
 | 
					#include "utils.h"
 | 
				
			||||||
 | 
					#include "message_handler.h"
 | 
				
			||||||
 | 
					#include "git/git_client.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#if defined (Q_OS_UNIX) || defined (Q_OS_LINUX)
 | 
				
			||||||
 | 
					#include "unistd.h"
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <QCoreApplication>
 | 
					 | 
				
			||||||
#include <QApplication>
 | 
					 | 
				
			||||||
#include <QFile>
 | 
					#include <QFile>
 | 
				
			||||||
#include <QTemporaryFile>
 | 
					 | 
				
			||||||
#include <QDebug>
 | 
					 | 
				
			||||||
#include <QTextStream>
 | 
					#include <QTextStream>
 | 
				
			||||||
 | 
					#include <QDebug>
 | 
				
			||||||
 | 
					#include <QDir>
 | 
				
			||||||
 | 
					#include <QDirIterator>
 | 
				
			||||||
 | 
					#include <QRegularExpression>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "interfaces.h"
 | 
					#include <fstream>
 | 
				
			||||||
#include "DCPlugin/include/hwapi.h"
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
//#include <unistd.h>
 | 
					int Utils::read1stLineOfFile(QString fileName) {
 | 
				
			||||||
#include <thread>
 | 
					    QFile f(fileName);
 | 
				
			||||||
#include <memory>
 | 
					    if (f.exists()) {
 | 
				
			||||||
#include <QSharedMemory>
 | 
					        if (f.open(QIODevice::ReadOnly | QIODevice::Text)) {
 | 
				
			||||||
#include <QScopedPointer>
 | 
					            QTextStream in(&f);
 | 
				
			||||||
#include <QProcess>
 | 
					            in.setCodec("UTF-8");
 | 
				
			||||||
 | 
					            while(!in.atEnd()) {
 | 
				
			||||||
#define COLUMN_STATUS       (0)
 | 
					                return in.readLine().toInt();
 | 
				
			||||||
#define COLUMN_NAME         (1)
 | 
					            }
 | 
				
			||||||
#define COLUMN_DATE_TIME    (2)
 | 
					        }
 | 
				
			||||||
#define COLUMN_RESULT       (3)
 | 
					    }
 | 
				
			||||||
 | 
					    return -1;
 | 
				
			||||||
Utils::Utils(QString update_ctrl_file,
 | 
					}
 | 
				
			||||||
             QObject *parent,
 | 
					
 | 
				
			||||||
             char const *serialInterface,
 | 
					QString Utils::getLocation(QString fileName) {
 | 
				
			||||||
             char const *baudrate)
 | 
					    QString location("N/A");
 | 
				
			||||||
    : QObject(parent)
 | 
					    QFile f(fileName);
 | 
				
			||||||
    , m_hw(new hwapi())
 | 
					    if (f.exists()) {
 | 
				
			||||||
    , m_serialInterface(serialInterface)
 | 
					        if (f.open(QIODevice::ReadOnly | QIODevice::Text)) {
 | 
				
			||||||
    , m_baudrate(baudrate)
 | 
					            QTextStream in(&f);
 | 
				
			||||||
    , m_update_ctrl_file(update_ctrl_file)
 | 
					            in.setCodec("UTF-8");
 | 
				
			||||||
    , m_update_ctrl_file_copy(update_ctrl_file + ".copy")
 | 
					            while(!in.atEnd()) {
 | 
				
			||||||
    , m_in(&m_update_ctrl_file)
 | 
					                QString const &line = in.readLine();
 | 
				
			||||||
    , m_out(&m_update_ctrl_file_copy)
 | 
					                if (line.indexOf("Project", Qt::CaseInsensitive) != -1) {
 | 
				
			||||||
    , m_init(true) {
 | 
					                    int const c = line.indexOf(":");
 | 
				
			||||||
 | 
					                    if (c != -1) {
 | 
				
			||||||
    if (!m_update_ctrl_file.exists()) {
 | 
					                        location = line.mid(c+1);
 | 
				
			||||||
        qCritical() << "Update-file" << m_update_ctrl_file.fileName()
 | 
					                        if (!location.isEmpty()) {
 | 
				
			||||||
                    << "does not exist";
 | 
					                            return location.replace(QChar('"'), QString("")).trimmed();
 | 
				
			||||||
        m_init = false;
 | 
					                        }
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
    if (!m_update_ctrl_file.open(QIODevice::ReadOnly | QIODevice::Text)) {
 | 
					 | 
				
			||||||
        qCritical() << "can not open " << m_update_ctrl_file.fileName()
 | 
					 | 
				
			||||||
                    << "for reading";
 | 
					 | 
				
			||||||
        m_init = false;
 | 
					 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
    if (!m_update_ctrl_file_copy.open(QIODevice::WriteOnly | QIODevice::Text)) {
 | 
					 | 
				
			||||||
        qCritical() << "can not open " << m_update_ctrl_file_copy.fileName()
 | 
					 | 
				
			||||||
                    << "for writing";
 | 
					 | 
				
			||||||
        m_init = false;
 | 
					 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Utils::~Utils() {
 | 
					    return location;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					QString Utils::getTariffVersion(QString fileName) {
 | 
				
			||||||
 | 
					    QString version("N/A");
 | 
				
			||||||
 | 
					    QFile f(fileName);
 | 
				
			||||||
 | 
					    if (f.exists()) {
 | 
				
			||||||
 | 
					        if (f.open(QIODevice::ReadOnly | QIODevice::Text)) {
 | 
				
			||||||
 | 
					            QTextStream in(&f);
 | 
				
			||||||
 | 
					            in.setCodec("UTF-8");
 | 
				
			||||||
 | 
					            while(!in.atEnd()) {
 | 
				
			||||||
 | 
					                QString const &line = in.readLine();
 | 
				
			||||||
 | 
					                if (line.indexOf("Version", Qt::CaseInsensitive) != -1) {
 | 
				
			||||||
 | 
					                    int const c = line.indexOf(":");
 | 
				
			||||||
 | 
					                    if (c != -1) {
 | 
				
			||||||
 | 
					                        version = line.mid(c+1);
 | 
				
			||||||
 | 
					                        if (!version.isEmpty()) {
 | 
				
			||||||
 | 
					                            return version.replace(QChar('"'), QString("")).trimmed();
 | 
				
			||||||
 | 
					                        }
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return version;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					QString Utils::getTariffInfo(QString fileName) {
 | 
				
			||||||
 | 
					    QString info("N/A");
 | 
				
			||||||
 | 
					    QFile f(fileName);
 | 
				
			||||||
 | 
					    if (f.exists()) {
 | 
				
			||||||
 | 
					        if (f.open(QIODevice::ReadOnly | QIODevice::Text)) {
 | 
				
			||||||
 | 
					            QTextStream in(&f);
 | 
				
			||||||
 | 
					            in.setCodec("UTF-8");
 | 
				
			||||||
 | 
					            while(!in.atEnd()) {
 | 
				
			||||||
 | 
					                QString const &line = in.readLine();
 | 
				
			||||||
 | 
					                if (line.indexOf("Info", Qt::CaseInsensitive) != -1) {
 | 
				
			||||||
 | 
					                    int const c = line.indexOf(":");
 | 
				
			||||||
 | 
					                    if (c != -1) {
 | 
				
			||||||
 | 
					                        info = line.mid(c+1);
 | 
				
			||||||
 | 
					                        if (!info.isEmpty()) {
 | 
				
			||||||
 | 
					                            return info.replace(QChar('"'), QString("")).trimmed();
 | 
				
			||||||
 | 
					                        }
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return info;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void Utils::updateBinary(char const *fileToSendToDC) {
 | 
					QString Utils::zoneName(quint8 i) {
 | 
				
			||||||
    qDebug() << "file to send to DC ..." << fileToSendToDC;
 | 
					    static constexpr char const *zName[] = {
 | 
				
			||||||
    qDebug() << "baudrate ............." << m_baudrate;
 | 
					        "",
 | 
				
			||||||
    qDebug() << "serial interface ....." << m_serialInterface;
 | 
					        "purple",
 | 
				
			||||||
    m_hw->dc_updateDC(fileToSendToDC, m_baudrate, m_serialInterface);
 | 
					        "blue",
 | 
				
			||||||
    std::this_thread::sleep_for(std::chrono::milliseconds(3000));
 | 
					        "yellow",
 | 
				
			||||||
    QCoreApplication::quit();
 | 
					        "green",
 | 
				
			||||||
 | 
					        "yellow (mars)",
 | 
				
			||||||
 | 
					        "green (mars)"
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					    if (i < (sizeof(zName)/sizeof(char const *))) {
 | 
				
			||||||
 | 
					        return zName[i];
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    return "N/A";
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void Utils::updatePrinterConf(int nrOfTemplate, char const *fileToSendToDC) {
 | 
					void Utils::printCriticalErrorMsg(QString const &errorMsg, bool upper, bool lower) {
 | 
				
			||||||
    QVector<int> printTemplates{ nrOfTemplate };
 | 
					    if (upper) qCritical() << QString(80, 'E');
 | 
				
			||||||
    QVector<QString> filesToSend{ fileToSendToDC };
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    m_hw->dc_updatePrinterTemplate(hwapi::FileTypeJson::PRINTER,
 | 
					    qCritical() << errorMsg;
 | 
				
			||||||
                                   printTemplates, filesToSend,
 | 
					
 | 
				
			||||||
                                   QString(m_baudrate),
 | 
					    if (lower) qCritical() << QString(80, 'E');
 | 
				
			||||||
                                   QString(m_serialInterface));
 | 
					 | 
				
			||||||
    std::this_thread::sleep_for(std::chrono::milliseconds(3000));
 | 
					 | 
				
			||||||
    QCoreApplication::quit();
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
QStringList Utils::getOpenLines() {
 | 
					void Utils::printCriticalErrorMsg(QStringList const &errorMsg) {
 | 
				
			||||||
    QStringList openLines;
 | 
					    qCritical() << QString(80, 'E');
 | 
				
			||||||
 | 
					    for (int i = 0; i < errorMsg.size(); ++i) {
 | 
				
			||||||
 | 
					        qCritical() << errorMsg.at(i);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    qCritical() << QString(80, 'E');
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    while (!m_in.atEnd()) {
 | 
					void Utils::printUpdateStatusMsg(QDebug debug, QStringList const &updateMsg) {
 | 
				
			||||||
        QString line = m_in.readLine().trimmed();
 | 
					    //if (updateMsg.size() > 1) {
 | 
				
			||||||
        // QString.split() is defined >= 5.14
 | 
					    //    qCritical() << QString(80, 'U');
 | 
				
			||||||
        if (!line.startsWith("OPEN")) {
 | 
					    //}
 | 
				
			||||||
            m_out << line;
 | 
					
 | 
				
			||||||
 | 
					    Q_UNUSED(debug);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    for (int i = 0; i < updateMsg.size(); ++i) {
 | 
				
			||||||
 | 
					        qInfo() << updateMsg.at(i);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    //if (updateMsg.size() > 1) {
 | 
				
			||||||
 | 
					    //    qCritical() << QString(80, 'U');
 | 
				
			||||||
 | 
					    //}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void Utils::printUpdateStatusMsg(QStringList const &updateMsg) {
 | 
				
			||||||
 | 
					    //if (updateMsg.size() > 1) {
 | 
				
			||||||
 | 
					    //    qCritical() << QString(80, 'U');
 | 
				
			||||||
 | 
					    //}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    for (int i = 0; i < updateMsg.size(); ++i) {
 | 
				
			||||||
 | 
					        qCritical() << updateMsg.at(i);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    //if (updateMsg.size() > 1) {
 | 
				
			||||||
 | 
					    //    qCritical() << QString(80, 'U');
 | 
				
			||||||
 | 
					    //}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void Utils::printUpdateStatusMsg(QString const &updateMsg, bool upper, bool lower) {
 | 
				
			||||||
 | 
					    if (upper) qCritical() << QString(80, 'U');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    qCritical() << updateMsg;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (lower) qCritical() << QString(80, 'U');
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void Utils::printUpdateStatusMsg(QDebug debug, QString const &updateMsg,
 | 
				
			||||||
 | 
					                                 bool upper, bool lower) {
 | 
				
			||||||
 | 
					    if (upper) debug << QString(80, 'U');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    qInfo() << updateMsg;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (lower) debug << QString(80, 'U');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void Utils::printInfoMsg(QString const &infoMsg, bool upper, bool lower) {
 | 
				
			||||||
 | 
					    if (upper) qCritical() << QString(80, 'I');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    qCritical() << infoMsg;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (lower) qCritical() << QString(80, 'I');
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void Utils::printInfoMsg(QStringList const &infoMsg) {
 | 
				
			||||||
 | 
					    //if (infoMsg.size() > 1) {
 | 
				
			||||||
 | 
					    //    qCritical() << QString(80, 'I');
 | 
				
			||||||
 | 
					    //}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    for (int i = 0; i < infoMsg.size(); ++i) {
 | 
				
			||||||
 | 
					        qCritical() << infoMsg.at(i);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    //if (infoMsg.size() > 1) {
 | 
				
			||||||
 | 
					    //    qCritical() << QString(80, 'I');
 | 
				
			||||||
 | 
					    //}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void Utils::printLineEditInfo(QStringList const &lines) {
 | 
				
			||||||
 | 
					    if (getDebugLevel() == LOG_DEBUG) {
 | 
				
			||||||
 | 
					        for (int i=0; i<lines.size(); ++i) {
 | 
				
			||||||
 | 
					            qInfo() << lines.at(i);
 | 
				
			||||||
 | 
					        } qInfo() << ""; qInfo() << "";
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					QString Utils::getTariffLoadTime(QString fileName) {
 | 
				
			||||||
 | 
					    QFileInfo fInfo(fileName);
 | 
				
			||||||
 | 
					    if (fInfo.exists()) {
 | 
				
			||||||
 | 
					        QDateTime lastModifiedTime = fInfo.lastModified();
 | 
				
			||||||
 | 
					        if (lastModifiedTime.isValid()) {
 | 
				
			||||||
 | 
					            return lastModifiedTime.toString(Qt::ISODateWithMs);
 | 
				
			||||||
        } else {
 | 
					        } else {
 | 
				
			||||||
            openLines << line;
 | 
					            printCriticalErrorMsg(fileName + " HAS INVALID MODIFIED-TIME");
 | 
				
			||||||
        }
 | 
					            QDateTime birthTime = fInfo.birthTime();
 | 
				
			||||||
    }
 | 
					            if (birthTime.isValid()) {
 | 
				
			||||||
    return openLines;
 | 
					                return birthTime.toString(Qt::ISODateWithMs);
 | 
				
			||||||
}
 | 
					            } else {
 | 
				
			||||||
 | 
					                printCriticalErrorMsg(fileName + " HAS INVALID BIRTH-TIME");
 | 
				
			||||||
bool Utils::doUpdate() {
 | 
					 | 
				
			||||||
    /*
 | 
					 | 
				
			||||||
        The file referred to by 'update_data' has the following structure for
 | 
					 | 
				
			||||||
        each line:
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        # ======================================================================
 | 
					 | 
				
			||||||
        # STATUS    |  NAME  |   DATE  |  RESULT
 | 
					 | 
				
			||||||
        # ======================================================================
 | 
					 | 
				
			||||||
        # where
 | 
					 | 
				
			||||||
        #
 | 
					 | 
				
			||||||
        # STATUS: OPEN or CLOSED
 | 
					 | 
				
			||||||
        # NAME  : If starting with 'opkg' it is an opkg-command to be executed.
 | 
					 | 
				
			||||||
        #         Otherwise its the name of a file which has to be updated.
 | 
					 | 
				
			||||||
        # DATE  : 0000-00-00T00:00:00
 | 
					 | 
				
			||||||
        # RESULT: SUCCESS or ERROR (possibly with description)
 | 
					 | 
				
			||||||
        #
 | 
					 | 
				
			||||||
     */
 | 
					 | 
				
			||||||
    if (!m_init) {
 | 
					 | 
				
			||||||
        return false;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    QStringList openLines = getOpenLines();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    bool res = false;
 | 
					 | 
				
			||||||
    QList<QString>::const_iterator it;
 | 
					 | 
				
			||||||
    for (it = openLines.cbegin(); it != openLines.cend(); ++it) {
 | 
					 | 
				
			||||||
        int start = 0, end;
 | 
					 | 
				
			||||||
        int column = 0;
 | 
					 | 
				
			||||||
        QString status, name, datetime, result;
 | 
					 | 
				
			||||||
        QString line = *it;
 | 
					 | 
				
			||||||
        while ((end = line.indexOf(QChar(','), start)) != -1) {
 | 
					 | 
				
			||||||
            QString next = line.mid(start, end).trimmed();
 | 
					 | 
				
			||||||
            switch (column) {
 | 
					 | 
				
			||||||
            case COLUMN_STATUS:
 | 
					 | 
				
			||||||
                status = next;
 | 
					 | 
				
			||||||
                break;
 | 
					 | 
				
			||||||
            case COLUMN_NAME:
 | 
					 | 
				
			||||||
                name = next;
 | 
					 | 
				
			||||||
                break;
 | 
					 | 
				
			||||||
            case COLUMN_DATE_TIME:
 | 
					 | 
				
			||||||
                datetime = next;
 | 
					 | 
				
			||||||
                break;
 | 
					 | 
				
			||||||
            case COLUMN_RESULT:
 | 
					 | 
				
			||||||
                result = next;
 | 
					 | 
				
			||||||
                break;
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
            ++column;
 | 
					 | 
				
			||||||
            start = end + 1;
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        if (!status.contains("OPEN")) {
 | 
					 | 
				
			||||||
            qCritical() << "Parsing error for" << m_update_ctrl_file.fileName();
 | 
					 | 
				
			||||||
            return false;
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
        if (name.contains("dc2c") && name.endsWith(".bin")) {
 | 
					 | 
				
			||||||
            updateBinary(name.toStdString().c_str());
 | 
					 | 
				
			||||||
            res = true;
 | 
					 | 
				
			||||||
        } else
 | 
					 | 
				
			||||||
        if (name.contains("DC2C_print") && name.endsWith(".json")) {
 | 
					 | 
				
			||||||
            int i = name.indexOf("DC2C_print");
 | 
					 | 
				
			||||||
            int templateIdx = name.mid(i).midRef(10, 2).toInt();
 | 
					 | 
				
			||||||
            updatePrinterConf(templateIdx, name.toStdString().c_str());
 | 
					 | 
				
			||||||
            res = true;
 | 
					 | 
				
			||||||
        } else
 | 
					 | 
				
			||||||
        if (name.contains("opkg")) {
 | 
					 | 
				
			||||||
            int i = name.indexOf("opkg ");
 | 
					 | 
				
			||||||
            QString rest = name.mid(i).trimmed();
 | 
					 | 
				
			||||||
            QScopedPointer<QProcess> p(new QProcess(this));
 | 
					 | 
				
			||||||
            p->setProcessChannelMode(QProcess::MergedChannels);
 | 
					 | 
				
			||||||
            p->start("opkg", QStringList() << rest);
 | 
					 | 
				
			||||||
            if (p->waitForStarted(1000)) {
 | 
					 | 
				
			||||||
                if (p->state() == QProcess::ProcessState::Running) {
 | 
					 | 
				
			||||||
                    if (p->waitForFinished(10000)) {
 | 
					 | 
				
			||||||
                        QByteArray output = p->readAllStandardOutput();
 | 
					 | 
				
			||||||
                        qCritical() << output;
 | 
					 | 
				
			||||||
                        res = true;
 | 
					 | 
				
			||||||
                    }
 | 
					 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    } else {
 | 
					    } else {
 | 
				
			||||||
            // TODO
 | 
					        printCriticalErrorMsg(fileName + " DOES NOT EXIST");
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
        QString resultLine = "CLOSED";
 | 
					    return "N/A";
 | 
				
			||||||
        resultLine += ", " + name;
 | 
					 | 
				
			||||||
        resultLine += ", " + QDateTime::currentDateTime().toString(Qt::ISODate);
 | 
					 | 
				
			||||||
        resultLine += ", " + (res == true) ? "SUCCESS" : "ERROR";
 | 
					 | 
				
			||||||
        m_out << resultLine;
 | 
					 | 
				
			||||||
    } // for (it = openLines.cbegin(); it != openLines.end(); ++it) {
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    return finishUpdate(openLines.size() > 0);
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
bool Utils::finishUpdate(bool replaceCtrlFile) {
 | 
					QString Utils::rstrip(QString const &str) {
 | 
				
			||||||
    if (replaceCtrlFile) {
 | 
					    int n = str.size() - 1;
 | 
				
			||||||
        if (!m_update_ctrl_file_copy.exists()) {
 | 
					    for (; n >= 0; --n) {
 | 
				
			||||||
 | 
					        if (!str.at(n).isSpace()) {
 | 
				
			||||||
 | 
					            return str.left(n + 1);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    return "";
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					bool Utils::sameFilesInDirs(QDir const &dir1, QDir const &dir2,
 | 
				
			||||||
 | 
					                            QStringList const &nameFilters) {
 | 
				
			||||||
 | 
					    if (!dir1.exists()) {
 | 
				
			||||||
 | 
					        printCriticalErrorMsg(dir1.dirName() + " DOES NOT EXIST");
 | 
				
			||||||
        return false;
 | 
					        return false;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
        if (!m_update_ctrl_file.remove()) {
 | 
					    if (!dir2.exists()) {
 | 
				
			||||||
 | 
					        printCriticalErrorMsg(dir2.dirName() + " DOES NOT EXIST");
 | 
				
			||||||
        return false;
 | 
					        return false;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
        if (!m_update_ctrl_file_copy.rename(m_update_ctrl_file.fileName())) {
 | 
					    if (dir1.absolutePath() == dir2.absolutePath()) {
 | 
				
			||||||
 | 
					        printCriticalErrorMsg(dir1.dirName() + " AND "+ dir2.dirName() + " HAVE SAME PATH");
 | 
				
			||||||
        return false;
 | 
					        return false;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // files, sorted by name
 | 
				
			||||||
 | 
					    QFileInfoList const &lst1 = dir1.entryInfoList(nameFilters, QDir::Files, QDir::Name);
 | 
				
			||||||
 | 
					    QFileInfoList const &lst2 = dir2.entryInfoList(nameFilters, QDir::Files, QDir::Name);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    QStringList fileNameLst1{};
 | 
				
			||||||
 | 
					    QStringList fileNameLst2{};
 | 
				
			||||||
 | 
					    QListIterator<QFileInfo> i1(lst1);
 | 
				
			||||||
 | 
					    while (i1.hasNext()) {
 | 
				
			||||||
 | 
					        fileNameLst1 << i1.next().fileName();
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					    QListIterator<QFileInfo> i2(lst2);
 | 
				
			||||||
 | 
					    while (i2.hasNext()) {
 | 
				
			||||||
 | 
					        fileNameLst2 << i2.next().fileName();
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (fileNameLst1.isEmpty()) {
 | 
				
			||||||
 | 
					        qCritical() << "DIR1" << dir1.dirName() << " DOES NOT CONTAIN EXPECTED FILES";
 | 
				
			||||||
 | 
					        return false;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    if (fileNameLst2.isEmpty())  {
 | 
				
			||||||
 | 
					        qCritical() << "DIR1" << dir2.dirName() << " DOES NOT CONTAIN EXPECTED FILES";
 | 
				
			||||||
 | 
					        return false;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    if (fileNameLst1 != fileNameLst2) {
 | 
				
			||||||
 | 
					        printCriticalErrorMsg(dir1.dirName() + " AND " + dir2.dirName()
 | 
				
			||||||
 | 
					                            + " DIFFER: [" + fileNameLst1.join(',') + "],["
 | 
				
			||||||
 | 
					                            + fileNameLst2.join(',') + "]");
 | 
				
			||||||
 | 
					        return false;
 | 
				
			||||||
 | 
					    } else {
 | 
				
			||||||
 | 
					        printInfoMsg(dir1.dirName() + " AND " + dir2.dirName()
 | 
				
			||||||
 | 
					                    + " ARE EQUAL: [" + fileNameLst1.join(',') + "]");
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    QStringList gitBlobLst1{};
 | 
				
			||||||
 | 
					    QStringList gitBlobLst2{};
 | 
				
			||||||
 | 
					    QListIterator<QFileInfo> i3(lst1);
 | 
				
			||||||
 | 
					    while (i3.hasNext()) {
 | 
				
			||||||
 | 
					        gitBlobLst1 << GitClient::gitBlob(i3.next().fileName());
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    QListIterator<QFileInfo> i4(lst2);
 | 
				
			||||||
 | 
					    while (i4.hasNext()) {
 | 
				
			||||||
 | 
					        gitBlobLst2 << GitClient::gitBlob(i4.next().fileName());
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (gitBlobLst1.isEmpty()) {
 | 
				
			||||||
 | 
					        qCritical() << "DIR1" << dir1.dirName() << " DOES NOT CONTAIN EXPECTED FILES";
 | 
				
			||||||
 | 
					        return false;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    if (gitBlobLst2.isEmpty())  {
 | 
				
			||||||
 | 
					        qCritical() << "DIR1" << dir2.dirName() << " DOES NOT CONTAIN EXPECTED FILES";
 | 
				
			||||||
 | 
					        return false;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (gitBlobLst1 != gitBlobLst2) {
 | 
				
			||||||
 | 
					        printCriticalErrorMsg(dir1.dirName() + " AND " + dir2.dirName()
 | 
				
			||||||
 | 
					                            + " DIFFER: [" + gitBlobLst1.join(',') + "],["
 | 
				
			||||||
 | 
					                            + gitBlobLst2.join(',') + "]");
 | 
				
			||||||
 | 
					        return false;
 | 
				
			||||||
 | 
					    } else {
 | 
				
			||||||
 | 
					        printInfoMsg(dir1.dirName() + " AND " + dir2.dirName()
 | 
				
			||||||
 | 
					                    + " CONTAIN SAME GIT-BLOBS FOR FILES: [" + fileNameLst1.join(',') + "]");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return true;
 | 
					    return true;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					QString Utils::getParentName() { // get name of parent process
 | 
				
			||||||
 | 
					    QString ppid = QString("/proc/%1/status").arg(getppid());
 | 
				
			||||||
 | 
					    std::ifstream f(ppid.toStdString().c_str());
 | 
				
			||||||
 | 
					    if (f.is_open()) {
 | 
				
			||||||
 | 
					        std::string next;
 | 
				
			||||||
 | 
					        while (std::getline(f, next)) {
 | 
				
			||||||
 | 
					            QString line = QString(next.c_str()).simplified();
 | 
				
			||||||
 | 
					            if (line.startsWith("Name")) {
 | 
				
			||||||
 | 
					                int const idx = line.indexOf(QChar(':'));
 | 
				
			||||||
 | 
					                if (idx != -1) {
 | 
				
			||||||
 | 
					                    return line.mid(idx+1).trimmed();
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    return "";
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					bool Utils::isATBQTRunning() {
 | 
				
			||||||
 | 
					    QDirIterator it("/proc",
 | 
				
			||||||
 | 
					                    QStringList() << "status",
 | 
				
			||||||
 | 
					                    QDir::Files,
 | 
				
			||||||
 | 
					                    QDirIterator::Subdirectories);
 | 
				
			||||||
 | 
					    while (it.hasNext()) {
 | 
				
			||||||
 | 
					        QString const &nextStatusFile = it.next();
 | 
				
			||||||
 | 
					        static const QRegularExpression re("^/proc/[0-9]{1,}/status");
 | 
				
			||||||
 | 
					        QRegularExpressionMatch match = re.match(nextStatusFile);
 | 
				
			||||||
 | 
					        if (match.hasMatch()) {
 | 
				
			||||||
 | 
					            std::ifstream f(nextStatusFile.toStdString().c_str());
 | 
				
			||||||
 | 
					            if (f.is_open()) {
 | 
				
			||||||
 | 
					                std::string next;
 | 
				
			||||||
 | 
					                while (std::getline(f, next)) {
 | 
				
			||||||
 | 
					                    QString line = QString(next.c_str()).simplified();
 | 
				
			||||||
 | 
					                    if (line.startsWith("Name")) {
 | 
				
			||||||
 | 
					                        int const idx = line.indexOf(QChar(':'));
 | 
				
			||||||
 | 
					                        if (idx != -1) {
 | 
				
			||||||
 | 
					                            QString const binary = line.mid(idx+1).trimmed();
 | 
				
			||||||
 | 
					                            if (binary == "ATBQT") {
 | 
				
			||||||
 | 
					                                return true;
 | 
				
			||||||
 | 
					                            }
 | 
				
			||||||
 | 
					                        }
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    return false;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										62
									
								
								utils.h
									
									
									
									
									
								
							
							
						
						
									
										62
									
								
								utils.h
									
									
									
									
									
								
							@@ -3,44 +3,36 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
#include <QObject>
 | 
					#include <QObject>
 | 
				
			||||||
#include <QString>
 | 
					#include <QString>
 | 
				
			||||||
 | 
					#include <QStringList>
 | 
				
			||||||
#include <QFile>
 | 
					#include <QFile>
 | 
				
			||||||
 | 
					#include <QFileInfo>
 | 
				
			||||||
 | 
					#include <QDateTime>
 | 
				
			||||||
 | 
					#include <QDir>
 | 
				
			||||||
 | 
					#include <QDebug>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <memory>
 | 
					namespace Utils {
 | 
				
			||||||
 | 
					    int read1stLineOfFile(QString fileName);
 | 
				
			||||||
 | 
					    QString getLocation(QString fileName);
 | 
				
			||||||
 | 
					    QString getTariffVersion(QString fileName);
 | 
				
			||||||
 | 
					    QString getTariffInfo(QString fileName);
 | 
				
			||||||
 | 
					    QString zoneName(quint8 i);
 | 
				
			||||||
 | 
					    void printCriticalErrorMsg(QString const &errorMsg, bool upper=false, bool lower=false);
 | 
				
			||||||
 | 
					    void printCriticalErrorMsg(QStringList const &errorMsg);
 | 
				
			||||||
 | 
					    void printInfoMsg(QString const &infoMsg, bool upper=false, bool lower=false);
 | 
				
			||||||
 | 
					    void printInfoMsg(QStringList const &infoMsg);
 | 
				
			||||||
 | 
					    void printUpdateStatusMsg(QDebug debug, QStringList const &updateMsg);
 | 
				
			||||||
 | 
					    void printUpdateStatusMsg(QStringList const &updateMsg);
 | 
				
			||||||
 | 
					    void printUpdateStatusMsg(QString const &updateMsg, bool upper=false, bool lower=false);
 | 
				
			||||||
 | 
					    void printUpdateStatusMsg(QDebug debug, QString const &updateMsg, bool upper=false, bool lower=false);
 | 
				
			||||||
 | 
					    void printLineEditInfo(QStringList const &lines);
 | 
				
			||||||
 | 
					    QString getTariffLoadTime(QString fileName);
 | 
				
			||||||
 | 
					    QString rstrip(QString const &str);
 | 
				
			||||||
 | 
					    bool sameFilesInDirs(QDir const &dir1, QDir const &dir2,
 | 
				
			||||||
 | 
					                         QStringList const &nameFilters = {"*.json"});
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "interfaces.h"
 | 
					 | 
				
			||||||
#include "DCPlugin/include/hwapi.h"
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef PTU5
 | 
					    QString getParentName();
 | 
				
			||||||
#define SERIAL_PORT "ttymxc2"
 | 
					    bool isATBQTRunning();
 | 
				
			||||||
#else
 | 
					}
 | 
				
			||||||
#define SERIAL_PORT "ttyUSB0"
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
class Utils : public QObject {
 | 
					 | 
				
			||||||
    Q_OBJECT
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    std::unique_ptr<hwinf> m_hw;
 | 
					 | 
				
			||||||
    char const *m_serialInterface;
 | 
					 | 
				
			||||||
    char const *m_baudrate;
 | 
					 | 
				
			||||||
    QFile m_update_ctrl_file;
 | 
					 | 
				
			||||||
    QFile m_update_ctrl_file_copy;
 | 
					 | 
				
			||||||
    QTextStream m_in;
 | 
					 | 
				
			||||||
    QTextStream m_out;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    bool m_init;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    void updateBinary(char const *fileToSendToDC);
 | 
					 | 
				
			||||||
    void updatePrinterConf(int nrOfTemplate, char const *fileToSendToDC);
 | 
					 | 
				
			||||||
    bool finishUpdate(bool finish);
 | 
					 | 
				
			||||||
    QStringList getOpenLines();
 | 
					 | 
				
			||||||
    static constexpr QChar SEPARATOR = QChar(',');
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
public:
 | 
					 | 
				
			||||||
    explicit Utils(QString update_ctrl_file,
 | 
					 | 
				
			||||||
                   QObject *parent = nullptr,
 | 
					 | 
				
			||||||
                   char const *serialInterface = SERIAL_PORT,
 | 
					 | 
				
			||||||
                   char const *baudrate = "115200");
 | 
					 | 
				
			||||||
    virtual ~Utils() override;
 | 
					 | 
				
			||||||
    bool doUpdate();
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
#endif // UTILS_H_INCLUDED
 | 
					#endif // UTILS_H_INCLUDED
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										1273
									
								
								worker.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1273
									
								
								worker.cpp
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										13
									
								
								worker_thread.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										13
									
								
								worker_thread.cpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,13 @@
 | 
				
			|||||||
 | 
					#include "worker_thread.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					WorkerThread::WorkerThread(QString const &name,
 | 
				
			||||||
 | 
					                           QObject *parent) : QThread(parent) {
 | 
				
			||||||
 | 
					    this->setObjectName(name);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					WorkerThread::~WorkerThread() {
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//void WorkerThread::run() {
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					//}
 | 
				
			||||||
							
								
								
									
										17
									
								
								worker_thread.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										17
									
								
								worker_thread.h
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,17 @@
 | 
				
			|||||||
 | 
					#ifndef WORKER_THREAD_H_INCLUDED
 | 
				
			||||||
 | 
					#define WORKER_THREAD_H_INCLUDED
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <QThread>
 | 
				
			||||||
 | 
					#include <QString>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class WorkerThread : public QThread {
 | 
				
			||||||
 | 
					    Q_OBJECT
 | 
				
			||||||
 | 
					public:
 | 
				
			||||||
 | 
					    WorkerThread(QString const &name, QObject *parent = nullptr);
 | 
				
			||||||
 | 
					    virtual ~WorkerThread();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					protected:
 | 
				
			||||||
 | 
					    // virtual void run();
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#endif // WORKER_THREAD_H_INCLUDED
 | 
				
			||||||
		Reference in New Issue
	
	Block a user