Utilice Hongmeng para desarrollar aplicaciones de IA (8) Marco JS para acceder a la capa del kernel

Prefacio

Como se mencionó la última vez, la eficiencia de desarrollo del uso de "C++" para escribir la interfaz "UI" no es tan alta como la de "JS+HTML", pero el desarrollo de dispositivos requiere inevitablemente operar el hardware a través del estado del kernel. Aquí primero debemos elimine el problema de `JS La conexión entre el marco y el controlador del dispositivo. Este capítulo se basa en las tecnologías de "controlador HDF" y "JS+CSS+HTML". Para contenido relacionado, puede revisar " Desarrollo de aplicaciones de IA con Hongmeng (5) Luz de relleno del controlador HDF" y " Desarrollo de aplicaciones de IA con Hongmeng ( 6) UI' `Estos dos artículos.

Principios del marco de desarrollo de aplicaciones JS

En el sexto artículo, experimentamos JSel proceso de uso de la interfaz de desarrollo, aquí hay un análisis simple acedel principio de implementación.

Primero veamos el diagrama del marco: las aplicaciones web, como los programas pequeños, primero se compilan en js bundlepaquetes y JS Data bindingel mapeo de objetos se obtiene a través de ellos. ObserverSe implementa un modelo MVVC minimalista, que se utiliza para dividir los DOMobjetos anteriores en 4 tipos (renderizado, datos, hoja de estilo, función), y el mecanismo de secuestro de datos se utiliza para montarlos en la función prototipo del observador respectivamente y convertirlos en funciones C++implementar.

Si miras el código fuente, encontrarás que JSla parte es minimalista, el motor JS la usa JerryScripty cada etiqueta corresponde a una C++clase Component. La mayoría de las funciones están realmente C++implementadas, incluido el registro y activación de eventos, enrutamiento de páginas, actualizaciones de control, tiempos de espera, operaciones de archivos, salida de línea de comando, etc. El acoplamiento del 100% de todas las API me recuerda a una caricatura.

C++Es mucho más conveniente después de ingresar al dominio. En este momento ACE, todavía estás en modo de usuario y puedes HDFusar el mecanismo de mensajes para llegar al kernel. No es más que una operación de matrioska envuelta en otra capa de API.

Módulo incorporado

Hay una serie @system.xxxde módulos que brindan capacidades al dispositivo para acceder a APP, enrutador, audio, sensor, etc. ohos_module_config.hDefine JS框架la relación correspondiente entre el alias del módulo y la función de inicialización del módulo. Entre ellos app, dfxse routerrequiere módulo.

// Config information for built-in JS modules of OHOS platform
const Module OHOS_MODULES[] = {
#ifdef ENABLE_MODULE_REQUIRE_TEST
    {"sample", InitSampleModule},
#endif
    {"app", InitAppModule},
#ifdef FEATURE_MODULE_AUDIO
    {"audio", InitAudioModule},
#endif // FEATURE_MODULE_AUDIO
    {"dfx", InitDfxModule},
    {"router", InitRouterModule},
#ifdef ENABLE_MODULE_CIPHER
    {"cipher", InitCipherModule},
#endif
};

Implementar módulo as

Después de introducir los conocimientos previos, puede encapsular las funciones del módulo ace personalizado de acuerdo con la complejidad del negocio. Para simplificar la operación, montamos la appoperación directamente en el módulo incorporado.

1. Definir archivos de encabezado

Modificar foundation/ace/frameworks/lite/src/core/modules/app_module.h, agregar ToggleLedfunciones e inicializar.

