본문 바로가기

전체 글

(154)
[Noise Detector] 그래픽 모듈 (5) : WaveBars ArrayBundle은 WaveBars가 데이터를 처리하는 단위입니다. WaveBars에 입력된 ArrayBundle은 내부 버퍼인 mBundleList에 담기게 되며 내부 스래드인 mAnimateBars에 의해 하나씩 처리됩니다. 실시간 처리를 위해 WaveDataView의 getView()의 autoAdjustPeriod를 true로 설정하여 버퍼에 4개 이상 쌓이게 되면 처리 주기를 감소시키도록 설정할 수있습니다. 해당 과정은 WaveBars.animateBars()에서 확인할 수 있습니다. mAnimateBars 스래드는 불필요한 스래드의 존재를 막기위해 mBundleLIst가 비워질 때까지 존재하며 이후 제거되고 새로운 ArrayBundle이 입력됐을 때 다시 생성됩니다. 그리고 ArrayBun..
[Noise Detector] 그래픽 모듈 (4) : CriticalLine 안드로이드는 화면이 터치되면 MotionEvent 객체를 onTouchEvent() 메소드에 넣어 호출합니다. MotionEvent 객체를 통해 사용자가 터치가 이동한 거리를 추출할 수 있습니다. 하지만 이렇게 추출된 거리는 픽셀 단위이기 때문에, 이후 수신될 데이터와 비교하기 위해서는 값 단위로 변환될 필요가 있고, 또한 수신될 데이터는 화면에 그리려지기 위해 픽셀 단위로 변환될 필요가 있습니다. 이것을 mPixelToValue와 mValueToPixel이 담당합니다. 그릴때마다 계산하면 리소스에 부담이될 수도 있기때문에 최초 onDraw() 호출에서 구한 값을 상수처럼 이용합니다. onTouch() 메소드 안에 있는 setCLValue() 메소드는 추출한 이동 거리를 픽셀 단위에서 값 단위로 변경하여..
[Noise Detector] 그래픽 모듈 (3) : EdgeLine 세로축의 맨 밑에는 항상 0이 표시되며 WaveDataView의 getView() 메소드에 입력된 verMaxValue로부터 생성된 문자열(mMarkingValue1~4)이 세로축의 맨 위, 3/4, 1/2, 1/4 긴 마킹 위치에 입력되고, 그 사이에는 작은 마킹이 들어갑니다. 정리하면 항상 총 9개의 마킹이 있고 4개의 마킹에 문자열이 들어가며, 이것은 수정할 수 없습니다. 이 문자열들은 소수점을 나타낼 수 있고 자리수까지 조절할 수 있습니다. mUnit은 마킹 문자열의 단위를 나타냅니다. 항상 괄호 안에 입력되며, 문자 2개를 초과하는 부분은 무시되어 나타납니다.
[Noise Detector] 그래픽 모듈 (2) : 공통 4개의 구성요소들은 다음 길이로 공간을 분배하며, 경고 라인이 움직이고, 막대가 그려지는 공간은 (mUsedHeight×mUsedWidth)입니다. 이 공간은 WaveDataView의 getView() 메소드에 입력된 extraRateHeight_hor, extraRateWidth_hor, extraRateHeight_ver, extraRateWidth_ver 파라미터에 의해 결정됩니다. 여기서 문제점은 안으로이드 좌표계와 우리가 주로 사용하는 직교 좌표계는 x축 방향은 같지만, y축 방향이 반대라는 것입니다. 안드로이드 좌표계를 직교 좌표계로 변환하기 위해서는 mHeight - requried height가 되어야 합니다. 여기서 "mHeight -"를 상수화시키고, requried height에 변수..
[Noise Detector] 그래픽 모듈 (1) : WaveDataView 시스템 흐름 설명 WaveDataView는 WaveData 모듈이 외부 시스템과 통신하는 클래스이자 4개의 핵심 구성요소인 WaveBars, CriticalLine, EdgeLine, Warning이 inflation되는 FrameLayout입니다. WaveDataView 인스턴스는 생성자로 생성되지 않고 getView() 메소드를 통해 얻어야 하며, 하나의 프로그램에 하나의 인스턴스만 존재할 수 있습니다. getView() 메소드에 입력된 파라미터는 다시 4개의 구성요소에 적절히 분배되어 각 구성요소를 생성하고 자신과 연결시킨 후 그것을 반환합니다. 위 방법은 XML을 이용한 정적 방법입니다. 동적 코드로 작성해 보려고 했는데 외부 FrameLayout에 다시 FrameLayout을 상속하는 WaveD..
[BLE 프로젝트] Noise Detector 목적 / 요구사항 / 시스템 흐름 제 블로그의 프로젝트 관련 포스트들은 모두 이용하는 제품이나 서비스에 대한 기본적인 이해를 가정하고 실제 구현을 목표로 하므로 기초적인 부분은 직접 공부해야 합니다. Noise Detector 목적 외부 소음을 탐지하여 지정한 값보다 크면 경고색 또는 진동을 사용하여 사용자에게 알려준다. 외부 소음을 녹음하기 위한 목적은 아니다. Noise Detector 요구사항 외부 소리에 대한 정보를 마이크를 통해 입력받아 BLE 통신을 사용하여 스마트폰으로 전송한다. 배터리 분리 없이 마이크로 USB 연결만으로 배터리를 충전시킬 수 있어야 한다. 저전력을 위해 연산 증폭기의 전원이 nRF51822에 의해 제어되어야 한다. 저전력을 위해 피어로부터 Noise Detector ON/OFF 명령을 받으면, 명령받은 동..
8. HAL 드라이버 수정/추가 (3) 필터 설정 구조체와 필터 설정 함수 개선 필터 설정 파트에서 이미 필터 설정 구조체인 CAN_FilterConfTypeDef 구조체를 설명했습니다. 필터는 식별자 정보 뿐만 아니라 RTR과 IDE에 대한 정보도 들어가는데 CAN_FilterConfTypeDef 구조체의 맴버 변수를 보면 식별자와 RTR, IDE에 대한 모든 정보를 사용자가 알아서 배열한 다음 FilterIdHigh, FilterIdLow, FilterMaskIdHigh, FilterMaskIdLow 맴버 변수에 넣어주게 되어 있습니다. 좀 귀찮습니다. 하지만 CAN_FilterConfTypeDef 구조체와 HAL_CAN_ConfigFilter 함수를 새로 만들기는 더 귀찮습니다. 그래서 FilterIdHigh, FilterIdLow, FilterMaskIdHigh, Filter..
8. HAL 드라이버 수정/추가 (2) HAL_CAN_Receive 개선 및 HAL_CAN_Receive_All로 업그레이드 함수의 선언입니다.잘 보면 두개의 RX 메일박스 FIFO 중 하나를 선택해서 수신하고 있습니다. 즉, 두개의 RX 메일박스를 동시에 수신할 수 없다는 의미입니다. 그래서 FIFONumber 변수를 HAL_CAN_Receive 함수 내부로 넣어주고, CAN_RFxR 레지스터에서 FMP 필드를 읽어오기 위한 변수 FMP0와 FMP1을 만든 후에 while 문을 다음과 같이 수정합니다. 참고로 __HAL_CAN_MSG_PENDING 함수도 CAN_RFxR 레지스터에서 FMP 필드를 읽어 오는 함수입니다. 이렇게 하면 두개의 RX 메일박스 FIFO를 모두 검사할 수 있습니다. 그런데 HAL_CAN_Receive 함수에는 한가지 문제가 더 있습니다. 바로 핸들을 잠그고 while문에 진입하는 것인데요. 그렇게 되..