2008年5月30日 星期五

GPS Intermediate Driver

Windows Mobile 5.0引進了GPS Intermediate Driver (GPSID),開發基於GPS的應用程式變得簡單多了。原因是它在開發人員編寫的應用程序和 GPS 設備之間加入了一個中間層,使開發人員不需要通過串口直接存取GPS設備,而是透過GPSID提供的API由GPSID再去存取GPS,這樣一來,編寫出來的GPS應用程式具有設備無關性。另外,GPSID還有兩個好處:1.多個應用程式可以同時一個 GPS設備 2.不需要再去解析NMEA資訊 《以上出自Windows Mobile 6 SDK 中的 GPS 工具

能提供這麼好的API,寫起程式事半功倍阿,沒什麼好說的了,程式碼再簡單不過:
'自行加入參考:Microsoft.WindowsMobile.Samples.Location.dll (一樣在WM5 SDK內)
Imports Microsoft.WindowsMobile.Samples.Location

Dim gps1 As New Gps
Private Sub GPS_OPEN(...) Handles Button1.Click
If (Not gps1.Opened) Then
gps1.Open()
End If
End Sub

Private Sub GPS_CLOSE(...) Handles Button2.Click
If (gps1.Opened) Then
gps1.Close()
End If
End Sub

Private Sub GPS_GET(...) Handles Button3.Click
If (Not gps1.Opened) Then
Label1.Text = "GPS NOT OPEN"
Else
Dim position As GpsPosition = gps1.GetPosition
Label2.Text = "經度:" & position.Longitude.ToString
Label3.Text = "緯度:" & position.Latitude.ToString
End If
End Sub

另外發現一個好東東Fake GPS,它可以模擬出GPS接收訊號的動作,而數據也可以自行定義,這個tool被放在WM6 SDK之中(C:\Program Files\Windows Mobile 6 SDK\Tools\GPS),如此programer就不用跑到戶外去傻傻的等了. 記得要配合GPS Settings把COM Port設定好.

Ref:
在WM6 SDK Sample下有兩支關於GPS的程式
GPSID相關:
Example GPS Intermediate Driver Registry Settings
Topic: GPS sample and Windows Mobile 2005

2008年5月28日 星期三

CameraCaptureDialog

延續上一篇,Windows Mobile 5 SDK提供了CameraCaptureDialog物件讓programer能夠存取device上的camera,算是一大福音啦,不過"拍照"這個動作卻一定要使用者用"手"去觸發,真是個半殘的東東. 真慘,非得用low level的function去實現:
Imports System.Runtime.InteropServices

<DllImport("CoreDll")> _
Public Shared Function FindWindow(ByVal className As String, _
ByVal WindowsName As String) As IntPtr
End Function

<DllImport("CoreDll")> _
Public Shared Function SendMessage(ByVal hWnd As IntPtr, _
ByVal wMsg As Integer, ByVal wParam As Integer, _
ByVal lParam As Integer) As Integer
End Function
* 注意"角括號"
* FindWindow可以用GetForegroundWindow()來取代
* SendMessage跟PostMessage相似,差別在於同步

關於SendMessage()內的做什麼用的可以參考這裡. 不過按下快門...算是那一類的Event?又帶哪些參數? 本來這個訊息是可以透過Remote Spy來獲取的,不過我的Spy卻有個大問題,是每次與device連線後,只能截取到第一則message,所以我一直重複開開關關就為了按下的一瞬間.
最後終結果 - Message:WM_KEYDOWN(0x100), WPARAM:0x0D, LPARAM:0
當然這東西會因不同的PDA而不同啦(我使用的是ASUS P535),你也可以在KEYDOWN_Enent中,WPARAM從0一直試上去...

Implement:利用程式去控制PDA自動拍照
按下button開啟CameraCaptureDialo,再利用timer去送出拍照及關閉的動作.
Imports Microsoft.WindowsMobile.Forms '這個要先安裝WM5 SDK,並且自行加入參考

Public WM_KEYDOWN As Integer = Val("&H100")
Public WM_CLOSE As Integer = Val("&H010")

Private Sub Timer1_Tick(...) Handles Timer1.Tick
Dim hwnd As IntPtr = FindWindow(Nothing, "Asus Camera")
PostMessage(hwnd, WM_KEYDOWN, Val("&H0D"), 0)
Timer1.Enabled = False
End Sub

