2022/11/17

antenna geometry . xWR6843AOP

SDK 和 example/labs 中,有用來描述 TX/RX 相對位置的資料。
xWR6843AOP 的 TX/RX 排列是
    R4R2
    R3R1
T1  

T3  T2
一格是1/2波長。
所以在sdk : antenna_geometry.c 中...
以tx, rx左上角為0.0。右,下為正。單位是 1/2 波長...
ANTDEF_AntGeometry gAntDef_IWR6843AOP = {
     .txAnt = {
                {0, 0},
                {2, 2},
                {0, 2}
       },
     .rxAnt = {
                {1, 1},
                {1, 0},
                {0, 1},
                {0, 0}
              }
};
而在 labs source 中,用 antGeometry0.1 來描述 tx,rx 的排列。
但是是用 virtial antenna 的方式..
因為 T1.T2.T3的排列方式。RX 可以視為:
R04 R02
R03 R01
R12 R10 R08 R06
R11 R09 R07 R05
定義:
  • antGeometry0: azimuth offset of all available virtual antennas
  • antGeimetry1: elevation offset of all available virtual antennas
然後以左上為原點,左上為正
antGeometry0 -1 -1  0 0 -3 -3 -2 -2 -1 -1  0  0
antGeometry1 -1  0 -1 0 -3 -2 -3 -2 -3 -2 -3 -2
:::

2022/11/14

bookmark : progress , check cp. progress

作者說明怎嘛做:
It simply scans /proc for interesting commands, 
and then looks at directories fd and fdinfo to find opened files and seek positions, and reports status for the largest file.

It's very light, and compatible with virtually any command.
apt install 就有了...

2022/11/10

Code Composer 12.1.0 in Linux, build project.

CCS 安裝就 download linux 版 tar.gz,解開後 執行 *.run 這個 script。
就會安裝。

裝完,點 icon 啟動,到 reosurce explorer。
到 automotive toolbox 右邊 ':', Install
會裝 SDK..
之後會重開。
然後就可以選需要的 example project 的 import to IDE.

build IDE 的化,會 fail,因為一堆 sdk/packages/scripts/ImageCreator/ 下的 tool 都是用 exe 呼叫。
到 project -- properties --- build -- steps -- post-build-step 去看,都是用 exe。
然後到 ImageCreator 去看,除了 out2rprc 只有 exe 之外,其他都有兩個檔,一個沒有 .ext 是給 linux 用。有 exe 給 windows 用。
out2rprc 用 file 看是 .NET,所以依照說明 apt install mono-runtime 之後,就可以 run 了。
所以修改剛剛 post-build-step 的每個,除了 out2rprc.exe 之外,其他的 .exe 附檔名都刪掉。
這樣就 build OK 了。

mmwave sdk , algorithm 與 主程式的關聯

mmwave sdk 的 example (labs sample) 的 source code,trace 主程式不太容易看到 對 chirp/frame 處理的code。
里如怎麼決定 algorithm, 哪裡會去執行 fft, aoa , cfar 的 code..

trace overhead_mount_occupy 這個 example 中,object detection hardware 的 code,找到 DPC_ObjectDetection_execute 這個 function。
就是做 處理的地方,然後它被放在DPM_ProcChainCfg 這個 structure 里。

從這個 structure 來找...應該是 interface 吧...
sdk/packages/ti/control/dpm/dpm.h
typedef struct DPM_ProcChainCfg_t
{
    DPM_ProcChainInitFxn                      initFxn;
    DPM_ProcChainStartFxn                     startFxn;
    DPM_ProcChainExecuteFxn                   executeFxn;
    DPM_ProcChainIoctlFxn                     ioctlFxn;
    DPM_ProcChainStopFxn                      stopFxn;
    DPM_ProcChainDeinitFxn                    deinitFxn;
    DPM_ProcChainInjectDataFxn                injectDataFxn;
    DPM_ProcChainChirpAvailableCallbackFxn    chirpAvailableFxn;
    DPM_ProcChainFrameStartCallbackFxn        frameStartFxn;
}DPM_ProcChainCfg;
這個 interface 是給誰用的?
從 member executeFxn 來找找看,他是被 DPM_execute( ) 呼叫:
int32_t DPM_execute (DPM_Handle handle, DPM_Buffer* ptrResult)
    ...
    ptrDPM = (DPM_MCB*)handle;
    ...
    retVal = ptrDPM->procChainCfg.executeFxn (ptrDPM->dpcHandle, ptrResult);
所以呼叫 DPM_execute 時,準備好的參數: handle. 就包含了將要 run 的 function (algorithm)


拿 overhead_mount_occupancy 的 mss 來看。這個 structure 在哪裡宣告。

