If you made sure your threading is fine please remove these debug which will fill up the log so fast. Please remove the other ones as well if not needed.
So if calibration is good but flow sensor is bad, we won't apply calibration? I think these two checks should be separated. Start test as passed. Then fail if either check is failed.
I remember I mentioned somewhere in the code to use the QObject internal timer and also mentioned MainTimer as an example. But I didn't mean to use the MainTimer. Please look at the MainTimer as an example of how to use the QObject internal timer and use it instead of the MainTimer itself.
I think it should be and. Because it is a "whichever is greater" condition. So if error is 6% but delta is less than 0.1 mL, I would not want to trigger the error because the volume is too small to alarm on a percentage basis. Likewise, if delta is > 0.1 mL but error is < 5%, no alarm.