package your.test; import java.io.*; import java.util.*; import java.util.concurrent.*; import android.app.*; import android.content.*; import android.hardware.*; import android.os.*; import android.os.PowerManager.*; import android.util.Log; import android.view.*; import android.view.View.*; import android.widget.*; public class TestActivity extends Activity implements SensorEventListener { /** Called when the activity is first created. */ private SensorManager mSensorManager ; private ScheduledExecutorService sla,sori,sgra,smag,srv; private Handler handler = new Handler(); private Runnable la,ori,gra,mag,rv; private PowerManager pm; private WakeLock lock; protected boolean MODE; protected String type; protected float arg1,arg2,arg3; protected int temp_voltage; private int wait_la,wait_ori,wait_gra,wait_mag,wait_rv; int [] sCount=new int [6],swich=new int[6]; int [][] temp = new int[6][3]; private String str,item,path = android.os.Environment.getExternalStorageDirectory().getPath()+"/log.txt"; private File file = new File(path); @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); //----------------------------------------------------------------------[[ インスタンス ]] mSensorManager = (SensorManager)this.getSystemService(SENSOR_SERVICE); //センサマネージャ pm = (PowerManager)getSystemService(Context.POWER_SERVICE); //パワーマネージャ lock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "My tag"); //ロックモード //----------------------------------------------------------------------[[ デフォルトサンプルレート ]] wait_la=1000*1; wait_ori=1000*1; wait_mag=1000*1; wait_gra=1000*1; wait_rv=1000*1; //----------------------------------------------------------------------[[ GUI部品 ]] Button button1 = (Button)findViewById(R.id.button1), //STARTボタン button2 = (Button)findViewById(R.id.button2), //STOPボタン button3 = (Button)findViewById(R.id.button3); Spinner spinner = (Spinner)findViewById(R.id.spinner1); //行動タグ選択ボックス ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,android.R.layout.simple_spinner_item); adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); adapter.add("walk"); adapter.add("train"); adapter.add("stop"); adapter.add("operate"); adapter.add("car"); spinner.setAdapter(adapter); //----------------------------------------------------------------------[[ センサリスナー登録スレッド作成 ]] la=new Runnable(){ public void run(){ registerListener(mSensorManager.getSensorList(Sensor.TYPE_LINEAR_ACCELERATION).get(0),mSensorManager); }}; ori=new Runnable(){ public void run(){ registerListener(mSensorManager.getSensorList(Sensor.TYPE_ORIENTATION).get(0),mSensorManager); }}; mag=new Runnable(){ public void run(){ registerListener(mSensorManager.getSensorList(Sensor.TYPE_MAGNETIC_FIELD).get(0),mSensorManager); }}; gra=new Runnable(){ public void run(){ registerListener(mSensorManager.getSensorList(Sensor.TYPE_GRAVITY).get(0),mSensorManager); }}; rv=new Runnable(){ public void run(){ registerListener(mSensorManager.getSensorList(Sensor.TYPE_ROTATION_VECTOR).get(0),mSensorManager); }}; //----------------------------------------------------------------------[[ リスナー登録 ]] spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { // スピナーのアイテムが選択された時に呼び出されるコールバックリスナーを登録 public void onItemSelected(AdapterView<?> parent, View view,int position, long id) { Spinner spinner = (Spinner) parent; // 選択されたアイテムを取得します item = (String) spinner.getSelectedItem(); } public void onNothingSelected(AdapterView<?> arg0) { } }); button1.setOnClickListener(new OnClickListener(){ //STARTボタンが押された時に呼び出されるリスナーを登録 public void onClick(View v) { (new Thread(new Runnable(){ public void run(){//センサー始動 lock.acquire(); //画面のパワーモードロック //----------------------------------------------------------------------[[一定周期でセンサリスナー登録]] sla=sori=sgra=smag=srv = Executors.newSingleThreadScheduledExecutor(); sla.scheduleAtFixedRate(new Runnable(){public void run() {handler.post(la);} }, 0, wait_la,TimeUnit.MILLISECONDS); sori.scheduleAtFixedRate(new Runnable(){public void run() {handler.post(ori);} }, 0, wait_ori,TimeUnit.MILLISECONDS); sgra.scheduleAtFixedRate(new Runnable(){public void run() {handler.post(gra);} }, 0, wait_gra,TimeUnit.MILLISECONDS); smag.scheduleAtFixedRate(new Runnable(){public void run() {handler.post(mag);} }, 0, wait_mag,TimeUnit.MILLISECONDS); srv.scheduleAtFixedRate(new Runnable(){public void run() {handler.post(rv);} }, 0, wait_rv,TimeUnit.MILLISECONDS); // MODE = true; //アクティブモードON } })).start(); } }); button2.setOnClickListener(new OnClickListener(){ //STOPボタンが押された時に呼び出されるリスナーを登録 public void onClick(View v) { (new Thread(new Runnable(){ public void run(){//センサー停止 // lock.release(); //画面のパワーリリース unregisterListener(mSensorManager); sla.shutdown(); sori.shutdown(); smag.shutdown(); sgra.shutdown(); srv.shutdown(); MODE = false; } })).start(); } }); button3.setOnClickListener(new OnClickListener(){ //バッテリー監視ボタンが押された時に呼び出されるリスナーを登録 public void onClick(View v) { (new Thread(new Runnable(){ public void run(){//BatteryActivityに切り替え Intent i = new Intent(getApplicationContext() , BatteryActivity.class); startActivity(i); } })).start(); } }); } public void SensorObserver(){//センサー状態を監視 /* (new Thread(new Runnable(){ public void run(){ *1357197385*/ StringBuffer sb = new StringBuffer(); TextView tv = (TextView)findViewById(R.id.textView3); sb.append("TAG :"+item+"\r\n"); sb.append("TYPE :"+type+"\r\n"); sb.append("ARG1 :"+String.valueOf(arg1)+"\r\n"); sb.append("ARG2 :"+String.valueOf(arg2)+"\r\n"); sb.append("ARG3 :"+String.valueOf(arg3)+"\r\n"); tv.setText(sb); /* } })).start(); *1357197386*/ } public void onResume(){ super.onResume(); // if(MODE){ //----------------------------------------------------------------------[[ バッテリー状態監視 ]] IntentFilter filter = new IntentFilter(); filter.addAction(Intent.ACTION_BATTERY_CHANGED); //----------------------------------------------------------------------[[ バッテリー状態監視 ]] SensorObserver(); } // } public void registerListener(Sensor s,SensorManager sm){//センサリスナー登録 sm.registerListener(this, s,SensorManager.SENSOR_DELAY_UI); } public void unregisterListener(SensorManager sm){//センサリスナー解除 sm.unregisterListener(this); } public void onPause(){ super.onPause(); } protected void onDestroy() { super.onDestroy(); /* sla.shutdown(); sori.shutdown(); smag.shutdown(); sgra.shutdown(); srv.shutdown(); *1357197387*/ mSensorManager.unregisterListener(this); } public void onSensorChanged(SensorEvent event) { mSensorManager.unregisterListener(this);//センサが値を取得した時点でリスナー解除 if(event.values[0]*event.values[1]*event.values[2]!=0){ //センサー別に値を取得。 // synchronized(this){ if(event.sensor.getType()==Sensor.TYPE_LINEAR_ACCELERATION && SensorCheck(1,(int)event.values[0],(int)event.values[1],(int)event.values[2]) && swich[1]==0){ // if(event.sensor.getType()==Sensor.TYPE_LINEAR_ACCELERATION && swich[1]==0){ // swich[1]=1; str = LogSet(event.values[0],event.values[1],event.values[2])+ "$LINEAR_ACCELERATION\r\n"; //----------------------------------------------------------------------[[ センサー監視変数に同期 ]] type = "LINEAR_ACCELERATION"; arg1 = event.values[0]; arg2 = event.values[1]; arg3 = event.values[2]; /* new Thread(new Runnable(){ public void run(){ handler.post(new Runnable(){ public void run(){ *1357197388*/ Log.v("Sensor", "LINEAR_ACCELERATION"); OutputResult(str); swich[1]=0; // }});}}).start(); } if(event.sensor.getType()==Sensor.TYPE_MAGNETIC_FIELD && SensorCheck(2,(int)event.values[0],(int)event.values[1],(int)event.values[2])&& swich[2]==0){ // if(event.sensor.getType()==Sensor.TYPE_MAGNETIC_FIELD && swich[2]==0){ // swich[2]=1; str = LogSet(event.values[0],event.values[1],event.values[2])+"$MAGNETIC_FIELD\r\n"; //----------------------------------------------------------------------[[ センサー監視変数に同期 ]] type = "MAGNETIC_FIELD"; arg1 = event.values[0]; arg2 = event.values[1]; arg3 = event.values[2]; /* new Thread(new Runnable(){ public void run(){ handler.post(new Runnable(){ public void run(){ *1357197389*/ Log.v("Sensor", "MAGNETIC_FIELD"); OutputResult(str); swich[2]=0; // }});}}).start(); } if(event.sensor.getType()==Sensor.TYPE_GRAVITY && SensorCheck(3,(int)event.values[0],(int)event.values[1],(int)event.values[2])&& swich[3]==0){ // if(event.sensor.getType()==Sensor.TYPE_GRAVITY && swich[3]==0){ // swich[3]=1; str = LogSet(event.values[0],event.values[1],event.values[2])+"$GRAVITY\r\n"; //----------------------------------------------------------------------[[ センサー監視変数に同期 ]] type = "GRAVITY"; arg1 = event.values[0]; arg2 = event.values[1]; arg3 = event.values[2]; /* new Thread(new Runnable(){ public void run(){ handler.post(new Runnable(){ public void run(){ *1357197390*/ Log.v("Sensor", "GRAVITY"); OutputResult(str); swich[3]=0; // }});}}).start(); } if(event.sensor.getType()==Sensor.TYPE_ORIENTATION && SensorCheck(4,(int)event.values[0],(int)event.values[1],(int)event.values[2])&& swich[4]==0){ // if(event.sensor.getType()==Sensor.TYPE_ORIENTATION && swich[4]==0){ // swich[4]=1; str = LogSet(event.values[0],event.values[1],event.values[2])+"$ORIENTATION\r\n"; //----------------------------------------------------------------------[[ センサー監視変数に同期 ]] type = "ORIENTATION"; arg1 = event.values[0]; arg2 = event.values[1]; arg3 = event.values[2]; /* new Thread(new Runnable(){ public void run(){ handler.post(new Runnable(){ public void run(){ *1357197391*/ Log.v("Sensor", "ORIENTATION"); OutputResult(str); swich[4]=0; // }});}}).start(); } if(event.sensor.getType()==Sensor.TYPE_ROTATION_VECTOR && SensorCheck(5,(int)event.values[0],(int)event.values[1],(int)event.values[2])&& swich[5]==0){ // if(event.sensor.getType()==Sensor.TYPE_ROTATION_VECTOR && swich[5]==0){ // swich[5]=1; str = LogSet(event.values[0]*10,event.values[1]*10,event.values[2]*10)+"$ROTATION_VECTOR\r\n"; //----------------------------------------------------------------------[[ センサー監視変数に同期 ]] type = "ROTATION_VECTOR"; arg1 = event.values[0]; arg2 = event.values[1]; arg3 = event.values[2]; /* new Thread(new Runnable(){ public void run(){ handler.post(new Runnable(){ public void run(){ *1357197392*/ Log.v("Sensor", "ROTATION_VECTOR"); OutputResult(str); swich[5]=0; // }});}}).start(); } } } // } public void OutputResult(String str){//出力形式判別モジュール //保存するテキストを編集する。 StringBuffer sb = new StringBuffer(); sb.append(str); //Wifiの受信状況を取得する /* ArrayList<String>st = WifiAPChecker(); if(st != null ){ for(String string : st) sb.append(string); }*/ /* if(CheckHttp()) syncWeb(sb.toString()); else *1357197393*/ syncExtraStrage(sb.toString()); } public boolean SensorCheck(int num,int x,int y,int z){//センサー値に変動があるか検査 double dev[]=new double[3]; switch(num){ case 1: dev[0] = dev[1] = dev[2]=1; break; case 2: dev[0] = dev[1] = dev[2]=10; break; case 3: dev[0] = dev[1] = dev[2]=2; break; case 4: dev[0] =40; dev[1] = 5; dev[2]=10; break; case 5: dev[0] = dev[1] = dev[2]=1; break; default: break; } if(Math.abs(temp[num][0]-x)>dev[0] || Math.abs(temp[num][1]-y)>dev[1] || Math.abs(temp[num][2]-z)>dev[2]){ temp[num][0]=x; temp[num][1]=y; temp[num][2]=z; sCount[num]=0; return true; }else{ sCount[num]++; return false; } } public String LogSet(float x,float y,float z){//データ出力フォーマットを作成 return //float値からshort値にキャストしてログ出力とする。 "$"+ String.valueOf(x)+","+ String.valueOf(y)+","+ String.valueOf(z); } public void syncExtraStrage(String str){ FileOutputStream fos ; try { fos = new FileOutputStream(file,true); OutputStreamWriter osw = new OutputStreamWriter(fos,"UTF-8"); PrintWriter pw = new PrintWriter(osw); pw.append(item+"$"+ String.valueOf(Calendar.getInstance().getTime().getMonth()+1) + ":"+ String.valueOf(Calendar.getInstance().getTime().getDate()) + ":"+ String.valueOf(Calendar.getInstance().getTime().getHours()) + ":"+ String.valueOf(Calendar.getInstance().getTime().getMinutes()) + ":" + String.valueOf(Calendar.getInstance().getTime().getSeconds())+str); pw.close(); osw.close(); fos.close(); } catch (FileNotFoundException e) {e.printStackTrace();} catch (UnsupportedEncodingException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();} } //----------------------------------------------------------------------[[ 未使用メソッド ]] /* public void timeScheduler(){ if(sCount[1]>2){ wait_la = 1000*1; Log.v("timeScheduler",String.valueOf(sCount[1])+ "wait_la sleep");} else{ wait_la = 1000*1; Log.v("timeScheduler", String.valueOf(sCount[1])+"wait_la wake");} if(sCount[2]>5){ wait_mag = 1000*1; Log.v("timeScheduler", "wait_mag sleep");} else{ wait_mag = 1000*1; Log.v("timeScheduler", "wait_mag wake");} if(sCount[3]>5){ wait_gra = 1000*1; Log.v("timeScheduler", "wait_gra sleep");} else{ wait_gra = 1000*1; Log.v("timeScheduler", "wait_gra wake");} if(sCount[4]>5){ wait_ori = 1000*1; Log.v("timeScheduler", String.valueOf(sCount[4])+"wait_ori sleep");} else{ wait_ori = 1000*1; Log.v("timeScheduler", String.valueOf(sCount[4])+"wait_ori wake");} if(sCount[5]>2) wait_rv = 1000*1; else wait_rv = 1000*1; } /* public boolean CheckHttp(){//通信可否判定 //-----[クライアント設定] HttpClient httpclient = new DefaultHttpClient(); HttpPost httppost = new HttpPost("http://sgw-fky.ddo.jp/sensor_data.php"); //-----[POST送信するデータを格納] List<NameValuePair> nameValuePair = new ArrayList<NameValuePair>(); nameValuePair.add(new BasicNameValuePair("check","check")); try { //-----[POST送信] httppost.setEntity(new UrlEncodedFormEntity(nameValuePair,HTTP.UTF_8)); HttpResponse response = httpclient.execute(httppost); ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); response.getEntity().writeTo(byteArrayOutputStream); Log.v("httpcheck", "syncing now"); //-----[サーバーからの応答を取得] if(response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) return true; } catch (UnsupportedEncodingException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();} return false; } public void syncWeb(String str){//データをwebサーバにPOST送信 //-----[ログデータ取得] FileInputStream fis ; String s; //-----[クライアント設定] HttpClient httpclient = new DefaultHttpClient(); HttpPost httppost = new HttpPost("http://sgw-fky.ddo.jp/sensor_data.php"); //-----[POST送信するストレージデータを格納] List<NameValuePair> nameValuePair2 = new ArrayList<NameValuePair>(); try { fis = new FileInputStream(file); InputStreamReader isr = new InputStreamReader(fis,"UTF-8"); BufferedReader br = new BufferedReader(isr); while((s=br.readLine())!=null) nameValuePair2.add(new BasicNameValuePair("log",s+"\n")); //ストレージを削除 file.delete(); br.close(); isr.close(); fis.close(); //-----[POST送信 - ストレージ] httppost.setEntity(new UrlEncodedFormEntity(nameValuePair2,HTTP.UTF_8)); HttpResponse response2 = httpclient.execute(httppost); ByteArrayOutputStream byteArrayOutputStream2 = new ByteArrayOutputStream(); response2.getEntity().writeTo(byteArrayOutputStream2); Log.v("syncWeb", "syncing now"); //-----[サーバーからの応答を取得] if(response2.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {} else Toast.makeText(this, "[error]: "+response2.getStatusLine(), Toast.LENGTH_LONG).show(); } catch (FileNotFoundException e) {e.printStackTrace();} catch (UnsupportedEncodingException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();} //-----[POST送信する生データを格納] List<NameValuePair> nameValuePair = new ArrayList<NameValuePair>(); nameValuePair.add(new BasicNameValuePair("log",item+"$"+ String.valueOf(Calendar.getInstance().getTime().getDate()) + ":"+ String.valueOf(Calendar.getInstance().getTime().getHours()) + ":"+ String.valueOf(Calendar.getInstance().getTime().getMinutes()) + ":" + String.valueOf(Calendar.getInstance().getTime().getSeconds()) + str)); try { //-----[POST送信 - 生データ] httppost.setEntity(new UrlEncodedFormEntity(nameValuePair,HTTP.UTF_8)); HttpResponse response = httpclient.execute(httppost); ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); response.getEntity().writeTo(byteArrayOutputStream); Log.v("syncWeb", "syncing now"); //-----[サーバーからの応答を取得] if(response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {} else Toast.makeText(this, "[error]: "+response.getStatusLine(), Toast.LENGTH_LONG).show(); }catch (UnsupportedEncodingException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();} } *1357197394*/ /* public ArrayList<String> WifiAPChecker(){//Wifiのアクセスポイント一覧を取得 WifiManager wManager = (WifiManager)getSystemService(WIFI_SERVICE); if(wManager.getWifiState()==WifiManager.WIFI_STATE_ENABLED){ //APをスキャン wManager.startScan(); //スキャン結果を取得 List<ScanResult> apList = wManager.getScanResults(); ArrayList<String> aps = new ArrayList<String>(); for(int i=0;i<apList.size();i++){ aps.add("#" + apList.get(i).SSID + apList.get(i).frequency + " MHz " + apList.get(i).level + "dBm\n"); } return aps; }else return null; } *1357197395*/ public void onAccuracyChanged(Sensor arg0, int arg1) { } }