2023/11/20

repo sync --mirror and --reference

repo init 的時候,加上 --mirror,會做出一份 mirror 的 repo 結構。
以前就是把這個做為其他 repo init 的 source。也就是 local mirror。

但是從這個 mirror clone(sync) 的 project,就 push 不回去原來的 repo server 了。
依樣,原來的 repo sever 有新 commit,他因為是跟 local mirror clone,所以也不知道。

這樣,就可以用 --reference

一樣,repo init -u 指向 repo server,最後加上 --reference local mirror

這樣sync(clone)的時候會參考 --reference 的資料,但是也會到 原來的 server 去 update。
sync 完後,.repo 的 size 變小了。

之後,project push 會回到 repo server,pull 也會。
local mirror 維持與 repo server 不同步也沒關係。不用到 local mirror 去 sync

2023/11/17

raspbian lite 新的設定方式

一樣,只是要作為 local wifi nas,所以裝 lite 就可以。
選了 arm64.

先是要啟動 uart login,結果新版 已經移除從 uart contol login pi 了。
說是寫第一次開機就會跳出rasp-config,要你 create 一個 username/password.
但是是在monitor, keyboard 界面。
因為是 headless,所以沒辦法這樣。
說明的第二格方法是用 rpi-imager,新的 tool,GUI界面幫 user download, write SD image。
其中一個新的功能就是customize image,邦你打開 ssh 和設定 username/password.
用這個方法設定,download 燒錄後,再把 boot partition 中的 config.txt 加上 enable_uart=1後,在 uart 可以 login 了。

進入後,再用 ssh 連線, run rasp-config.

啟動 wifi ap 也改用 nmcli 了。
ref: 設置完全用 nmcli 命令來做,他會幫忙寫好 config 檔。
設置的方式就跟 ref 的說明一樣..
sudo nmcli connection add type wifi mode ap con-name nonopiap ifname wlan0 ssid nonopiap ipv4.address 192.168.33.254/24
sudo nmcli connection modify nonopiap 802-11-wireless.band bg
sudo nmcli connection modify nonopiap 802-11-wireless-security.key-mgmt wpa-psk
sudo nmcli connection modify nonopiap 802-11-wireless-security.psk mypassword123
sudo nmcli connection modify nonopiap ipv4.method shared
sudo nmcli connection up nonopiap 
sudo nmcli device wifi show-password


另外firewall 以前用 iptables。現在用 nftables: 看看 servier 有沒有起來:
$ sudo systemctl status nftables.service
然後看看現在的 rules
$ sudo nft list ruleset
table ip nm-shared-wlan0 {
	chain nat_postrouting {
		type nat hook postrouting priority srcnat; policy accept;
		ip saddr 192.168.44.0/24 ip daddr != 192.168.44.0/24 masquerade
	}

	chain filter_forward {
		type filter hook forward priority filter; policy accept;
		ip daddr 192.168.44.0/24 oifname "wlan0" ct state { established, related } accept
		ip saddr 192.168.44.0/24 iifname "wlan0" accept
		iifname "wlan0" oifname "wlan0" accept
		iifname "wlan0" reject
		oifname "wlan0" reject
	}
}
根據這一篇: 用 networkmanager 做 internet connection sharing ,會自動設定 nat.同時啟動dnamasq
文章看起來。share mode 跟 hotspot mode 不一樣。

2023/11/16

Android Programming : Ignore the orientation change

ref: 機器(手機) 改變方向( portait -- landscape) 的時候,application 會經歷:
  • Surface Destroyed
  • Surface created
然後在 created 就要偵測orientation, 好知道現在的方向。

如果只想固定方向,AndroidManifest.xml 的 activity 要加上一個 attribute :
android:screenOrientation="nosensor"
這樣螢幕轉動的時候,這個 activity 就不會收到 ondestory, oncreate 的 callback


如果依照google 自己的說明,在activity 加上
    android:configChanges="orientation|screenSize|screenLayout|keyboardHidden"
結果application 是不會重新 destroy, creatre view 沒錯,但是application 還是會旋轉。
是系統幫你轉的(?)
因為這樣,如果是 camera 的應用,可以看到顯示的camera 內容剛好跟螢幕旋轉方向相反。

2023/11/8

Android : start Activity from another package

就是要叫起另一個 package 中的activity.

Example:
裡面就是兩個 application: Target Application, Launch Target.
Launch Target 這個 app 會把 Target Application 叫起來。

clone 下來,分別用Android Studio 開啟兩個project,都 build OK,and install 後,
啟動 Launch Target,去按中間的 "Launch Target" 字樣,就會啟動 Target Application.

原來有人說用 getLaunchIntentForPackage( ) 取得 launchIntent,結果我都return null
所以有人說 android 11 後,要加上 query tag 的 applicatin 才能被取到。

