-
위 글을 참고하여 EuPI 코드를 살펴보던 중 궁금한 점이 생겨 디스커션 올립니다! 예를 들어 아래의 코드를 작성했다고 가정했을 때, val rxManager: EuRxManager() = EuRxManager(EuOption.ModeType.EUPI)
rxManager.setOnWaveKeyDown(19000 )
rxManager.setOnWaveKeyUp(19000)
rxManager.setOnWaveKeyPressed(19000)
// rxManager 초기화
if ( rxManager.listen()) {
Log.d(TAG, "StoreActivity - mEuPIRxManager listen return : true")
}
// EuPICallFragment.java의 사용 예시
mRxManager.setOnWaveKeyPressed(18500, new EuPICallDetector() {
@Override
public void call() {
api_1_count++;
API_1_COUNT.setText("" + api_1_count);
}
}); // https://github.com/orgs/euphony-io/discussions/182에 작성된 예시
val rxManager: EuRxManager() = EuRxManager(EuOption.ModeType.EUPI)
rxManager.setOnWaveKeyPressed(18500) { // 18500.0 -> 18500
Toast.makeText(this, "menu request detected", Toast.LENGTH_SHORT).show()
}
1val rxManager: EuRxManager() = EuRxManager(EuOption.ModeType.EUPI) EuRxManager 의 모드를 EuPI로 설정합니다. ## 2
rxManager.setOnWaveKeyDown(19000)
/*
public void setOnWaveKeyPressed(int freq, EuPICallDetector iEuPICallDetector) {
EuPI eupi = new EuPI(freq, KEY_PRESSED, iEuPICallDetector);
if(mEuPICallRunner == null) {
mEuPICallRunner = new EuPICallRunner(eupi);
} else {
mEuPICallRunner.addEuPI(eupi);
}
}
*/
rxManager.listen() EuPI 객체를 만들어 EuPICallRunner 클래스의 EuPICallList에 추가하고있습니다. 이후 listen() 에서 EuPICallRunner의 run 함수가 실행됩니다. public boolean listen() {
if(getStatus() != RxManagerStatus.RUNNING) {
switch (mOption.getMode()) {
case DEFAULT:
mListenThread = new Thread(new RxRunner(), "RX");
break;
case EUPI: {
if(mEuPICallRunner != null) {
mListenThread = new Thread(mEuPICallRunner, "EUPI");
Log.d(LOG, "Euphony : EuPICallRunner's EuPI Count : " + mEuPICallRunner.getEuPICount());
break;
}
else {
Log.d(LOG, "Euphony : EuPICallRunner is null");
return false;
}
}
default:
Log.d(LOG, "Detect must have specific frequency value");
return false;
}
mListenThread.start();
return true;
} else {
return false;
}
} ## 3
EuPICallRunner 의 run 함수입니다.
@Override
public void run() {
while(!Thread.currentThread().isInterrupted()) {
processFFT();
float[] amp = {0, 0, 0};
for(EuPI eupi : EuPICallList) {
boolean isActable = false;
switch(eupi.getTrigger()) {
case KEY_DOWN: {
if(eupi.getStatus() == EuPI.EuPIStatus.KEY_UP){
isActable = true;
}
}
break;
case KEY_UP: {
if(eupi.getStatus() != EuPI.EuPIStatus.KEY_UP) {
isActable = true;
}
}
break;
case KEY_PRESSED: {
isActable = true;
}
break;
}
int freqIndex = eupi.getFreqIndex();
amp[0] = getSpectrumValue(freqIndex - 2);
amp[1] = getSpectrumValue(freqIndex);
amp[2] = getSpectrumValue(freqIndex + 2);
if(isActable) {
if(compareThreshold((amp[1] - (amp[0] + amp[2])/2))) {
if(eupi.getTrigger() == KEY_DOWN || eupi.getTrigger() == KEY_PRESSED) {
Message msg = mHandler.obtainMessage();
msg.what = EUPI_CALL_MODE;
msg.obj = eupi;
mHandler.sendMessage(msg);
}
eupi.setStatus(EuPI.EuPIStatus.KEY_DOWN);
} else {
if(eupi.getTrigger() == KEY_UP) {
Message msg = mHandler.obtainMessage();
msg.what = EUPI_CALL_MODE;
msg.obj = eupi;
mHandler.sendMessage(msg);
}
eupi.setStatus(EuPI.EuPIStatus.KEY_UP);
}
} else {
if(compareThreshold((amp[1] - (amp[0] + amp[2])/2))) {
eupi.setStatus(EuPI.EuPIStatus.KEY_DOWN);
} else {
eupi.setStatus(EuPI.EuPIStatus.KEY_UP);
}
}
Log.d(LOG, eupi.getKey() + "(" + eupi.getFreqIndex() + ")" + "'s Amplitude : " + amp[2]);
}
}
destroyFFT();
}
} 앞서 생성한 모든 EuPI 객체를 특정 조건에 따라 스레드 (EuPICallRunner ? ) 에 전달하고 EuPI 의 status 를 변경합니다. |
Beta Was this translation helpful? Give feedback.
Replies: 1 comment 2 replies
-
@phj0407 상세한 코드와 설명으로 질문주셔서 감사합니다! 1. 우선 사용법 관련해서 초기화 후 listen() 이라고 이해했습니다. 여기까지 작성하면 rxManager가 특정 주파수 (19000) 의 음파를 인식했을 때 true 를 반환하는 게 맞을까요?public boolean listen() {
if(getStatus() != RxManagerStatus.RUNNING) {
//...
return true;
} else {
return false;
} listen 함수의 성공 여부를 return 값으로 생각하시면 되겠습니다. 특정 주파수 (19000)의 음파를 현재 인식 중임을 나타내는 것이며, 2. setOnWaveKeyDown 메서드는 public void setOnWaveKeyPressed(int freq, EuPICallDetector iEuPICallDetector) 으로 되어있습니다. 인자로 freq와 EuPICallDetector를 받고있으며, EuPICallFragment.java 에서도 EuPICallDetector 의 call() 함수를 오버라이드 해서 사용하고 있었습니다. 다만 첫 번째 링크에서 들어주신 예시에서는 EuPICallDetector 에서는 EuPICallDetector 를 넘겨주지 않았습니다. EuPICallDetector 가 필수적이지 않은 건지 궁금합니다.
setOnWaveKeyDown(key: Int, iEuPICallDetector: (() -> Unit)!)
setOnWaveKeyDown(key: Int, iEuPICallDetector: EuPICallDetector!)
setOnWaveKeyDown(key: Int, threshold: Double, iEuPICallDetector: (() -> Unit)!)
setOnWaveKeyDown(key: Int, threshold: Double, iEuPICallDetector: EuPICallDetector!)
setOnWaveKeyPressed(key: Int, iEuPICallDetector: (() -> Unit)!)
setOnWaveKeyPressed(key: Int, iEuPICallDetector: EuPICallDetector!)
setOnWaveKeyPressed(key: Int, threshold: Double, iEuPICallDetector: (() -> Unit)!)
setOnWaveKeyPressed(key: Int, threshold: Double, iEuPICallDetector: EuPICallDetector!)
setOnWaveKeyUp(key: Int, iEuPICallDetector: (() -> Unit)!)
setOnWaveKeyUp(key: Int, iEuPICallDetector: EuPICallDetector!)
setOnWaveKeyUp(key: Int, threshold: Double, iEuPICallDetector: (() -> Unit)!)
setOnWaveKeyUp(key: Int, threshold: Double, iEuPICallDetector: EuPICallDetector!) 함수 원형을 보면 iEuPICallDetector는 필수 argument 입니다. 가령, // 1번 usage
rxManager.setOnWaveKeyDown(18000, {
Log.d("주파수감지", "18000 주파수가 감지됨.")
})
// 2번 usage
rxManager.setOnWaveKeyDown(18000) {
Log.d("주파수감지", "18000 주파수가 감지됨.")
} 1번 usage와 2번 usage는 동일합니다. |
Beta Was this translation helpful? Give feedback.
@phj0407 상세한 코드와 설명으로 질문주셔서 감사합니다!
1. 우선 사용법 관련해서 초기화 후 listen() 이라고 이해했습니다. 여기까지 작성하면 rxManager가 특정 주파수 (19000) 의 음파를 인식했을 때 true 를 반환하는 게 맞을까요?
listen 함수의 성공 여부를 return 값으로 생각하시면 되겠습니다.
위 구현된 함수 원형을 보시면
getStatus()
를 통해 listen의 상태값을 확인한 후, boolean을 반환합니다.특정 주파수 (19000)의 음파를 현재 인식 중임을 나타내는 것이며,
19000 주파수를 인식했을때 반환하는 값은 아닙니다. :)
현재
Listening
중이라고 이해하시면 되겠습니다.2. setOnWaveKeyDown 메서드는 public void setOnWaveKeyPressed(int freq, EuPICallDetector iEuPICallDetector) 으로 되어있습니다. 인자로 freq와 EuPICallDetector를 받고있으며, EuPICa…