偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

OpenHarmony3.0上采用ets開發(fā)HAP控制LED燈

開發(fā) 前端
OpenHarmony3.0采用了方舟開發(fā)框架arkUI,支持了基于TS擴(kuò)展的聲明式開發(fā)范式eTS,本文使用ets開發(fā)語言,構(gòu)造一個(gè)應(yīng)用程序,實(shí)現(xiàn)通過上層HAP控制底層LED燈的亮與滅。

想了解更多內(nèi)容,請?jiān)L問:

51CTO和華為官方合作共建的鴻蒙技術(shù)社區(qū)

https://harmonyos.51cto.com

1. 開發(fā)環(huán)境

硬件:Hi3516DV300開發(fā)板

軟件:OpenHarmony3.0系統(tǒng)

工具:DevEco Studio 3.0

2. 功能簡介

OpenHarmony3.0采用了方舟開發(fā)框架arkUI,支持了基于TS擴(kuò)展的聲明式開發(fā)范式eTS,本文使用ets開發(fā)語言,構(gòu)造一個(gè)應(yīng)用程序,實(shí)現(xiàn)通過上層HAP控制底層LED燈的亮與滅。

3. 實(shí)現(xiàn)原理

如果在Android上實(shí)現(xiàn),需要通過java調(diào)用jni實(shí)現(xiàn)對底層的訪問。但是在OpenHarmony上,HAP采用ets語言開發(fā),沒有發(fā)現(xiàn)嵌入到HAP當(dāng)中的類JNI語言,但是系統(tǒng)也提供了一個(gè)訪問底層的機(jī)制,叫做NAPI,不過這部分是在系統(tǒng)層實(shí)現(xiàn)的,不隨HAP一起發(fā)布。我們想要實(shí)現(xiàn)控制LED燈的功能,是在NAPI部分通過C語言實(shí)現(xiàn)的,然后編譯為xxx.z.so動(dòng)態(tài)庫,它向上層提供了一個(gè)控制接口。綠色LED燈對應(yīng)GPIO2_3,計(jì)算出編號(hào):2*8+3=19,所以直接控制gpio19下的value值就可以控制LED燈亮滅了。

4. 具體實(shí)現(xiàn)

整個(gè)功能的實(shí)現(xiàn)分為了上層HAP應(yīng)用開發(fā)和底層.z.so庫的開發(fā)兩部分。

4.1 應(yīng)用的開發(fā)

1.在HUAWEI DevEco Studio中,創(chuàng)建一個(gè) [Standard]Empty Ability 。

#星光計(jì)劃2.0# OpenHarmony3.0上采用ets開發(fā)HAP控制LED燈-鴻蒙HarmonyOS技術(shù)社區(qū)

開發(fā)語言選擇 “eTS”,可以注意到API Version僅支持7,說明是在OpenHarmony3中新支持的,也僅在OpenHarmony3中支持,這些功能實(shí)際上都是測試版本,穩(wěn)定了之后就會(huì)在HarmonyOS中使用了,但目前還沒有發(fā)布。

#星光計(jì)劃2.0# OpenHarmony3.0上采用ets開發(fā)HAP控制LED燈-鴻蒙HarmonyOS技術(shù)社區(qū)

工程創(chuàng)建完畢后,我直接在pages目錄結(jié)構(gòu)下右擊新建了一個(gè)ets page,取名led。

#星光計(jì)劃2.0# OpenHarmony3.0上采用ets開發(fā)HAP控制LED燈-鴻蒙HarmonyOS技術(shù)社區(qū)

我們頁面的樣式、布局和控制全都在led.ets這個(gè)文件里了,不再像js分為css、hml和js三個(gè)文件。

