友善之臂Mini6410之Android開發學習筆記(4)-EEPROM Demo
友善之臂Mini6410之Android開發學習筆記源碼同步更新,請使用git工具進行同步。關於Git工具更多信息,請參考:https://progit.org/book/zh/
git clone https://code.google.com/p/androiddemoformini6410/
EEPROMActivity.java
package com.mini6410.EEPROM;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.text.Editable;
import android.view.View;
import android.view.Window;
import android.widget.Button;
import android.widget.EditText;
import com.mini6410.R;
/**
*
* ClassName:EEPROMActivity
* Reason: EEPROM Demo
*
* @author snowdream
* @version
* @since Ver 1.1
* @Date 2011 2012-03-16 17:04
*
* @see
*/
public class EEPROMActivity extends Activity {
public static final int MSG_UPDATE_UI = 0;
public static final int MSG_GET_DATA = 1;
/*讀寫按鈕和讀寫輸入框*/
private Button mButtonWrite = null;
private Button mButtonRead = null;
private EditText mEditTextWrite = null;
private EditText mEditTextRead = null;
private Editable mEditable = null;
/*讀寫模塊*/
private WriteEEPROM mWriteEEPROM = null;
private ReadEEPROM mReadEEPROM = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_PROGRESS);
setContentView(R.layout.eepromdemo);
setProgressBarVisibility(true);
initUI();
initData();
}
/**
*
* initUI: 初始化UI
*
* @param
* @return
* @throws
*/
public void initUI(){
mButtonWrite = (Button)findViewById(R.id.Button_write);
mButtonRead = (Button)findViewById(R.id.Button_read);
mButtonWrite.setOnClickListener(mClickListener);
mButtonRead.setOnClickListener(mClickListener);
mEditTextWrite = (EditText)findViewById(R.id.EditText_write);
mEditTextRead = (EditText)findViewById(R.id.EditText_read);
mEditable = mEditTextRead.getText();
}
/**
*
* initData:新建讀寫模塊,準備讀寫數據
*
* @param
* @return
* @throws
*/
public void initData(){
mWriteEEPROM = new WriteEEPROM(mHandler);
mReadEEPROM = new ReadEEPROM(mHandler);
}
private Handler mHandler = new Handler(){
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case MSG_UPDATE_UI:
int pos = (int)msg.arg1;
int length = (int)msg.arg2;
setProgress(pos*10000/(length -1));
break;
case MSG_GET_DATA:
Byte dataByte = (Byte)msg.obj;
mEditable.append((char)dataByte.byteValue());
mEditTextRead.setText(mEditable);
break;
default:
break;
}
}
};
private Button.OnClickListener mClickListener = new Button.OnClickListener(){
public void onClick(View v) {
Button mButton = (Button)v;
switch (mButton.getId()) {
case R.id.Button_read:
ReadDataIntoEEPROM();
break;
case R.id.Button_write:
WriteDataIntoEEPROM();
break;
default:
break;
}
}
};
/**
*
* WriteDataIntoEEPROM:取出mEditTextWrite輸入框中的數據,轉換成byte數組,啟用寫模塊寫入EEPROM
*
* @param
* @return
* @throws
*/
public void WriteDataIntoEEPROM(){
byte[] data = mEditTextWrite.getText().toString().getBytes();
if(mWriteEEPROM != null)
mWriteEEPROM.WriteData(data);
}
/**
*
* ReadDataIntoEEPROM:啟用讀模塊從EEPROM讀取數據
*
* @param
* @return
* @throws
*/
public void ReadDataIntoEEPROM(){
mEditable.clear();
if(mReadEEPROM != null)
mReadEEPROM.ReadData();
}
@Override
protected void onDestroy() {
super.onDestroy();
}
}
WriteEEPROM.java
package com.mini6410.EEPROM;
import android.os.Handler;
import android.util.Log;
import com.friendlyarm.AndroidSDK.HardwareControler;
public class WriteEEPROM{
private static final String TAG = "WriteEEPROM";
private static final int MAX_LENGTH = 256; //EEPROM最多可存儲256個字節數據
Handler mHandler = null;
byte[] mData = null;
private WriteEEPROMThread mWriteEEPROMThread = null;
public WriteEEPROM(Handler mHandler){
this.mHandler = mHandler;
}
/**
*
* WriteData: 新建並啟動寫線程將數據逐個字節寫入EEPROM
*
* @param data byte數組
* @return
* @throws
*/
public void WriteData(byte[] data){
mData = data;
safeStop();
mWriteEEPROMThread = new WriteEEPROMThread();
mWriteEEPROMThread.start();
}
/**
*
* safeStop: 安全停止線程
*
* @param
* @return
* @throws
*/
public void safeStop(){
if(mWriteEEPROMThread != null && mWriteEEPROMThread.isAlive()){
mWriteEEPROMThread.interrupt();
mWriteEEPROMThread.stop = true;
try {
mWriteEEPROMThread.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
mWriteEEPROMThread = null;
}
public void sendMessage(int what ){
if(mHandler != null){
mHandler.sendMessage(mHandler.obtainMessage(what));
}
}
public void sendMessage(int what, Object obj ){
if(mHandler != null){
mHandler.sendMessage(mHandler.obtainMessage(what, obj));
}
}
public void sendMessage(int what, int arg1,int arg2,Object obj ){
if(mHandler != null){
mHandler.sendMessage(mHandler.obtainMessage(what,arg1,arg2,obj));
}
}
public void sendMessage(int what, int arg1,int arg2 ){
if(mHandler != null){
mHandler.sendMessage(mHandler.obtainMessage(what,arg1,arg2));
}
}
/**
*
* WriteEEPROMThread: 數據寫入線程
*
* @param
* @return
* @throws
*/
private class WriteEEPROMThread extends Thread{
volatile boolean stop = false;
int fd = 0;
int length = 0;
int pos = 0;
@Override
public void run() {
if(mData == null){
Log.e(TAG, "There is No Data!");
stop = true;
}
/*打開設備*/
fd = HardwareControler.openI2CDevice();
if(fd == -1)
{
Log.e(TAG, "Failed to open the I2CDevice !");
stop = true;
}
length = mData.length;
if (length > MAX_LENGTH) {
length = MAX_LENGTH;
}
//擦除並初始化EEPROM
for(int i = 0 ; i < MAX_LENGTH; i++){
HardwareControler.writeByteDataToI2C(fd, i, (byte)'\0');
}
while(!stop){
if (pos >= length) {
break;
}
/*寫入數據,每次隻能讀取一個字節。*/
HardwareControler.writeByteDataToI2C(fd, pos, mData[pos]);
sendMessage(EEPROMActivity.MSG_UPDATE_UI, pos,length);
Log.i(TAG, "writeByteDataToI2C pos: "+ pos);
pos++;
// try {
// Thread.sleep(10);
// } catch ( InterruptedException e ) {
// e.printStackTrace();
// }
}
if(fd != -1)
{
/*關閉設備*/
HardwareControler.close(fd);
}
}
}
}
ReadEEPROM.java
package com.mini6410.EEPROM;
import android.os.Handler;
import android.util.Log;
import com.friendlyarm.AndroidSDK.HardwareControler;
public class ReadEEPROM{
private static final String TAG = "ReadEEPROM";
private static final int MAX_LENGTH = 256; //EEPROM最多可存儲256個字節數據
Handler mHandler = null;
private ReadEEPROMThread mReadEEPROMThread = null;
public ReadEEPROM(Handler mHandler){
this.mHandler = mHandler;
}
/**
*
* ReadData: 新建並啟動讀線程從EEPROM中逐個讀取數據
*
* @param
* @return
* @throws
*/
public void ReadData(){
safeStop();
mReadEEPROMThread = new ReadEEPROMThread();
mReadEEPROMThread.start();
}
/**
*
* safeStop: 安全停止線程
*
* @param
* @return
* @throws
*/
public void safeStop(){
if(mReadEEPROMThread != null && mReadEEPROMThread.isAlive()){
mReadEEPROMThread.interrupt();
mReadEEPROMThread.stop = true;
try {
mReadEEPROMThread.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
mReadEEPROMThread = null;
}
public void sendMessage(int what ){
if(mHandler != null){
mHandler.sendMessage(mHandler.obtainMessage(what));
}
}
public void sendMessage(int what, Object obj ){
if(mHandler != null){
mHandler.sendMessage(mHandler.obtainMessage(what, obj));
}
}
public void sendMessage(int what, int arg1,int arg2,Object obj ){
if(mHandler != null){
mHandler.sendMessage(mHandler.obtainMessage(what,arg1,arg2,obj));
}
}
public void sendMessage(int what, int arg1,int arg2 ){
if(mHandler != null){
mHandler.sendMessage(mHandler.obtainMessage(what,arg1,arg2));
}
}
/**
*
* ReadEEPROMThread: 數據讀取線程
*
* @param
* @return
* @throws
*/
private class ReadEEPROMThread extends Thread{
volatile boolean stop = false;
int fd = 0;
int length = 0;
int pos = 0;
byte data = 0;
@Override
public void run() {
/*打開設備*/
fd = HardwareControler.openI2CDevice();
if(fd == -1)
{
Log.e(TAG, "Failed to open the I2CDevice !");
stop = true;
}
length = MAX_LENGTH;
while(!stop){
if (pos >= length) {
break;
}
/*讀取數據,每次隻能讀取一個字節。*/
data = (byte)HardwareControler.readByteDataFromI2C(fd, pos);
if(data != -1)
{
sendMessage(EEPROMActivity.MSG_GET_DATA, data);
sendMessage(EEPROMActivity.MSG_UPDATE_UI, pos,length);
}
Log.i(TAG, "readByteDataFromI2C pos: "+ pos);
pos++;
// try {
// Thread.sleep(10);
// } catch ( InterruptedException e ) {
// e.printStackTrace();
// }
}
if(fd != -1)
{
/*關閉設備*/
HardwareControler.close(fd);
}
}
}
}
eepromdemo.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:andro
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<LinearLayout
android:
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="horizontal" >
<LinearLayout
android:
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_weight="1"
android:orientation="vertical" >
<Button
android:
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/writeeeprom" />
<EditText
android:
android:layout_width="fill_parent"
android:layout_height="100dip"
android:text="@string/dataeeprom" />
</LinearLayout>
<LinearLayout
android:
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_weight="1"
android:orientation="vertical" >
<Button
android:
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/readeeprom" />
<EditText
android:
android:layout_width="fill_parent"
android:layout_height="100dip" />
</LinearLayout>
</LinearLayout>
</LinearLayout>
預覽效果:

最後更新:2017-04-02 22:16:36