2010年7月30日 星期五

C/C++, Windows CE registry 與 CreateFile

利用 CReg 宣告物件進而讀出registry中的Key值。
例如要讀出某一個String:

CReg regDaemon;

regDaemon.OpenOrCreateRegKey(HKEY_LOCAL_MACHINE, RK_TEST_KEY);

WCHAR * wchRegKeyString = (WCHAR * ) regDaemon(HKEY_LOCAL_MACHINE, RK_BASE_TEST, 0);

然而當你要用這個方法讀出存在Key中的String,然後放進 CreateFile 中去進行檔案的操作時。
CreateFile會一直說路徑錯誤。

例如:

HANDLE hFile = CreateFile(wchRegKeyString ,
GENERIC_READ,
0,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
NULL);

原因不明,但是有方法可以解決(找了好久才發現一定需要這樣子做)。因為reg key 傳回的只有一個字元陣列的指標。那就是必須在function中額外宣告一個字元陣列來暫存這些字元。因此你必須利用memcpy或是wcscpy_s先將字元拷貝到暫存的陣列:

WCHAR wStringBuffer[128] = {0};
wcscpy_s(wStringBuffer,sizeof(wStringBuffer)/sizeof(WCHAR),wchRegKeyString );

HANDLE hFile = CreateFile(wStringBuffer,
GENERIC_READ,
0,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
NULL);

真的是很機車的M$,很不乾脆的一個作法。害我浪費了許多時間try and error。(這才是這篇網誌的主要目的,上來幹橋一下M$)。

2010年6月7日 星期一

GPS : NEMA Format

GPS NMEA數據格式

關鍵字: gps nmea 數據格式
nmea數據如下:
$GPGGA,121252.000,3937.3032,N,11611.6046,E,1,05,2.0,45.9,M,-5.7,M,,0000*77
$GPRMC,121252.000,A,3958.3032,N,11629.6046,E,15.15,359.95,070306,,,A*54
$GPVTG,359.95,T,,M,15.15,N,28.0,K,A*04
$GPGGA,121253.000,3937.3090,N,11611.6057,E,1,06,1.2,44.6,M,-5.7,M,,0000*72
$GPGSA,A,3,14,15,05,22,18,26,,,,,,,2.1,1.2,1.7*3D
$GPGSV,3,1,10,18,84,067,23,09,67,067,27,22,49,312,28,15,47,231,30*70
$GPGSV,3,2,10,21,32,199,23,14,25,272,24,05,21,140,32,26,14,070,20*7E
$GPGSV,3,3,10,29,07,074,,30,07,163,28*7D

說明:NMEA0183格式以“$”開始,主要語句有GPGGA,GPVTG,GPRMC等

1、 GPS DOP and Active Satellites(GSA)當前衛星信息

$GPGSA,<1>,<2>,<3>,<3>,,,,,<3>,<3>,<3>,<4>,<5>,<6>,<7>

<1>模式 :M = 手動, A = 自動。
<2>定位型式 1 = 未定位, 2 = 二維定位, 3 = 三維定位。
<3>PRN 數字:01 至 32 表天空使用中的衛星編號,最多可接收12顆衛星信息。
<4> PDOP位置精度因子(0.5~99.9)
<5> HDOP水平精度因子(0.5~99.9)
<6> VDOP垂直精度因子(0.5~99.9)
<7> Checksum.(檢查位).


2、 GPS Satellites in View(GSV)可見衛星信息
$GPGSV, <1>,<2>,<3>,<4>,<5>,<6>,<7>,?<4>,<5>,<6>,<7>,<8>

<1> GSV語句的總數
<2> 本句GSV的編號
<3> 可見衛星的總數,00 至 12。
<4> 衛星編號, 01 至 32。
<5>衛星仰角, 00 至 90 度。
<6>衛星方位角, 000 至 359 度。實際值。
<7>訊號噪聲比(C/No), 00 至 99 dB;無表未接收到訊號。
<8>Checksum.(檢查位).

第<4>,<5>,<6>,<7>項個別衛星會重複出現,每行最多有四顆衛星。其餘衛星信息會於次一行出現,若未使用,這些字段會空白。

3、Global Positioning System Fix Data(GGA)GPS定位信息

$GPGGA,<1>,<2>,<3>,<4>,<5>,<6>,<7>,<8>,<9>,M,<10>,M,<11>,<12>*hh