所以最後只有這種方法可以用:
      Intent launchIntent = new Intent(Intent.ACTION_MAIN);
      launchIntent.setComponent(new ComponentName("com.example.targetapplication","com.example.targetapplication.MainActivity"));
      startActivity(launchIntent);

bookmark: lazarus . GPLed Delphi

就是以前很有名的 RAD: Delphi 的 opensource 版本。

Windows 11 也可以用。
UI 就跟以前的 delphi 依樣,會有 Form, Unit,然後寫 pascal,build 成exe 檔,也可以直接 run.
應該是目前 最方便的 Windows UI 開發環境。

USB type-c. alternat mode. and VDM

USB Type C, 新的協定有很多功能:
  • 角色(host, device)轉換
  • 充電能力(PD)
  • alt mode : DP, hdmit
  • audio
這些功能都是透過 CC pin 來完成。
CC1.2 除了以往用 High, Low, R-GND 來辨識對方之外,新增了通訊功能,用 BMC 編碼。:


透過CC溝通VDM,讓USB進入不同模式。


以 DP Alternat Mode 為例。
經過 VDM 的溝通,進入 dp alter mode後,usb 的某些 pin,就會連接到 DP 的信號:


之後,就可以像一般DP連接依樣的動作了。
-- 可以看到,CC 的溝通會轉成 HPD(Hotplug detection) 給 Monitor.

ref:


一般 type-C to DP 的線,應該就是內含這類 IC 的線。
這個 ST 的chip,說明如何藉由 VDM 進入 display alternate mode.

linux kernel 根據這個 patch,在drivers/usb/typec/altmodes/displayport.c。
kernel config option 是: CONFIG_TYPEC_DP_ALTMODE

2023/11/2

Try opencv android sdk and snpe...

照著做做看,是不是做得出來 需要:
  • android studio , ndk 17.2 cmake 18
  • opencv for android sdk 4.5.4 : unzip 到下面 cmakelist.txt 中的 path
  • snpe 1.68 : unzip 到下面 cmakelist.txt 中的 path
用 android studio import clone 下來的 folder.
等android studio import 完成,所有 project component 都顯示了。
選 Project Files. 然後下面的 Object-Detection-with..... ,選 app - main - cpp 就會看到有 CMakeList.txt。
修改這個 CMakeList.txt 中的 opencv 和 snpe 的目錄:
diff --git a/app/src/main/cpp/CMakeLists.txt b/app/src/main/cpp/CMakeLists.txt
index 8aa71f5..3e041ce 100644
--- a/app/src/main/cpp/CMakeLists.txt
+++ b/app/src/main/cpp/CMakeLists.txt
@@ -10,7 +10,7 @@ cmake_minimum_required(VERSION 3.4.1)
 project("objectrecognition")
 
 set(OpenCV_STATIC on)
-set(OpenCV_DIR "/<OPENCV_PATH>/opencv-4.5.4-android-sdk/OpenCV-android-sdk/sdk/native/jni")
+set(OpenCV_DIR "/home/charles-chang/OpenCV-android-sdk/sdk/native/jni")
 find_package(OpenCV REQUIRED)
 
 set(CMAKE_VERBOSE_MAKEFILE on)
@@ -18,7 +18,7 @@ set(CMAKE_VERBOSE_MAKEFILE on)
 # build native_app_glue as a static lib
 include_directories(${ANDROID_NDK}/sources/android/native_app_glue ${COMMON_SOURCE_DIR})
 
-include_directories(/<SNPE_PATH>/snpe-1.68.0.3932/include/zdl)
+include_directories(/home/charles-chang/snpe-1.68.0.3932/include/zdl)
 add_library(app_glue STATIC
         ${ANDROID_NDK}/sources/android/native_app_glue/android_native_app_glue.c)
