/
klib2-python.py
184 lines (153 loc) · 5.45 KB
/
klib2-python.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
#-*- coding: utf-8 -*-
import os
from subprocess import CREATE_NEW_CONSOLE
import sys
import time
import numpy as np
import csv
import datetime
import time
import binascii
import base64
import os
from socket import *
from select import select
import codecs
class KLib():
def __init__(self,_server_ip = "127.0.0.1", _port = 3800):
self.nrow = 0
self.ncol = 0
self.datasize = 0
self.adc = None
self.port = _port
self.server_ip = _server_ip
self.device = ""
self.sensor = ""
self.adc = []
self.buf = None
self.BufSize = 5000
self.addr = None
self.client_socket = None
self.result = None
self.client_socket_connection = False
# New variable
self.totalPacketSize = 0
self.staticPacketLen = 96
#TcpIP 연결 시도
def init(self):
try:
self.addr = (self.server_ip, self.port) #server address 정보
self.client_socket = socket(AF_INET, SOCK_STREAM) #소켓 정보
self.client_socket.setsockopt(SOL_SOCKET, SO_RCVBUF, 50000)
self.client_socket.connect(self.addr) # tcpip연결
except Exception as e:
print('Failed to connect TCP/IP!')
self.client_socket_connection = False
return False
self.client_socket_connection = True
resp = self.client_socket.recv(self.BufSize) #버퍼 받기
self.buf = resp
self.datasize = 5000
self.BufSize = self.datasize + 200
sp = 0
#header가 2개 이상이 아닌경우 패킷이 다안들어왔을 가능성이 있음
while(1):
if(len(self.buf) > self.BufSize):
break
resp = self.client_socket.recv(self.BufSize)
self.buf = self.buf + resp
#header 위치 찾기
while(1):
sp = self.buf.index(0x7e,sp)
if(self.buf[sp+1] == 0x7e and self.buf[sp+2]== 0x7e and self.buf[sp+3] == 0x7e):
self.nrow = int.from_bytes(self.buf[88:91],byteorder='little')
self.ncol = int.from_bytes(self.buf[92:95],byteorder='little')
self.datasize = self.nrow * self.ncol
self.BufSize = self.datasize + 200
break
self.device = self.buf[4:28]
self.sensor = self.buf[28:52]
self.nrow = int.from_bytes(self.buf[88:91],byteorder='little')
self.ncol = int.from_bytes(self.buf[92:95],byteorder='little')
self.datasize = self.nrow * self.ncol
#Fix this code
self.totalPacketSize = 100 + self.datasize
#header, tail을 뺀 버퍼를 result에 집어넣음
self.result = self.buf[sp + 4 : sp + self.datasize]
# rawdata array 생성
for i in range(96,self.datasize+96):
self.adc.append(int(self.buf[i]))
#Fix this code
self.buf = b''
def check_tcp_connection(self):
if(self.client_socket_connection == True):
return True
else:
return False
#서버와 tcp 연결 시도
def start(self):
self.init()
#서봐의 tcp 연결 끊기
def stop(self):
self.client_socket.close()
self.client_socket_connection = False
#패킷읽기
def read(self):
self.buf = self.buf + self.client_socket.recv(self.totalPacketSize)
#header 검색
while(1):
#Fix this code
if(len(self.buf) > self.totalPacketSize):
break
#Fix this code
resp = self.client_socket.recv(self.totalPacketSize)
self.buf = self.buf + resp
#header 위치 찾기
sp = 0
while(1):
try:
sp = self.buf.index(0x7e,sp)
except error:
self.buf = None
print("Error buf None")
return
#Fix this code
if(sp+self.totalPacketSize>len(self.buf)):
self.buf = self.buf[sp:]
return
if(self.buf[sp+1] == 0x7e and self.buf[sp+2]== 0x7e and self.buf[sp+3] == 0x7e):
break
#Fix this code
for i in range(self.staticPacketLen+sp,self.datasize+self.staticPacketLen+sp):
self.adc[i-self.staticPacketLen-sp] = int(self.buf[i])
# 읽어들인 adc 데이터 부분 삭제
self.buf = self.buf[sp+self.totalPacketSize:]
# 수신 버퍼에 데이터가 10frame 이상 쌓일경우 clear
if len(self.buf) > self.totalPacketSize * 3:
self.buf = b''
def printadc(self):
#It can be a cause of long latency. "print" command,too.
#os.system('cls')
for i in range(self.nrow):
write_str = ""
for j in range(self.ncol):
write_str = write_str + " " + str(self.adc[i*self.ncol + j])
print(write_str)
print()
if __name__ == "__main__":
klib = KLib("127.0.0.1", 3800)
tick = 0
FPS = 0
prevTime = time.time()
klib.start()
while(1):
klib.read()
klib.printadc()
tick = tick + 1
#FPS 계산
curTime = time.time()
if curTime - prevTime > 1 :
FPS = tick
prevTime = curTime
tick = 0
print("FPS : ", FPS)