Private Sub Timer2_Tick(...) Handles Timer2.Tick
Dim hwnd As IntPtr = FindWindow(Nothing, "Asus Camera")
PostMessage(hwnd, WM_CLOSE, 0, 0) '這樣關閉Camera會有問題
Timer2.Enabled = False
End Sub

Private Sub Button1_Click(...) Handles Button1.Click
Timer1.Interval = 5000
Timer1.Enabled = True
Timer2.Interval = 8000
Timer2.Enabled = True

Dim CCD As New CameraCaptureDialog
CCD.Owner = Me
CCD.Title = "MyCamera"
CCD.Mode = CameraCaptureMode.Still
CCD.InitialDirectory = "\My Documents"
CCD.DefaultFileName = "picture.jpg"

Try
CCD.ShowDialog() '這個function會在整個拍照動作完成才結束
Catch ex As Exception
'MsgBox(ex.ToString)
End Try

PictureBox1.Image = New Bitmap(CCD.InitialDirectory & "\" & CCD.DefaultFileName)
End Sub

關於這個問題找到四篇討論串:
1. SendKeys - MSDN Forums
2. How to press ok button to take picture automatically with CameraCaptureDialog?
3. CameraCaptureDialog in VS2005/CF2 - xda-developers
4. How to close Camera app after opening it using CameraCaptureDialog

* 意外發現一個好用的library-OpenNETCF,其針對Windows Mobile or Windows CE所設計,算是用來補足.Net Compact Framework 2.0. 至於有哪些好東東請參閱Table of Content
這個library是要錢的,若想試用可以考慮到對岸的網站找找

Windows Mobile開發相關:
Code Samples for Windows Mobile
Microsoft .NET Compact Framework 開發常見問題解答
AppleSeeker's Tech Blog - 博客园

2008年5月27日 星期二

Program in Windows Mobile 5.0

這學期唯一修的一門課-多媒體嵌入式系統,蠻有趣的,主要是以實做為主.
期末專題要在Mobile Device上開發,跟同學一起想了一個屌屌主題-『全民來抓姦』
『太太,您手中有這利器,還需要怕第三者嗎?』這是設計的動機

認真的畫了兩張架構圖:

這個功能是用來隨時監控另一半的動向,配合Google Map位置無所遁形阿!(前提是PDA要乖乖帶在身上)


這個則是有點像偷拍的功能,從遠端可以控制PDA拍照並傳回.

最大的難題就是如何去控制PDA上的GPS,Camera.而最大的挑戰則是解決無線網路下傳輸可能遇到的問題,如資料重複傳送,傳到一半斷訊.
還好挑到這台ASUS P535 with Windows Mobile 5.0,其有針對GPS與Camera提供API. 找了一些相關資料還未整理...
而Server方面使用ASP.Net+Database,算是老本行了.

ref:
GPS相關
GPS Tracking with Windows Mobile 5.0+
基于Windows Mobile 5.0的GPS应用程序开发

Camera相關
Windows Mobile Developer Center - SHCameraCapture
使用 Windows Mobile 5.0 中的圖片、視頻和照相機
cameracapture PDA等使用wince平台上 频捕获程序,vs2005 Windows CE

2008年5月15日 星期四

Big Trouble

今天解了一個大trouble,是什麼trouble?
近幾個月老是碰到網頁打不開,但bbs,MSN都正常的狀況。
但有時候就還蠻順的...

這種要壞不壞的問題最難解決了
剛開始以為Firefox外掛害的,移除之以後果真變正常,但一陣子又壞了
重裝Firefox,還用了免安裝版->失敗
用IE開有時可以有時不行,用對岸奇怪的軟體看看是不是IE被綁架->沒結果
改IP、關閉防火牆、檢查防毒軟體、重開機...甚至還懷疑網卡壞了QQ
這麼多變因交叉測試之下搞得我都快吐血,網路比別人慢學習也比別人慢阿
長期飽受這種困擾,幾乎是想要重灌電腦了-_-

ping 140.130.175.3 <- 對嘉大系上主機念念不忘
ping ptt.cc <- ok
ping yahoo.com.tw <- 失敗
突如其來的靈感,懷疑是DNS出了問題...
我使用學校用的DNS 163.28.112.1 與 163.28.113.1
把其中一個換成中華電信的 168.95.1.1 就...這樣解決了...
怪哉,莫非DNS壞了?而且還壞的不完全,edu.tw網域的還可以連(為何這麼說,因為ptt.cc是在ntu.edu.tw底下)
結論就是學校跟Hinet的混用啦~

後續:
這個鳥問題還是沒解決,不過今天似乎發現癥結所在...
在cmd下打netstat指令,發現一堆connection的狀態是TIME_WAIT,這些是開了firefox以後才產生的. 關閉firefox, connection的狀態變成CLOSE_WAIT久久不會中斷,這是中毒了嗎?到底要怎麼解決阿?


終於解決了,Avira Antivirus搞得鬼,從註冊版改成free版的就ok了,莫非...

2008年5月12日 星期一

禮拜日晚上做了一個夢。
夢見我跟阿銘一起游泳到綠島去,但第二次出發的時候只剩下我一個人,旅途上浪很大,我感到恐懼孤單,還沒到達目的我就醒了。
為什麼會做這樣夢?我思考了很久...

後來找到一位解夢大師,請他替我開導。他說:
『應該是你對目前的生活感到不滿不順利,希望逃離去另一個環境,所以你想到了畢旅去的綠島,它代表的是一個可以放鬆的地方,至於有我的出現,應該是你希望可以跟朋友出去玩,到一個無拘無束的地方。至於第二次只剩自己一個人,是因為你害怕自己一個人離開,你對前方有什麼東西抱有不確定性,所以雖然你同樣游向綠島,希望到一個可以放鬆自己的環境,你朝這個方向前進,卻對自己沒信心,雖然知道前方的美好,可是卻無法跨越過去。
結論是,你該找個時間放鬆一下了,下次可以考慮在夢裡造一艘船,叫幾個人,當然還要有我,一起搭船過去。』

看出來了嗎?其實解夢大師就是阿銘啦~我覺得說得蠻切合我的處境,有安定人心的效果,很高興他找到第二專長了。

近幾個月一直徘徊在低潮期,在煩惱課業上的ooxx,這些寫出來就是一連串的抱怨啦,我像是喜歡抱怨的人嗎~科科。就往好處想摟,處在逆境中人生才有新的體悟。

撇開這個不說,最近找到新房子了,六月底就可以搬過去,終於不用再睡頂樓了。
離學校很近,生活機能好,週邊設備俱全,房東女兒很正...
後來跟學長聊到這邊的環境,越說跟他住的地方越像,原來我們房間就在斜對面QQ

Google Map

弄了一個地圖專區(在左邊⇐),來記錄在台南的生活點滴,吃過的餐廳,想去踏青的地方...
在Google Map裡除了標示地點,還可以寫一些心得,放幾張代表性的照片,不用打一長篇的敘述,很適合我這種懶人.
Google Map有提供API可以使用,可以拿來動態的標示地點,畫路線,結合自己的資料庫創造出不同的世界. 像是在GMap->我的地圖->推薦小工具,就有一些令人驚艷的好物,像是Panoramio 照片集-把全世界的景點照片都連結到同個地圖裡.之前有人把無名相簿跟地圖結合,讓你認識全台各地的美女.其他還有"全台國道即時影像","微笑台灣319鄉"都讓我感到特別. 有朝一日我去環島,就可以開個地圖把沿途景點通通擺上來啦^^. 主要還是跟大家分享一個寫網誌的方式啦.

Map Channels是一個把GMap包裝起來的網站,提供一個更完整的介面來顯示使用者的圖資.這東西的使用方式很簡單:
1. 到Map Channels加入會員
2. 顯選右上角Create New Map Channel
3. 填寫Data Source(就是GMap的連結),按下Creat就可以得到內嵌的html語法


在這邊提供兩個可以把GMap嵌在blog的方法:
1. 在"版面配置"中新增一個"html widget",然後把上面的語法直接貼進去
2. 利用圖層的觀念+一些javascript,一樣是把語法貼在"html widget",不過顯示的位置可以自己調整
<div id="GMap" style="visibility:hidden; position:absolute; top:10px; left:90px; z-index: 9;">想顯示的東東</div>
<script type="text/javascript">
function click(){
document.getElementById("GMap").style.width = 800;
document.getElementById("GMap").style.height = 500;
document.getElementById("GMap").style.visibility ="visible";}
</script>

不過讀取大量的圖資會造成使用者的負擔,所以就在想javascript有沒有動態讀取的方案-
改變iframe的src屬性:
<iframe id="Iframe_GMap" iframe_gmap="" src="" scrolling="no" ...>
<script type="text/javascript">document.getElementById("Iframe_GMap").setAttribute("src", "http://www.xxx...");</script>

其實我也不太懂javascript的執行先後,為何改變src後就會重新loading?
反正這樣就可以在使用者點選以後再去讀取摟,使用多個map也ok.

ref:
syshen's blog:Google Maps API 簡易使用文件: 寫得蠻清楚的,不過目前用不到
如何在Blogger使用UrMap/Google Maps API之HTML: 提醒一些要注意的地方,像是blogspot會自動換行的問題.

2008年5月3日 星期六

Porting MySQL

同樣的事情對岸也有人做過了,照本宣科.
下載: mysql-5.0.51b.tar.gz

./configure --prefix=/home/showtime/mysql --build=i386-linux --host=arm-linux --with-charset=utf8 --without-debug --without-docs --without-man --without-bench --with-named-curses-libs=/home/showtime/mysql/ncurses-5.6/lib/libncurses.a遇到下列錯誤:
1) checking "return type of sprintf"... configure: error: cannot run test program while cross compiling
2) checking for atomic operations... configure: error: cannot run test program while cross compiling
3) checking for int8... configure: error: cannot run test program while cross compiling
4) checking for restartable system calls... configure: error: cannot run test program while cross compiling
5) checking if conversion of longlong to float works... configure: error: cannot run test program while cross compiling
6) error: Your compiler cannot convert a longlong value to a float!
在網路上搜尋發現這幾個似乎是常碰到的問題,表示此版本的mysql尚未支援corss-compile
看別人的解法是直接略過configure裡面的測試(不知道使用的時候會不crash?)
configure script裡在checking若遇到錯誤就會中斷
於是移除上方這些測試的離開語句{ (exit 1); exit 1; }; (請注意大括號的配對)

