編輯:關於Android編程
前幾章我們分析了FM模塊的幾個主要的類文件,今天要分析的是:FMTransceiver.java
public class FmTransceiver
{
/* Primary FM States :
* FM will be in one of the 4 states at any point of time
* '0' - FMState_Turned_Off
* '1' - FMState_Rx_Turned_On
* '2' - FMState_Tx_Turned_On
* '3' - FMState_Srch_InProg
*/
public static final int FMState_Turned_Off = 0;
public static final int FMState_Rx_Turned_On = 1;
public static final int FMState_Tx_Turned_On = 2;
public static final int FMState_Srch_InProg = 3;
/ *FM狀態:
*FM 在任何時候都處於以下四種狀態中的一種:
*“0”——FMState_Turned_Off
* ' 1 ' - FMState_Rx_Turned_On
* ' 2 ' - FMState_Tx_Turned_On
“3”——FMState_Srch_InProg
* /
/ * *
*允許訪問V4L2 FM設備。
*這種同步調用允許客戶端使用V4L2調頻裝置。這一定是第一次調用之前發布的客戶端可以使用任何接收器接口。
*
*這也叫權力的調頻模塊。
*
* @param設備路徑字符串,無線電設備
*
* @return真
如果V4L2調頻設備了,假如果V4L2調頻設備不能被收購,可能被其他客戶
* @see #釋放
*
* /
protected boolean acquire(String device){
boolean bStatus = true;
if (sFd <= 0) { // if previous open fails fd will be -ve.
sFd = FmReceiverJNI.acquireFdNative(V4L2_DEVICE);
if (sFd > 0) {
Log.d(TAG, "Opened "+ sFd);
bStatus = true;
}
else {
Log.d(TAG, "Fail to Open "+ sFd);
bStatus = false;
}
/ * *
*發布訪問V4L2調頻裝置。
* < p >
這個同步調用允許客戶端版本控制V4L2調頻裝置。這個函數應該被稱為調頻裝置時不再需要。這應該是最後一次調頻客戶發行的調用。一旦調用,客戶端必須調用#acquire來重新請求
V4L2設備控制調頻裝置,可以再次使用。
* < p >
之前客戶端可以釋放控制調頻接收機接口,它必須禁用調頻接收器,如果客戶端啟用它,並注銷注冊的回調函數。如果客戶端接收方的所有權,它將自動返回到系統。
* < p >
*這也叫權力的調頻模塊。
* < p >
* @param無線電設備路徑字符串,
* @return真 如果V4L2調頻裝置釋放,假如果V4L2調頻設備不能被釋放
* @see #收購
* /
static boolean release(String device) {
if (sFd!=0)
{
FmReceiverJNI.closeFdNative(sFd);
sFd = 0;
Log.d("FmTransceiver", "Turned off: " + sFd);
} else
{
Log.d("FmTransceiver", "Error turning off");
}
return true;
}
/**
* 注冊一個回調為調頻接收機事件通知。
*
* 這是一個同步調用注冊用於調頻接收機的事件通知司機。自調頻驅動異步執行一些任務,該功能允許客戶端異步接收信息。
*
* 在調用該函數時,客戶機必須通過一個回調函數用來實現異步事件。必須非空值參數的回調。如果一個NULL值傳遞給這個函數,注冊將會失敗。
*
* 客戶端可以選擇哪些事件將從接收器發送司機只需實現事件希望接收的功能。
*
@param回調事件回調處理事件的調頻接收機。
@return真如果回調注冊,假如果回調注冊失敗了。
@see #acquire
@see # unregisterClient
*
*/
public boolean registerClient(FmRxEvCallbacks callback){
boolean bReturnStatus = false;
if (callback!=null)
{
mRxEvents.startListner(sFd, callback);
bReturnStatus = true;
} else
{
Log.d(TAG, "Null, do nothing");
}
return bReturnStatus;
}/**
* 注銷客戶的事件通知回調。
*
* 這是一個同步調用用於注銷客戶的事件回調。
*
* @return true always.
* @see #acquire
* @see #release
* @see #registerClient
*
public boolean unregisterClient () {
mRxEvents.stopListener();
return true;
} /**
* 注冊一個回調為調頻發射機事件通知。
*
* 這是一個同步調用注冊用於事件通知的調頻發射機的司機。自調頻驅動異步執行一些任務,該功能允許客戶端異步接收信息。
*
* 在調用該函數時,客戶機必須通過一個回調函數用來實現異步事件。必須非空值參數的回調。如果一個NULL值傳遞給這個函數,注冊將會失敗。
*
* 客戶端可以選擇哪些事件將從接收器發送司機只需實現事件希望接收的功能。
*
* @param 回調事件回調處理事件的調頻發射機。
* @return true 如果回調注冊,假回調注冊失敗。
* @see #acquire
* @see #unregisterTransmitClient
*
*/
public boolean registerTransmitClient( FmTransmitterCallbacks callback){
boolean bReturnStatus = false;
if (callback!=null)
{
mTxEvents.startListner(sFd, callback);
bReturnStatus = true;
} else
{
Log.d(TAG, "Null, do nothing");
}
return bReturnStatus;
} /**
* 注銷發射機事件通知回調。
*
* 這是一個同步調用用於注銷發射機客戶的事件回調。
*
* @return true always.
*
* @see #acquire
* @see #release
* @see #registerTransmitClient
*
*/
public boolean unregisterTransmitClient () {
mTxEvents.stopListener();
return true;
}
/**
* 初始化 FM .
*
* 這是一個同步調用用於初始化調頻tranceiver。如果已經初始化該函數將intialize tranceiver默認設置。只有在成功地調用這個函數的許多調頻設備接口可以使用。
*
* 使接收者時,客戶機還必須提供的區域設置接收器將運作。這些設置(包括在configSettings)通常用於設置調頻接收機操作在一個特定的地理區域。這些設置可以更改後啟用調頻驅動程序通過使用#配置功能。
*
* 這個電話只能出具一個調頻接收器的所有者。發行這個調用,客戶機必須首先成功地調用#qcquire。
*
* @param configSettings the settings to be applied when
* turning on the radio
* @return true if Initialization succeeded, false if
* Initialization failed.
* @see #registerClient
* @see #disable
*
*/
public boolean enable (FmConfig configSettings, int device){
boolean status;
//Acquire the deviceon Enable
if( !acquire("/dev/radio0")){
return false;
}
Log.d(TAG, "turning on " + device);
mControl.fmOn(sFd, device);
Log.d(TAG, "Calling fmConfigure");
status = FmConfig.fmConfigure (sFd, configSettings);
if (!status) {
Log.d(TAG, "fmConfigure failed");
FmReceiverJNI.closeFdNative(sFd);
sFd = 0;
}
return status;
}
/**
* 禁用 FM .
*
* 這是一個同步調用用於禁用調頻裝置。時這個函數將使用客戶端不再需要使用調頻裝置。曾稱,大多數調頻裝置提供的功能將被禁用,直到客戶端通過#設備再次啟用。
*
* @return true if disabling succeeded, false if disabling
* failed.
*
* @see #enable
* @see #registerClient
*/
public boolean disable(){
mControl.fmOff(sFd);
return true;
} /**
* 重新配置設備的區域設置
* (FM Band, De-Emphasis, Channel Spacing, RDS/RBDS mode).
*
* 這是一個同步調用用於調頻設備上的配置設置。包含在結構通過設置通常不同於一個地理區域到另一個地方。
*
* @param configSettings Contains settings for the FM radio
* (FM band, De-emphasis, channel
* spacing, RDS/RBDS mode)
*
* @return true if configure succeeded, false if
* configure failed.
*/
public boolean configure(FmConfig configSettings){
boolean status=true;
int lowerFreq = configSettings.getLowerLimit();
Log.d(TAG, "fmConfigure");
status = FmConfig.fmConfigure (sFd, configSettings);
status = setStation (lowerFreq);
return status;
} /**
* 音樂調頻設備指定的FM頻率。
*
* 這種方法音樂電台的調頻裝置提供指定的頻率。唯一有效頻率帶內啟用或設定的配置可以通過這個功能來調諧。試圖調整頻率集之外的樂隊將導致一個錯誤。
*
* 一旦完成調到指定的頻率,事件回調FmRxEvRadioTuneStatus將被調用。
*
* @param frequencyKHz Frequency (in kHz) to be tuned
* (Example: 96500 = 96.5Mhz)
* @return true if setStation call was placed successfully,
* false if setStation failed.
*/
public boolean setStation (int frequencyKHz) {
int ret;
mControl.setFreq(frequencyKHz);
ret = mControl.setStation(sFd);
if(ret < 0 )
{
return false;
}
else
{
return true;
}
}/**
* 設置所需的WAN避免陷波濾波器。
*
* 這個方法設置所需的陷波濾波器基於當前WAN帶頻率達到FM-WAN並發性。應用程序應該聽數據調用事件和調用函數在每個數據調用連接讓u,實現FM-WAN並發性。
*
*/
public void setNotchFilter(boolean value) {
FmReceiverJNI.setNotchFilterNative(sFd, V4L2_CID_PRIVATE_TAVARUA_SET_NOTCH_FILTER, value);
}
/**
* 啟用/禁用模擬低電力模式。
*
* 這種方法啟用/禁用模擬低電力模式。
*
*/
public boolean setAnalogMode(boolean value) {
int re = mControl.setAudioPath(sFd, value);
re = FmReceiverJNI.setAnalogModeNative(value);
if (re == 1)
return true;
return false;
}
/**
* 返回true,如果內部調頻天線
*
*
* 該方法返回true內部FM天線可用,否則假
*
* @return true/false
*/
public boolean getInternalAntenna()
{
int re = FmReceiverJNI.getControlNative (sFd, V4L2_CID_PRIVATE_TAVARUA_ANTENNA);
if (re == 1)
return true;
return false;
}
/**
* 否則返回true,如果成功,則返回false
*
* 該方法內部天線類型設置為true / false
*
* @param intAntenna true is 內部天線存在
*
*
* @return true/false
*/
public boolean setInternalAntenna(boolean intAnt)
{
int iAntenna ;
if (intAnt)
iAntenna = 1;
else
iAntenna = 0;
int re = FmReceiverJNI.setControlNative (sFd, V4L2_CID_PRIVATE_TAVARUA_ANTENNA, iAntenna);
if (re == 0)
return true;
return false;
} /**
* 設置FM 電源狀態
*
*
* 該方法集調頻電源狀態。
*
*/
static void setFMPowerState(int state)
{
FMState = state;
} /**
* Returns :
*
* FMOff - If the FM Radio is turned off
* FMRxOn - If the FM Receiver is currently turned on
* FMTxOn - If the FM Transmitter is currently turned on
* FMReset - If the FM Radio is reset
*
* Gets the FM power state
*
*
* This method gets the FM power state.
*
*
*/
public static int getFMPowerState()
{
return FMState;
}
Servlet異常處理
1:聲明式異常處理什麼是聲明式:就是在web.xml中聲明對各種異常的處理方法。是通過元素來聲明的,下面有幾個子元素如下圖error-code:http錯誤代碼excep
Android View 事件分發機制源碼詳解(View篇)
前言在Android View 事件分發機制源碼詳解(ViewGroup篇)一文中,主要對ViewGroup#dispatchTouchEvent的源碼做了相應的解析,其
Android CalendarView,DatePicker,TimePicker,以及NumberPicker的使用
Android CalendarView,DatePicker,TimePicker,以及NumberPicker的使用簡單復習下基礎UI組件,做個簡單的總結
Android Template(模板) 編寫(二)
上篇文章介紹的方法只能創建類模板,不能創建xml文件等資源文件以及配置文件等,這篇文章來介紹創建可以一次創建多個文件多種類型文件的方法。 我們在使用AndroidStu