<1> UTC時間,hhmmss(時分秒)格式
<2> 緯度ddmm.mmmm(度分)格式(前面的0也將被傳輸)
<3> 緯度半球N(北半球)或S(南半球)
<4> 經度dddmm.mmmm(度分)格式(前面的0也將被傳輸)
<5> 經度半球E(東經)或W(西經)
<6> GPS狀態:0=未定位,1=非差分定位,2=差分定位,6=正在估算
<7> 正在使用解算位置的衛星數量(00~12)(前面的0也將被傳輸)
<8> HDOP水平精度因子(0.5~99.9)
<9> 海拔高度(-9999.9~99999.9)
<10> 地球橢球面相對大地水準面的高度
<11> 差分時間(從最近一次接收到差分信號開始的秒數,如果不是差分定位將為空)
<12> 差分站ID號0000~1023(前面的0也將被傳輸,如果不是差分定位將為空)


4、Recommended Minimum Specific GPS/TRANSIT Data(RMC)推薦定位信息

$GPRMC,<1>,<2>,<3>,<4>,<5>,<6>,<7>,<8>,<9>,<10>,<11>,<12>*hh

<1> UTC時間,hhmmss(時分秒)格式
<2> 定位狀態,A=有效定位,V=無效定位
<3> 緯度ddmm.mmmm(度分)格式(前面的0也將被傳輸)
<4> 緯度半球N(北半球)或S(南半球)
<5> 經度dddmm.mmmm(度分)格式(前面的0也將被傳輸)
<6> 經度半球E(東經)或W(西經)
<7> 地面速率(000.0~999.9節,前面的0也將被傳輸)
<8> 地面航向(000.0~359.9度,以真北為參考基準,前面的0也將被傳輸)
<9> UTC日期,ddmmyy(日月年)格式
<10> 磁偏角(000.0~180.0度,前面的0也將被傳輸)
<11> 磁偏角方向,E(東)或W(西)
<12> 模式指示(僅NMEA0183 3.00版本輸出,A=自主定位,D=差分,E=估算,N=數據無效)

5、 Track Made Good and Ground Speed(VTG)地面速度信息
$GPVTG,<1>,T,<2>,M,<3>,N,<4>,K,<5>*hh
<1> 以真北為參考基準的地面航向(000~359度,前面的0也將被傳輸)
<2> 以磁北為參考基準的地面航向(000~359度,前面的0也將被傳輸)
<3> 地面速率(000.0~999.9節,前面的0也將被傳輸)
<4> 地面速率(0000.0~1851.8公里/小時,前面的0也將被傳輸)
<5> 模式指示(僅NMEA0183 3.00版本輸出,A=自主定位,D=差分,E=估算,N=數據無效)

2010年5月28日 星期五

C/C++ : static 的意義

1.用作變數:
1-1:放在函數內

Ex:

void MyFun()
{
static int i=0;
}

說明:"i"為"static,i"的生命週期會到程式結束,但是他的scope 還是在MyFun()中,每次呼叫MyFun(),函數中"i"的值會保留上次呼叫最後一次設定的值。

1-2:放在函數外

Ex:檔案 abc.c 中寫了如下

static int s_i=0;

int myfun()

{}

說明:此時"s_i"只能在檔案"abc.c"中使用,他可以讓"abc.c"中所有的"function"看到,他的生命週期也是到程式結束,但是別的.c 檔是無法使用到"abc.c"檔中的"s_i"。

2.在function 前面加上"static"

Ex:檔案 123.c 中寫了如下

static void MyFun()
{return;}

說明:此時"MyFun()"只能給這個123.c 這個檔案中的其他function 呼叫。
(簡單的說,就是"MyFun()"這個function不會被linker 參考到)

資料來源:http://flykof.pixnet.net/blog/post/23583952

2010年5月24日 星期一

在 Windows 7 上執行Platform builder 5.0

create 一個批次檔(x.bat)。
內容:

@ehco
start cepb.exe
exit
@ehco

並放到\Windows CE Platform Builder\5.00\CEPB\BIN\ 下,以管理員身份運行這個bat即可。

資料來源:http://blog.csdn.net/AAa_tnT/archive/2010/01/23/5249062.aspx

2010年4月16日 星期五

轉-如何去寫Android init.rc (Android init language)

