I am setting an 8 bit field (set) where each bit is constructed individually. For the readDataLinesFromPads proc, is using the if and calling the .incl and .excl on each bit in the set the best way to approach this?
const
# data bus pad index
db0 = 1005
db1 = 82
db3 = 650
db2 = 945
db5 = 175
db4 = 1393
db7 = 1349
db6 = 1591
type
DataLine* {.size: sizeof(cint).} = enum
D0
D1
D2
D3
D4
D5
D6
D7
DataLines = set[DataLine]
var pads: array[0..1725, bool]
var dataLines: DataLines
proc readDataLinesFromPads =
if pads[db0]: dataLines.incl(D0) else: dataLines.excl(D0)
if pads[db1]: dataLines.incl(D1) else: dataLines.excl(D1)
if pads[db2]: dataLines.incl(D2) else: dataLines.excl(D2)
if pads[db3]: dataLines.incl(D3) else: dataLines.excl(D3)
if pads[db4]: dataLines.incl(D4) else: dataLines.excl(D4)
if pads[db5]: dataLines.incl(D5) else: dataLines.excl(D5)
if pads[db6]: dataLines.incl(D6) else: dataLines.excl(D6)
if pads[db7]: dataLines.incl(D7) else: dataLines.excl(D7)
proc writeDataLinesToPads(v: uint8) =
dataLines = cast[DataLines](v)
pads[db0] = D0 in dataLines
pads[db1] = D1 in dataLines
pads[db2] = D2 in dataLines
pads[db3] = D3 in dataLines
pads[db4] = D4 in dataLines
pads[db5] = D5 in dataLines
pads[db6] = D6 in dataLines
pads[db7] = D7 in dataLines
readDataLinesFromPads()
echo $cast[cint](dataLines), " ", $dataLines
# outputs: 0 {}
writeDataLinesToPads(255)
echo $cast[cint](dataLines), " ", $dataLines
# outputs: 255 {D0, D1, D2, D3, D4, D5, D6, D7}
dataLines = {}
readDataLinesFromPads()
echo $cast[cint](dataLines), " ", $dataLines
# outputs: 255 {D0, D1, D2, D3, D4, D5, D6, D7}
Here is a much cleaner version of the code:
import std/setutils
type
DataLine* {.size: sizeof(cint).} = enum
D0
D1
D2
D3
D4
D5
D6
D7
DataLines = set[DataLine]
const dataLineVals = [
D0: 1005,
D1: 82,
D2: 945,
D3: 650,
D4: 1393,
D5: 175,
D6: 1591,
D7: 1349
]
var pads: array[0..1725, bool]
var dataLines: DataLines
proc readDataLinesFromPads =
for index, val in dataLineVals.pairs:
dataLines[index] = pads[val]
proc writeDataLinesToPads(v: uint8) =
dataLines = cast[DataLines](v)
for index, val in dataLineVals.pairs:
pads[val] = index in dataLines
readDataLinesFromPads()
echo $cast[cint](dataLines), " ", $dataLines
# outputs: 0 {}
writeDataLinesToPads(255)
echo $cast[cint](dataLines), " ", $dataLines
# outputs: 255 {D0, D1, D2, D3, D4, D5, D6, D7}
dataLines = {}
readDataLinesFromPads()
echo $cast[cint](dataLines), " ", $dataLines
# outputs: 255 {D0, D1, D2, D3, D4, D5, D6, D7}