Your problem is that you're not thinking in terms of an event driven system. You're thinking in terms of a linear system.
In a linear system, A happens before B which happens before C which happens before D.
So... It's:
DoThingA();
delay();
DoThingB();
delay();
DoThingC();
delay();
DoThingD();
In an event driven system, you set up events, then stuff happens! It's more like:
Phase 1: Set up events.
Phase 2: ?
Phase 3: Profit!
Here's how you need to look at it. The 6 motors are indeed doing different tasks, but they are not being DIRECTED at the same time. Think of time as a line. The microcontroller is fast... damn fast. It can respond to an event and instruct the motor to do something in a tiny amount of time. Hundreds of these events can be preformed every second.
In an event driven system, the events are the trigger that causes the microcontroller to change the current status of the motor... like running or not running.
Let's look at your motor sequence for one motor:
'Motor1: run for (random) time, (random) speed, then stop and change direction, again run for (random) time, (random) speed
at the same time:"
Let's use my Event Manager system roboticcore.com to show how this works.
Basically. One handler per motor. You need a starter event in setup():
AddEvent(TIMER,ONE_SHOT,1000,Motor1Handler);
Then you need an event handler:
void Motor1Handler()
{
// Pseudo code.
// Change motor direction.
// Select random motor speed.
// Drive motor at selected speed and direction.
// Select random delay.
AddEvent(TIMER,ONE_SHOT,random_delay,Motor1Handler);
}
Your entire program is then:
#include "EventManager.h"
void Motor1Handler(void)
{
long random_time;
// Motor 1 handler code here!
// Reset event.
AddEvent(TIMER,ONE_SHOT,random_time,Motor1Handler);
}
void Motor2Handler(void)
{
long random_time;
// Motor 2 handler code here!
// Reset event.
AddEvent(TIMER,ONE_SHOT,random_time,Motor2Handler);
}
void Motor3Handler(void)
{
long random_time;
// Motor 3 handler code here!
// Reset event.
AddEvent(TIMER,ONE_SHOT,random_time,Motor3Handler);
}
void Motor4Handler(void)
{
long random_time;
// Motor 4 handler code here!
// Reset event.
AddEvent(TIMER,ONE_SHOT,random_time,Motor4Handler);
}
void Motor5Handler(void)
{
long random_time;
// Motor 5 handler code here!
// Reset event.
AddEvent(TIMER,ONE_SHOT,random_time,Motor5Handler);
}
void Motor6Handler(void)
{
long random_time;
// Motor 6 handler code here!
// Reset event.
AddEvent(TIMER,ONE_SHOT,random_time,Motor6Handler);
}
void setup()
{
// Initialize the Event Handler System.
InitEvents();
// Start Motor 1 event chain. Other motor starts are below.
AddEvent(TIMER,ONE_SHOT,1000,Motor1Handler);
AddEvent(TIMER,ONE_SHOT,1000,Motor2Handler);
AddEvent(TIMER,ONE_SHOT,1000,Motor3Handler);
AddEvent(TIMER,ONE_SHOT,1000,Motor4Handler);
AddEvent(TIMER,ONE_SHOT,1000,Motor5Handler);
AddEvent(TIMER,ONE_SHOT,1000,Motor6Handler);
}
void loop()
{
ProcessEvents(millis());
}