參數--with-named-curses-libs是因為錯誤訊息: checking for termcap functions library... configure: error: No curses/termcap library found
請自行下載ncurses,並cross-compile
./configure --host=arm-linux && make

mysql configure通過後, make && make install
將install的東西copy起來準備到target上測試

將lib放到正確的路徑,或使用link達成
開始安裝: ./mysql_install_db --user=root
出現錯誤:
Please configure the 'hostname' command to return a correct
hostname.
If you want to solve this at a later stage, restart this script
with the --force option

執行hostname看看名字是什麼
新增/etc/hosts
127.0.0.1 localhost
127.0.0.1 你的hostname
再安裝一次,成功了.

啟動server: ./mysqld_safe --user=root & (有時後會失敗,但重開機後又正常?)
建立密碼: ./mysqladmin -u root password 'your password' (這一步應該可以省略了)
連接server: ./mysql -u root
成功連接上以後就會出現歡迎訊息
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 1
Server version: 5.0.51b Source distribution

稍微測試一下:
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| test |
+--------------------+
3 rows in set (0.00 sec)
mysql> use mysql;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL ser
ver version for the right syntax to use near 'user mysql' at line 1
(不知道為什麼)
mysql> use test;
Database changed
跑一下mysql tutorial的sample
mysql> CREATE TABLE pet (name VARCHAR(20), owner VARCHAR(20),
-> species VARCHAR(20), sex CHAR(1), birth DATE, death DATE);
mysql> INSERT INTO pet VALUES ('Puffball','Diane','hamster','f','1999-03-30',NULL);
mysql> SELECT * FROM pet;
+----------+-------+---------+------+------------+-------+
| name | owner | species | sex | birth | death |
+----------+-------+---------+------+------------+-------+
| Puffball | Diane | hamster | f | 1999-03-30 | NULL |
+----------+-------+---------+------+------------+-------+
1 row in set (0.00 sec)

大致上都還蠻正常的;)

ref:
MySQL Typical configure Options
mysql數據庫在arm+linux平台上的移植