1 package com.example.sycapp;
3 import java.io.BufferedInputStream;
4 import java.io.BufferedOutputStream;
5 import java.io.BufferedReader;
7 import java.io.FileInputStream;
8 import java.io.FileNotFoundException;
9 import java.io.FileOutputStream;
10 import java.io.IOException;
11 import java.io.InputStream;
12 import java.io.InputStreamReader;
13 import java.io.OutputStream;
14 import java.io.OutputStreamWriter;
15 import java.nio.ByteBuffer;
16 import java.nio.CharBuffer;
17 import java.text.SimpleDateFormat;
18 import java.util.Date;
19 import java.util.Locale;
21 import java.util.Timer;
22 import java.util.TimerTask;
23 import java.util.Vector;
25 import android.os.AsyncTask;
26 import android.os.Bundle;
27 import android.os.Environment;
28 import android.app.Activity;
29 import android.app.AlertDialog;
30 import android.content.Context;
31 import android.content.DialogInterface;
32 import android.text.format.Time;
33 import android.text.method.ScrollingMovementMethod;
34 import android.view.LayoutInflater;
35 import android.view.Menu;
36 import android.view.View;
37 import android.view.View.OnClickListener;
38 import android.view.ViewGroup;
39 import android.widget.Button;
40 import android.widget.CompoundButton;
41 import android.widget.CompoundButton.OnCheckedChangeListener;
42 import android.widget.EditText;
43 import android.widget.Switch;
44 import android.widget.TextView;
45 import android.widget.Toast;
46 import android.hardware.usb.*;
48 public class MainActivity extends Activity {
50 //private String fileNameExt = "logFile.txt";
51 //private String fileName = "logFile";
52 private FileOutputStream fout;
53 private FileInputStream fin;
56 private SerialIO serial;
57 private SerialIO serial0;
58 private SerialIO serial1;
59 private SerialIO serial2;
60 private SerialIO serial3;
61 private SerialIO serial4;
62 private SerialIO serial5;
64 private final int interval = 100;
65 private final int xvlTimeUp = 2500;
66 private long currentSeconds;
69 private XivelyUL xively;
71 // TODO: need to be deleted
72 private EventGen evtGen;
74 private FileLogger fileLog;
81 private Button startBttn;
82 private Button logBttn;
83 private Button xvlBttn;
84 private Button evtBttn;
85 private EditText fileText;
86 private EditText xvlFeed;
87 private EditText xvlKey;
88 private EditText evtTrInt;
89 private EditText newName;
90 private TextView stream1;
91 private TextView stream2;
92 private TextView diffStr;
94 private boolean logEnable;
102 private final int LINENUM = 30;
105 protected void onCreate(Bundle savedInstanceState) {
106 super.onCreate(savedInstanceState);
107 setContentView(R.layout.activity_main);
108 Util.debug("Program Start!!");
110 LayoutInflater viewGen = LayoutInflater.from(this);
111 //LayoutInflater viewGen = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
112 this.xvlView = viewGen.inflate(R.layout.xively_cfg_layout, null, false);
113 this.evtView = viewGen.inflate(R.layout.one_alert_layout, null, false);
114 this.logView = viewGen.inflate(R.layout.one_alert_layout, null, false);
116 this.timer = new Timer();
119 this.logSW = (Switch) findViewById(R.id.logSwitch);
120 this.xvlSW = (Switch) findViewById(R.id.xvlSwitch);
121 this.evtSW = (Switch) findViewById(R.id.evtSwitch);
122 this.logBttn = (Button) findViewById(R.id.fileBttn);
123 this.xvlBttn = (Button) findViewById(R.id.xvlBttn);
124 this.evtBttn = (Button) findViewById(R.id.evtBttn);
125 this.startBttn=(Button) findViewById(R.id.startBttn);
126 this.stream1 = (TextView) findViewById(R.id.dataStream1);
127 this.stream2 = (TextView) findViewById(R.id.dataStream2);
128 this.fileText= (EditText) findViewById(R.id.fileText);
129 this.xvlFeed = (EditText) xvlView.findViewById(R.id.xvlFeed);
130 this.xvlKey = (EditText) xvlView.findViewById(R.id.xvlKey);
131 this.evtTrInt= (EditText) evtView.findViewById(R.id.oneLineEdit);
132 this.newName = (EditText) logView.findViewById(R.id.oneLineEdit);
134 this.logSW.setOnCheckedChangeListener(new SwitchChangedListener());
135 this.xvlSW.setOnCheckedChangeListener(new SwitchChangedListener());
136 this.evtSW.setOnCheckedChangeListener(new SwitchChangedListener());
137 this.startBttn.setOnClickListener(new ButtonClickListener());
138 this.logBttn .setOnClickListener(new ButtonClickListener());
139 this.xvlBttn .setOnClickListener(new ButtonClickListener());
140 this.evtBttn .setOnClickListener(new ButtonClickListener());
142 /*logSW .setEnabled(false);
143 xvlSW .setEnabled(false);
144 evtSW .setEnabled(false);
145 logBttn.setEnabled(false);
146 xvlBttn.setEnabled(false);
147 evtBttn.setEnabled(false);*/
154 //try {fout = openFileOutput(fileName, Context.MODE_PRIVATE);
155 // fin = openFileInput (fileName);}
156 //catch(Exception e) {Util.debug("[M#1]"+e.toString());}
157 this.serial = new SerialIO(fout);
158 //this.serial0= new SerialIO("/dev/ttyO0");
159 this.serial1= new SerialIO("/dev/ttyO1", 1);
160 this.serial2= new SerialIO("/dev/ttyO2", 2);
161 //this.serial3= new SerialIO("/dev/ttyO3");
162 this.xively = new XivelyUL();
163 this.evtGen = new EventGen();
164 this.fileLog= new FileLogger();
167 xively.setEnable(false);
168 evtGen.SetEnable(false);
169 fileLog.setEnable(false);
172 //stream1.setMovementMethod(new ScrollingMovementMethod().getInstance());
173 timer.scheduleAtFixedRate(new MainCycle(), 0, interval);
176 /*stream1.append("aa\n");
177 stream1.append("bb\n");
178 stream1.append("cc\n");
179 stream1.append("dd\n");
180 stream1.append("ee\n");
181 stream1.append("aa\n");
182 stream1.append("bb\n");
183 stream1.append("cc\n");
184 stream1.append("dd\n");
185 stream1.append("ee\n");
186 stream1.append("aa\n");
187 stream1.append("bb\n");
188 stream1.append("cc\n");
189 stream1.append("dd\n");
190 stream1.append("ee\n");
191 stream1.append("aa\n");
192 stream1.append("bb\n");
193 stream1.append("cc\n");
194 stream1.append("dd\n");
195 stream1.append("ee\n");
196 stream1.append("aa\n");
197 stream1.append("bb\n");
198 stream1.append("cc\n");
199 stream1.append("dd\n");
200 stream1.append("ee\n");
201 stream1.append("aa\n");
202 stream1.append("bb\n");
203 stream1.append("cc\n");
204 stream1.append("dd\n");
205 stream1.append("ee\n");
206 stream1.append("aa\n");
207 stream1.append("bb\n");
208 stream1.append("cc\n");
209 stream1.append("dd\n");
210 stream1.append("ee\n");
211 stream1.append("aa\n");
212 stream1.append("bb\n");
213 stream1.append("cc\n");
214 stream1.append("dd\n");
215 stream1.append("ee\n");
216 stream1.append("aa\n");
217 stream1.append("bb\n");
218 stream1.append("cc\n");
219 stream1.append("dd\n");
220 stream1.append("ee\n");
221 stream1.append("aa\n");
222 stream1.append("bb\n");
223 stream1.append("cc\n");
224 stream1.append("dd\n");
225 stream1.append("ee\n");
226 stream1.append("aa\n");
227 stream1.append("bb\n");
228 stream1.append("cc\n");
229 stream1.append("dd\n");
230 stream1.append("ee\n");
231 stream1.append("aa\n");
232 stream1.append("bb\n");
233 stream1.append("cc\n");
234 stream1.append("dd\n");
235 stream1.append("ee\n");*/
239 /*String longText = "aaaaaaaaaaaaaaaaaaaaaa\nbbbbbbbbbbbbbbbbbbbb\ncccccccccccccccccccc\n"+
240 "dddddddddddddddddddddd\neeeeeeeeeeeeeeeeeeee\nffffffffffffffffffff\n"+
241 "gggggggggggggggggggggg\nhhhhhhhhhhhhhhhhhhhh\niiiiiiiiiiiiiiiiiiii\n"+
242 "jjjjjjjjjjjjjjjjjjjjjj\nkkkkkkkkkkkkkkkkkkkk\nllllllllllllllllllll\n"+
243 "mmmmmmmmmmmmmmmmmmmmmm\nnnnnnnnnnnnnnnnnnnnn\noooooooooooooooooooo\n"+
244 "pppppppppppppppppppppp\nqqqqqqqqqqqqqqqqqqqq\nrrrrrrrrrrrrrrrrrrrr\n";*/
246 //stream2.setText(longText);
249 /*private int lineEnd(TextView text){
251 if (text.getLineCount()< LINENUM)return -1;
252 String s = text.getText().toString();
253 if (s.length()==0)return -1;
254 while (lineEnd<s.length()&&s.charAt(lineEnd)!='\n'){
257 if(lineEnd>=s.length())return -1;
260 /*private void cutLines(TextView text){
261 String s = text.getText().toString();
262 if (s.length()==0)return;
263 while (text.getLineCount()> LINENUM){
265 while (lineEnd<s.length()&&s.charAt(lineEnd)!='\n'){
268 if(lineEnd>=s.length())return;
269 text.getEditableText().delete(0, lineEnd+1);
273 /*private void cutLines(TextView text){
274 String content = text.getText().toString();
275 int totalLen = text.getLineCount();
277 if(totalLen<LINENUM){
279 }else if(totalLen <2*LINENUM){
282 for(i=0; i<content.length(); i++){
283 if(content.charAt(i)=='i'){
285 if(_nCnt == LINENUM){
290 if(i==content.length())return;
291 text.getEditableText().delete(0, i+1);
295 if (totalLen<=LINENUM)return;
296 for(i=content.length(); i>0; i--){
297 if(content.charAt(i)=='\n'){
299 if((_nCnt+LINENUM-1)>=totalLen){
305 text.getEditableText().delete(0, i+1);
309 private void cutLines(TextView text){
310 String content = text.getText().toString();
311 int totalLine = text.getLineCount();
312 if (totalLine>LINENUM+1){
313 text.getEditableText().delete(0, 25*(totalLine-1-LINENUM));
321 public boolean onCreateOptionsMenu(Menu menu) {
322 getMenuInflater().inflate(R.menu.main, menu);
326 private void initTimeStamp(){
327 long currentTimeM = System.currentTimeMillis();
328 SerialData initiator = new SerialData();
329 initiator.initMessage((short)0x00FF, (short)1, currentTimeM, (long)(currentTimeM+1000), (long)100);
330 serial1.send(initiator.initToBytes());
331 initiator.initMessage((short)0x80FF, (short)2, currentTimeM, (long)(currentTimeM+1000), (long)100);
332 serial2.send(initiator.initToBytes());
337 //--------------------------------------------------------------------
340 private class SwitchChangedListener implements OnCheckedChangeListener{
343 public void onCheckedChanged(CompoundButton sw, boolean checked) {
344 // TODO Auto-generated method stub
346 case R.id.logSwitch: logEnable = !checked; break;
347 case R.id.xvlSwitch: xively.setEnable(checked); break;
348 case R.id.evtSwitch: evtGen.SetEnable(checked); break;
353 private class ButtonClickListener implements OnClickListener{
356 public void onClick(View v) {
359 //for(int i=0; i<100;i++){
362 logSW .setEnabled(true);
363 xvlSW .setEnabled(true);
364 evtSW .setEnabled(true);
365 logBttn.setEnabled(true);
366 xvlBttn.setEnabled(true);
367 evtBttn.setEnabled(true);
370 AlertDialog.Builder fileDialog = new AlertDialog.Builder(MainActivity.this);
371 fileDialog.setTitle("New File Name");
372 fileDialog.setView(logView);
373 fileDialog.setPositiveButton("Save", new DialogInterface.OnClickListener() {
375 public void onClick(DialogInterface dialog, int which) {
376 String newFileName = newName.getText().toString();
377 if (newFileName==""){
378 toast("Fail:Empty File Name");
380 toast("File Setting Succeed");
381 //fileNameExt = newFileName+".txt";
382 fileLog.setNewFile(newFileName+".txt");
383 toast("New File Name Available");
389 fileDialog.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
391 public void onClick(DialogInterface dialog, int which) {
396 fileDialog.create().show();
400 String newFileName = fileText.getText().toString();
402 Toast.makeText(getApplicationContext(), "Fail:Empty File Name", Toast.LENGTH_LONG).show();
405 fileNameExt = fileText.getText().toString()+".txt";
406 Toast.makeText(getApplicationContext(), "Change Success!!", Toast.LENGTH_LONG).show();
407 //fileNameExt = "newFile.txt";
408 Util.debug("[M#8]FileName Changed to:"+fileNameExt);
409 }catch (Exception e){
410 Util.debug("[M#0]"+e.toString());
415 Util.debug("[M#10]I'm clicked");
416 AlertDialog.Builder xvlDialog = new AlertDialog.Builder(MainActivity.this);
417 xvlDialog.setTitle("Xively Configuration");
418 xvlDialog.setView(xvlView);
419 xvlDialog.setPositiveButton("Save", new DialogInterface.OnClickListener() {
421 public void onClick(DialogInterface dialog, int which) {
422 toast("Xively Feed/Key Set");
423 String newXvlFeed = xvlFeed.getText().toString();
424 String newXvlKey = xvlKey.getText().toString();
425 if (newXvlFeed!="") xively.setFeedID(newXvlFeed);
426 if (newXvlKey !="") xively.setApiKey(newXvlKey);
427 xively.createChannel("mbed1");
428 xively.createChannel("mbed2");
433 xvlDialog.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
435 public void onClick(DialogInterface dialog, int arg1) {
440 xvlDialog.setNeutralButton("Reset", new DialogInterface.OnClickListener() {
442 public void onClick(DialogInterface dialog, int which){
443 toast("Xively Reset Succeed!");
444 xively.resetFeedID();
445 xively.resetApiKey();
450 xvlDialog.create().show();
453 AlertDialog.Builder evtDialog = new AlertDialog.Builder(MainActivity.this);
454 evtDialog.setTitle("Event Trigger Interval(ms)");
455 evtDialog.setView(evtView);
456 evtDialog.setPositiveButton("Save", new DialogInterface.OnClickListener() {
458 public void onClick(DialogInterface dialog, int which) {
459 String newIntervalS = evtTrInt.getText().toString();
460 if(newIntervalS.length()>0) {
461 int interval = Integer.parseInt(evtTrInt.getText().toString());
462 if (interval<10||interval>10000){
463 toast("Fail:In valid Interval");
465 toast("Setting Succeed!");
466 evtGen.setInterval(interval);
467 SerialData cmd = evtGen.genTriggerCmd(1);
468 serial1.send(cmd.initToBytes());
469 cmd = evtGen.genTriggerCmd(2);
470 serial2.send(cmd.initToBytes());
477 evtDialog.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
479 public void onClick(DialogInterface dialog, int which) {
484 evtDialog.create().show();
491 private void toast(String s){
492 Toast.makeText(getApplicationContext(), s, Toast.LENGTH_LONG).show();
495 private void dismiss(View view){
496 ViewGroup vg = (ViewGroup) view.getParent();
500 /*private void writeExternal(Vector<SerialData> sData){
502 File myFile = new File(Environment
503 .getExternalStorageDirectory(), fileNameExt);
504 //if (!myFile.exists())
505 //myFile.createNewFile();
506 FileOutputStream fex;
507 fex = new FileOutputStream(myFile,true);
508 for (int i = 0; i < sData.size(); i++){
509 SerialData data = sData.get(i);
510 fex.write(("[Node "+Integer.toString(data.devID)+"] ["+Integer.toString(data.msgSeq)+"] "+data.timeStamp()+"\n").getBytes()) ;
515 Util.debug("M#7"+e.toString());
519 /*private void writeData(Vector<SerialData> sData){
524 OutputStreamWriter outputStreamWriter = new OutputStreamWriter(openFileOutput(fileName, Context.MODE_APPEND));
526 for(int i=0; i<sData.size(); i++){
527 SerialData data = sData.get(i);
528 //fout = (data.devId==1)?fout1:fout2;
529 outputStreamWriter.write("[Node "+Integer.toString(data.devID)+"] "+data.timeStamp()+"\n");
531 outputStreamWriter.close();
533 Util.debug("[M#5]"+e.toString());
537 /*private String readData() {
542 InputStream inputStream = openFileInput(fileName);
544 if ( inputStream != null ) {
545 InputStreamReader inputStreamReader = new InputStreamReader(inputStream);
546 BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
547 String receiveString = "";
548 StringBuilder stringBuilder = new StringBuilder();
550 while ( (receiveString = bufferedReader.readLine()) != null ) {
551 stringBuilder.append(receiveString);
555 ret = stringBuilder.toString();
558 catch (FileNotFoundException e) {
559 Util.debug("File not found: " + e.toString());
560 } catch (IOException e) {
561 Util.debug("Can not read file: " + e.toString());
566 // Serial 1 for the moment
567 private void packToView(Vector<SerialData> data){
568 for(int i=0; i<data.size(); i++){
569 SerialData d = data.get(i);
571 stream1.append(d.devID+": "+d.timeDisplay()+"\n");
573 stream2.append(d.devID+": "+d.timeDisplay()+"\n");
578 private void simpleCal(Vector<SerialData> v1, Vector<SerialData> v2){
583 while(i<v1.size()&& j<v2.size()){
590 private void timeDiff(int wrS1, int wrN1, int wrS2, int wrN2){
591 /*long t1 = (long)(((long)(wrS1)*(long)(1000))+((long)(wrN1)/(long)(1000000)));
592 long t2 = (long)(((long)(wrS2)*(long)(1000))+((long)(wrN2)/(long)(1000000)));
593 String tt1 = new SimpleDateFormat("yyyy-MM-dd", Locale.US).
594 format(new Date(currentTimeM)).toString()*/
600 private int did_temp = 1;
601 private class MainCycle extends TimerTask{
611 if(cnt>=1000/interval){
613 Util.debug("check for alive");
618 Vector<SerialData> data = serial1.checkPort();
619 Vector<SerialData> data2 = serial2.checkPort();
622 //Fot test: data generator:
623 /*SerialData sd = new SerialData();
624 did_temp = (did_temp==1)?2:1;
625 sd.evtMessage((short)did_temp, (short)0, System.currentTimeMillis(), (long)0);
626 Vector<SerialData> data= new Vector<SerialData>();
632 new XivelyPack().execute(data); //always pack data
633 if (xvlCnt>=2500/interval){
635 new XivelyUpload().execute(); //upload when it is time
639 new LogToFile().execute(data);
643 final Vector<SerialData> dataToDisplay = data;
644 runOnUiThread(new Runnable(){
647 packToView(dataToDisplay);
648 if(dspCnt>=1000/interval){
661 /*Vector<SerialData> data = serial.checkPort();
662 new XivelyPack().execute(data);
665 if(xvlCnt == (xvlTimeUp/interval)){
666 new XivelyUpload().execute();
669 new LogToFile().execute(data);*/
678 /*Vector<SerialData> data = serial.checkPort();
679 xively.packSerialData(data);
682 if(xvlCnt == (xvlTimeUp/interval)){
686 //fileLog.writeExternal(data);
687 //if(logEnable){ writeExternal(data);Util.debug("[M#9]Recording");}
688 //else {Util.debug("[M#9]Not writing because of the permit");}
690 //Util.debug("[Read Result]"+readData());
691 //Util.debug("[Read Result] "+Integer.toString(data.size()));
693 //xively.packSerialData(data);
696 /*SerialData sd = new SerialData();
697 sd.evtMessage((short)0, (short)0, System.currentTimeMillis(), (long)0);
698 Vector<SerialData> v= new Vector<SerialData>();
700 //xively.uploadData();
706 SerialData evtData = new SerialData();
707 evtData.evtMessage((short)1, (short)0, System.currentTimeMillis(), 0);
708 serial.send(evtData.evtToBytes());
709 /*SerialData syncData = new SerialData();
710 syncData.evtMessage((short)1, (short)0, System.currentTimeMillis(), 0);
711 //syncData.syncMessage(seq++, System.currentTimeMillis());*/
712 //syncData.syncMessage(seq++, System.currentTimeMillis());
715 private class LogToFile extends AsyncTask<Vector,Void,Void>{
717 @SuppressWarnings("unchecked")
718 protected Void doInBackground(Vector... dataVctArray) {
719 fileLog.writeExternal(dataVctArray[0]);
724 private class XivelyPack extends AsyncTask<Vector,Void,Void>{
726 @SuppressWarnings("unchecked")
727 protected Void doInBackground(Vector... dataVctArray) {
728 xively.packSerialData(dataVctArray[0]);
734 private class XivelyUpload extends AsyncTask<Void, Void, Void>{
737 protected Void doInBackground(Void... voids) {