Led.ets 文件內(nèi)容

  1. import led from '@ohos.led' 
  2.  
  3. @Entry 
  4. @Component 
  5. struct Led { 
  6.   @State private imgpath: string = 'app.media.ledoff' 
  7.   @State private isShow: boolean= false 
  8.  
  9.   build() { 
  10.     Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) { 
  11.       Text('LED 燈控制'
  12.         .fontSize(25) 
  13.         .fontWeight(FontWeight.Bold) 
  14.         .margin({bottom: 30}) 
  15.       Image($r('app.media.ledoff')) 
  16.         .objectFit(ImageFit.Contain) 
  17.         .width(150) 
  18.         .height(150) 
  19.         .visibility(this.isShow ? Visibility.None : Visibility.Visible) 
  20.       Image($r('app.media.ledon')) 
  21.         .objectFit(ImageFit.Contain) 
  22.         .width(150) 
  23.         .height(150) 
  24.         .visibility(this.isShow ? Visibility.Visible : Visibility.None) 
  25.  
  26.       Flex({ alignItems: ItemAlign.Center, justifyContent: FlexAlign.SpaceEvenly }) { 
  27.         Button('關(guān)閉', { type: ButtonType.Capsule, stateEffect: true }).backgroundColor(0x317aff).width(150).height(50).backgroundColor("#aaaaaa"
  28.           .onClick((event: ClickEvent) => { 
  29.             this.isShow = false 
  30.  
  31.             led.switchLed(19, 0); 
  32.  
  33.           }) 
  34.         Button('打開', { type: ButtonType.Capsule, stateEffect: true }).backgroundColor(0x317aff).width(150).height(50) 
  35.         .onClick((event: ClickEvent) => { 
  36.           this.isShow = true 
  37.  
  38.           led.switchLed(19, 1); 
  39.  
  40.         }) 
  41.  
  42.       }.width("100%"
  43.       .margin({ top: 50 }) 
  44.     } 
  45.     .width('100%'
  46.     .height('100%'
  47.     .padding(10) 
  48.   } 

放了兩個(gè)圖片,表示LED燈狀態(tài)的,放在了代碼的entry\src\main\resources\phone\media目錄。

#星光計(jì)劃2.0# OpenHarmony3.0上采用ets開發(fā)HAP控制LED燈-鴻蒙HarmonyOS技術(shù)社區(qū)

導(dǎo)入的ohos.led 庫,是自己添加的NAPI層的動(dòng)態(tài)庫,后面會(huì)繼續(xù)介紹。

在config.json文件中,記得把led.ets放到j(luò)s部分pages數(shù)組的第一位,因?yàn)樗且@示的首頁面。

代碼中使用了兩個(gè)Button組件,一個(gè)打開,一個(gè)關(guān)閉,因?yàn)樵趀ts中還沒有類似js中的switch的組件,頁面中有兩個(gè)image組件,分別顯示打開和關(guān)閉的圖像,通過設(shè)置visibility屬性來切換狀態(tài),本來想通過動(dòng)態(tài)設(shè)置image的源來改變圖像內(nèi)容,但沒找到有效的方法,應(yīng)該是支持的,只是自己還沒了解怎么用。

編譯前記得一定要設(shè)置簽名,否則編譯出來的程序無法安裝。

#星光計(jì)劃2.0# OpenHarmony3.0上采用ets開發(fā)HAP控制LED燈-鴻蒙HarmonyOS技術(shù)社區(qū)

最后可以編譯程序了,

#星光計(jì)劃2.0# OpenHarmony3.0上采用ets開發(fā)HAP控制LED燈-鴻蒙HarmonyOS技術(shù)社區(qū)

生成的最終HAP在 build\outputs\hap\debug\phone\entry-debug-standard-ark-signed.hap

4.2 動(dòng)態(tài)庫的開發(fā)

動(dòng)態(tài)庫需要在OpenHarmony源碼中添加和編譯,本文使用的是OpenHarmony3.0源碼,在foundation/ace/napi/sample目錄下,復(fù)制一份native_module_demo,重命名為native_module_led,里面的文件也相應(yīng)的修改名字,注意文件里調(diào)用也相應(yīng)的修改成正確的名字,否則編譯會(huì)報(bào)錯(cuò)。

#星光計(jì)劃2.0# OpenHarmony3.0上采用ets開發(fā)HAP控制LED燈-鴻蒙HarmonyOS技術(shù)社區(qū)

主要修改的文件有,

foundation/ace/napi/sample/native_module_led/BUILD.gn

foundation/ace/napi/sample/native_module_led/native_module_led.cpp

foundation/ace/napi/BUILD.gn

目錄native_module_led下BUILD.gn文件:

  1. import("//build/ohos.gni"
  2.  
  3. ohos_shared_library("led") { 
  4.   include_dirs = [ 
  5.     "//third_party/node/src"
  6.     "//foundation/ace/napi/interfaces/kits"
  7.   ] 
  8.  
  9.   sources = [ 
  10.     "led_javascript_class.cpp"
  11.     "native_module_led.cpp"
  12.   ] 
  13.  
  14.   deps = [ "//foundation/ace/napi:ace_napi" ] 
  15.  
  16.   relative_install_dir = "module" 
  17.    
  18.   external_deps = [ "hiviewdfx_hilog_native:libhilog" ] 
  19.    
  20.   subsystem_name = "ace" 
  21.   part_name = "napi" 

 目錄native_module_led下native_module_led.cpp文件修改部分摘要:

包含的頭文件和宏定義,

  1. #include <stdlib.h>     // standard library 標(biāo)準(zhǔn)庫函數(shù)頭文件 
  2. #include <stdio.h>      // standard input output 標(biāo)準(zhǔn)輸入輸出函數(shù) 
  3. #include <stdint.h>     // 定義了擴(kuò)展的整數(shù)類型和宏 
  4.  
  5. #include <unistd.h>     // POSIX 系統(tǒng) API 訪問功能的頭文件 
  6. #include <fcntl.h>      // unix標(biāo)準(zhǔn)中通用的頭文件 define O_WRONLY and O_RDONLY   
  7.  
  8. // #include <string.h> 
  9. #define GPIO_DIR_IN (char*)"in" 
  10. #define GPIO_DIR_OUT (char*)"out" 
  11. #define GPIO_VAL_LOW 0 
  12. #define GPIO_VAL_HIGH 1 

 添加函數(shù)SwitchLed的具體實(shí)現(xiàn),

  1. static napi_value SwitchLed(napi_env env, napi_callback_info info) 
  2.     HILOG_INFO("hey, SwitchLed - 0"); 
  3.      
  4.     size_t requireArgc = 2; 
  5.     size_t argc = 2; 
  6.     napi_value args[2] = { nullptr }; 
  7.     NAPI_CALL(env, napi_get_cb_info(env, info, &argc, args, nullptr, nullptr)); 
  8.  
  9.     NAPI_ASSERT(env, argc >= requireArgc, "Wrong number of arguments"); 
  10.  
  11.     napi_valuetype valuetype0; 
  12.     NAPI_CALL(env, napi_typeof(env, args[0], &valuetype0)); 
  13.     napi_valuetype valuetype1; 
  14.     NAPI_CALL(env, napi_typeof(env, args[1], &valuetype1)); 
  15.  
  16.     NAPI_ASSERT(env, valuetype0 == napi_number && valuetype1 == napi_number, "Wrong argument type. Numbers expected."); 
  17.  
  18.     uint32_t gpio; 
  19.     NAPI_CALL(env, napi_get_value_uint32(env, args[0], &gpio)); 
  20.  
  21.     uint32_t val; 
  22.     NAPI_CALL(env, napi_get_value_uint32(env, args[1], &val)); 
  23.  
  24.  
  25.     char direction[100] = {0}; 
  26.     sprintf(direction,"echo out > /sys/class/gpio/gpio%d/direction", gpio); 
  27.     system(direction); 
  28.  
  29.     char value[100] = {0}; 
  30.     sprintf(value,"echo %d > /sys/class/gpio/gpio%d/value", val, gpio); 
  31.     system(value); 
  32.      
  33.     napi_value sum
  34.     NAPI_CALL(env, napi_create_double(env, 1.0f, &sum)); 
  35.     return sum

初始化部分,

  1. EXTERN_C_START 
  2. /* 
  3.  * function for module exports 
  4.  */ 
  5. static napi_value Init(napi_env env, napi_value exports) 
  6.     /* 
  7.      * Properties define 
  8.      */ 
  9.     napi_property_descriptor desc[] = { 
  10.         DECLARE_NAPI_FUNCTION("add"Add), 
  11.         DECLARE_NAPI_FUNCTION("minus", Minus), 
  12.         DECLARE_NAPI_FUNCTION("switchLed", SwitchLed), 
  13.         DECLARE_NAPI_FUNCTION("TestPromise", TestPromise), 
  14.         DECLARE_NAPI_FUNCTION("TestPromiseOrAsyncCallback", TestPromiseOrAsyncCallback), 
  15.     }; 
  16.     NAPI_CALL(env, napi_define_properties(env, exports, sizeof(desc) / sizeof(desc[0]), desc)); 
  17.  
  18.     DemoJavascriptClassInit(env, exports); 
  19.  
  20.     return exports; 
  21. EXTERN_C_END 

 模塊定義及注冊,

  1. /* 
  2.  * Module define 
  3.  */ 
  4. static napi_module ledModule = { 
  5.     .nm_version = 1, 
  6.     .nm_flags = 0, 
  7.     .nm_filename = nullptr, 
  8.     .nm_register_func = Init, 
  9.     .nm_modname = "led"
  10.     .nm_priv = ((void*)0), 
  11.     .reserved = { 0 }, 
  12. }; 
  13. /* 
  14.  * Module register function 
  15.  */ 
  16. extern "C" __attribute__((constructor)) void RegisterModule(void) 
  17.     napi_module_register(&ledModule); 

 目錄napi下BUILD.gn文件,

  1. group("napi_packages_test") { 
  2.   testonly = true 
  3.  
  4.   deps = [ 
  5.     "sample/native_module_demo:demo"
  6.     "sample/native_module_netserver:netserver"
  7.     "sample/native_module_storage:storage"
  8. "test/unittest:unittest"
  9. "sample/native_module_led:led"
  10.   ] 
  11.  
  12.   if (is_standard_system) { 
  13.     deps += [ "sample/native_module_ability:ability" ] 
  14.   } 

 最后在源碼根目錄下執(zhí)行編譯命令,

  1. $./build.sh --product-name Hi3516DV300 --build-target make_test 

生成的文件為:

  1. out/ohos-arm-release/ace/napi/libled.z.so 

5. 系統(tǒng)設(shè)置

需要授予應(yīng)用訪問gpio下export文件的權(quán)限,

device/hisilicon/hi3516dv300/build/rootfs/init.Hi3516DV300.cfg

  1. "name" : "boot"
  2.         "cmds" : [ 
  3.             "write /sys/class/gpio/export 19"
  4.             "chmod 777 /sys/class/gpio/gpio19/direction"
  5.             "chmod 777 /sys/class/gpio/gpio19/value"

6. 系統(tǒng)部署

6.1 拷貝動(dòng)態(tài)庫

生成的.z.so動(dòng)態(tài)庫已經(jīng)拷貝到PC上E:\libled.z.so

PC串口控制臺(tái):

  1. #mount -o remount,rw / 

PC命令窗口cmd:

  1. E:>hdc_std file send E:\libled.z.so /system/lib/module/ 

PC串口控制臺(tái):

  1. #chmod 666 /system/lib/module/libled.z.so 

6.2 安裝應(yīng)用

PC命令窗口cmd:

  1. E:>hdc_std install E:\Projects\HarmonyProject\MyLed\build\outputs\hap\debug\phone\entry-debug-standard-ark-signed.hap 

7. 應(yīng)用測試

點(diǎn)擊打開按鈕,LED圖標(biāo)變綠,同時(shí)LED燈亮,

#星光計(jì)劃2.0# OpenHarmony3.0上采用ets開發(fā)HAP控制LED燈-鴻蒙HarmonyOS技術(shù)社區(qū)

點(diǎn)擊關(guān)閉按鈕,LED圖標(biāo)變灰,同時(shí)LED燈滅。

#星光計(jì)劃2.0# OpenHarmony3.0上采用ets開發(fā)HAP控制LED燈-鴻蒙HarmonyOS技術(shù)社區(qū)

8. 動(dòng)圖展示

#星光計(jì)劃2.0# OpenHarmony3.0上采用ets開發(fā)HAP控制LED燈-鴻蒙HarmonyOS技術(shù)社區(qū)

想了解更多內(nèi)容,請?jiān)L問:

51CTO和華為官方合作共建的鴻蒙技術(shù)社區(qū)

https://harmonyos.51cto.com

責(zé)任編輯:jianghua 來源: 鴻蒙社區(qū)
相關(guān)推薦

2023-09-06 15:35:14

2021-12-03 09:50:39

鴻蒙HarmonyOS應(yīng)用

2022-08-05 19:37:59

鴻蒙Api框架

2021-11-08 07:19:45

鴻蒙HarmonyOS應(yīng)用

2021-11-29 15:17:48

鴻蒙HarmonyOS應(yīng)用

2021-11-09 15:28:41

鴻蒙HarmonyOS應(yīng)用

2021-12-31 10:00:30

鴻蒙HarmonyOS應(yīng)用

2021-10-22 10:41:18

鴻蒙HarmonyOS應(yīng)用

2021-12-29 16:11:11

鴻蒙HarmonyOS應(yīng)用

2022-03-07 15:22:16

classHarmony鴻蒙

2022-05-20 10:56:54

AbilityeTS FA調(diào)用

2022-08-10 15:58:54

LED燈鴻蒙

2022-09-21 14:58:11

OH應(yīng)用簽名鴻蒙

2022-11-04 15:10:31

JS應(yīng)用LED燈

2022-07-12 17:03:43

鴻蒙網(wǎng)絡(luò)請求庫

2022-02-14 14:28:57

驅(qū)動(dòng)開發(fā)鴻蒙系統(tǒng)

2023-02-28 15:49:09

鴻蒙應(yīng)用開發(fā)

2022-04-13 11:24:18

ETS開發(fā)HarmonyOS鴻蒙

2022-09-16 15:34:32

CanvasArkUI

2021-10-15 10:26:28

鴻蒙HarmonyOS應(yīng)用
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)