namespace OHOS {
namespace ACELite {
class AppModule final : public MemoryHeap {
public:
    static JSIValue ToggleLed(const JSIValue thisVal, const JSIValue* args, uint8_t argsNum);

void InitAppModule(JSIValue exports)
{
    JSI::SetModuleAPI(exports, "getInfo", AppModule::GetInfo);
    JSI::SetModuleAPI(exports, "terminate", AppModule::Terminate);
    JSI::SetModuleAPI(exports, "toggleLed", AppModule::ToggleLed);
}
} // namespace ACELite
} // namespace OHOS
#endif // OHOS_ACELITE_APP_MODULE_H

2. Llame al controlador HDF

Únete foundation/ace/frameworks/lite/src/core/modules/app_module.cpp,

#include <fcntl.h>
#include <sys/stat.h>
#include <sys/ioctl.h>
#include <unistd.h>
#include "hdf_sbuf.h"
#include "hdf_io_service_if.h"

#define LED_WRITE_READ 1
#define LED_SERVICE "led_service"

JSIValue AppModule::ToggleLed(const JSIValue thisVal, const JSIValue *args, uint8_t argsNum)
{
    HILOG_ERROR(HILOG_MODULE_ACE, "led button pressed.");
    printf("led button pressed\n");

    struct HdfIoService *serv = HdfIoServiceBind(LED_SERVICE, 0);
    if (serv == NULL)
    {
        printf("fail to get service %s\n", LED_SERVICE);
        return JSI::CreateUndefined();
    }

    static struct HdfDevEventlistener listener = {
        .callBack = OnDevEventReceived,c
        .priv = (void *)"Service0"};

    if (HdfDeviceRegisterEventListener(serv, &listener) != HDF_SUCCESS)
    {
        printf("fail to register event listener\n");
        return JSI::CreateUndefined();
    }

    const char *send_cmd = "toggle LED";

    if (SendEvent(serv, send_cmd))
    {
        printf("fail to send event\n");
        return JSI::CreateUndefined();
    }

    if (HdfDeviceUnregisterEventListener(serv, &listener))
    {
        printf("fail to  unregister listener\n");
        return JSI::CreateUndefined();
    }

    HdfIoServiceRecycle(serv);

    return JSI::CreateUndefined();
}

3. Configure la ruta del archivo de encabezado HDF

Revisarfoundation/ace/frameworks/lite/src/core/modules/BUILD.gn

include_dirs = [
    "presets",
    "maplejs",
    "//test/lite/testservice/include",
    "//vendor/huawei/watchgt/devkit/hal/include",
	"//foundation/distributedschedule/interfaces/innerkits/samgr_lite/communication/mpc/transport",
    "//foundation/distributedschedule/interfaces/innerkits/samgr_lite/communication/mpc",
    
    "//drivers/hdf/lite/include/host",
    "$HDF_FRAMEWORKS/ability/sbuf/include",        
    "$HDF_FRAMEWORKS/core/shared/include",
    "$HDF_FRAMEWORKS/core/host/include",
    "$HDF_FRAMEWORKS/core/master/include",
    "$HDF_FRAMEWORKS/include/core",
    "$HDF_FRAMEWORKS/include/utils",
    "$HDF_FRAMEWORKS/utils/include",
    "$HDF_FRAMEWORKS/include/osal",
    "$HDF_FRAMEWORKS/adapter/syscall/include",
    "$HDF_FRAMEWORKS/adapter/vnode/include",
]

Revisarfoundation/ace/frameworks/lite/BUILD.gn

config("ace_lite_config") {
  include_dirs = [
  ...
  ]
  
  include_dirs += [
    "//drivers/hdf/lite/include/host",
    "$HDF_FRAMEWORKS/ability/sbuf/include",        
    "$HDF_FRAMEWORKS/core/shared/include",
    "$HDF_FRAMEWORKS/core/host/include",
    "$HDF_FRAMEWORKS/core/master/include",
    "$HDF_FRAMEWORKS/include/core",
    "$HDF_FRAMEWORKS/include/utils",
    "$HDF_FRAMEWORKS/utils/include",
    "$HDF_FRAMEWORKS/include/osal",
    "$HDF_FRAMEWORKS/adapter/syscall/include",
    "$HDF_FRAMEWORKS/adapter/vnode/include",
  ]
}
shared_library("ace_lite") {
      
  public_deps = [
    "//base/security/frameworks/crypto_lite/js/builtin:ace_kit_cipher",
    "//foundation/graphic/lite/frameworks/surface:surface",
    "//foundation/multimedia/frameworks/camera_lite:camera",
    "//foundation/multimedia/frameworks/player_lite:player",
    "//foundation/multimedia/interfaces/kits/player_lite/js/builtin:audio_api",
    "//third_party/bounds_checking_function:libsec_shared",
    "//third_party/cJSON:cjson_shared",
    "//third_party/jerryscript/jerry-core:jerry-core_shared",
    "//third_party/jerryscript/jerry-ext:jerry-ext_shared",
    "//third_party/jerryscript/jerry-libm:jerry-libm_shared",
    "//third_party/jerryscript/jerry-port/default:jerry-port-default_shared",
    "//utils/native/lite/js/builtin:ace_utils_kits",
    "//utils/native/lite/timer_task:ace_kit_timer",

    "//drivers/hdf/lite/manager:hdf_core",
    "//drivers/hdf/lite/adapter/osal/posix:hdf_posix_osal",
  ]
}

4. Compilar y grabar

python build.py my_hi3516dv300 -b debug

En lo que respecta a HDFcontroladores y ACEmarcos, el archivo de imagen debe volver a grabarse por completo.

Desarrollar programa de interfaz.

1. Configurar la interfaz del módulo

Anteriormente, appagregamos funciones al módulo integrado taggleLed, que DevEco Studiono se pueden obtener directamente para Python, por lo que primero debemos agregar apiuna interfaz.

Modificar \Huawei\Sdk\js\2.0.1.93\api\smartVision\@system.app.d.tsarchivos

export default class App {
  /**
   * Obtains the declared information in the config.json file of an application.
   */
  static getInfo(): IAppInfo;

