2016년 4월 14일 목요일

Smart Home Gear S2 App v1.0

에어컨, 라디오 기능을 추가 하면서 UI 를 정비 하고 bug 도 잡아 주면서 스스로 1.0 정도의 version 을 부여 할 수 있을 것 같다는 생각에 한번 정리하고 가려고 한다.



그동안 작업했던 것을 하나로 모으니 그럴싸한 조합이 완성 됐다.
[Diagram]



처음에 문 여는 기능만 해 보려고 icon 을 문으로 했었는데, 스마트홈 이라는 느낌이 있는 아이콘으로 바꿔 줘야 겠다. 
순서대로 기능을 설명 하면,

1. 벨롱이 - 차 문을 열수 있는 기능.
2. 현관문 - 현관 문을 여는 기능.
3. 거실 조명 on - 거실 조명을 켜 주는 기능.
4. 거실 조명 off - 거실 조명을 꺼 주는 기능.
5. TV - TV 를 켜고 끄는 기능.
6. 에어컨 on - 에어컨을 켜 주는 기능.
7. 에어컨 off - 에어컨을 꺼 주는 기능.
8. 라디오 - 홈시어터의 라디오를 켜 주는 기능.
9. TV 채널 - TV 채널을 변경해 주는 기능의 그룹.
10. CCTV - 출입자가 있을 때 capture 된 CCTV 를 보여 주는 기능.

 초기 버전에 TV 관련된 아이콘이 너무 메인 화면에 많았어서 그룹으로 묶어서 따로 빼고 0~9 번호도 선택할 수 있게 추가 했다. 숫자와 선호채널, 그리고 채널 업/다운 기능이 모여 있다.
on/off 로 나뉘어져 있는 것들을 버튼 하나로 묶고 싶은데, 그러려면 현재 기기 상태를 알아야 한다. 아무래도 이건 다음 버젼을 기약 해야 겠다.

이 앱 덕분에 리모컨을 찾을 필요 없이 빠르게 모든 제품을 다룰 수 있어야 생활이 편해졌다. 스마트 와치에는 관심도 없던 집사람이 기어 스포츠 가격을 찾아보는 것만 봐도 편해 보이긴 한가 보다.

이렇게 집안에 있는 가전제품과 현관/자동차를 모두 시계에 담았다. 각 제품의 추가 기능은 하나씩
더해 가면 될테고 다음에는 뭔가 새로운 주제를 찾아서 스마트한 생활에 '+'를 만들어야 겠다.

참고로 타이젠 앱은 처음이라 허접하기 짝이 없는 소스코드지만 조금 설명을 붙이자면,
Tizen IDE > File > Tizen Native Project > Basic UI 를 생성해서 아래 순서대로 코드를 더해 갔다.

1. 메인 화면 만들어 주기
static void
create_rotary_selector(appdata_s *ad)
{
Elm_Object_Item *nf_it = NULL;
ad->rs = eext_rotary_selector_add(ad->naviframe);
eext_rotary_object_event_activated_set(ad->rs, EINA_TRUE);
Eext_Object_Item * item;
Evas_Object *image;
item = eext_rotary_selector_item_append(ad->rs);
image = elm_image_add(ad->rs);
elm_image_file_set(image, "car.png", NULL);
eext_rotary_selector_item_part_content_set(item, "item,icon",
                                          EEXT_ROTARY_SELECTOR_ITEM_STATE_NORMAL, image);
eext_rotary_selector_item_part_text_set(item, "selector,main_text", "벨롱이");
....
}
static void
create_base_gui(appdata_s *ad)
{
...
   create_rotary_selector(ad);
}

2. 각 기능 연결해 주기
void
item_clicked_cb(void *data, Evas_Object *obj, void *event_info)
{
   appdata_s *ad = data;
   CURL *curl;
   CURLcode res;
   Eext_Object_Item * item = eext_rotary_selector_selected_item_get(obj);
   char *text = eext_rotary_selector_item_part_text_get(item, "selector,main_text");
   curl = curl_easy_init();
   if(curl) {
      connection_h connection;
      int conn_err;
      conn_err = connection_create(&connection);
      if (conn_err != CONNECTION_ERROR_NONE) {
         // Error handling
         return;
      }
      char *proxy_address;
      conn_err = connection_get_proxy(connection, CONNECTION_ADDRESS_FAMILY_IPV4, &proxy_address);
      char *text = eext_rotary_selector_item_part_text_get(item, "selector,main_text");
      if (!strncmp(text, "벨롱이", sizeof("벨롱이"))){
         curl_easy_setopt(curl, CURLOPT_URL, "http://my-serever/car-door");
      }
......
.......
      if (conn_err == CONNECTION_ERROR_NONE && proxy_address) {
         curl_easy_setopt(curl, CURLOPT_PROXY, proxy_address);
      }
      res = curl_easy_perform(curl);
      if(res != CURLE_OK) {
         dlog_print(DLOG_ERROR, LOG_TAG, "CurlFail", res);
         elm_exit();
      }
      curl_easy_cleanup(curl);
      connection_unset_proxy_address_changed_cb(connection);
      connection_destroy(connection);
   }
}
3. 서브 메뉴 만들어 주기
 1번에서 했던 것과 같은 방법으로 TV 채널 화면 만들어 주고 2번 과정과 같이 기능을 추가 해 준다.

Full Source 코드는 arduino 코드들과 정리해서 github 에 공개 할 예정이다.

댓글 없음: