Доработка. Подсчёт контрольной сумму согласован с Тулой, разработчиками СПТ-25
This commit is contained in:
@@ -11,40 +11,63 @@ var tick: int = 0
|
||||
|
||||
|
||||
class SocketSerial extends SerialPort:
|
||||
const P_DIV: = 0x8408
|
||||
const FLAG: = 0x7e
|
||||
const FLAG_MASK: = 0x20
|
||||
const FSC_MASK: = 0x8000
|
||||
const parity_code = {
|
||||
'N': SerialPort.PARITY_NONE,
|
||||
'E': SerialPort.PARITY_EVEN,
|
||||
'O': SerialPort.PARITY_ODD }
|
||||
|
||||
var tx_buffer: PackedByteArray
|
||||
|
||||
func _init() -> void:
|
||||
tx_buffer.resize(256)
|
||||
|
||||
func send_to(data: PackedByteArray):
|
||||
tools.allways(data.size() >= 3, 'длина буфера меньше необходимого')
|
||||
var i_sum: = data.size() - 3
|
||||
data.encode_u16(i_sum, 0)
|
||||
tx_buffer[0] = 0x7e
|
||||
var i: = 1
|
||||
for v in data:
|
||||
if v != 0x7e:
|
||||
tx_buffer[i] = v
|
||||
i += 1
|
||||
else:
|
||||
tx_buffer[i] = FLAG
|
||||
i += 1
|
||||
tx_buffer[i] = FLAG ^ FLAG_MASK
|
||||
i += 1
|
||||
var v_sum: = get_check_sum(data)
|
||||
data.encode_u16(i_sum, v_sum)
|
||||
write_raw(data)
|
||||
tx_buffer.encode_u16(i, v_sum)
|
||||
i += 2
|
||||
tx_buffer[i] = FLAG
|
||||
i += 1
|
||||
write_raw(tx_buffer.slice(0, i))
|
||||
|
||||
func _to_string() -> String: return 'последовательный порт \"%s\" @ %d (%s)' % [self.port, self.baudrate, 'открыт' if is_open() else 'закрыт']
|
||||
|
||||
func get_check_sum(src: PackedByteArray) -> int:
|
||||
var P_DIV: = 0xf0b8
|
||||
var FCS = ~((src[2]<<8) + src[1])
|
||||
for i in range(3, src.size()):
|
||||
var C = src[i]
|
||||
for j in 8:
|
||||
if C & 1:
|
||||
if FCS & 1:
|
||||
FCS = ((FCS >> 1) | 0x8000) ^ P_DIV
|
||||
var fsc: = ~((src[1]<<8) + src[0])
|
||||
for i: int in range(2, src.size()):
|
||||
var chr: = src[i]
|
||||
for j: int in 8:
|
||||
if chr & 1:
|
||||
if fsc & 1:
|
||||
fsc = ((fsc >> 1) | FSC_MASK) ^ P_DIV
|
||||
else:
|
||||
FCS = ((FCS >> 1) | 0x8000)
|
||||
fsc = ((fsc >> 1) | FSC_MASK)
|
||||
else:
|
||||
if FCS & 1:
|
||||
FCS = (FCS >> 1) ^ P_DIV
|
||||
if fsc & 1:
|
||||
fsc = (fsc >> 1) ^ P_DIV
|
||||
else:
|
||||
FCS = FCS >> 1
|
||||
C >>= 1
|
||||
for j in 16:
|
||||
if FCS & 1:
|
||||
FCS = (FCS >> 1) ^ P_DIV
|
||||
fsc = fsc >> 1
|
||||
chr >>= 1
|
||||
for j: int in 16:
|
||||
if fsc & 1:
|
||||
fsc = (fsc >> 1) ^ P_DIV
|
||||
else:
|
||||
FCS = FCS >> 1
|
||||
return ~FCS
|
||||
|
||||
fsc = fsc >> 1
|
||||
return ~fsc
|
||||
|
||||
func try_open(parsing_proc: Callable):
|
||||
if is_open():
|
||||
|
||||
Reference in New Issue
Block a user