+//////////////////////////////////////////////////////////////////////////////
+// Copyright 2002-2006 Andreas Huber Doenni
+// Distributed under the Boost Software License, Version 1.0. (See accompany-
+// ing file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//////////////////////////////////////////////////////////////////////////////
+
+
+
+//////////////////////////////////////////////////////////////////////////////
+// This program shows how a state machine can be spread over several
+// translation units if necessary. The inner workings of a digital camera are
+// modeled, the corresponding state chart looks as follows:
+//
+// ---------------------------
+// | |
+// | NotShooting |
+// | |
+// | ------------- |<---O
+// | O--->| Idle | | --------------
+// | ------------- | EvShutterHalf | |
+// | | ^ |------------------>| Shooting |
+// | EvConfig | | EvConfig | | |
+// | v | | EvShutterRelease | |
+// | ------------- |<------------------| |
+// | | Configuring | | | |
+// | ------------- | --------------
+// ---------------------------
+//
+// The states Configuring and Shooting will contain a large amount of logic,
+// so they are implemented in their own translation units. This way one team
+// could implement the Configuring mode while the other would work on the
+// Shooting mode. Once the above state chart is implemented, the teams could
+// work completely independently of each other.
+
+
+
+#include "Precompiled.cpp"
+#include "Camera.cpp"
+#include "Shooting.cpp"
+#include "Configuring.cpp"
+
+
+#include <iostream>
+
+
+
+//////////////////////////////////////////////////////////////////////////////
+char GetKey()
+{
+ char key;
+ std::cin >> key;
+ return key;
+}
+
+
+//////////////////////////////////////////////////////////////////////////////
+int main()
+{
+ std::cout << "Boost.Statechart Camera example\n\n";
+
+ std::cout << "h<CR>: Press shutter half-way\n";
+ std::cout << "f<CR>: Press shutter fully\n";
+ std::cout << "r<CR>: Release shutter\n";
+ std::cout << "c<CR>: Enter/exit configuration\n";
+ std::cout << "e<CR>: Exits the program\n\n";
+ std::cout << "You may chain commands, e.g. hfr<CR> first presses the shutter half-way,\n";
+ std::cout << "fully and then releases it.\n\n";
+
+
+ Camera myCamera;
+ myCamera.initiate();
+
+ char key = GetKey();
+
+ while ( key != 'e' )
+ {
+ switch( key )
+ {
+ case 'h':
+ {
+ myCamera.process_event( EvShutterHalf() );
+ }
+ break;
+
+ case 'f':
+ {
+ myCamera.process_event( EvShutterFull() );
+ }
+ break;
+
+ case 'r':
+ {
+ myCamera.process_event( EvShutterRelease() );
+ }
+ break;
+
+ case 'c':
+ {
+ myCamera.process_event( EvConfig() );
+ }
+ break;
+
+ default:
+ {
+ std::cout << "Invalid key!\n";
+ }
+ break;
+ }
+
+ key = GetKey();
+ }
+
+ return 0;
+}