61 #include "rnr/rnrconfig.h" 64 #include "opencv/cv.h" 65 #include "opencv/highgui.h" 68 #include "WM/WMCamera.h" 70 #include "WM/WMLookFeel.h" 71 #include "WM/WMSession.h" 72 #include "WM/WMState.h" 77 using namespace WMWin;
87 WMState::WMState(WMSession &session,
int nInitAction)
89 m_pWin = session.m_pWin;
91 m_nInitAction = nInitAction;
92 m_nCurAction = WMUIActionNone;
93 m_bHardBttnEnable =
true;
117 int WMState::getNextAction(WMSession &session,
int nTimeoutMs)
119 session.m_pWin->WaitEvent(nTimeoutMs);
122 if( m_pMenu != NULL )
124 m_nCurAction = m_pMenu->GetCurrentAction();
125 m_pMenu->SetCurrentAction(WMUIActionNone);
129 m_nCurAction = WMUIActionNone;
134 void WMState::buildInterface(WMSession &session)
140 if( m_pMenu != NULL )
142 m_pMenu->Bind(session.m_pWin);
143 m_nCurAction = m_pMenu->SetCurrentAction(m_nInitAction);
147 session.m_pWin->ShowPageId(session.GetPageNum());
150 setMenuStates(session);
153 session.SetContext(
this);
156 void WMState::destroyInterface()
158 if( m_pMenu != NULL )
165 m_pWin->WorkspaceRemoveAll();
175 bool WMState::isHardButtonPushed(WMSession &session)
178 uint_t key = session.m_pWin->GetLastKeyPress() & 0x00ff;
179 LOGDIAG4(
"Key 0x%x pressed. Camera key=0x%x.", key, WMHardButtonCtlKey);
180 return key == WMHardButtonCtlKey ?
true:
false;
181 #elif defined ARCH_overo 182 return WMHardButtonCtlGetState();
184 uint_t key = session.m_pWin->GetLastKeyPress() & 0x00ff;
185 LOGDIAG4(
"Key 0x%x pressed. Camera key=0x%x.", key, WMHardButtonCtlKey);
186 return key == (uint_t)
'c' ?
true:
false;
198 WMStateImage::WMStateImage(WMSession &session,
199 const CvSize &sizeDisplay,
200 const CvSize &sizeIoI,
202 WMState(session, nInitAction)
207 m_pImgDisplay = NULL;
208 m_sizeDisplay = sizeDisplay;
211 m_pTransShadow = NULL;
212 m_bIoICanZoomIn =
true;
213 m_bIoICanZoomOut =
false;
214 m_bIoIIsPanning =
false;
215 m_bShadowChanged =
false;
221 WMStateImage::~WMStateImage()
238 int WMStateImage::getNextAction(WMSession &session,
int nTimeoutMs)
240 session.m_pWin->WaitEvent(nTimeoutMs);
252 m_pMenu->SetCurrentAction(WMUIActionNone);
253 m_mouse.SetCurrentAction(WMUIActionNone);
258 void WMStateImage::buildInterface(WMSession &session)
261 WMState::buildInterface(session);
264 session.m_pWin->WorkspaceSetAsCvImage();
267 m_mouse.Bind(session.m_pWin);
273 m_pImgShadow = cvCreateImage(m_sizeDisplay, IPL_DEPTH_8U, 3);
276 m_pImgDisplay = cvCreateImage(m_sizeDisplay, IPL_DEPTH_8U, 3);
279 cvSet(m_pImgDisplay, GuiRgbImageBg);
282 session.m_pWin->ShowCvImage(m_pImgDisplay);
288 m_rectIoIRoI = cvRect(0, 0, m_sizeIoI.width, m_sizeIoI.height);
289 m_bShadowChanged =
true;
292 m_pTransIoI =
new WMWinIoI(m_sizeIoI, m_sizeDisplay,
293 WMImgTransRot, WMImgTransAlign, WMImgTransCrop);
296 m_pTransShadow =
new WMWinIoI(m_sizeDisplay, m_sizeDisplay,
297 WMImgTransRot, WMImgTransAlign, WMImgTransCrop);
300 void WMStateImage::destroyInterface()
304 if( m_pImgShadow != NULL )
306 cvReleaseImage(&m_pImgShadow);
310 if( m_pImgDisplay != NULL )
312 cvReleaseImage(&m_pImgDisplay);
313 m_pImgDisplay = NULL;
316 if( m_pTransIoI != NULL )
322 if( m_pTransShadow != NULL )
324 delete m_pTransShadow;
325 m_pTransShadow = NULL;
336 void WMStateImage::resetView(WMSession &session)
339 m_rectIoIRoI = cvRect(0, 0, m_sizeIoI.width, m_sizeIoI.height);
340 m_bShadowChanged =
true;
343 m_bIoICanZoomIn =
true;
344 m_bIoICanZoomOut =
false;
345 m_bIoIIsPanning =
false;
348 m_pTransIoI->SetTransParams(m_sizeIoI,
359 void WMStateImage::markupPanImg(WMSession &session)
361 CvRect shadowROI = mapRect(m_rectIoIRoI);
362 CvScalar brighter = cvScalar(80);
364 cvSetImageROI(m_pImgMarked, shadowROI);
365 cvAddS(m_pImgMarked, brighter, m_pImgMarked);
366 cvResetImageROI(m_pImgMarked);
377 void WMStateImage::showMarkupImg(WMSession &session)
380 if( m_bShadowChanged )
382 LOGDIAG3(
"Updating shadow image.");
385 cvResize(m_pImgIoI, m_pImgShadow);
389 cvSetImageROI(m_pImgIoI, m_rectIoIRoI);
390 cvResize(m_pImgIoI, m_pImgShadow);
391 cvResetImageROI(m_pImgIoI);
394 m_bShadowChanged =
false;
397 cvCopy(m_pImgShadow, m_pImgDisplay);
398 m_pImgMarked = m_pImgDisplay;
405 markupPanImg(session);
411 session.m_pWin->ShowCvImage(m_pImgDisplay);
420 void WMStateImage::showImg(WMSession &session, IplImage *pImg)
423 cvSet(m_pImgDisplay, GuiRgbImageBg);
429 LOGDIAG4(
"Resolution of displayed image: %d, %d",
430 pImg->width, pImg->height);
431 m_pTransShadow->WMWinIoITrans(pImg, m_pImgDisplay);
435 session.m_pWin->ShowCvImage(m_pImgDisplay);
445 CvPoint WMStateImage::mapPt(CvPoint& ptHiRes)
451 ptShadow.x = ptHiRes.x - m_rectIoIRoI.x;
452 ptShadow.y = ptHiRes.y - m_rectIoIRoI.y;
455 fScale = (1.0 * (double)m_sizeDisplay.width) / (double)m_rectIoIRoI.width;
457 ptShadow.x = (
int)(fScale*ptShadow.x);
458 ptShadow.y = (int)(fScale*ptShadow.y);
470 CvPoint WMStateImage::mapPtPan(CvPoint& ptHiRes)
476 fScale = (1.0 * m_sizeDisplay.width) / m_sizeIoI.width;
478 ptShadow.x = (
int)(fScale*ptHiRes.x);
479 ptShadow.y = (int)(fScale*ptHiRes.y);
491 CvRect WMStateImage::mapRect(CvRect& rectHiRes)
496 fScale = (1.0 * m_sizeDisplay.width) / m_sizeIoI.width;
498 rectShadow.x = (
int)(rectHiRes.x*fScale);
499 rectShadow.y = (int)(rectHiRes.y*fScale);
500 rectShadow.width = (int)(rectHiRes.width*fScale);
501 rectShadow.height = (int)(rectHiRes.height*fScale);
517 void WMStateImage::transZoomIn(WMSession &session)
522 if( !m_bIoICanZoomIn )
527 sizeZoom =
ar43width((
int)(m_rectIoIRoI.width * 0.9));
529 if( (sizeZoom.width <= m_sizeDisplay.width) &&
530 (sizeZoom.height <= m_sizeDisplay.height) )
533 m_bIoICanZoomIn =
false;
539 x = m_rectIoIRoI.x + (m_rectIoIRoI.width / 2) - (sizeZoom.width /2);
540 y = m_rectIoIRoI.y + (m_rectIoIRoI.height/ 2) - (sizeZoom.height/2);
542 m_rectIoIRoI = cvRect(x, y, sizeZoom.width, sizeZoom.height);
543 m_bShadowChanged =
true;
545 if ( !m_bIoIIsPanning )
547 m_pTransIoI->SetTransParams(m_sizeIoI,
555 showMarkupImg(session);
557 m_bIoICanZoomOut =
true;
559 setModifiedState(
true);
569 void WMStateImage::transZoomOut(WMSession &session)
574 if( !m_bIoICanZoomOut )
579 sizeZoom =
ar43width((
int)(m_rectIoIRoI.width * 1.1));
581 if( (sizeZoom.width >= m_sizeIoI.width) ||
582 (sizeZoom.height >= m_sizeIoI.height) )
584 sizeZoom = m_sizeIoI;
585 m_bIoICanZoomOut =
false;
589 x = m_rectIoIRoI.x + (m_rectIoIRoI.width / 2) - (sizeZoom.width /2);
590 y = m_rectIoIRoI.y + (m_rectIoIRoI.height/ 2) - (sizeZoom.height/2);
593 if( x + sizeZoom.width > m_sizeIoI.width )
595 x = (m_sizeIoI.width - sizeZoom.width);
602 if( y + sizeZoom.height > m_sizeIoI.height )
604 y = (m_sizeIoI.height - sizeZoom.height);
611 m_rectIoIRoI = cvRect(x, y, sizeZoom.width, sizeZoom.height);
612 m_bShadowChanged =
true;
614 if ( !m_bIoIIsPanning )
616 m_pTransIoI->SetTransParams(m_sizeIoI,
624 showMarkupImg(session);
626 m_bIoICanZoomIn =
true;
628 setModifiedState(
true);
638 void WMStateImage::transPan(WMSession &session)
646 ptRaw = m_mouse.GetMousePoint();
649 if( (ptRaw.x < 0) || (ptRaw.x >= m_sizeDisplay.width) ||
650 (ptRaw.y < 0) || (ptRaw.y >= m_sizeDisplay.height) )
653 LOGDIAG4(
"Mouse pt out of scope for panning.");
656 showMarkupImg(session);
660 ptImg = m_pTransIoI->WMWinIoIMapPoint(ptRaw);
668 if( nAction == WMUIActionDragStart )
670 LOGDIAG4(
"Drag Start");
675 else if( nAction == WMUIActionDragEnd )
677 LOGDIAG4(
"Drag End.");
682 if(( abs(m_ptPanRaw.x - ptRaw.x) < 10 ) && (abs(m_ptPanRaw.y - ptRaw.y) < 10))
687 x = m_rectIoIRoI.x - m_ptPan.x + ptImg.x;
688 y = m_rectIoIRoI.y - m_ptPan.y + ptImg.y;
694 else if( x + m_rectIoIRoI.width > m_sizeIoI.width )
696 x = m_sizeIoI.width - m_rectIoIRoI.width;
703 else if( y + m_rectIoIRoI.height > m_sizeIoI.height )
705 y = m_sizeIoI.height - m_rectIoIRoI.height;
712 CvRect tmpRoI = cvRect(0,0, m_sizeIoI.width, m_sizeIoI.height);
713 m_pTransIoI->SetTransParams(m_sizeIoI,
723 showMarkupImg(session);
725 setModifiedState(
true);
736 WMStateCvCamera::WMStateCvCamera(WMSession &session,
737 const CvSize &sizeDisplay,
738 const CameraRes eVideoRes,
739 const CameraRes eImageRes,
741 WMState(session, nInitAction),
742 m_camera(session.m_sVidDevName, session.m_nVideoIndex, eVideoRes, eImageRes)
745 m_pImgDisplay = NULL;
746 m_sizeDisplay = sizeDisplay;
747 m_eVideoRes = eVideoRes;
756 WMStateCvCamera::~WMStateCvCamera()
773 int WMStateCvCamera::getNextAction(WMSession &session,
int nTimeoutMs)
775 session.m_pWin->WaitEvent(nTimeoutMs);
790 m_pMenu->SetCurrentAction(WMUIActionNone);
795 void WMStateCvCamera::buildInterface(WMSession &session)
798 WMState::buildInterface(session);
801 session.m_pWin->WorkspaceSetAsCvImage();
804 m_pImgDisplay = cvCreateImage(m_sizeDisplay, IPL_DEPTH_8U, 3);
807 cvSet(m_pImgDisplay, GuiRgbImageBg);
810 session.m_pWin->ShowCvImage(m_pImgDisplay);
816 m_camera.startCamera(m_eVideoRes);
818 if( m_camera.isCameraRunning() )
820 m_pTransIoI =
new WMWinIoI(m_camera.getVideoResolution(),
834 void WMStateCvCamera::destroyInterface()
836 if( m_pImgMarked != NULL )
838 cvReleaseImage(&m_pImgMarked);
842 if( m_pImgDisplay != NULL )
844 cvReleaseImage(&m_pImgDisplay);
845 m_pImgDisplay = NULL;
848 if( m_pTransIoI != NULL )
860 void WMStateCvCamera::cloneFrame(WMSession &session)
865 if( m_pImgMarked != NULL )
867 cvReleaseImage(&m_pImgMarked);
872 if( (pImgFrame = m_camera.getCurFrame()) != NULL )
874 m_pImgMarked = cvCloneImage(pImgFrame);
885 void WMStateCvCamera::showMarkupImg(WMSession &session)
894 showImg(session, m_pImgMarked);
903 void WMStateCvCamera::showImg(WMSession &session, IplImage *pImg)
906 cvSet(m_pImgDisplay, GuiRgbImageBg);
911 m_pTransIoI->WMWinIoITrans(pImg, m_pImgDisplay);
915 session.m_pWin->ShowCvImage(m_pImgDisplay);
929 void WMStateCvCamera::transRunVideo(WMSession &session)
933 if( (pImgFrame = m_camera.grabFrame()) == NULL )
935 session.PushFatalState(
"Failed to grab video frame.");
939 showImg(session, pImgFrame);
950 void WMStateCvCamera::transRunMarkupVideo(WMSession &session)
954 if( (pImgFrame = m_camera.grabFrame()) == NULL )
956 session.PushFatalState(
"Failed to grab video frame.");
960 showMarkupImg(session);
971 void WMStateCvCamera::transStopVideo(WMSession &session)
973 m_camera.stopCamera();
984 WMStateGstCamera::WMStateGstCamera(WMSession &session,
985 const CvSize &sizeDisplay,
986 const CameraRes eVideoRes,
987 const CameraRes eImageRes,
989 WMState(session, nInitAction),
990 m_camera(session.m_sVidDevName, session.m_nVideoIndex, eVideoRes, eImageRes)
992 m_sizeVidWin = sizeDisplay;
1000 WMStateGstCamera::~WMStateGstCamera()
1017 int WMStateGstCamera::getNextAction(WMSession &session,
int nTimeoutMs)
1019 session.m_pWin->WaitEvent(nTimeoutMs);
1034 m_pMenu->SetCurrentAction(WMUIActionNone);
1039 void WMStateGstCamera::buildInterface(WMSession &session)
1042 WMState::buildInterface(session);
1045 session.m_pWin->WorkspaceSetAsGstWin(m_sizeVidWin);
1048 m_camera.setXid(session.m_pWin->GetGstXid());
1051 m_camera.startCamera();
1054 void WMStateGstCamera::destroyInterface()
1065 void WMStateGstCamera::cloneFrame(WMSession &session)
1076 void WMStateGstCamera::showMarkupImg(WMSession &session)
1088 void WMStateGstCamera::showImg(WMSession &session, IplImage *pImg)
1103 void WMStateGstCamera::transRunVideo(WMSession &session)
1115 void WMStateGstCamera::transRunMarkupVideo(WMSession &session)
1126 void WMStateGstCamera::transStopVideo(WMSession &session)
1128 m_camera.stopCamera();
int m_nCurAction
current state input action
Menu * m_pMenu
button menu
bool m_bHardBttnEnable
enable/disable hard button input
cv::Size ar43width(cv::Size &siz)
Calculate the nearest 4:3 aspect ratio from the width component of the target size.
int getCurAction()
Get the currently retrieved input action.