參考來源:http://embeddeder.spaces.live.com/blog/cns!8006E36532087D51!160.entry

如何去寫Android init.rc (Android init language)
Android初始化語言由四大類聲明組成:行為類(Actions),命令類(Commands),服務類(Services),選項類(Options).

* 初始化語言以行為單位,由以空格間隔的語言符號組成。C風格的反斜槓轉義符可以用來插入空白到語言符號。雙引號也可以用來防止文本被空格分成多個語言符號。當飯斜槓在行末時,作為折行符。

* 以#開始(前面允許有空格)的行為註釋行。

* Actions和Services隱含聲明一個新的段落。所有該段落下Commands或Options的聲明屬於該段落。第一段落前的Commands或Options被忽略。

* Actions和Services擁有獨一無二的命名。在它們之後聲明相同命名的類將被當作錯誤並忽略。

Actions

-------

Actions是一系列命令的命名。Actions擁有一個觸發器(trigger)用來決定action何時執行。當一個action在符合觸發條件被執行時,如果它還沒被加入到待執行隊列中的話,則加入到隊列最後。

隊列中的action依次執行,action中的命令也依次執行。Init在執行命令的中間處理其他活動(設備創建/銷毀,property設置,進程重啟)。

Actions表現形式為:

on





Services

--------

Services是由init啟動,在它們退出時重啟(可選)。Service表現形式為:

service [ ]*



...


Options

-------

Options是Services的修飾,它們影響init何時、如何運行service.


critical

這是一個設備關鍵服務(device-critical service) .如果它在4分鐘內退出超過4次,設備將重啟並進入恢復模式。


disabled

這個服務的級別將不會自動啟動,它必須被依照服務名指定啟動才可以啟動。


setenv

設置已啟動的進程的環境變量的值


socket [ [ ] ]

創建一個名為/dev/socket/的unix domin socket,並傳送它的fd到已啟動的進程。必須為"dgram"或"stream".用戶和組默認為0.


user

在執行服務前改變用戶名。當前默認為root.如果你的進程需要linux能力,你不能使用這個命令。你必須在還是root時請求能力,並下降到你需要的uid.


group [ ]*

在執行服務前改變組。在第一個組後的組將設為進程附加組(通過setgroups()).當前默認為root.


oneshot

在服務退出後不重啟。


class

為service指定一個類別名。同樣類名的所有的服務可以一起啟動或停止。如果沒有指定類別的服務默認為"default"類。


onrestart

當服務重啟時執行一個命令。


Triggers

--------

Triggers(觸發器)是一個字串,可以用來匹配某種類型的事件並執行一個action。


boot

這是當init開始後執行的第一個觸發器(當/init.conf被加載)


=

當property 被設為指定的值時觸發。


device-added-

device-removed-

當設備節點被添加或移除時觸發。


service-exited-

當指定的服務存在時觸發



Commands

--------


exec [ ]*

Fork並執行一個程序().這將被block直到程序執行完畢。最好避免執行例如內建命令以外的程序,它可能會導致init被阻塞不動。


export

設定全局環境變量的值,當這個命令執行後所有的進程都可以取得。


ifup

使網絡接口連線。


import

解析一個init配置文件,擴展當前配置文件。


hostname

設置主機名


chmod

改變文件訪問權限


chown

改變文件所屬和組


class_start

當指定類別的服務沒有運行,啟動該類別所有的服務。


class_stop

當指定類別的服務正在運行,停止該類別所有的服務。


domainname

設置域名。


insmod

加載該路徑的模塊


mkdir [mode] [owner] [group]

創建一個目錄,可選選項:mod,owner,group.如果沒有指定,目錄以755權限,owner為root,group為root創建.


mount [ ]*

嘗試mount 到目錄. 可以用mtd@name格式以命名指定一個mtd塊設備。包含"ro","rw","remount","noatime".


setkey

暫時沒有


setprop

設置系統property 的值.


setrlimit

設置resource的rlimit.


start

啟動一個沒有運行的服務。


stop

停止一個正在運行的服務。


symlink

創建一個的符號鏈接到


sysclktz

設置系統時區(GMT為0)


trigger

觸發一個事件。用於調用其他action。


write [ ]*

打開的文件並寫入一個或多個字串。



Properties

----------

Init會更新一些系統property以提供查看它正在幹嘛。

init.action

