I have migrate my blog to new blog. Click the link below to redirect.
http://edisonthk.wordpress.com/2014/06/12/constraints-of-multiple-layouts-listview-for-android/
2014年6月12日木曜日
2014年4月21日月曜日
Setup egit for eclipse ADT by install new software
I have migrate my blog to new blog. Click the link below to redirect.
http://edisonthk.wordpress.com/2014/04/21/setup-egit-for-eclipse-adt-by-install-new-software/
http://edisonthk.wordpress.com/2014/04/21/setup-egit-for-eclipse-adt-by-install-new-software/
2014年4月16日水曜日
Login ssh to server without including username
Let's say you want to login to ssh in very short command. For instance,
And save it. No restart is required, just try ssh myserver, and you are login as myuser@myserverdomain.com
ssh myserver
How to do it?
No configuration on server, just do some configuration on client side.
On client side terminal, open ssh config file. If it doesn't exists, create a new one.
nano ~/.ssh/config
Then, type in following.
host myserver hostname myserverdomain.com user myuser
And save it. No restart is required, just try ssh myserver, and you are login as myuser@myserverdomain.com
2014年1月28日火曜日
LED Blinky with BGScript Programming
If you are not yet setup the development environment. Check the last post.
http://edisontus.blogspot.jp/2014/01/getting-started-with-development.html
I am going to guide you how to make LED blink (turn on and turn off) in every 1 seconds with BGScript.
hardware.xml is configuration file that related to ble112 hardware configuration.
gatt.xml exposes the Bluetooth services and profiles.
project.xml tell bgbuild what roles played by every xml file.
Then, binary file out.hex is generated. It is the file we needed to flash into ble112.
http://edisontus.blogspot.jp/2014/01/getting-started-with-development.html
I am going to guide you how to make LED blink (turn on and turn off) in every 1 seconds with BGScript.
Create 3 config files (gatt.xml, hardware.xml, project.xml)
Every file have it's own function and contains the information needed when compile to binary file. These 3 files are config files that is needed and you must always remember to import these in every project. What you needs to do is copy following source code and paste it.hardware.xml is configuration file that related to ble112 hardware configuration.
<?xml version="1.0" encoding="UTF-8" ?> <hardware> <sleeposc enable="true" ppm="30" /> <usb enable="false" endpoint="none" /> <txpower power="15" bias="5" /> <usart channel="1" alternate="1" baud="57600" endpoint="api" /> <wakeup_pin enable="true" port="0" pin="0" /> <port index="0" tristatemask="0" pull="down" /> <pmux regulator_pin="7" /> </hardware>
gatt.xml exposes the Bluetooth services and profiles.
<?xml version="1.0" encoding="UTF-8" ?> <configuration> <service uuid="1800"> <description>Generic Access Profile</description> <characteristic uuid="2a00"> <properties read="true" const="true" /> <value>BG Demo</value> </characteristic> <characteristic uuid="2a01"> <properties read="true" const="true" /> <value type="hex">4142</value> </characteristic> </service> <service type="primary" uuid="9000" id="manufacturer"> <characteristic uuid="9100"> <properties read="true" const="true" /> <value type="hex">000780c0ffeef00d</value> </characteristic> <characteristic uuid="9101"> <properties read="true" const="true" /> <value>modelnumber</value> </characteristic> <characteristic uuid="9106"> <properties read="true" const="true" /> <value>Bluegiga</value> </characteristic> </service> <service uuid="e001"> <description>Battery status</description> <include id="manufacturer" /> <characteristic uuid="e101" id="xgatt_battery"> <properties read="true" notify="true" /> <value type="hex">ABCD</value> </characteristic> </service> <service uuid="00431c4a-a7a4-428b-a96d-d92d43c8c7cf"> <description>Bluegiga demo service</description> <characteristic uuid="f1b41cde-dbf5-4acf-8679-ecb8b4dca6fe"> <properties read="true" write="true"/> <value type="hex">coffee</value> </characteristic> </service> </configuration>
project.xml tell bgbuild what roles played by every xml file.
<project> <gatt in="gatt.xml" /> <hardware in="hardware.xml" /> <script in="blink.bgs" /> <image out="out.hex" /> </project>
Create blink.bgs
I will explain detail on blink.bgs later. Copy following code and paste to blink.bgs
dim flag dim interval # Boot event listener event system_boot(major ,minor ,patch ,build ,ll_version ,protocol_version ,hw) flag = 0 interval = $8000 # Configure the P0_0 as output call hardware_io_port_config_direction(0, 1) # Enable P0_0 pin call hardware_io_port_write(0, 1, 1) # Start a 5 second, one stop timer call hardware_set_soft_timer(interval, 0 ,1) end # Timer event listener event hardware_soft_timer(handle) #declare hardware_set_soft_timer to allow it work as forever loop as recursive if flag = 0 then # When timer expires disable P0_0 pin call hardware_io_port_write(0, 1, 0) call hardware_set_soft_timer(interval, 0 ,1) flag = 1 else # When timer expires enable P0_0 pin call hardware_io_port_write(0, 1, 1) call hardware_set_soft_timer(interval, 0 ,1) flag = 0 end if end
Debug with bgbuild.exe
bgbuild.exe can be found at {ble_directory} -> bin directory.
Open command prompt and go to blink directory that created at beginning of this article, and run following command.
C:\Bluegiga\ble-1.2.1-91\bin\bgbuild.exe project.xml
Replace {ble_directory} to your own path. You should get the result look as below.
Then, binary file out.hex is generated. It is the file we needed to flash into ble112.
BLE SW update tool
Bluegiga prepared a flash tool called Bluegiga BLE SW Update tool. This tool can be found at BleUpdate directory, it is placed at different place with bgbuild.exe.
Click Refresh and Info to choose the debugger. Then click browse to the out.hex that generated at last section inside blink directory.
Then click update and it will write the binary file into ble112.
Last job
Connect LED to P0_0 pin. Then you will see LED blink at every 1 seconds.
Explaination on blink.bgs
event system_boot is something like int main() in c language. It is always the first part to be executed after global variables.
dim is used to declare variable. Usually, it means int or char in c language.
$ mark in bgscript used to declared the following number is hexadecimal. In this case, interval = $8000 is same as interval = 0x8000 in c language. Following equation is used to calculate the time for timer. Based on the equation below, clock of ble112 is 32.768kHz, in order to set 1 seconds, interval needed to be set to 32768 ( 8000 in hexdecimal ).
You might reliased that there is not for or while loop in my script. How can I achieve forever loop? The answer is recursive between hardware_set_soft_timer and hardware_soft_timer.
There is no built in delay event so recursive method is the only way to do forever loop.
hardware_set_soft_timer set the timer start and hardware_soft_timer is the handler event after the time specified in 1st parameter of hardware_set_soft_timer is passed.
By adding hardware_set_soft_timer into hardware_soft_timer, the timer will started again when timer is stop.
End
Thank you for reading.
2014年1月22日水曜日
Simple guide to ExecutorService Android
ExecutorService is almost same as ThreadPoolExecutor, it allows you to carry out multiple background thread in sequentially.
What can ExecutorService do? Do you know that powerful AsyncTask method is only allows to be executed one time in single activity. If you execute AsyncTask more then one time in single activity, you will get the errors.
So it is where ExecutorService comes, it help you handle multiple background task which AsyncTask cannot be done.
What can ExecutorService do? Do you know that powerful AsyncTask method is only allows to be executed one time in single activity. If you execute AsyncTask more then one time in single activity, you will get the errors.
So it is where ExecutorService comes, it help you handle multiple background task which AsyncTask cannot be done.
Try it out!!
It is always easy to understand if you get something work first.
First, prepare server script.
<?php echo "hello! I am server."; ?>
Remember the url of your server. Then, copy following android code and replace the url to your own and give permission to internet.
package com.example.apps1; import java.io.IOException; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import org.apache.http.HttpResponse; import org.apache.http.client.ClientProtocolException; import org.apache.http.client.methods.HttpGet; import org.apache.http.impl.client.DefaultHttpClient; import org.apache.http.util.EntityUtils; import android.app.Activity; import android.os.Bundle; import android.os.Handler; import android.os.Looper; import android.os.Message; import android.util.Log; import android.view.View; import android.widget.Button; import android.widget.LinearLayout; import android.widget.LinearLayout.LayoutParams; import android.widget.Toast; public class MainActivity extends Activity { private Button mButton; private ExecutorService pool; public static final String URL = "http://path_to_server/"; private static final String TAG = MainActivity.class.getName(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mButton = new Button(this); mButton.setText("Press"); addContentView(mButton, new LinearLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT)); pool = Executors.newSingleThreadExecutor(); mButton.setOnClickListener(mClickListener); } private View.OnClickListener mClickListener = new View.OnClickListener(){ @Override public void onClick(View v) { pool.execute(new NetworkService()); } }; private class NetworkService implements Runnable { private Handler mHandler; public NetworkService(){ mHandler = new Handler(Looper.getMainLooper()){ @Override public void handleMessage(Message inputMessage){ String msg = (String) inputMessage.obj; Toast.makeText(getApplicationContext(), ""+msg, Toast.LENGTH_SHORT).show(); } }; } @Override public void run() { String recv = HttpRequest(URL); sendMessage(1, recv); } public void sendMessage(int what, String msg){ Message message = mHandler.obtainMessage(what , msg); message.sendToTarget(); } } // Doing all Networking task, if failed to get message from server, it will return null // public String HttpRequest(String url) { DefaultHttpClient client = new DefaultHttpClient(); HttpResponse response = null; try{ HttpGet httpGet = new HttpGet(url); response = client.execute(httpGet); return EntityUtils.toString(response.getEntity()); }catch(ClientProtocolException e){ Log.e(TAG,"ClientProtocolException : "+e); }catch(IOException e){ Log.e(TAG,"IOException : "+e); } return null; } }
Press the button and toast will show you the message from server.
Explanation
ExecutorService can be instanced in few different way.
Based on how ExecutorService is instanced, ExecutorService will be working in different way. For more detail please checking Executors API. In this guide, I am using newSingleThreadExecutor, it only allows one task in the same time.
NetworkService is implemented with Runnable. NetworkService is almost same as AsyncTask, contains UI thread callback method, doInBackground method.
In this case, same method of AsnycTask and NetworkService
- Executors.newSingleThreadExecutor();
- Executors.newFixedThreadPool(10);
- Executors.newScheduledThreadPool(10);
Based on how ExecutorService is instanced, ExecutorService will be working in different way. For more detail please checking Executors API. In this guide, I am using newSingleThreadExecutor, it only allows one task in the same time.
NetworkService is implemented with Runnable. NetworkService is almost same as AsyncTask, contains UI thread callback method, doInBackground method.
In this case, same method of AsnycTask and NetworkService
- doInBackground == run
- onPostExecute == handleMessage
private class NetworkService implements Runnable { private Handler mHandler; public NetworkService(){ // Handler looper constructor to declare this handler // is going to link to UI Thread mHandler = new Handler(Looper.getMainLooper()){ // handleMessage method is callback of background work. // All the tasks in handleMessage will be pass to UI thread // // This method is same as AsyncTask.onPostExecute @Override public void handleMessage(Message inputMessage){ String msg = (String) inputMessage.obj; Toast.makeText(getApplicationContext(), ""+msg, Toast.LENGTH_SHORT).show(); } }; } // Runnable.run method doing all tasks in background // It is same as AsyncTask.doInBackground @Override public void run() { String recv = HttpRequest(URL); // Get the result from HttpRequest and past it to handler. sendMessage(1, recv); } public void sendMessage(int what, String msg){ Message message = mHandler.obtainMessage(what , msg); message.sendToTarget(); } }
Every time user press the button, NetworkService will be created and added to background's pool. If there is no task queue in front the NetworkService task, it will be executed.
pool.execute(new NetworkService());
Background task is not an easy task. There are much more work then the sample code on above such as shutdown or pause the ExecutorService. What I have explain in this article is to get you works on your apps quickly.
End
Hope this article help you in coding. Thank you for reading.
2014年1月21日火曜日
Quick Guide to Android Networking by Request Message from Server
A quick guide to programming Android request Server and getting the message. On this guide, I am going to show you how to getting message "hello! I am server." and show it on Android.
Script it as simple as you can.
Replace the url "http://path_to_server" to your own in HttpRequest.
Don't debug it, we haven't done yet. As I mentioned above, you need to configure android to able to access internet. What you needs to do is simple, go to your_project_directory and open AndroidManifest.xml
Add following uses-permission to in front of <uses-sdk> tag
Then, debug it and you will see the requested message from server.
Android is doing a good job for developer, there are built-in background thread method prepared by Android called AsyncTask.
AsyncTask easy us to doing background task coding by put all the background code in doInBackground method. On the code above, HttpRequest method is the internet task and you will find it I put it on doInBackground method. It means the all the task in HttpRequest will be carried out in background thread.
onPostExecute method is a callback method for background thread. After HttpRequest getting the messages, it needs to show it on UI. Here's where onPostExecute comes, the message returned by HttpRequest method is assign to onPostExecute 1st parameter "result". TextView set text of 1st parameter result.
After coding AsyncTask method, you needs to execute it by
Be caution here, AsyncTask is easy but it can only be executed one time in single Activity.
It means if you execute AsnycTask for twice, exception will be thrown and you will get errors.
Luckily, Android have prepared another method called ExecutorService. It allows multiple network task can be executed in single activity.
Check it out with my next post, if you are interesting with it.
On Server side
Before programming android, prepare some simple php script on server.
<?php echo "hello! I am server"; ?>
Script it as simple as you can.
On Android side
Android is quiet complicated with Internet. You needs to enable android to access to internet and work your internet thread on background. Before we get start with our tutorial, copy the code below and debug it. It is always simple to understand if you get the things work first.package com.example.apps1; import java.io.IOException; import org.apache.http.HttpResponse; import org.apache.http.client.ClientProtocolException; import org.apache.http.client.methods.HttpGet; import org.apache.http.impl.client.DefaultHttpClient; import org.apache.http.util.EntityUtils; import android.app.Activity; import android.os.AsyncTask; import android.os.Bundle; import android.util.Log; import android.widget.LinearLayout; import android.widget.LinearLayout.LayoutParams; import android.widget.TextView; public class MainActivity extends Activity { private TextView mTextView; private static final String TAG = MainActivity.class.getName(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mTextView = new TextView(this); addContentView(mTextView, new LinearLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT)); new ConnectToServer().execute(); } public class ConnectToServer extends AsyncTask<Void,Void,String>{ @Override protected String doInBackground(Void... params) { // replace the url to your own return HttpRequest("http://path_to_server/"); } @Override protected void onPostExecute(String result){ if(result == null){ mTextView.setText("Failed to connecting to server"); }else{ mTextView.setText(result); } } public String HttpRequest(String url) { DefaultHttpClient client = new DefaultHttpClient(); HttpResponse response = null; try{ HttpGet httpGet = new HttpGet(url); response = client.execute(httpGet); return EntityUtils.toString(response.getEntity()); }catch(ClientProtocolException e){ Log.e(TAG,"ClientProtocolException : "+e); }catch(IOException e){ Log.e(TAG,"IOException : "+e); } return null; } } }
Replace the url "http://path_to_server" to your own in HttpRequest.
Don't debug it, we haven't done yet. As I mentioned above, you need to configure android to able to access internet. What you needs to do is simple, go to your_project_directory and open AndroidManifest.xml
Add following uses-permission to in front of <uses-sdk> tag
<uses-permission android:name="android.permission.INTERNET" />
Then, debug it and you will see the requested message from server.
Explanation
There are 2 things you need to be careful when programming across internet.- Networking thread must be on background
- Configure internet permission in AndroidManifest.xml
Android is doing a good job for developer, there are built-in background thread method prepared by Android called AsyncTask.
AsyncTask easy us to doing background task coding by put all the background code in doInBackground method. On the code above, HttpRequest method is the internet task and you will find it I put it on doInBackground method. It means the all the task in HttpRequest will be carried out in background thread.
onPostExecute method is a callback method for background thread. After HttpRequest getting the messages, it needs to show it on UI. Here's where onPostExecute comes, the message returned by HttpRequest method is assign to onPostExecute 1st parameter "result". TextView set text of 1st parameter result.
@Override protected String doInBackground(Void... params) { // doing all networking thread here // // 1st parameter of HttpRequest is the url to server. Replace the url to your own return HttpRequest("http://path_to_server/"); } @Override protected void onPostExecute(String result){ // 1st parameter result is the result returned by HttpRequest which doInBackground if(result == null){ mTextView.setText("Failed to connecting to server"); }else{ mTextView.setText(result); } } // Doing all Networking task, if failed to get message from server, it will return null // public String HttpRequest(String url){ DefaultHttpClient client = new DefaultHttpClient(); HttpResponse response = null; try{ HttpGet httpGet = new HttpGet(url); response = client.execute(httpGet); return EntityUtils.toString(response.getEntity()); }catch(ClientProtocolException e){ Log.e(TAG,"ClientProtocolException : "+e); }catch(IOException e){ Log.e(TAG,"IOException : "+e); } return null; }
After coding AsyncTask method, you needs to execute it by
new ConnectToServer().execute();
Be caution here, AsyncTask is easy but it can only be executed one time in single Activity.
It means if you execute AsnycTask for twice, exception will be thrown and you will get errors.
Luckily, Android have prepared another method called ExecutorService. It allows multiple network task can be executed in single activity.
Check it out with my next post, if you are interesting with it.
End
Thank you for reading and hope my blog will help you.
2014年1月19日日曜日
Getting started with Developing Bluetooth 4.0 LE and Android with BLE112 Bluetooth module
I have migrate to new blog. Click the link below to redirect.
http://edisonthk.wordpress.com/2014/01/18/getting-started-with-developing-bluetooth-4-0-le-and-android-with-ble112-bluetooth-module/
http://edisonthk.wordpress.com/2014/01/18/getting-started-with-developing-bluetooth-4-0-le-and-android-with-ble112-bluetooth-module/
登録:
投稿 (Atom)