在 project source 的 src/common/dpc/objdetrangehwa/src/objdetrangehwa.c 中,先把這個 functiontable(interface): gDPC_ObjDetRangeHWACfg 的內容 implement好,把表填好
DPM_ProcChainCfg gDPC_ObjDetRangeHWACfg =
{
    DPC_ObjectDetection_init,            /* Initialization Function:         */
    DPC_ObjectDetection_start,           /* Start Function:                  */
    DPC_ObjectDetection_execute,         /* Execute Function:                */
    DPC_ObjectDetection_ioctl,           /* Configuration Function:          */
    DPC_ObjectDetection_stop,            /* Stop Function:                   */
    DPC_ObjectDetection_deinit,          /* Deinitialization Function:       */
    NULL,                                /* Inject Data Function:            */
    NULL,                                /* Chirp Available Function:        */
    DPC_ObjectDetection_frameStart       /* Frame Start Function:            */
};
在 mss_main.c 的 initTask( ) 時,放在要給 DPM 的 parameter, handle structure 中,
然後呼叫 DPM_init( ) 初始化,並且把這個 structure 放到 objDetDpmHandle 中:
    dpmInitCfg.ptrProcChainCfg  = &gDPC_ObjDetRangeHWACfg;
    ...
    gMmwMssMCB.objDetDpmHandle = DPM_init (&dpmInitCfg, &errCode);
然後在後來 create 的 Task : mssDPMTask( ) 中,呼叫 DPM_execute 時,傳入這個structure 做 parameter.
static void mmwDemo_mssDPMTask(UArg arg0, UArg arg1)
{
    ...
    while (1)
    {
       ...
       errCode = DPM_execute (gMmwMssMCB.objDetDpmHandle, &result);

2022/11/8

bookmark : bartlett vs Capon beamforming,

Bartlett Beamformer and MVDR Beamformer in the Browser

用 javascript 做出兩個 algorithm,然後讓你調整參數看二者的不同。
可以看出 Capon 容許較大 noise (調整 SNR 來看),有比較大的鑑別度。

有關這兩個 beamforming 的方法,這一篇 : "Beamforming algorithms - beamformers" -- Norsonic tech notes, by Jørgen Grythe, Norsonic AS, Oslo, Norway 有白話的說明。

2022/11/2

SonarQube , install and test

用 Docker 安裝。
官方是用 docker-compose.: example-compose-files

要run 的主機,要先把 file limit 相關增加
sudo sysctl -w vm.max_map_count=262144
sudo sysctl -w fs.file-max=65536
ulimit -n 65536
ulimit -u 4096
這樣做,reboot 後又要重新設定,可以修改 /etc/sysctl.conf 和 /etc/security/limits.conf

然後就可以在 docker-compose.yml 目錄下: docker-compose up -d
之後一些message 結束後,可以用 docker ps 看是不是有兩個 container 在 run:
$ docker ps
CONTAINER ID   IMAGE                 COMMAND                  CREATED          STATUS          PORTS                                       NAMES
39b76878cb7f   sonarqube:community   "/opt/sonarqube/bin/…"   39 minutes ago   Up 39 minutes   0.0.0.0:9000->9000/tcp, :::9000->9000/tcp   compose-sonarqube-1
bd6b6e8ef34b   postgres              "docker-entrypoint.s…"   39 minutes ago   Up 39 minutes   0.0.0.0:5432->5432/tcp, :::5432->5432/tcp   compose-db-1
如果有沒起來的,用 docker ps -a 看,然後用 docker start container-id -a 看啟動 log,找找看 Error message。
啟動完成,開啟 browser,到 http://host-name:9000 就會顯示 login 畫面,default 是 admin, admin,登入完成會立刻要求修改 passowrd (+123)

follow instruction,先 create 一個 new project,用 local,然後就會產生一個 key。之後就會指示要你download 一個 zip,做 scan 用。
依照你要 run scan 的平台(windows, linux, mac), download 不一樣的 zip 檔。

zip 解開後,在 sonar-scanner-4.7.0.2747-linux/bin/ 下就是 sonar-scanner 執行檔。
在 ~/bin/ 下建一個link,讓自己可以 invoke 到。
如果要給所有人都可以 run, 就要 copy 到 /usr/opt/ ,然後建 link 到 /bin/

回到 server,gen 完 token 後,第二步要你download zip,後面就是 sonar-scanner 的 example command。
用 sonarqube 的 example 來測試:
https://github.com/SonarSource/sonar-scanning-examples.git
cd sonar-scanning-examples/sonarqube-scanner
copy剛剛step 2 的 command 來 run
sonar-scanner   -Dsonar.projectKey=test1   -Dsonar.sources=.   -Dsonar.host.url=http://i9rtx3090:9000   -Dsonar.login=sqp_87a27fdf903c31857f1349b47bee1aa31706e427
執行完,server 網頁就變了...
把節結果顯示出來..

可以看看 example 中的 sonar-project.properties 和剛剛 command 的 -D overwrite 裡面的定義。


麻煩的是,如果要 scan c++,sonar 須要知道code是怎麼 build 的,所以跟 build system 有關 (bazel, msbuild.. etc)
需要另一個tool: build-wrapper
然後 server 好像要是 developer editiion 以上,community edition 不支援的樣子..

這一篇 有說,好像有 opensource implement C++ extension