// -*- C++ -*-
/*!
* @file Flip.cpp
* @brief Flip component
* @date $Date$
*
* $Id$
*/
#include "Flip.h"
// Module specification
//
static const char* flip_spec[] =
{
"implementation_id", "Flip",
"type_name", "Flip",
"description", "Flip component",
"version", "1.0.0",
"vendor", "Aizu",
"category", "Category",
"activity_type", "PERIODIC",
"kind", "DataFlowComponent",
"max_instance", "1",
"language", "C++",
"lang_type", "compile",
// Configuration variables
"conf.default.flipMode", "0",
// Widget
"conf.__widget__.flipMode", "radio",
// Constraints
"conf.__constraints__.flipMode", "(-1, 0, 1)",
""
};
//
/*!
* @brief constructor
* @param manager Maneger Object
*/
Flip::Flip(RTC::Manager* manager)
//
: RTC::DataFlowComponentBase(manager),
m_originalImageIn("originalImage", m_originalImage),
m_flippedImageOut("flippedImage", m_flippedImage)
//
{
}
/*!
* @brief destructor
*/
Flip::~Flip()
{
}
RTC::ReturnCode_t Flip::onInitialize()
{
// Registration: InPort/OutPort/Service
//
// Set InPort buffers
addInPort("originalImage", m_originalImageIn);
// Set OutPort buffer
addOutPort("flippedImage", m_flippedImageOut);
// Set service provider to Ports
// Set service consumers to Ports
// Set CORBA Service Ports
//
//
// Bind variables and configuration variable
bindParameter("flipMode", m_flipMode, "0");
//
return RTC::RTC_OK;
}
/*
RTC::ReturnCode_t Flip::onFinalize()
{
return RTC::RTC_OK;
}
*/
/*
RTC::ReturnCode_t Flip::onStartup(RTC::UniqueId ec_id)
{
return RTC::RTC_OK;
}
*/
/*
RTC::ReturnCode_t Flip::onShutdown(RTC::UniqueId ec_id)
{
return RTC::RTC_OK;
}
*/
RTC::ReturnCode_t Flip::onActivated(RTC::UniqueId ec_id)
{
// イメージ用メモリの初期化
m_imageBuff = NULL;
m_flipImageBuff = NULL;
// OutPort の画面サイズの初期化
m_flippedImage.width = 0;
m_flippedImage.height = 0;
return RTC::RTC_OK;
}
RTC::ReturnCode_t Flip::onDeactivated(RTC::UniqueId ec_id)
{
if (m_imageBuff != NULL)
{
// イメージ用メモリの解放
cvReleaseImage(&m_imageBuff);
cvReleaseImage(&m_flipImageBuff);
}
return RTC::RTC_OK;
}
RTC::ReturnCode_t Flip::onExecute(RTC::UniqueId ec_id)
{
// 新しいデータのチェック
if (m_originalImageIn.isNew()) {
// InPort データの読み込み
m_originalImageIn.read();
// InPort とOutPort の画面サイズ処理およびイメージ用メモリの確保
if (m_originalImage.width != m_flippedImage.width || m_originalImage.height != m_flippedImage.height)
{
m_flippedImage.width = m_originalImage.width;
m_flippedImage.height = m_originalImage.height;
// InPort のイメージサイズが変更された場合
if (m_imageBuff != NULL)
{
cvReleaseImage(&m_imageBuff);
cvReleaseImage(&m_flipImageBuff);
}
// イメージ用メモリの確保
m_imageBuff = cvCreateImage(cvSize(m_originalImage.width, m_originalImage.height), IPL_DEPTH_8U, 3);
m_flipImageBuff = cvCreateImage(cvSize(m_originalImage.width, m_originalImage.height), IPL_DEPTH_8U, 3);
}
// InPort の画像データをIplImage のimageData にコピー
memcpy(m_imageBuff->imageData, (void *)&(m_originalImage.pixels[0]), m_originalImage.pixels.length());
// InPort からの画像データを反転する。 m_flipMode 0: X 軸周り, 1: Y 軸周り, -1: 両方の軸周り
cvFlip(m_imageBuff, m_flipImageBuff, m_flipMode);
// 画像データのサイズ取得
int len = m_flipImageBuff->nChannels * m_flipImageBuff->width * m_flipImageBuff->height;
m_flippedImage.pixels.length(len);
// 反転した画像データをOutPort にコピー
memcpy((void *)&(m_flippedImage.pixels[0]), m_flipImageBuff->imageData, len);
// 反転した画像データをOutPort から出力する。
m_flippedImageOut.write();
}
return RTC::RTC_OK;
}
/*
RTC::ReturnCode_t Flip::onAborting(RTC::UniqueId ec_id)
{
return RTC::RTC_OK;
}
*/
/*
RTC::ReturnCode_t Flip::onError(RTC::UniqueId ec_id)
{
return RTC::RTC_OK;
}
*/
/*
RTC::ReturnCode_t Flip::onReset(RTC::UniqueId ec_id)
{
return RTC::RTC_OK;
}
*/
/*
RTC::ReturnCode_t Flip::onStateUpdate(RTC::UniqueId ec_id)
{
return RTC::RTC_OK;
}
*/
/*
RTC::ReturnCode_t Flip::onRateChanged(RTC::UniqueId ec_id)
{
return RTC::RTC_OK;
}
*/
extern "C"
{
void FlipInit(RTC::Manager* manager)
{
coil::Properties profile(flip_spec);
manager->registerFactory(profile,
RTC::Create,
RTC::Delete);
}
};