2023/11/28
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
以前就是把這個做為其他 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 了。
要啟動 uart,還要在boot partition 的 config.txt 加上 enable_uart=1
文件寫第一次開機就會跳出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 的說明一樣..
這樣command 設定玩會在
另外firewall 以前用 iptables。現在用 nftables: 看看 servier 有沒有起來:
文章看起來。share mode 跟 hotspot mode 不一樣。
automount usb disk 的話,參考 街上usb, partition, format 好之後,用 blkid 看 id
選了 arm64.
先是要啟動 uart login,結果新版 已經移除從 uart contol login pi 了。
要啟動 uart,還要在boot partition 的 config.txt 加上 enable_uart=1
文件寫第一次開機就會跳出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
這樣command 設定玩會在
/etc/NetworkManager/system-connections/
另外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 不一樣。
automount usb disk 的話,參考 街上usb, partition, format 好之後,用 blkid 看 id
$ sudo blkid /dev/mmcblk0p1: LABEL_FATBOOT="bootfs" LABEL="bootfs" UUID="91FE-7499" BLOCK_SIZE="512" TYPE="vfat" PARTUUID="3ed9a06c-01" /dev/mmcblk0p2: LABEL="rootfs" UUID="56f80fa2-e005-4cca-86e6-19da1069914d" BLOCK_SIZE="4096" TYPE="ext4" PARTUUID="3ed9a06c-02" /dev/sda1: UUID="35c5f6de-8be0-4522-b313-5c760ac57e95" BLOCK_SIZE="4096" TYPE="ext4" PARTUUID="51c355fa-01"準備好 mount folder (/usbd 之後就可以改 /etc/fstab):
PARTUUID=51c355fa-01 /usbd ext4 defaults,auto,users,rw,nofail 0 0本來依照說明,option 有加 umask=000,結果 mount -a 時,說不認識 umask,只好拿掉。
2023/11/16
Android Programming : Ignore the orientation change
ref:
機器(手機) 改變方向( portait -- landscape) 的時候,application 會經歷:
如果只想固定方向,AndroidManifest.xml 的 activity 要加上一個 attribute :
如果依照google 自己的說明,在activity 加上
是系統幫你轉的(?)
因為這樣,如果是 camera 的應用,可以看到顯示的camera 內容剛好跟螢幕旋轉方向相反。
- Surface Destroyed
- Surface created
如果只想固定方向,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 才能被取到。
所以最後只有這種方法可以用:
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 開發環境。
Windows 11 也可以用。
UI 就跟以前的 delphi 依樣,會有 Form, Unit,然後寫 pascal,build 成exe 檔,也可以直接 run.
應該是目前 最方便的 Windows UI 開發環境。
USB type-c. alternat mode. and VDM
USB Type C, 新的協定有很多功能:
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
- 角色(host, device)轉換
- 充電能力(PD)
- alt mode : DP, hdmit
- audio
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 import 完成,所有 project component 都顯示了。
選 Project Files. 然後下面的 Object-Detection-with..... ,選 app - main - cpp 就會看到有 CMakeList.txt。
修改這個 CMakeList.txt 中的 opencv 和 snpe 的目錄:
然後再 build apk boundle.
出現manifest 沒有 version 的錯。
修改... 亂寫一個版本
run 起來後,windows 一直打不開。因為下面這行被 optimize 調,所以要改:
要 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..
然後把存檔功能刪掉。
- 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 完成,所有 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
訂閱:
文章 (Atom)