gh-5 Handle unsigned & signed values

updateRegisters now handles signed values correctly. Bitfields and
enumerations are still interpreted as unsigned values
This commit is contained in:
Jarno Rankinen 2023-02-01 23:09:50 +02:00
parent 2758f67299
commit 1080219b23
1 changed files with 14 additions and 4 deletions

View File

@ -152,13 +152,20 @@ func (p PingvinKL) updateRegisters() {
// value, so for each even byte in the reponse slice we bitshift the byte // value, so for each even byte in the reponse slice we bitshift the byte
// left by 8, then add the odd byte as is to the shifted 16-bit value // left by 8, then add the odd byte as is to the shifted 16-bit value
msb := true msb := true
value := 0 value := int16(0)
uvalue := uint16(0)
for i := 0; i < len(results); i++ { for i := 0; i < len(results); i++ {
if msb { if msb {
value = int(results[i]) << 8 value = int16(results[i]) << 8
uvalue = uint16(results[i]) << 8
} else { } else {
value += int(results[i]) value += int16(results[i])
p.Registers[k].Value = value uvalue += uint16(results[i])
if p.Registers[k].Signed {
p.Registers[k].Value = int(value)
} else {
p.Registers[k].Value = int(uvalue)
}
k++ k++
} }
msb = !msb msb = !msb
@ -204,6 +211,9 @@ func New() PingvinKL {
registerData := readCsvLines("registers.csv") registerData := readCsvLines("registers.csv")
for i := 0; i < len(registerData); i++ { for i := 0; i < len(registerData); i++ {
signed := registerData[i][2] == "int16" signed := registerData[i][2] == "int16"
if !signed {
log.Println("Unsigned register", i, registerData[i][6])
}
pingvin.Registers = append(pingvin.Registers, pingvin.Registers = append(pingvin.Registers,
newRegister(registerData[i][0], registerData[i][1], signed, registerData[i][6])) newRegister(registerData[i][0], registerData[i][1], signed, registerData[i][6]))
} }