友善之臂Mini6410之Android开发学习笔记(4)-EEPROM Demo

简介:

友善之臂Mini6410之Android开发学习笔记源码同步更新,请使用git工具进行同步。关于Git工具更多信息,请参考:http://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:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <LinearLayout
        android:id="@+id/eeprom"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:orientation="horizontal" >

        <LinearLayout
            android:id="@+id/writemodel"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:layout_weight="1"
            android:orientation="vertical" >

            <Button
                android:id="@+id/Button_write"
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                android:text="@string/writeeeprom" />

            <EditText
                android:id="@+id/EditText_write"
                android:layout_width="fill_parent"
                android:layout_height="100dip"
                android:text="@string/dataeeprom" />
        </LinearLayout>

        <LinearLayout
            android:id="@+id/readmodel"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:layout_weight="1"
            android:orientation="vertical" >

            <Button
                android:id="@+id/Button_read"
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                android:text="@string/readeeprom" />

            <EditText
                android:id="@+id/EditText_read"
                android:layout_width="fill_parent"
                android:layout_height="100dip" />
        </LinearLayout>
    </LinearLayout>

</LinearLayout>

预览效果:


相关文章
|
7天前
|
消息中间件 网络协议 Java
Android 开发中实现数据传递:广播和Handler
Android 开发中实现数据传递:广播和Handler
13 1
|
9天前
|
Linux 编译器 Android开发
FFmpeg开发笔记(九)Linux交叉编译Android的x265库
在Linux环境下,本文指导如何交叉编译x265的so库以适应Android。首先,需安装cmake和下载android-ndk-r21e。接着,下载x265源码,修改crosscompile.cmake的编译器设置。配置x265源码,使用指定的NDK路径,并在配置界面修改相关选项。随后,修改编译规则,编译并安装x265,调整pc描述文件并更新PKG_CONFIG_PATH。最后,修改FFmpeg配置脚本启用x265支持,编译安装FFmpeg,将生成的so文件导入Android工程,调整gradle配置以确保顺利运行。
32 1
FFmpeg开发笔记(九)Linux交叉编译Android的x265库
|
10天前
|
Unix Linux Shell
FFmpeg开发笔记(八)Linux交叉编译Android的FFmpeg库
在Linux环境下交叉编译Android所需的FFmpeg so库,首先下载`android-ndk-r21e`,然后解压。接着,上传FFmpeg及相关库(如x264、freetype、lame)源码,修改相关sh文件,将`SYSTEM=windows-x86_64`改为`SYSTEM=linux-x86_64`并删除回车符。对x264的configure文件进行修改,然后编译x264。同样编译其他第三方库。设置环境变量`PKG_CONFIG_PATH`,最后在FFmpeg源码目录执行配置、编译和安装命令,生成的so文件复制到App工程指定目录。
43 9
FFmpeg开发笔记(八)Linux交叉编译Android的FFmpeg库
|
1天前
|
机器学习/深度学习 安全 数据处理
构建未来:基于Android的智能家居控制系统开发
【4月更文挑战第29天】 随着物联网技术的蓬勃发展,智能家居已成为现代技术革新的重要领域。本文将深入探讨基于Android平台的智能家居控制系统的设计和实现,旨在提供一种用户友好、高度集成且功能丰富的解决方案。通过利用Android设备的广泛普及和其强大的处理能力,结合最新的无线通讯技术和人工智能算法,我们旨在打造一个可靠、易用且具有高度可定制性的智能家居控制环境。文中不仅详细阐述了系统架构、关键技术选型以及界面设计,还对可能遇到的安全挑战进行了分析,并提出了相应的解决策略。
|
6天前
|
数据库 Android开发 开发者
安卓应用开发:构建高效用户界面的策略
【4月更文挑战第24天】 在竞争激烈的移动应用市场中,一个流畅且响应迅速的用户界面(UI)是吸引和保留用户的关键。针对安卓平台,开发者面临着多样化的设备和系统版本,这增加了构建高效UI的复杂性。本文将深入分析安卓平台上构建高效用户界面的最佳实践,包括布局优化、资源管理和绘制性能的考量,旨在为开发者提供实用的技术指南,帮助他们创建更流畅的用户体验。
|
23天前
|
XML 开发工具 Android开发
构建高效的安卓应用:使用Jetpack Compose优化UI开发
【4月更文挑战第7天】 随着Android开发不断进化,开发者面临着提高应用性能与简化UI构建流程的双重挑战。本文将探讨如何使用Jetpack Compose这一现代UI工具包来优化安卓应用的开发流程,并提升用户界面的流畅性与一致性。通过介绍Jetpack Compose的核心概念、与传统方法的区别以及实际集成步骤,我们旨在提供一种高效且可靠的解决方案,以帮助开发者构建响应迅速且用户体验优良的安卓应用。
|
25天前
|
监控 算法 Android开发
安卓应用开发:打造高效启动流程
【4月更文挑战第5天】 在移动应用的世界中,用户的第一印象至关重要。特别是对于安卓应用而言,启动时间是用户体验的关键指标之一。本文将深入探讨如何优化安卓应用的启动流程,从而减少启动时间,提升用户满意度。我们将从分析应用启动流程的各个阶段入手,提出一系列实用的技术策略,包括代码层面的优化、资源加载的管理以及异步初始化等,帮助开发者构建快速响应的安卓应用。
|
26天前
|
Java Android开发
Android开发之使用OpenGL实现翻书动画
本文讲述了如何使用OpenGL实现更平滑、逼真的电子书翻页动画,以解决传统贝塞尔曲线方法存在的卡顿和阴影问题。作者分享了一个改造后的外国代码示例,提供了从前往后和从后往前的翻页效果动图。文章附带了`GlTurnActivity`的Java代码片段,展示如何加载和显示书籍图片。完整工程代码可在作者的GitHub找到:https://github.com/aqi00/note/tree/master/ExmOpenGL。
30 1
Android开发之使用OpenGL实现翻书动画
|
26天前
|
Android开发 开发者
Android开发之通过渲染纹理展示地球仪
该文阐述了如何使用OpenGL为三维物体添加纹理,以增强其真实感。纹理坐标是二维的,用于标记摊平后的“布料”对应物体的哪个部位,类似裁缝制作衣服的过程。在OpenGL中,启用纹理和深度测试是关键,还包括设置纹理参数、分配纹理编号、绑定位图材质等步骤。计算材质的纹理坐标后,通过`glDrawArrays`结合顶点和纹理坐标逐个贴图。最终示例展示了将世界地图贴到球体上形成逼真的地球仪效果。通过控制旋转、平移和缩放,能实现简单的三维动画效果。
13 2
Android开发之通过渲染纹理展示地球仪
|
26天前
|
存储 缓存 Java
Android开发之利用GL10描绘点、线、面
本文介绍了如何使用GL10进行三维图形绘制。首先,每个点由三个浮点数(x, y, z)表示,数组大小为顶点数的三倍来构建平面。接着,通过`FloatBuffer`将浮点数组转换为OpenGL可识别的格式。绘制图形时,需启用和禁用顶点开关,并调用`glVertexPointer`指定顶点坐标和`glDrawArrays`绘制点、线、面。文中展示了绘制立方体线框的代码,包括顶点数组转换、立方体各面的定义以及绘制方法。最后,提到了球体的绘制概念。
8 1
Android开发之利用GL10描绘点、线、面