1、BMA250采用I2C通信,CLK设置为400K。
2、BMA250的INT1作为中断输出,接CPU的EINT25。主要用来做特定的中断使用,比如倾角(X、Y、Z角度)达到设定值时,将产生中断,通知CPU。这种功能主要做某些特定功能使用,比如翻车时,如果没有熄火,BMA250检测到垂直角度有变化,将提示是否自动报警,如果在规定时间内没有反应,就会自动报警,从而达到尽快救援的目的。
3、原厂提供了相应的Kernel和android 驱动,只需要按步骤添加即可。但原厂提供的kernel代码需要修正,即每次读取X、Y、Z数据完成后,会调用input_sync(bma250->input)函数告诉上层数据要刷新,这个函数会导致外部的其它设备数据也跟着刷新,产生的现象有:机器支持USB鼠标功能,但没插入鼠标,界面上也显示鼠标的光标。把input_sync(bma250->input)函数修改为input_mt_sync(bma250->input)即可解决。
4、测试方法:
(1)把kernel和android驱动都添加完成后,勾上“设置”---->“显示”---->“自动旋转屏幕”,旋转机器时,界面显示顺序也会跟着实际方向变化,若变化的角度与实际角度不符,需要修改android对X、Y、Z的数据处理。
(2)开机后,若把kernel中读X、Y、Z数据的函数bma250_read_accel_xyz相关LOG放开,会发现上层一直在不断的读取这些数据。翻转机器时,这些数据会相应的跟着改变。若在同一角度X、Y、Z数据无特别大的变化,说明数据读取正常。
(3)使能BMA250_ENABLE_INT1时,设置好BMA250_INT_ENABLE1_REG寄存器,则可以看到当翻转机器时,CPU的EINT25会检测到BMA250产生的中断,执行中断线程。
UITabBarController是选项卡栏导航控制器,显示效果是在页面底部有多个选项卡,通过点击不同选项卡可以在不同的ViewController之间进行切换。
这种对象的层次结构至少包含6个对象:
一个UITabBarController;
两个UIViewController;
一个UITabBar;
两个UITabBarItem;
UITabBarController是选项卡栏视图控制器,UITabBar是底部两个UITabBarItem的容器,管理两个UITabBarItem,每个UITabBarItem对应一个UIViewController,然后每个UIViewController都有自己的视图和视图控制器。
UITabBarController中有一个viewControllers属性,这是一个NSArray,包含选项卡控制器的视图控制器
下面来用代码创建一个UITabBarController:
下面是工程结构:
首先创建两个带xib文件的ViewController,分别为FirstViewController和SecondViewController
然后在AppDelegate.h中声明@property (strong, nonatomic) UITabBarController *tabBarController;,并添加协议UITabBarControllerDelegate
在.m中实现如下代码:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease]; // Override point for customization after application launch. //第一个tab的viewController FirstViewController *firstViewController = [[FirstViewController alloc]init]; //如果在这里指定tabitem标题,则在FirstViewController中指定self.tabBarItem.title则不生效 firstViewController.title = @"First view"; UITabBarItem *firstItem = [[UITabBarItem alloc]initWithTitle:@"First" image:nil tag:1]; [firstItem setFinishedSelectedImage:[UIImage imageNamed:@"p1"] withFinishedUnselectedImage:[UIImage imageNamed:@"p1_f"]]; firstViewController.tabBarItem = firstItem; SecondViewController *secondViewController = [[SecondViewController alloc]init]; //构建TabBarItem UITabBarItem *secondItem = [[UITabBarItem alloc]initWithTitle:@"Second" image:nil tag:2]; //设置选中和非选中状态下的图片 [secondItem setFinishedSelectedImage:[UIImage imageNamed:@"p2_f"] withFinishedUnselectedImage:[UIImage imageNamed:@"p2"]]; //右上角小图标 [secondItem setBadgeValue:@"2"]; //指定tabBarItem secondViewController.tabBarItem = secondItem; [secondItem release]; //构建UITabBarController并指定代理为本身 self.tabBarController = [[[UITabBarController alloc]init] autorelease]; self.tabBarController.delegate = self; //为UITabBarController添加TabBarItem self.tabBarController.viewControllers = [NSArray arrayWithObjects:firstViewController,secondViewController, nil]; [firstViewController release]; [secondViewController release]; //设置选中哪个tab // [self.tabBarController setSelectedIndex:0]; //指定根视图 self.window.rootViewController = self.tabBarController; self.window.backgroundColor = [UIColor whiteColor]; [self.window makeKeyAndVisible]; return YES; }
效果比较简单,有需要源码的可以给我留言,谢谢,另外,欢迎关注我的新浪微博:唐韧_Ryan
Handler内容摘要 :
/**
*handler可以分发Message对象和Runnable对象到主线程中, 每个Handler实例,都会绑定到创建他的线程中(一般是位于主线程), 它有两个作用: (1): 安排消息或Runnable
* 在某个主线程中某个地方执行, (2)安排一个动作在不同的线程中执行
*
* Handler中分发消息的一些方法 post(Runnable) postAtTime(Runnable,long)
* postDelayed(Runnable long) sendEmptyMessage(int) sendMessage(Message)
* sendMessageAtTime(Message,long) sendMessageDelayed(Message,long)
*
* 以上post类方法允许你排列一个Runnable对象到主线程队列中, sendMessage类方法,
* 允许你安排一个带数据的Message对象到队列中,等待更新. 三、Handler实例
*
* (1) 子类需要继承Hendler类,并重写handleMessage(Message msg) 方法, 用于接受线程数据
*
* 以下为一个实例,它实现的功能为 : 通过线程修改界面Button的内容
*/
不说废话了,直接上代码 :
main.xml 文件,在此 清单文件就不给出 了, 清单文件在eclipse中新建一个项目即可。
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<!-- TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_centerVertical="true"
android:padding="@dimen/padding_medium"
android:text="@string/hello_world"
tools:context=".MainActivity" />
-->
<Button
android:id="@+id/btn1"
android:text="Button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center"
/>
</RelativeLayout>
MainActivity 类 :
package com.example.testhandler;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.app.Activity;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.Button;
import android.support.v4.app.NavUtils;
public class MainActivity extends Activity {
Button button;
MyHandler myHandler;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
button = (Button) findViewById(R.id.btn1);
myHandler = new MyHandler();
// 当创建一个新的Handler实例时,它会绑定到当前线程和消息队列中,开始分发数据
// Handler 有两个最用 :
// 1 ,定时执行Message 和Runable对象
// 2 ,让一个动作,在不同的线程中执行
// 它安排消息,用以下方法
// post(Runnable)
// postAtTime(Runnable,long)
// postDelayed(Runnable,long)
// sendEmptyMessage(int)
// sendMessage(Message);
// sendMessageAtTime(Message,long)
// sendMessageDelayed(Message,long)
// 以上方法以post开头的允许你处理 Runnable对象,
// sendMessage 允许你处理Message对象(Message 里可以包含数据)
MThread m = new MThread();
new Thread(m).start();
}
/**
* 接收消息,处理消息,此handler会与主线程一起运行
*
* @author chon
*
*/
class MyHandler extends Handler {
public MyHandler(){}
public MyHandler(Looper L){
super(L);
}
//子类必须重写此方法,接收数据
@Override
public void handleMessage(Message msg) {
// TODO Auto-generated method stub
Log.i("Other", "MyHandler");
super.handleMessage(msg);
//此处可以更新UI
Bundle b = msg.getData();
String color = b.getString("color");
MainActivity.this.button.append(color);
}
}
class MThread implements Runnable {
@Override
public void run() {
// TODO Auto-generated method stub
try {
Thread.sleep(10000);
} catch (Exception e) {
e.printStackTrace();
}
Message message = new Message();
Bundle b =new Bundle (); //存放数据
b.putString("color", "我的 color");
message.setData(b);
//向Handler发送消息,更新UI
MainActivity.this.myHandler.sendMessage(message);
}
}
}