mirror of
https://github.com/BertoldVdb/ms-tools.git
synced 2025-12-10 07:44:46 +01:00
Add inverted serial support on GPIO4 and add FLIR Tau command helper
This commit is contained in:
parent
22ddf782f5
commit
6a644ede3f
7 changed files with 98 additions and 43 deletions
|
|
@ -41,6 +41,7 @@ var CLI struct {
|
|||
I2CTransfer I2CTransfer `cmd name:"i2c-txfr" help:"Perform I2C transfer."`
|
||||
|
||||
UARTTx UARTTx `cmd name:"uart-tx" help:"Transmit data over UART."`
|
||||
FlirTX FlirTX `cmd name:"flir-tx" help:"Transmit FLIR Tau(2) command over UART."`
|
||||
|
||||
GPIOSet GPIOSet `cmd name:"gpio-set" help:"Set GPIO pin value and direction."`
|
||||
GPIOGet GPIOGet `cmd name:"gpio-get" help:"Get GPIO values."`
|
||||
|
|
|
|||
37
cli/uart.go
37
cli/uart.go
|
|
@ -1,12 +1,16 @@
|
|||
package main
|
||||
|
||||
import (
|
||||
"encoding/binary"
|
||||
"encoding/hex"
|
||||
|
||||
"github.com/sigurn/crc16"
|
||||
)
|
||||
|
||||
type UARTTx struct {
|
||||
Data string `arg name:"data" help:"Hex string to write to device"`
|
||||
Baud int `optional help:"Data rate in bits per second" default:"57600"`
|
||||
Data string `arg name:"data" help:"Hex string to write to device"`
|
||||
Invert bool `optional help:"Use RS232 polarity instead of TTL" default:"false"`
|
||||
Baud int `optional help:"Data rate in bits per second" default:"57600"`
|
||||
}
|
||||
|
||||
func (l *UARTTx) Run(c *Context) error {
|
||||
|
|
@ -15,5 +19,32 @@ func (l *UARTTx) Run(c *Context) error {
|
|||
return err
|
||||
}
|
||||
|
||||
return c.hal.UARTTransmit(l.Baud, buf)
|
||||
return c.hal.UARTTransmit(l.Baud, buf, l.Invert)
|
||||
}
|
||||
|
||||
type FlirTX struct {
|
||||
Func int `arg name:"func" type:"hex" help:"Function to call"`
|
||||
Params string `optional name:"data" help:"Parameters as hex string"`
|
||||
}
|
||||
|
||||
func flirTauEncodeCommand(cmd byte, param []byte) []byte {
|
||||
var crcTab = crc16.MakeTable(crc16.CRC16_XMODEM)
|
||||
|
||||
result := []byte{0x6E, 0, 0, cmd, 0, 0, 0, 0}
|
||||
binary.BigEndian.PutUint16(result[4:], uint16(len(param)))
|
||||
|
||||
binary.BigEndian.PutUint16(result[6:], crc16.Update(0, result[:6], crcTab))
|
||||
|
||||
result = append(result, param...)
|
||||
result = binary.BigEndian.AppendUint16(result, crc16.Update(0, result[8:], crcTab))
|
||||
return result
|
||||
}
|
||||
|
||||
func (l *FlirTX) Run(c *Context) error {
|
||||
param, err := hex.DecodeString(l.Params)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return c.hal.UARTTransmit(56700, flirTauEncodeCommand(uint8(l.Func), param), true)
|
||||
}
|
||||
|
|
|
|||
1
go.mod
1
go.mod
|
|
@ -6,6 +6,7 @@ require (
|
|||
github.com/alecthomas/kong v0.2.17
|
||||
github.com/fatih/color v1.12.0
|
||||
github.com/inancgumus/screen v0.0.0-20190314163918-06e984b86ed3
|
||||
github.com/sigurn/crc16 v0.0.0-20211026045750-20ab5afb07e3 // indirect
|
||||
github.com/sstallion/go-hid v0.0.0-20190621001400-1cf4630be9f4
|
||||
golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97 // indirect
|
||||
golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1
|
||||
|
|
|
|||
2
go.sum
2
go.sum
|
|
@ -13,6 +13,8 @@ github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Ky
|
|||
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
|
||||
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
|
||||
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
||||
github.com/sigurn/crc16 v0.0.0-20211026045750-20ab5afb07e3 h1:aQKxg3+2p+IFXXg97McgDGT5zcMrQoi0EICZs8Pgchs=
|
||||
github.com/sigurn/crc16 v0.0.0-20211026045750-20ab5afb07e3/go.mod h1:9/etS5gpQq9BJsJMWg1wpLbfuSnkm8dPF6FdW2JXVhA=
|
||||
github.com/sstallion/go-hid v0.0.0-20190621001400-1cf4630be9f4 h1:hczfXYN39SDj4FcN5J7sgHBtJm4U7ef2nvlonn6NvVU=
|
||||
github.com/sstallion/go-hid v0.0.0-20190621001400-1cf4630be9f4/go.mod h1:JwBz6izP5UGcbYDU5VGeLkqpRIpSBDPtCB5/XnVXz9Q=
|
||||
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
||||
|
|
|
|||
|
|
@ -1,50 +1,56 @@
|
|||
.FLAG PIN, P2.2
|
||||
.FLAG DIR, P3.2
|
||||
.EQU BAUD0, 120
|
||||
.EQU BAUD1, 121
|
||||
.EQU PDIR, 122
|
||||
.FLAG PIN, P2.4
|
||||
.EQU BAUD0, 126
|
||||
.EQU BAUD1, 127
|
||||
|
||||
MOV BAUD0, R5 ;Save baud rate param
|
||||
MOV BAUD1, R6
|
||||
MOV PDIR, P3
|
||||
CLR DIR
|
||||
PUSH BAUD0
|
||||
PUSH BAUD1
|
||||
|
||||
more:
|
||||
MOVX A, @DPTR
|
||||
INC DPTR
|
||||
MOV BAUD0, A
|
||||
MOVX A, @DPTR
|
||||
MOV BAUD1, A
|
||||
|
||||
more:
|
||||
MOV R0, #8 ;Send 8 bits from A
|
||||
CLR PIN ;Send start bit
|
||||
INC DPTR
|
||||
|
||||
MOV R5, BAUD0 ;Delay between bits
|
||||
MOV R6, BAUD1
|
||||
MOV A, R6
|
||||
RRC A
|
||||
MOV PIN,C ;Send start bit
|
||||
|
||||
MOV R1, BAUD0 ;Delay between bits
|
||||
MOV R2, BAUD1
|
||||
d1:
|
||||
DJNZ R5, d1
|
||||
DJNZ R6, d1
|
||||
DJNZ R1, d1
|
||||
DJNZ R2, d1
|
||||
|
||||
MOVX A, @DPTR
|
||||
|
||||
bits:
|
||||
RRC A ;Rotate bits via carry
|
||||
MOV PIN,C ;Output bits
|
||||
|
||||
MOV R5, BAUD0 ;Delay between bits
|
||||
MOV R6, BAUD1
|
||||
MOV R1, BAUD0 ;Delay between bits
|
||||
MOV R2, BAUD1
|
||||
d2:
|
||||
DJNZ R5, d2
|
||||
DJNZ R6, d2
|
||||
DJNZ R1, d2
|
||||
DJNZ R2, d2
|
||||
|
||||
DJNZ R0, bits ;Send all bits
|
||||
|
||||
RRC A ;Not needed, but makes timing equal
|
||||
SETB PIN ;Send stop bit
|
||||
MOV A, R6
|
||||
RLC A
|
||||
MOV PIN,C ;Send stop bit
|
||||
|
||||
MOV R5, BAUD0 ;Delay between bits
|
||||
MOV R6, BAUD1
|
||||
MOV R1, BAUD0 ;Delay between bits
|
||||
MOV R2, BAUD1
|
||||
d3:
|
||||
DJNZ R5, d3
|
||||
DJNZ R6, d3
|
||||
DJNZ R1, d3
|
||||
DJNZ R2, d3
|
||||
|
||||
DJNZ R7, more ;Send all characters
|
||||
|
||||
MOV P3, PDIR
|
||||
|
||||
POP BAUD0
|
||||
POP BAUD1
|
||||
RET
|
||||
|
|
|
|||
|
|
@ -1 +1 @@
|
|||
峹巠叞z虏啵x垄瓁畒蔺撄挗瓁畒蔺撄伢尧瓁畒蔺撄哓厇<E59393>"
|
||||
À~Àà£õ~àõx£î’¤©~ªÙþÚüà’¤©~ªÙþÚüØóî3’¤©~ªÙþÚüßÕÐ~Ð"
|
||||
|
|
@ -1,21 +1,35 @@
|
|||
package mshal
|
||||
|
||||
import (
|
||||
"encoding/binary"
|
||||
)
|
||||
import "encoding/binary"
|
||||
|
||||
func (h *HAL) UARTTransmit(baud int, buf []byte) error {
|
||||
region := h.MemoryRegionGet(MemoryRegionUserRAM)
|
||||
parent, addr := region.GetParent()
|
||||
addr += region.GetLength() - len(buf)
|
||||
|
||||
if _, err := parent.Access(true, addr, buf); err != nil {
|
||||
func (h *HAL) UARTTransmit(baud int, data []byte, invert bool) error {
|
||||
if _, _, err := h.GPIOUpdate(0, 0, 1>>4, 0); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
var div [2]byte
|
||||
binary.LittleEndian.PutUint16(div[:], uint16((1.0/float64(baud))/108.125e-9))
|
||||
region := h.MemoryRegionGet(MemoryRegionUserRAM)
|
||||
parent, addr := region.GetParent()
|
||||
|
||||
_, err := h.PatchExecFunc(false, h.patchCallAddrs[4], PatchExecFuncRequest{DPTR: uint16(addr), R5: div[0] + 1, R6: div[1] + 1, R7_A: uint8(len(buf))})
|
||||
params := make([]byte, 2+len(data))
|
||||
addr += region.GetLength() - len(params)
|
||||
|
||||
binary.LittleEndian.PutUint16(params[:], uint16((1.0/float64(baud))/108.125e-9))
|
||||
params[0] += 1
|
||||
params[1] += 1
|
||||
|
||||
copy(params[2:], data)
|
||||
ssbit := byte(0x80)
|
||||
if invert {
|
||||
ssbit = 0x01
|
||||
for i := range data {
|
||||
params[2+i] ^= 0xFF
|
||||
}
|
||||
}
|
||||
|
||||
if _, err := parent.Access(true, addr, params); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
_, err := h.PatchExecFunc(false, h.patchCallAddrs[4], PatchExecFuncRequest{DPTR: uint16(addr), R6: ssbit, R7_A: uint8(len(data))})
|
||||
return err
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue