@sekitoba | はじめよう!プラットフォーム Kernel2.6のマルチプロセッサー対応その3(仮) |
@akryokoyoko | その後の現状での活動報告(USBの表面的なこと) |
@magoroku15 | Androidの入力システム(仮) |
@l_b__ | OpenBinder Android IPCの2回目 |
メモ内容はつづきへ
@sekitoba | はじめよう!プラットフォーム Kernel2.6のマルチプロセッサー対応その3(仮) |
@akryokoyoko | その後の現状での活動報告(USBの表面的なこと) |
@magoroku15 | Androidの入力システム(仮) |
@l_b__ | OpenBinder Android IPCの2回目 |
#include <spi.h>
#include <adb.h>
// ADB接続
Connection *connection;
// ADB接続のイベントハンドラ
void adbEventHandler(Connection *connection, adb_eventType event, uint16_t length, uint8_t *data) {
if (event == ADB_CONNECTION_RECEIVE) {
}
}
void setup(){
// ADBの初期化
ADB::init();
// ADB接続の開始
connection = ADB::addConnection("tcp:4567", true, adbEventHandler);
}
void loop() {
// ADB接続のポーリング
ADB::poll();
}
#include <spi.h>
#include <adb.h>
#define LED 2
// Adb connection.
Connection * connection;
int data[15];
int g = 0;
byte b = B001111;
// Event handler for the shell connection.
void adbEventHandler(Connection * connection, adb_eventType event, uint16_t length, uint8_t * data) {
// Data packets contain two bytes, one for each servo, in the range of [0..180]
if (event == ADB_CONNECTION_RECEIVE) {
char ch = data[0];
Serial.println(ch, DEC);
if (ch < 0x20) {
setbit(ch);
} else {
setch(ch - 0x20);
}
}
}
void setup(){
Serial.begin(57600);
Serial.println("Ready");
pinMode(LED , OUTPUT);
// Initialise the ADB subsystem.
ADB::init();
// Open an ADB stream to the phone's shell. Auto-reconnect
connection = ADB::addConnection("tcp:4567", true, adbEventHandler);
}
void loop(){
// Poll the ADB subsystem.
ADB::poll();
}
ここまでやっておいてなんですが、やはり標準のコントローラーの方が操縦しやすいです。seekBar.setMax(180);
seekBar.setOnSeekBarChangeListener(new OnSeekBarChangeListener() {
publicvoid onStopTrackingTouch(SeekBar arg0) {
}
publicvoid onStartTrackingTouch(SeekBar arg0) {
}
publicvoid onProgressChanged(SeekBar v, int progress, boolean flag) {
try {
byte[] data = {
(byte) progress, (byte) progress
};
server.send(new String(data));
} catch (IOException e) {<
Log.e("SEEK", e.toString());
}
}
});
Server.java ・Server#addListener()でのエラーに対処 理由は良く解らんが、なぜかMicroBridge.javaで、Server#addListener()を呼ぶと ClassCastExceptionがでたので、とりあえずの対処。 元ソースだとTreeSetを使ってリスナーの管理をしているのだが、 多分Listでも動くだろうと思って変更。 TreeSetを使ったことがないのでなんでClassCastExceptionがでたのか理解は出来なかったけど、 Listにしても問題なかったのでいいのかな? // private TreeSet<serverlistener> listeners = new TreeSet<serverlistener>(); private List<serverlistener> listeners = new ArrayList<serverlistener>();とりあえずこれだけAndroid側のアプリには変更を加えて実行。
String url = "www.blogger.com";
String[] s = url.split("\\.", 0);
String url = "www.blogger.com";
String[] s = url.split("¥¥.", 0);
import com.sun.javadoc.*;
public class ListClass {
public static boolean start(RootDoc root) {
ClassDoc[] classes = root.classes();
for (int i = 0; i < classes.length; ++i) {
System.out.println(classes[i]);
}
return true;
}
}
・プロジェクトの実行の構成を変える メイン・クラス com.sun.tools.javadoc.Main 引数 -docletpath ${workspace_loc:doclet/bin} -doclet MyDoclet -sourcepath ${workspace_loc:対象になるソース} -subpackages パッケージ名 -private public class Main {
/**
* @param args
*/
public static void main(String[] args) {
final int LOOP = 1000000;
final int value = 0x12345678;
ByteBuffer buf = ByteBuffer.allocate(16);
buf.order(ByteOrder.LITTLE_ENDIAN);
byte[] dat = new byte[16];
long s_time = System.nanoTime();
for (int i = 0; i < LOOP; i++) {
DataConverter.setValue(dat, 0, value);
DataConverter.setValue(dat, 3, value);
DataConverter.setValue(dat, 7, value);
DataConverter.setValue(dat, 11, value);
}
System.out.println("Convertor:" + (System.nanoTime() - s_time) / LOOP);
for (int i = 0; i < dat.length; i++) {
System.out.format("%02X ", dat[i]);
}
System.out.println();
System.out.println();
s_time = System.nanoTime();
for (int i = 0; i < LOOP; i++) {
buf.putInt(0, value);
buf.putInt(3, value);
buf.putInt(7, value);
buf.putInt(11, value);
// byte[] d = buf.array();
}
System.out.println("ByteBuffer:" + (System.nanoTime() - s_time) / LOOP);
byte[] d = buf.array();
for (int i = 0; i < d.length; i++) {
System.out.format("%02X ", d[i]);
}
}
}
・DataConvertor.java public final class DataConverter {
/** int型のバイトサイズ */
private static final int SIZE_INTEGER = Integer.SIZE / Byte.SIZE;
/** マスク */
private static final int MASK = 0xFF;
public static void setValue(final byte[] dest, final int offset, final int src) {
for (int i = 0; i < SIZE_INTEGER; i++) {
dest[offset + i] = (byte)(src >> Byte.SIZE * i & MASK);
}
}
}
●結果 Convertor:56 78 56 34 78 56 34 12 78 56 34 12 78 56 34 12 00 ByteBuffer:130 78 56 34 78 56 34 12 78 56 34 12 78 56 34 12 00どちらも出力の形は一緒になったけど、時間に差が出た。 10回やってみた結果。
cnt = 1 Convertor : 54ns ByteBuffer: 139ns cnt = 2 Convertor : 53ns ByteBuffer: 130ns cnt = 3 Convertor : 49ns ByteBuffer: 131ns cnt = 4 Convertor : 50ns ByteBuffer: 134ns cnt = 5 Convertor : 50ns ByteBuffer: 129ns cnt = 6 Convertor : 50ns ByteBuffer: 130ns cnt = 7 Convertor : 52ns ByteBuffer: 131ns cnt = 8 Convertor : 50ns ByteBuffer: 127ns cnt = 9 Convertor : 50ns ByteBuffer: 131ns cnt = 10 Convertor : 50ns ByteBuffer: 131ns