當前正在執行的action,如果沒有則為""


init.command

被執行的命令,如果沒有則為""


init.svc.

命名為的服務的狀態("stopped", "running", "restarting")



init.rc 示例:

-----------------


# not complete -- just providing some examples of usage

#

on boot

export PATH /sbin:/system/sbin:/system/bin

export LD_LIBRARY_PATH /system/lib


mkdir /dev

mkdir /proc

mkdir /sys


mount tmpfs tmpfs /dev

mkdir /dev/pts

mkdir /dev/socket

mount devpts devpts /dev/pts

mount proc proc /proc

mount sysfs sysfs /sys


write /proc/cpu/alignment 4


ifup lo


hostname localhost

domainname localhost


mount yaffs2 mtd@system /system

mount yaffs2 mtd@userdata /data


import /system/etc/init.conf


class_start default


service adbd /sbin/adbd

user adb

group adb


service usbd /system/bin/usbd -r

user usbd

group usbd

socket usbd 666


service zygote /system/bin/app_process -Xzygote /system/bin --zygote

socket zygote 666


service runtime /system/bin/runtime

user system

group system


on device-added-/dev/compass

start akmd


on device-removed-/dev/compass

stop akmd


service akmd /sbin/akmd

disabled

user akmd

group akmd


調試

---------------

默認情況下,init執行的程序輸出的信息和錯誤到/dev/null.為了debug,你可以通過Android程序logwrapper執行你的程序。這將重定向輸出/錯誤輸出到Android logging系統(通過logcat訪問)。

例如

service akmd /system/bin/logwrapper /sbin/akmd

2010年3月24日 星期三

Python - subprocess 的用法

Reference address : http://docs.python.org/library/subprocess.html

import subprocess

p = subprocess.Popen(args, stderr=subprocess.PIPE)

p.communicate() <-加入這個function,可以等前面執行完成之後,才繼續往下走。

2010年3月22日 星期一

WinRats - 參數定義

series

定義:set start end = [function or value]
說明: 1.series name : 這個series的名字
2.start :開始(可省略)
3.end :結束(可省略)
4.function or value: 一開始時候的附值,可以接特定的function或是給予某一個值作為初始化。但是不可以省略
範例:
1. set x = 1
宣告一個series名字為x,大小則根據一開始All的宣告,並且每一個都填入1。
2. set y 1 200 = %NA
宣告一個series名字為y,大小為1~200,並且每一個都填入NA(空值)。

操作:
1.讀取一個名字叫做x的series中第三個值到變數temp:

computer temp = x(3)

2.將x的第四個值填入5

computer x(3) = 1

輸出:
print start end [serise name]
start 與 end可以省略用"/" 代替。series則可以輸入許多個。列印的時候就會依序排列輸出。

解說:
winrats中series是一個最基本也是最好用的變數型態。
這種變數型態相當有趣!一開始宣告,就會直接幫你在記憶體中製造一個類似矩陣又類似向量型態的變數。並且大小可以根據一開始all宣告的大小來附值。這種型態的變數,是winrats主要操作的變數型態。並且series在宣告的同時,就預設為real (類似c語言的浮點數float)。

2010年3月10日 星期三

ubuntu - 英文版開機自動執行ibus

英文版預設輸入法沒有安裝ibus。

當安裝好之後,也沒辦法自動執行。

這時候開啟命令列視窗,輸入:

sudo im-switch -s ibus

就可以開機自動執行ibus。

2010年2月22日 星期一

Python : 常用系統命令

轉貼自:http://idobest.pixnet.net/blog/post/22049589

1.sys模組:

argv: 命令列參數。
exit([arg]): 結束程式。
exitfunc: 若有指定此函式,程式結束前會先呼叫此函式。

2.getopt模組:

getopt(args, options[, long_options]): 解譯命令列參數選項的工具。

3.os模組:

