Files
linuxcncAllWasm/tests/raster/rastertest.py
2026-08-20 06:17:39 +08:00

259 lines
8.6 KiB
Python
Executable File

#!/usr/bin/env python3
import hal
import time
import os
from raster import *
theta = 0.005
timeout = 0.25
def fleq(a, b):
return abs(a - b) < theta
def assertIdle(pin):
assert not pin['fault'].value, "Fault detected"
assert pin['state'].value == 0, "raster not idle"
def waitEnabled(pin):
stop = time.process_time() + timeout
while not pin['enabled'].value:
time.sleep(0.001);
assert not pin['fault'].value, "Fault occurred. Code {0}".format(pin['fault_code'].value)
assert time.process_time() < stop, "Timeout while waiting"
def waitDisabled(pin):
stop = time.process_time() + timeout
while pin['enabled'].value:
time.sleep(0.001);
assert not pin['fault'].value, "Fault occurred. Code {0}".format(pin['fault_code'].value)
assert time.process_time() < stop, "Timeout while waiting"
def waitFault(pin):
stop = time.process_time() + timeout
while not pin['fault'].value:
time.sleep(0.001);
assert time.process_time() < stop, "Timeout while waiting"
def waitIdle(pin):
stop = time.process_time() + timeout
while pin['state'].value != 0:
time.sleep(0.001);
assert not pin['fault'].value, "Fault occurred. Code {0}".format(pin['fault_code'].value)
assert time.process_time() < stop, "Timeout while waiting"
def resetRaster(prog, pin):
stop = time.process_time() + timeout
prog.run.value = 0
pin['reset'].value = 1
while pin['state'].value != 0:
time.sleep(0.001);
assert time.process_time() < stop, "Timeout while waiting"
pin['reset'].value = 0
assertIdle(pin)
def testValidBegin(prog, pin):
resetRaster(prog, pin)
prog.port.write("123.45;4;1.0;10;0000000000")
prog.run.value = 1
waitEnabled(pin)
assert not pin['fault'].value, "Fault detected."
assert fleq(pin['offset'].value, 123.45), "Offset was not set correctly"
assert pin['bpp'].value == 4, "BPP was not set correctly, Given:{0}".format(pin['bpp'].value)
assert fleq(pin['ppu'].value, 1.0), "PPU was not set correctly"
assert pin['count'].value == 10, "count was not set correctly"
prog.run.value = 0
waitIdle(pin)
assertIdle(pin)
def testInvalidOffset(prog, pin):
resetRaster(prog, pin)
prog.port.write("FOOB;41.0;2;00")
prog.run.value = 1
waitFault(pin)
assert pin['fault'].value, "Fault not detected"
assert pin['fault_code'].value == FaultCodes.InvalidOffset.value
def testInvalidBPP(prog, pin):
for bpp in [0, 2, 10, 14, 54, -50.0]:
resetRaster(prog, pin)
prog.port.write("123.45;{0};1.0;2;00".format(bpp))
prog.run.value = 1
waitFault(pin)
assert pin['fault_code'].value == FaultCodes.InvalidBPP.value
def testValidBPP(prog, pin):
for bpp in [4, 8, 12, 16, 20, 24, 28, 32]:
resetRaster(prog, pin)
prog.port.write("123.45;{0};1.0;2;{1}".format(bpp, "0" * 2 * int(bpp/4)))
prog.run.value = 1
waitEnabled(pin)
def testInvalidPPU(prog, pin):
for ppu in [-1.0, 0.0]:
resetRaster(prog, pin)
prog.port.write("123.45;4;{0};2;00".format(ppu))
prog.run.value = 1
waitFault(pin)
assert pin['fault_code'].value == FaultCodes.InvalidPPU.value
def testValidPPU(prog, pin):
for tppu in [0.01, 1423.2343, 1000]:
resetRaster(prog, pin)
prog.port.write("123;4;{0};2;00".format(tppu))
prog.run.value = 1
waitEnabled(pin)
assert fleq(pin['ppu'].value, tppu), "PPU failed to be set"
def testValidCount(prog, pin):
for tcount in [2, 10, 500]:
resetRaster(prog, pin)
prog.port.write("-156;4;1.0;{0};{1}".format(tcount, "0" * tcount))
prog.run.value = 1
waitEnabled(pin)
assert pin['count'].value == tcount, "Count was not valid"
def testInvalidCount(prog, pin):
for tcount in [0, 1, -1, -100]:
resetRaster(prog, pin)
prog.port.write("2334.1223;4;1.0;{0};00000000".format(tcount))
prog.run.value = 1
waitFault(pin)
assert pin['fault_code'].value == FaultCodes.InvalidCount.value, \
"Not expected fault code {0}. tcount {1}".format(pin['fault_code'].value, tcount)
def testWrongDirection(prog, pin):
resetRaster(prog, pin)
pin['position'].value = -10
prog.port.write("10;4;1.0;10;0123456789")
prog.run.value = 1
waitEnabled(pin)
pin['position'].value = -11
waitFault(pin)
assert pin['fault_code'].value == FaultCodes.WrongDirection.value, \
"Expected fault WrongDirection. Got {0}".format(pin['fault_code'].value)
resetRaster(prog, pin)
pin['position'].value = 10
prog.port.write("-10;4;1.0;10;0123456789")
prog.run.value = 1
waitEnabled(pin)
pin['position'].value = 11
waitFault(pin)
assert pin['fault_code'].value == FaultCodes.WrongDirection.value, \
"Expected fault WrongDirection. Got {0}".format(pin['fault_code'].value)
def testProgram(prog, pin, pos, offset, bpp, dpu, program, data):
pin['position'].value = pos
prog.begin(offset, bpp, dpu, int(len(program)/(bpp/4)))
prog.data(program)
prog.start()
for (pos, pwr) in data:
pin['position'].value = pos
time.sleep(0.001)
assert (pin['output'].value - pwr) < theta, \
"output at position {0} should be {1}. Got {2}".format(pos, pwr, pin['output'].value)
#once position is exceeded the program should be finished and raster should reset
assert pin['enabled'].value == True, "raster should still be enabled"
prog.stop()
def main():
try:
c = hal.component("test")
pin = {
'reset': c.newpin("reset", hal.HAL_BIT, hal.HAL_OUT),
'enabled': c.newpin("enabled", hal.HAL_BIT, hal.HAL_IN),
'position': c.newpin("position", hal.HAL_FLOAT, hal.HAL_OUT),
'output': c.newpin("output", hal.HAL_FLOAT, hal.HAL_IN),
'offset': c.newpin("offset", hal.HAL_FLOAT, hal.HAL_IN),
'bpp': c.newpin("bpp", hal.HAL_S32, hal.HAL_IN),
'ppu': c.newpin("ppu", hal.HAL_FLOAT, hal.HAL_IN),
'count': c.newpin("count", hal.HAL_S32, hal.HAL_IN),
'fault': c.newpin("fault", hal.HAL_BIT, hal.HAL_IN),
'fault_code': c.newpin("fault-code", hal.HAL_S32, hal.HAL_IN),
'state': c.newpin("state", hal.HAL_S32, hal.HAL_IN),
'bitmap_position': c.newpin("bitmap-position", hal.HAL_FLOAT, hal.HAL_IN),
'current_pixel_index': c.newpin("current-pixel-index", hal.HAL_S32, hal.HAL_IN),
'current_pixel_value': c.newpin("current-pixel-value", hal.HAL_FLOAT, hal.HAL_IN),
'previous_pixel_value': c.newpin("previous-pixel-value", hal.HAL_FLOAT, hal.HAL_IN),
'fraction': c.newpin("fraction", hal.HAL_FLOAT, hal.HAL_IN),
}
c.ready()
prog = RasterProgrammer("programmer")
#instantiate the raster component,
#add it to a thread and link all signals from
#the test component here
assert os.system('halcmd -f raster.hal') == 0, "raster.hal script failed"
testInvalidOffset(prog, pin)
testInvalidBPP(prog, pin)
testValidBPP(prog, pin)
testInvalidPPU(prog, pin)
testValidPPU(prog, pin)
testValidCount(prog, pin)
testInvalidCount(prog, pin)
#testWrongDirection()
resetRaster(prog, pin)
testProgram(prog, pin, -1.0,
1.0,
4,
1.0,
"0E",
[(-0.5, -1.0),
(0.0, 0.0),
(0.25, 25.0),
(0.5, 50.0),
(0.75, 75.0),
(1.0, 100.0),
(1.1, -1.0)])
testProgram(prog, pin, 2.0,
-1.0,
4,
1.0,
"0E",
[(1.1, -1.0),
(1.0, 0.0),
(0.75, 25.0),
(0.5, 50.0),
(0.25, 75.0),
(0.0, 100.0),
(-0.5, -1.0)])
testProgram(prog, pin, -1.0,
1.0,
12,
1.0,
"000FFE",
[(-0.5, -1.0),
(0.0, 0.0),
(0.25, 25.0),
(0.5, 50.0),
(0.75, 75.0),
(1.0, 100.0),
(1.1, -1.0)])
except Exception as e:
import traceback
print("error: Test failed: {}".format(traceback.format_exc()))
return 1
finally:
c.exit()
prog.exit()
return 0
if __name__ == "__main__":
exit(main())