////////////////////////////////////////////////////////////////////////////// // 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.hpp" #include "Camera.hpp" #include ////////////////////////////////////////////////////////////////////////////// char GetKey() { char key; std::cin >> key; return key; } ////////////////////////////////////////////////////////////////////////////// int main() { std::cout << "Boost.Statechart Camera example\n\n"; std::cout << "h: Press shutter half-way\n"; std::cout << "f: Press shutter fully\n"; std::cout << "r: Release shutter\n"; std::cout << "c: Enter/exit configuration\n"; std::cout << "e: Exits the program\n\n"; std::cout << "You may chain commands, e.g. hfr 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; }