  /**
   * Destroys the current ability.
   */
  static terminate(): void;
  
  /**
   * 翻转Led
   */
  static toggleLed(): void;
}

2. Activador de página

Aquí UI篇usamos un evento deslizante en el programa anterior para activar la operación de voltear el Led.

Revisarentry/src/main/js/default/pages/index/index.js

swiperChange (e) {
    this.swiperPage = e.index;
    if(e.index == 0){
        this.iconcheckedColor = '#ffffff';
        this.iconUncheckedColor = '#262626';
    }else{
        this.iconcheckedColor = '#262626';
        this.iconUncheckedColor = '#ffffff';
    }
    // 调用翻转Led函数
    app.toggleLed();
}

El toggleLednombre de la función debe coincidir con el nombre de la cadena definido aceen el registro de inicialización del módulo anterior .JSI::SetModuleAPI

3. Empaquetar en Hap

Empaquetar la aplicación con el Hapnombre renombradoMyUILed.hap

4. Instalar en el dispositivo

Para conocer el directorio de mapeo específico nfs, consulte el capítulo anterior.

mkdir nfs
mount 192.168.1.52:/nfs /nfs nfs
cd nfs
./dev_tools/bin/bm set -s disable
./dev_tools/bin/bm install -p MyUILed.hap

5. Ejecute el programa

Deslice la interfaz principal y vea Led灯el interruptor, lo que significa que el programa se está ejecutando correctamente.

Para resumir brevemente todo el proceso,

  • Página principal index, import app from '@system.app'módulo de importación;

  • Llamado en un evento app.toggleLed();para iniciar una operación;

  • Por JS框架embalaje MyUILed.hap(esencialmente un paquete zip);

  • Una vez instalado en el dispositivo, se descomprime y se restaura en JS代码;

  • El marco del dispositivo acepasa JSI::SetModuleAPIy JS代码las palabras clave "toggleLed"se asignan a las C++funciones correspondientes AppModule::ToggleLed;

  • AppModule::ToggleLedEncontrado en función LED_SERVICE, enviar HDFmensaje

  • Después de que el controlador del kernel HDFrecibe el mensaje, lo ejecuta LED翻转操作.

En este punto, podemos tener lo mejor de ambos mundos: no solo podemos construir de manera eficiente hermosas UIpiezas en forma de un pequeño programa, sino también acceder C++de manera eficiente a las funciones subyacentes del dispositivo, lo que AIallana el camino para una gran cantidad de posteriores. Cálculos intensivos.

Descargar

Puede encontrar información y documentos relevantes para este problema en la cuenta pública "Deep Awakening" y responda: "ohos08" en segundo plano para obtener el enlace de descarga.

Vista previa del artículo siguiente

Herramientas de dispositivo DevEco 2.0 recientemente actualizadas,

Integra muchos comandos hpm y hos,

En el próximo artículo, primero probaremos la nueva versión de la herramienta de grabación.

Manténganse al tanto...

Recomendado en el pasado

Supongo que te gusta

Origin blog.csdn.net/weixin_47479625/article/details/113733673
Recomendado
Clasificación