f8e471e541
[SVN r36255]
111 lines
3.1 KiB
C++
111 lines
3.1 KiB
C++
//////////////////////////////////////////////////////////////////////////////
|
|
// 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 <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;
|
|
}
|