GoForSmoke:
You can make your process state out of multiple T/F bits to reduce if (a&b&c...) logic to if (value) logic.
You have the beam-break trigger that should have a task just to watch the pin and update 2 process state bits; bit 0 is now and bit 1 is previous. When the bits differ (== 1 or 2) the trigger changed state, next read the 2 bits will be the same.
You have a bit for error detected when trigger time exceeds 10 seconds. A task should run when it is set that clears the error bit if state bit 0 (trigger pin now state) is HIGH. Error bit is process state bit 2, a red flag to the camera task.
A task for the camera if process state == 2 (trigger now LOW, trigger previous HIGH, no error) to mark start time and start the camera.
A task for the camera if process state == 0 (trigger now LOW, trigger previous LOW, no error) to check for timeout then stop the camera and set the process status error bit.
A task for the camera if process state == 1 (trigger now HIGH, trigger previous LOW, no error) to stop the camera.
Tasks here are code inside of if-else or switch-case structures inside of void loop(). They all run if only to see whether or not conditions are right: a pin state, a value, time, some condition passes and the task does its work.
Do Not Use Delaying Code, it only screws up responsiveness and timing badly.
When you're not programming a wodges of RAM PC, try using byte and char variables for small numbers like pin numbers and for-next indexes instead of ints and #defines that take twice the RAM. Uno has 2048 bytes of mind-your-head-don't-bump RAM for heap and stack, make a habit to check variable type when defining as it takes time to change.
You've put quite some effort into this so I'll attempt a response.
At the outset I'll say that there is always a trade off between efficiency and transparency. An optimally efficient program may be difficult, especially for a beginner, to understand and maintain.
You've put some emphasis on efficient representation of states and testing the current state with bits representing states. Of course, it is a matter of style but I prefer the following representation:
enum class State : byte { BEAM_TRUE = 1 , BEAM_BREAK = 2 , PENDING_NO_DETECTION = 3 } ;
State state ;
However, I agree that say:
const int SENSOR = 3;
would have been better as
const byte SENSOR = 3;
Anyway, if you want to continue the discussion, you have the option of showcasing your solution model by rewriting the code which the OP has confirmed as working and we can compare them.