void CContextWeather::TimerProc(UINT idTimer) { time_t now; struct tm *t; char szText[128] = {0,}; switch(idTimer) { case CLOCK_TIMER: now = time(NULL); t = localtime(&now); if(g_setup_data.m_SetupData.wallpad_type != WALLPAD_TYPE_KCM) { sprintf(szText, "%04d년 %02d월 %02d일\0", t->tm_year + 1900, t->tm_mon + 1, t->tm_mday); RedrawImage(g_wid, g_gc, 300, 34, 200, 32, 300, 34, 200, 32, WEATHER_OBJ_BG); DrawText(szText, g_wid, g_gc, 300, 34, 200, 32, g_font, 24, WHITE, TXT_HALIGN_CENTER|TXT_VALIGN_MIDDLE); memset(szText, 0, 128); sprintf(szText, "%02d:%02d\0", t->tm_hour, t->tm_min); RedrawImage(g_wid, g_gc, 300, 68, 200, 88, 300, 68, 200, 88, WEATHER_OBJ_BG); DrawText(szText, g_wid, g_gc, 300, 68, 200, 88, g_font, 72, WHITE, TXT_HALIGN_CENTER|TXT_VALIGN_MIDDLE); } else { sprintf(szText, "%02d:%02d\0", t->tm_hour, t->tm_min); RedrawImage(g_wid, g_gc, 300, 68, 200, 88, 300, 68, 200, 88, WEATHER_OBJ_BG); DrawText(szText, g_wid, g_gc, 300, 68, 200, 88, g_font, 72, WHITE, TXT_HALIGN_CENTER|TXT_VALIGN_MIDDLE); } break; case RESPONSE_TIMER: if(g_pWallPad) { g_pWallPad->RequestWeatherInfo(); //날씨정보요청 } break; } }
void CContextWeather::ButtonDown(UINT usGpioFlag, UINT usEventEnum) { DBGMSGC(DBG_WEATHER, "++\r\n"); if(usEventEnum == MTM_GPIO_BUTTON_DOWN) { } else if(usEventEnum == MTM_GPIO_BUTTON_LONG) { if( CHK_FLAG(usGpioFlag, BIT_FLAG(GPIO_FRONT_RIGHT_TOP)|BIT_FLAG(GPIO_FRONT_RIGHT_BOTTOM)) || CHK_FLAG(usGpioFlag, BIT_FLAG(GPIO_REAR_VOL_UP)|BIT_FLAG(GPIO_REAR_VOL_DOWN)) ) { if (!CHK_FLAG(usGpioFlag, BIT_FLAG(GPIO_FRONT_RIGHT_MIDDLE))) { GrUnmapWindow(m_wid_ment); //Ment Scroll Window 영역이 까맣게 보이는 증상이 있어서 배경으로 다시 덮어줌 RedrawImage(g_wid, g_gc, MENT_AREA_X, MENT_AREA_Y, MENT_AREA_WIDTH, MENT_AREA_HEIGHT, MENT_AREA_X, MENT_AREA_Y, MENT_AREA_WIDTH, MENT_AREA_HEIGHT, WEATHER_OBJ_BG); g_state.ChangeState(STATE_SETUP); } } } DBGMSGC(DBG_WEATHER, "--\r\n"); }
bool wxGenericDragImage::Show() { wxASSERT_MSG( (m_windowDC != NULL), wxT("No window DC in wxGenericDragImage::Show()") ); // Show at the current position if (!m_isShown) { // This is where we restore the backing bitmap, in case // something has changed on the window. #ifndef wxHAS_NATIVE_OVERLAY wxBitmap* backing = (m_pBackingBitmap ? m_pBackingBitmap : (wxBitmap*) & m_backingBitmap); wxMemoryDC memDC; memDC.SelectObject(* backing); UpdateBackingFromWindow(* m_windowDC, memDC, m_boundingRect, wxRect(0, 0, m_boundingRect.width, m_boundingRect.height)); //memDC.Blit(0, 0, m_boundingRect.width, m_boundingRect.height, m_windowDC, m_boundingRect.x, m_boundingRect.y); memDC.SelectObject(wxNullBitmap); #endif // !wxHAS_NATIVE_OVERLAY RedrawImage(m_position - m_offset, m_position - m_offset, false, true); } m_isShown = true; m_isDirty = true; return true; }
void CContextWeather::Proc(UINT nContextNum) { char szWaveFile[7][14] = { "serenity\0", "party_cloudy\0", "cloudy\0", "shower\0", "rainny\0", "thunderstorm\0", "snow\0" }; char szWaveFilePath[128] = {0,}; DBGMSGC(DBG_WEATHER, "++ [%d]\r\n", nContextNum); switch (nContextNum) { case 0: //하단 배너 준비 if ((!g_setup_data.m_SetupData.light_stat) && (g_gpio_mtm.CheckWatchdogReset()==FALSE) && (g_gpio_mtm.GetGpioInputPin(GPIO_DOOR_DETECT)==HIGH)) { //와치독 리셋상태가 아니고 출입문이 닫힌 상태이면 sprintf(szWaveFilePath, "/app/sound/%s.wav\0", szWaveFile[g_setup_data.m_SetupData.weather_right]); PlayWavFile(szWaveFilePath); } //문자열의 길이 m_len_ment = strlen(g_szWeatherMent[g_setup_data.m_SetupData.weather_right]); //폰트크기를 감안한 문자열이 표시되는 폭 m_width_ment = m_len_ment*12; //멘트 텍스트를 픽셀맵에 그리기 GrMapWindow(m_wid_ment); RedrawImage(m_wid_ment, g_gc, 0, 0, MENT_AREA_WIDTH, MENT_AREA_HEIGHT, MENT_AREA_X, MENT_AREA_Y, MENT_AREA_WIDTH, MENT_AREA_HEIGHT, WEATHER_OBJ_BG); RedrawImage(m_pixmap_ment, g_gc, 0, 0, MENT_AREA_WIDTH, MENT_AREA_HEIGHT, MENT_AREA_X, MENT_AREA_Y, MENT_AREA_WIDTH, MENT_AREA_HEIGHT, WEATHER_OBJ_BG); RedrawImage(m_pixmap_ment, g_gc, MENT_AREA_WIDTH, 0, MENT_PIXEL_MAP_WIDTH-MENT_AREA_WIDTH, MENT_AREA_HEIGHT, MENT_AREA_X, MENT_AREA_Y, MENT_PIXEL_MAP_WIDTH-MENT_AREA_WIDTH, MENT_AREA_HEIGHT, WEATHER_OBJ_BG); DrawText(g_szWeatherMent[g_setup_data.m_SetupData.weather_right], m_pixmap_ment, g_gc, 0, 0, m_width_ment, MENT_AREA_HEIGHT, g_font, 24, WHITE, TXT_HALIGN_LEFT|TXT_VALIGN_MIDDLE); GrRaiseWindow(m_wid_ment); m_nThreadStep = 0; break; case 1: break; } DBGMSGC(DBG_WEATHER, "--\r\n"); }
void CContextWeather::DeInit() { CContext::DeInit(); GrDestroyWindow(m_pixmap_ment); // GrUnmapWindow(m_wid_ment); GrDestroyWindow(m_wid_ment); //Ment Scroll Window 영역이 까맣게 보이는 증상이 있어서 배경으로 다시 덮어줌 RedrawImage(g_wid, g_gc, MENT_AREA_X, MENT_AREA_Y, MENT_AREA_WIDTH, MENT_AREA_HEIGHT, MENT_AREA_X, MENT_AREA_Y, MENT_AREA_WIDTH, MENT_AREA_HEIGHT, WEATHER_OBJ_BG); m_ObjectList.RemoveAll(); }
bool wxGenericDragImage::Hide() { wxASSERT_MSG( (m_windowDC != NULL), wxT("No window DC in wxGenericDragImage::Hide()") ); // Repair the old position if (m_isShown && m_isDirty) { RedrawImage(m_position - m_offset, m_position - m_offset, true, false); } m_isShown = false; m_isDirty = false; return true; }
void CContextParking::Draw(UINT nContextNum) { MTM_DATA_PARKING parking_info; char szText[64] = {0,}; int i, line_feed = 0; if(m_gc==0) return; DBGMSGC(DBG_PARKING, "++ [%d]\r\n", nContextNum); //배경 m_ObjectList.Draw(PARKING_OBJ_BG); //아이콘 m_ObjectList.Draw(PARKING_OBJ_ICON); //주차 이미지 m_ObjectList.Draw(PARKING_OBJ_IMAGE); parking_list_get_item(0, &parking_info); if (parking_info.status == MTM_DATA_PARKING_STATUS_IN) { sprintf(szText, "[%s]층 [%s]에 주차 되었습니다", parking_info.floor, parking_info.zone); DrawText(szText, m_wid_parent, m_gc, 245, 89, 500, 32, g_font, 24, WHITE, TXT_HALIGN_LEFT|TXT_VALIGN_MIDDLE); } else { DrawText("주차위치를 확인할 수 없습니다", m_wid_parent, m_gc, 245, 89, 500, 32, g_font, 24, WHITE, TXT_HALIGN_LEFT|TXT_VALIGN_MIDDLE); } // 37,251 - 209,450 : w=172, h=200 RedrawImage(g_wid, g_gc, 37, 251, 172, 200, 37, 251, 172, 200, PARKING_OBJ_BG); for (i = 1; i < MAX_PARKING_LIST; i++) { parking_list_get_item(i, &parking_info); if (parking_info.status != MTM_DATA_PARKING_STATUS_IN) break; memset(szText, 0, 64); sprintf(szText, "%s -%s", parking_info.floor, parking_info.zone); DrawText(szText, m_wid_parent, m_gc, 37, 251+line_feed*36, 172, 32, g_font, 24, WHITE, TXT_HALIGN_LEFT|TXT_VALIGN_MIDDLE); line_feed++; } DBGMSGC(DBG_PARKING, "--\r\n"); }
void CContextWeather::ButtonUp(UINT usGpioFlag, UINT usEventEnum) { DBGMSGC(DBG_WEATHER, "++\r\n"); if(usEventEnum == MTM_GPIO_BUTTON_UP) { switch(usGpioFlag) { case GPIO_FLAG_FRONT_LEFT_TOP: //Weather if(g_pWallPad) { g_pWallPad->RequestWeatherInfo(); //날씨정보요청 } break; case GPIO_FLAG_FRONT_LEFT_MIDDLE: //Elevator g_state.ChangeState(STATE_ELEVATOR); break; case GPIO_FLAG_FRONT_LEFT_BOTTOM: //Parking g_state.ChangeState(STATE_PARKING); break; case GPIO_FLAG_FRONT_RIGHT_TOP: //Gas g_state.ChangeState(STATE_GAS); break; case GPIO_FLAG_FRONT_RIGHT_MIDDLE: //Light g_state.ChangeState(STATE_LIGHT); break; case GPIO_FLAG_FRONT_RIGHT_BOTTOM: //Security g_state.ChangeState(STATE_SECURITY); break; default: return; } if(usGpioFlag != GPIO_FLAG_FRONT_LEFT_TOP) { GrUnmapWindow(m_wid_ment); //Ment Scroll Window 영역이 까맣게 보이는 증상이 있어서 배경으로 다시 덮어줌 RedrawImage(g_wid, g_gc, MENT_AREA_X, MENT_AREA_Y, MENT_AREA_WIDTH, MENT_AREA_HEIGHT, MENT_AREA_X, MENT_AREA_Y, MENT_AREA_WIDTH, MENT_AREA_HEIGHT, WEATHER_OBJ_BG); } } DBGMSGC(DBG_WEATHER, "--\r\n"); }
// Move the image: call from OnMouseMove. Pt is in window client coordinates if window // is non-NULL, or in screen coordinates if NULL. bool wxGenericDragImage::Move(const wxPoint& pt) { wxASSERT_MSG( (m_windowDC != NULL), wxT("No window DC in wxGenericDragImage::Move()") ); wxPoint pt2(pt); if (m_fullScreen) pt2 = m_window->ClientToScreen(pt); // Erase at old position, then show at the current position wxPoint oldPos = m_position; bool eraseOldImage = (m_isDirty && m_isShown); if (m_isShown) RedrawImage(oldPos - m_offset, pt2 - m_offset, eraseOldImage, true); m_position = pt2; if (m_isShown) m_isDirty = true; return true; }
// // Member Function // void CContextWeather::Init() { CObject* pObject; CObjectIcon* pObjectIcon; UINT id; CContext::Init(); // 배경 이미지 pObject = new CObjectImage(m_wid_parent, m_gc, 0, 0, g_scr_info.cols, g_scr_info.rows); if(pObject) { pObject->LoadImage(IMG_BACKGROUND, "/app/img/main_bg_blank.png"); id = m_ObjectList.AddObject(pObject); } // 왼쪽 날씨 이미지 pObject = new CObjectIcon(m_wid_parent, m_gc, 1, 169, 300, 246); if(pObject) { pObjectIcon = (CObjectIcon*)pObject; pObjectIcon->AllocImageCount(IMG_ENUM_WEATHER_COUNT); pObject->LoadImage(IMG_ENUM_WEATHER_SERENITY, "/app/img/weather/serenity.png"); pObject->LoadImage(IMG_ENUM_WEATHER_PARTLY_CLOUDY, "/app/img/weather/partly_cloudy.png"); pObject->LoadImage(IMG_ENUM_WEATHER_CLOUDY, "/app/img/weather/cloudy.png"); pObject->LoadImage(IMG_ENUM_WEATHER_SHOWER, "/app/img/weather/shower.png"); pObject->LoadImage(IMG_ENUM_WEATHER_RAINNY, "/app/img/weather/rainny.png"); pObject->LoadImage(IMG_ENUM_WEATHER_THUNDERSTORM, "/app/img/weather/thunderstorm.png"); pObject->LoadImage(IMG_ENUM_WEATHER_SNOW, "/app/img/weather/snow.png"); id = m_ObjectList.AddObject(pObject); } // 오른쪽 날씨 이미지 pObject = new CObjectIcon(m_wid_parent, m_gc, 499, 169, 300, 246); if(pObject) { pObjectIcon = (CObjectIcon*)pObject; pObjectIcon->AllocImageCount(IMG_ENUM_WEATHER_COUNT); pObject->LoadImage(IMG_ENUM_WEATHER_SERENITY, "/app/img/weather/serenity.png"); pObject->LoadImage(IMG_ENUM_WEATHER_PARTLY_CLOUDY, "/app/img/weather/partly_cloudy.png"); pObject->LoadImage(IMG_ENUM_WEATHER_CLOUDY, "/app/img/weather/cloudy.png"); pObject->LoadImage(IMG_ENUM_WEATHER_SHOWER, "/app/img/weather/shower.png"); pObject->LoadImage(IMG_ENUM_WEATHER_RAINNY, "/app/img/weather/rainny.png"); pObject->LoadImage(IMG_ENUM_WEATHER_THUNDERSTORM, "/app/img/weather/thunderstorm.png"); pObject->LoadImage(IMG_ENUM_WEATHER_SNOW, "/app/img/weather/snow.png"); id = m_ObjectList.AddObject(pObject); } // 가스On/Off 이미지 pObject = new CObjectIcon(m_wid_parent, m_gc, 325, 245, 137, 137); //좌측여백 13 if(pObject) { pObjectIcon = (CObjectIcon*)pObject; pObjectIcon->AllocImageCount(IMG_ENUM_GAS_COUNT); pObject->LoadImage(IMG_ENUM_GAS_ON, "/app/img/main_icon/main_gas_on.png"); //적색 가스사용 pObject->LoadImage(IMG_ENUM_GAS_OFF, "/app/img/main_icon/main_gas_off.png"); //녹색 가스차단 id = m_ObjectList.AddObject(pObject); } // 주차아이콘 pObject = new CObjectImage(m_wid_parent, m_gc, 0, 419, 261, 61); if(pObject) { pObject->LoadImage(IMG_BACKGROUND, "/app/img/main_bar_back.png"); id = m_ObjectList.AddObject(pObject); } //g_setup_data.m_SetupData.gas_stat: 0=사용중, 1=사용차단 m_isGasOff = (g_setup_data.m_SetupData.gas_stat) ? TRUE : FALSE; //멘트가 표시될 서브 윈도 m_wid_ment = GrNewWindow(g_wid, MENT_AREA_X, MENT_AREA_Y, MENT_AREA_WIDTH, MENT_AREA_HEIGHT, 0, 0, 0); if(m_wid_ment) { // GrMapWindow(m_wid_ment); //이미지 버퍼링을 처리할 Pixel Map // m_pixmap_ment = GrNewPixmap(MENT_AREA_WIDTH, MENT_AREA_HEIGHT, NULL); m_pixmap_ment = GrNewPixmap(MENT_PIXEL_MAP_WIDTH, MENT_AREA_HEIGHT, NULL); #if 0 RedrawImage(m_wid_ment, g_gc, 0, 0, MENT_AREA_WIDTH, MENT_AREA_HEIGHT, MENT_AREA_X, MENT_AREA_Y, MENT_AREA_WIDTH, MENT_AREA_HEIGHT, WEATHER_OBJ_BG); RedrawImage(m_pixmap_ment, g_gc, 0, 0, MENT_AREA_WIDTH, MENT_AREA_HEIGHT, MENT_AREA_X, MENT_AREA_Y, MENT_AREA_WIDTH, MENT_AREA_HEIGHT, WEATHER_OBJ_BG); DrawText(g_szWeatherMent[g_setup_data.m_SetupData.today_weather], m_pixmap_ment, g_gc, 0, 0, m_width_ment, MENT_AREA_HEIGHT, g_font, 24, WHITE, TXT_HALIGN_LEFT|TXT_VALIGN_MIDDLE); GrRaiseWindow(m_wid_ment); #endif } else { DBGMSGC(DBG_WEATHER, "%s: GrNewWindow failure\r\n", __func__); } }
void CContextElevator::ThreadProc() { static int nArrowStep; static ULONG ulTickDraw; char szText[32] = {0,}; //호출이 성공하고 엘리베이터 상태를 모니터링 하는 동안 동작함 // if(m_nContextNum==0) return; switch(m_nThreadStep) { case 0: nArrowStep = 0; m_nThreadStep++; break; case 1: if( m_pObjectIcon && (m_nContextNum==2)) { RedrawImage(m_wid_parent, m_gc, 245, 89, 500, 32, 245, 89, 500, 32, ELEVATOR_OBJ_BG); switch(m_nElevatorDir) { case MTM_DATA_EV_STATUS_STOP: DrawText("엘레베이터가 정지해 있습니다", m_wid_parent, m_gc, 245, 89, 500, 32, g_font, 24, WHITE, TXT_HALIGN_LEFT|TXT_VALIGN_MIDDLE); break; case MTM_DATA_EV_STATUS_UP: case MTM_DATA_EV_STATUS_DOWN: DrawText("엘레베이터가 이동중 입니다", m_wid_parent, m_gc, 245, 89, 500, 32, g_font, 24, WHITE, TXT_HALIGN_LEFT|TXT_VALIGN_MIDDLE); break; case MTM_DATA_EV_STATUS_ARRIVE: DrawText("엘레베이터가 도착 하였습니다", m_wid_parent, m_gc, 245, 89, 500, 32, g_font, 24, WHITE, TXT_HALIGN_LEFT|TXT_VALIGN_MIDDLE); break; } //방향표시 if( (m_nElevatorDir == MTM_DATA_EV_STATUS_STOP) || (m_nElevatorDir == MTM_DATA_EV_STATUS_ARRIVE) ) { m_pObjectIcon->Draw(IMG_ENUM_ARROW_BLANK); nArrowStep = 0; } else if(m_nElevatorDir == MTM_DATA_EV_STATUS_DOWN) { switch(nArrowStep) { case 0: m_pObjectIcon->Draw(IMG_ENUM_ARROW_DOWN_1); break; case 1: m_pObjectIcon->Draw(IMG_ENUM_ARROW_DOWN_2); break; default: m_pObjectIcon->Draw(IMG_ENUM_ARROW_DOWN_3); break; } nArrowStep++; if(nArrowStep==5) nArrowStep=0; } else if(m_nElevatorDir == MTM_DATA_EV_STATUS_UP) { switch(nArrowStep) { case 0: m_pObjectIcon->Draw(IMG_ENUM_ARROW_UP_1); break; case 1: m_pObjectIcon->Draw(IMG_ENUM_ARROW_UP_2); break; default: m_pObjectIcon->Draw(IMG_ENUM_ARROW_UP_3); break; } nArrowStep++; if(nArrowStep==5) nArrowStep=0; } //층표시 if(m_nElevatorFloor > 0) { if(m_nElevatorFloor >= 128) sprintf(szText, "B%2d\0", 256-m_nElevatorFloor); else sprintf(szText, "%3d\0", m_nElevatorFloor); } else if(m_nElevatorFloor < 0) { sprintf(szText, "B%2d\0", m_nElevatorFloor*(-1)); } // else // { // sprintf(szText, "L\0"); // } #if 0 DrawText(szText, m_wid_parent, m_gc, 339+13, 240+13, 143-26, 127-26, g_font, 72, WHITE, TXT_HALIGN_CENTER|TXT_VALIGN_MIDDLE); #else RedrawImage(m_wid_parent, m_gc, 352, 253, 117, 101, 12, 12, 117, 101, ELEVATOR_OBJ_DISPLAY); DrawText(szText, m_wid_parent, m_gc, 352, 253, 117, 101, g_font, 80, WHITE, TXT_HALIGN_CENTER|TXT_VALIGN_TOP); //DrawText(szText, m_wid_parent, m_gc, 352, 253, 117, 101, g_font, 72, WHITE, TXT_HALIGN_CENTER|TXT_VALIGN_MIDDLE); #endif ulTickDraw = GetTickCount(); m_nThreadStep++; } break; case 2: if(GetElapsedTick(ulTickDraw) >= 500) { m_nThreadStep--; } break; } }