//## begin module%1.4%.codegen_version preserve=yes
//   Read the documentation to learn more about C++ code generator
//   versioning.
//## end module%1.4%.codegen_version

//## begin module%3D86D3FC0244.cm preserve=no
//	  %X% %Q% %Z% %W%
//## end module%3D86D3FC0244.cm

//## begin module%3D86D3FC0244.cp preserve=no
//## end module%3D86D3FC0244.cp

//## Module: Camera%3D86D3FC0244; Pseudo Package body
//## Source file: C:\Program Files\Rational\Rose\C++\source\Camera.cpp

//## begin module%3D86D3FC0244.additionalIncludes preserve=no
//## end module%3D86D3FC0244.additionalIncludes

//## begin module%3D86D3FC0244.includes preserve=yes
#include "Version.h"
//## end module%3D86D3FC0244.includes

// Camera
#include "Camera.h"
//## begin module%3D86D3FC0244.additionalDeclarations preserve=yes
//## end module%3D86D3FC0244.additionalDeclarations


// Class Camera

//## begin Camera::aCamera%3D9AA26D032A.attr preserve=no  private: static Camera {U}
Camera Camera::cameras[NUMBER_OF_ROBOTS];
//## end Camera::aCamera%3D9AA26D032A.attr

Camera::Camera()
  //## begin Camera::Camera%3D86D3FC0244_const.hasinit preserve=no
  //## end Camera::Camera%3D86D3FC0244_const.hasinit
  //## begin Camera::Camera%3D86D3FC0244_const.initialization preserve=yes
  //## end Camera::Camera%3D86D3FC0244_const.initialization
{
  //## begin Camera::Camera%3D86D3FC0244_const.body preserve=yes
  //to run the program on the EyeSim simulator the initialization must not take place
  //in the constructor
  //so we have to declare the method as public and call it in main before we start
  //the program
  //if running the program on real robots the initialization must be done in the
  //constructors (otherwise the camera initialization doesn't work, for example
  //(for whatever reason)
//  initialize();
  //## end Camera::Camera%3D86D3FC0244_const.body
}


Camera::~Camera()
{
  //## begin Camera::~Camera%3D86D3FC0244_dest.body preserve=yes
	release();
  //## end Camera::~Camera%3D86D3FC0244_dest.body
}



//## Other Operations (implementation)
Camera* Camera::getCamera ()
{
  //## begin Camera::getCamera%3D9AA24401FE.body preserve=yes
  return &cameras[OSMachineID()];
  //## end Camera::getCamera%3D9AA24401FE.body
}

void Camera::getFrame (image& aImage)
{
  //## begin Camera::getFrame%3D9292500154.body preserve=yes
  CAMGetFrame(&aImage);
  LCDPutGraphic(&aImage); // added by TB
  //## end Camera::getFrame%3D9292500154.body
}

void Camera::getColorFrame (colimage& aColorImage)
{
  //## begin Camera::getColorFrame%3D92926000DC.body preserve=yes
  CAMGetColFrame(&aColorImage, 0); //0 means no automatic conversion to grayscale
  LCDPutColorGraphic(&aColorImage); // added by TB
  //## end Camera::getColorFrame%3D92926000DC.body
}

bool Camera::initialize ()
{
  //## begin Camera::initialize%3D92923E00DC.body preserve=yes
  int camera = CAMInit(NORMAL);
  //CAMMode(AUTOBRIGHTNESS);???

  switch(camera)
  {
    case 255:
			LCDPutString("No camera!\n");
			OSPanic(""); //or return false??
			break;
    case 254:
			LCDPutString("error!\n");
			OSPanic(""); //or return false??
      break;
    case 0:
			LCDPutString("No color camera!\n");
			OSPanic(""); //or return false??
      break;
    case 16:
			LCDPutString("QuickCam V2 color\n"); //ok??
      break;
    case 17:
			LCDPutString("EyeCam-1 (6300)\n"); //ok??
      break;
    case 18:
			LCDPutString("EyeCam-2 (7620)\n"); //ok??
      break;
    case 19:
			LCDPutString("EyeCam-3 (6620)\n"); //ok??
      break;
    default:
			LCDPutString("Unknown camera\ntype!\n");
			OSPanic("");  //or return false??
      break;
  }
  //the EyeSim simulator does not support servos yet
#ifndef EYESIM_CUBECLUSTERING_PARAMETERS
    if ((cameraServoHandle = SERVOInit(SERVO12)))
    {
#ifdef EYEBOT8_CUBECLUSTERING_PARAMETERS
      SERVOSet(cameraServoHandle, 120); //values can go from 0 .. 255
#endif
#ifdef EYEBOT3_CUBECLUSTERING_PARAMETERS
      SERVOSet(cameraServoHandle, 112); //values can go from 0 .. 255
#endif
#ifdef EYEBOT10_CUBECLUSTERING_PARAMETERS
      SERVOSet(cameraServoHandle, 128); //values can go from 0 .. 255
#endif
    }
    else
    {
		  LCDPutString("No camera servo!\n");
    }
#endif
  return true;
  //## end Camera::initialize%3D92923E00DC.body
}

bool Camera::release ()
{
  //## begin Camera::release%3D92923E010E.body preserve=yes
  CAMRelease();
  SERVORelease(cameraServoHandle);
  return true;
  //## end Camera::release%3D92923E010E.body
}

// Additional Declarations
  //## begin Camera%3D86D3FC0244.declarations preserve=yes
  //## end Camera%3D86D3FC0244.declarations

//## begin module%3D86D3FC0244.epilog preserve=yes
//## end module%3D86D3FC0244.epilog