chdir(path): 變更目前工作目錄。
getcwd(): 取得目前工作目錄。
getenv(varname[, defaultValue]): 取得環境變數。
putenv(varname, value): 設定或新增環境變數。
popen(command[, mode[, bufsize] ]): 執行某個命令,並將結果以pipe的方式傳會此程式。
tmpfile(): 傳回一個新的暫存檔案物件,此物件將以"w+b"的mode開啟。
listdir(path): 傳回指定路徑的內容。
remove(path): 刪除指定的檔案。
removedirs(path): 以遞迴的方式刪除指定的路徑。
rename(src, dst): 變更路徑或檔案名稱。
renames(old, new): 遞迴的變更路徑或檔案名稱。
rmdir(path): 非遞迴的方式移除目錄。
stat(path): 傳回指定檔案或路徑的stat結構。
walk(top[, topdown=True [, onerror=None] ]): 產生整個目錄的樹狀結構。
abort(): 對目前的行程產生SIGABRT的訊號。
system(command): 在sub-shell中執行命令。
path.abspath(path): 傳回指定目錄的絕對路徑。
path.join(a, *p): 將兩個或多個路徑名稱結合成一個路徑。並在適當的地方加上目錄分隔字元。
path.exists(path): 檢查檔案或路徑是否存在。
path.basename(path): 傳回路徑的最後一個部分。
path.dirname(path): 傳回檔案名稱中屬於路徑的部分。
path.split(path): 將路徑分割成為各部分。
path.splitdrive(path): 分割出檔案名稱中,關於磁碟機的部分。
path.splitext(path): 分割出檔案名稱中,關於副檔名的部分。
path.splitunc(path): 分割出檔案名稱中屬於UNC的部分。
path.getsize(path): 取得指定檔案的大小。
path.isfile(path): 檢查指定的路徑是否指向一個檔案。
path.isdir(path): 檢查指定的路徑是否為一個目錄。
path.isabs(path): 檢查指定的路徑是否為一個絕對路徑。

4.shutil模組:

copy(src, dst): 拷貝src所指定的檔案到dst所指定的檔案中。
copytree(src, dst[, symlinks]): 遞迴的方式將整個src所指定的目錄樹拷貝到dst所指定的地方。
rmtree(path[, ignore_errors[, onerror] ]): 將整個目錄樹下的所有檔案目錄刪除。
move(src, dst): 將整個檔案或目錄搬移到dst所指定的地方。

5.glob模組:

glob(pathname): 依照類似於shell在使用的檔案符合檢驗的格式來找出某個目錄下的檔案。

6.re模組:

re.compile(pattern[, flags]): 將指定的pattern字串編譯並產生RegExp物件。
regexp.match(string[, pos[, endpos] ]): 若字串與pattern相符,傳回Match物件,否則傳回None。
regexp.search(string[, pos[, endpos] ]): 搜尋字串便找出符合pattern的字串。
regexp.split(string[, maxsplit]): 以pattern作為分割字串,將指定的字串分割成為數個部分。
regexp.sub(repl, string[, count]): 將相符合的字串取得成為另一個字串。
matchObj.group([group1, ...]): 傳回Match物件中的指定群組字串。
matchObj.groups(): 傳回所有的Match物件中的群組。
matchObj.groupdict(): 傳回所有的Match物件中有取名稱的群組。

2010年2月4日 星期四

ubuntu:Acer TravelMate 3260WXMi sound card and wifi (intel 3945abg) seting

自從公司的舊筆電Acer TravelMate 3260 WXMi 升級到 ubuntu 9.10 之後,我的無線網路跟聲音就消失了。後來發現原來是因為我之前把Linux Kernel 改道PAE版本之後,相對映的一些Header沒有安裝。在網路上找了一堆資料都沒有幫助,最後發現連module都沒辦法Load到Kernel。才去檢查相對映的Header。
1.Kernel :

linux-image-2.6.31-17-generic-pae
linux-headers-2.6.31-17-generic-pae

2.Intel 3945abg :
linux-backports-modules-headers-karmic-generic-pae
linux-backports-modules-2.6.31-17-generic-pae
3.Alsa Sound card

linux-backports-modules-alsa-2.6.31-17-generic-pae

安裝這幾個之後,重開機就有可以用wifi也有聲音了。
PS.搞這個搞了一整天,最後成功還真感動。

2010年2月2日 星期二

C/C++ : strdup

1.功能:自動幫指標依照宣告的字元(char)分配記憶體空間(malloc()),並且回傳所分配的位置的指標。可以利用free()進行釋放。
2.原形:extern char * strdup(char*s);
3.範例:


// strdup.c
#include
#include

main()
{
	char *s="Golden Global View";
	char *d;
	clrscr();
	d=strdup(s);
	printf("%s",d);

	getchar();
	return 0;
}