Notice
Recent Posts
Recent Comments
Link
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

재훈재훈

삼성 Gear에서 Android 스마트폰으로 센서 데이터 보내기 - 실습편 본문

Computer Engineering/Tizen

삼성 Gear에서 Android 스마트폰으로 센서 데이터 보내기 - 실습편

jaehoonx2 2019. 1. 3. 01:41

실습에 들어가기 전 main_app.c의 구조를 파악해보자.

아래 그림은 main_app.c의 아웃라인이다. 많은 함수가 존재함을 알 수 있다.

여기서 우리가 알아야 할 몇가지는 바로 sensor, listener 그리고 on_sensor_event() 이다.

참고로 _sensor~_cb들은 센서에 대한 콜백함수로 sensor와 listner에 대해 각종

옵션을 줄 수 있는 함수이다. 센서 측정 간격을 조정하는 등 상당히 유용하게 쓸 수 있다.



- sensor & listener

센서 변수와 센서 리스너이다. 센서를 정의하고

그 센서를 리스너에 집어 넣는 형식으로 작동이 된다.

각종 콜백 함수를 이용하여 sensor의 옵션을 지정할 수 있고,

listener를 통해 sensor의 동작을 감지해낼 수 있다.


- on_sensor_event()

main_app.c에서 실질적으로 가장 중요한 함수라고 볼 수 있다.

바로 센서값을 받아오는 함수이기 때문이다.

여기서 센서 값 관련 작업을 할 수 있고,

실습에서는 이 함수를 수정하여 심박센서 값을 추출할 것이다.


다음 링크는 HRMSensorApp에 관한 가이드이다.

https://developer.tizen.org/community/tip-tech/accessing-heart-rate-monitor-hrm-sensor-data-native-applications?langswitch=en


전체 가이드를 읽고 코드를 보면 이해가 쉽게 된다.

실습 전에 먼저 읽어보는 것을 추천한다.



이제 지금부터 본격적인 실습에 들어간다.



main_app.c


1. 헤더파일을 다음과 같이 추가한다.



2. app_create() 함수 부분에 sap을 초기화시켜주는 initialize_sap() 호출문을 삽입한다.

app_create()란 앱이 처음 시작될 때 호출되는 수명주기 함수의 일종이다.

안드로이드의 onCreate() 함수와 유사하다.




3. on_sensor_event() 함수에서 얻는 심박수를 저장하기 위해 

별도의 int형 전역변수 하나를 선언한다.

이 변수는 나중에 sap.c에서 Android로 전송할 때에도 사용된다.




BPM을 int형으로 선언한 이유는 심박수 센서에서

심박수를 측정한 결과값(event->values[0])이 int형 변수로 나오기 때문이다.



그렇지만 정작 Tizen Studio에서는 float로 인식한다.

서식문자를 %f가 아닌 %d를 사용하면 숫자가 깨져서 나온다.

하지만 event->values[0]이 float여도 이상한 점이 있는데,

정작 int형 변수인 BPM에 저장해서 값을 띄울 때는 아무런 문제가 없다.

왜 이런 문제가 발생하는지 원인 파악을 아직 하지 못했다.

때문에 BPM의 데이터 타입을 float 혹은 double로 선언하는 것도 괜찮다.


2019. 02. 13. 수정 내용

HRMSensorApp (상단 링크) 가이드에서는

심박센서의 event->values[0]의 타입은 int가 아닌 float 로 나와있다.

Tizen 홈페이지 내 센서 설명 부분과 상이(거기에는 int로 나와있다)한데

int가 아닌 float로 표기되어야 맞을 것 같다.



sap.c


1. 우선 sap.c의 헤더 부분에 다음과 같이 추가한다.



2. sap.c 에서 update_ui 부분이 에러를 엄청 띄우기 때문에 모두 삭제한다.

Ctrl + H를 눌러 찾으면 쉽고 빠르게 찾을 수 있다.



3. main_app.c의 BPM을 sap.c에서도 접근할 수 있도록 전역에 extern을 선언한다. ( extern int BPM; )



4. sap.c의 on_data_recived() 함수가 바로 우리가 건드릴 함수이다. 함수의 구조를 살펴보면

보낼 데이터를 로그로 찍고 sap_socket_send_data() 함수를 호출해 안드로이드로 전송하고 있다.

즉, 실제 데이터를 전송하는 진짜 전송함수는 sap_socket_send_data() 함수임을 알 수 있다.

우리는 on_data_recived() 함수에서 아까 선언한 BPM을 전송하는 코드를 작성할 것이다.




다음은 우리의 목적에 맞게 수정한 코드이다.

BPM을 msg에 담아서 실제로는 msg을 안드로이드로 전달하고 있다.





이제 코드의 수정이 끝났다. 다음 테스트편에서는 실질적으로 센서 데이터가

안드로이드 스마트폰으로 넘어가는지 실험을 할 것이다.