然後選回 android, 選 build apk,會說 Native_C 有錯,就改:
diff --git a/app/src/main/cpp/Native_C.h b/app/src/main/cpp/Native_C.h
index 56c5024..458a822 100644
--- a/app/src/main/cpp/Native_C.h
+++ b/app/src/main/cpp/Native_C.h
@@ -40,8 +40,8 @@ class Native_C {
 
   bool CreateCaptureSession(ANativeWindow* window);
 
-  int32_t GetCameraCount() { return m_camera_id_list->numCameras; }
-  uint32_t GetOrientation() { return m_camera_orientation; };
+  int32_t GetCameraCount() { return camera_id_list->numCameras; }
+  uint32_t GetOrientation() { return camera_orientation; };
 
  private:
這樣就能 build apk OK.

然後再 build apk boundle.
出現manifest 沒有 version 的錯。
修改... 亂寫一個版本
diff --git a/app/build.gradle b/app/build.gradle
index 3bc0773..7daba68 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -10,6 +10,8 @@ android {
         applicationId 'com.object.recognition'
         minSdkVersion 24
         targetSdkVersion 29
+        versionName '1.0.2'
+        versionCode 3
 
         ndk {
             abiFilters 'armeabi-v7a'//, 'arm64-v8a', 'x86', 'x86_64'
build Boundle OK

run 起來後,windows 一直打不開。因為下面這行被 optimize 調,所以要改:
diff --git a/app/src/main/cpp/main.cpp b/app/src/main/cpp/main.cpp
index 88c8e52..785636d 100644
--- a/app/src/main/cpp/main.cpp
+++ b/app/src/main/cpp/main.cpp
@@ -156,17 +156,17 @@ void main::OnCreate() {
 void main::OnPause() {}
 void main::OnDestroy() {}
 
-void main::SetNativeWindow(ANativeWindow* native_window) {
+void main::SetNativeWindow(ANativeWindow* anative_window) {
     // Save native window
-    native_window = native_window;
+    native_window = anative_window;
 }
 
 void main::SetUpCamera() {
 
     native_camera = new Native_C(selected_camera_type);
     native_camera->MatchCaptureSizeRequest(&m_view,
-                                             ANativeWindow_getWidth(native_window),
-                                             ANativeWindow_getHeight(native_window));
+                                             720/*ANativeWindow_getWidth(native_window)*/,
+                                             1080/*ANativeWindow_getHeight(native_window)*/);
 
     LOGI("______________mview %d\t %d\n", m_view.width, m_view.height);
之後還有 camera aspect ratio 問題,找不到可用的camera 設定。所以固定.

要 adb root, remount,follow instruction push snpe so 和 dlc file,
是 push 整個 folder,所以要 follow 說明,不要擅自用 *




同公司的令一個project 也一樣。 一樣修改 CMakeList.txt 的 opencv 和 snpe 的 path,build.grandle 加上 version.
然後就是 commit code 的 dlc , class.txt 是從 sdcard 上讀取,要概回原來的。
另外這個dlc 和 class.txt 是在 assets folder,還有 push 的 folder 是 models 不是上一個 Object Detection 的 mode..
然後把存檔功能刪掉。
diff --git a/app/build.gradle b/app/build.gradle
index 11378c8..6b306d9 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -21,6 +21,8 @@ android {
         applicationId 'com.homesight.personrecognition'
         minSdkVersion 24
         targetSdkVersion 29
+        versionName '1.0.2'
+        versionCode 3
 
         ndk {
             abiFilters 'armeabi-v7a'//, 'arm64-v8a', 'x86', 'x86_64'
diff --git a/app/src/main/cpp/CMakeLists.txt b/app/src/main/cpp/CMakeLists.txt
index 12c12fc..c30cae2 100644
--- a/app/src/main/cpp/CMakeLists.txt
+++ b/app/src/main/cpp/CMakeLists.txt
@@ -10,7 +10,7 @@ cmake_minimum_required(VERSION 3.4.1)
 project("persondetection")
 
 set(OpenCV_STATIC on)
-set(OpenCV_DIR "/home/krishnapriya/Desktop/Office_work/opencv-4.7.0-android-sdk/OpenCV-android-sdk/sdk/native/jni")
+set(OpenCV_DIR "/home/charles-chang/opencv-4.7.0-android-sdk/sdk/native/jni")
 find_package(OpenCV REQUIRED)
 
 set(CMAKE_VERBOSE_MAKEFILE on)
@@ -18,7 +18,7 @@ set(CMAKE_VERBOSE_MAKEFILE on)
 # build native_app_glue as a static lib
 include_directories(${ANDROID_NDK}/sources/android/native_app_glue ${COMMON_SOURCE_DIR})
 
-include_directories(/home/krishnapriya/Desktop/Office_work/SNPE/snpe-1.51.0.2663/include/zdl)
+include_directories(/home/charles-chang/snpe-1.51.0.2663/include/zdl)
 #set(SNPE_LIB_DIR "/home/krishnapriya/Desktop/Office_work/SNPE/snpe-1.51.0.2663/lib/aarch64-android-clang6.0")
 #set(DSP_LIB_DIR "/home/krishnapriya/Desktop/Office_work/SNPE/snpe-1.51.0.2663//lib/dsp")
 add_library(app_glue STATIC
diff --git a/app/src/main/cpp/Native_Camera.cpp b/app/src/main/cpp/Native_Camera.cpp
index e601b88..d12dab4 100644
--- a/app/src/main/cpp/Native_Camera.cpp
+++ b/app/src/main/cpp/Native_Camera.cpp
@@ -157,4 +157,4 @@ bool Native_Camera::CreateCaptureSession(ANativeWindow* window) {
                                             &m_capture_request, nullptr);
 
   return true;
-}
\ No newline at end of file
+}
diff --git a/app/src/main/cpp/Person_Detect.cpp b/app/src/main/cpp/Person_Detect.cpp
index acf1158..9983989 100644
--- a/app/src/main/cpp/Person_Detect.cpp
+++ b/app/src/main/cpp/Person_Detect.cpp
@@ -1,4 +1,4 @@
-3#include "Person_Detect.h"
+#include "Person_Detect.h"
 #include <unistd.h>
 #include <cmath>
 #include <opencv2/core/core.hpp>
@@ -55,8 +55,8 @@ void Person_Detect::SetUpCamera() {
 
     m_native_camera = new Native_Camera(m_selected_camera_type);
     m_native_camera->MatchCaptureSizeRequest(&m_view,
-                                             ANativeWindow_getWidth(m_native_window),
-                                             ANativeWindow_getHeight(m_native_window));
+                                             720/*ANativeWindow_getWidth(m_native_window)*/,
+                                             480/*ANativeWindow_getHeight(m_native_window)*/);
 
     LOGI("______________mview %d\t %d\n", m_view.width, m_view.height);
     LOGI("______________mview %d\t %d\n", ANativeWindow_getWidth(m_native_window),ANativeWindow_getHeight(m_native_window));
@@ -71,8 +71,8 @@ void Person_Detect::SetUpCamera() {
     m_camera_ready = m_native_camera->CreateCaptureSession(image_reader_window);
 }
 
-//std::string class_name_path = "/storage/emulated/0/appData/models/classes.txt";
-std::string class_name_path = "/sdcard/Documents/classes.txt";
+std::string class_name_path = "/storage/emulated/0/appData/models/classes.txt";
+//std::string class_name_path = "/sdcard/Documents/classes.txt";
 std::vector<std::string> load_class_list()
 {
     std::vector<std::string> class_list;
@@ -88,7 +88,7 @@ std::vector<std::string> class_list = load_class_list();
 
 void Person_Detect::CameraLoop() {
     bool buffer_printout = false;
-    video_writer.open("/sdcard/Documents/Person_Detect_video.avi", cv::VideoWriter::fourcc('M', 'J', 'P', 'G'), 10.0, cv::Size(640, 480), true);
+    //video_writer.open("/sdcard/Documents/Person_Detect_video.avi", cv::VideoWriter::fourcc('M', 'J', 'P', 'G'), 10.0, cv::Size(640, 480), true);
 
     while (1) {
         if (m_camera_thread_stopped) { break; }
@@ -210,14 +210,14 @@ void Person_Detect::CameraLoop() {
         }
         cv::imwrite("/storage/emulated/0/appData/models/Person_Detect_bgr.jpg",bgr_img);
         cv::resize(img_mat, out_img, cv::Size(640, 480));
-        video_writer.write(out_img);
+        //video_writer.write(out_img);
         cv::imwrite("/storage/emulated/0/appData/models/Person_Detect_image.jpg",out_img);
 
         pred_out.clear();
         ANativeWindow_unlockAndPost(m_native_window);
         ANativeWindow_release(m_native_window);
     }
-    video_writer.release();
+    //video_writer.release();
 
 }
 
diff --git a/app/src/main/cpp/Person_Detect.h b/app/src/main/cpp/Person_Detect.h
index cbc6971..9c194f2 100644
--- a/app/src/main/cpp/Person_Detect.h
+++ b/app/src/main/cpp/Person_Detect.h
@@ -75,8 +75,8 @@ private:
 
     cv::VideoWriter video_writer;
 
-//    std::string model_path = "/storage/emulated/0/appData/models/yolov5_person_latest.dlc";
-    std::string model_path = "/sdcard/Download/Telegram/yolov5_person_latest.dlc";
+    std::string model_path = "/storage/emulated/0/appData/models/yolov5_person_latest.dlc";
+    //std::string model_path = "/sdcard/Download/Telegram/yolov5_person_latest.dlc";
     std::vector<std::string> output_layers {OUTPUT_LAYER_1};
 
     std::map <std::string, std::vector<float>> pred_out;
diff --git a/local.properties b/local.properties
index 06c338c..ae5b6a0 100644
--- a/local.properties
+++ b/local.properties
@@ -4,5 +4,5 @@
 # Location of the SDK. This is only used by Gradle.
 # For customization when using a Version Control System, please read the
 # header note.
-#Thu Aug 17 18:03:24 IST 2023
-sdk.dir=/home/krishnapriya/Android/Sdk
+#Wed Nov 01 16:48:14 CST 2023
+sdk.dir=/home/charles-chang/Android/Sdk