/* 
 | 
 * algo_loader.cpp - The dynamic loads algorithm library 
 | 
 * 
 | 
 *  Copyright (c) 2021 Rockchip Electronics Co., Ltd. 
 | 
 * 
 | 
 * Licensed under the Apache License, Version 2.0 (the "License"); 
 | 
 * you may not use this file except in compliance with the License. 
 | 
 * You may obtain a copy of the License at 
 | 
 * 
 | 
 *      http://www.apache.org/licenses/LICENSE-2.0 
 | 
 * 
 | 
 * Unless required by applicable law or agreed to in writing, software 
 | 
 * distributed under the License is distributed on an "AS IS" BASIS, 
 | 
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 
 | 
 * See the License for the specific language governing permissions and 
 | 
 * limitations under the License. 
 | 
 * 
 | 
 * Author: Cody Xie <cody.xie@rock-chips.com> 
 | 
 */ 
 | 
#include "eis_loader.h" 
 | 
  
 | 
#include <dlfcn.h> 
 | 
  
 | 
#include <string> 
 | 
  
 | 
#include "dvs_app.h" 
 | 
#include "rk_aiq_mems_sensor.h" 
 | 
#include "xcam_log.h" 
 | 
  
 | 
namespace RkCam { 
 | 
  
 | 
const static std::string DvsLibraryName = "libdvs_gyro.so"; 
 | 
  
 | 
DvsLibrary::~DvsLibrary() { 
 | 
    if (handle_ != nullptr) { 
 | 
        ::dlclose(handle_); 
 | 
    } 
 | 
} 
 | 
  
 | 
bool DvsLibrary::Init() { 
 | 
    handle_ = ::dlopen(DvsLibraryName.c_str(), RTLD_LAZY); 
 | 
    if (handle_ == nullptr) { 
 | 
        return false; 
 | 
    } 
 | 
    return true; 
 | 
} 
 | 
  
 | 
bool DvsLibrary::LoadSymbols() { 
 | 
    char* error; 
 | 
  
 | 
    ops_.RegisterRemap = (dvsRegisterRemap)dlsym(handle_, "dvsRegisterRemap"); 
 | 
    error              = dlerror(); 
 | 
    if (error != NULL) { 
 | 
        LOGE("Failed to resolve symbol dvsRegisterRemap: %s", error); 
 | 
        goto error_out; 
 | 
    } 
 | 
  
 | 
    ops_.Prepare = (dvsPrepare)dlsym(handle_, "dvsPrepare"); 
 | 
    error        = dlerror(); 
 | 
    if (error != NULL) { 
 | 
        LOGE("Failed to resolve symbol dvsPrepare: %s", error); 
 | 
        goto error_out; 
 | 
    } 
 | 
  
 | 
    ops_.GetMeshSize = (getMeshSize)dlsym(handle_, "getMeshSize"); 
 | 
    error            = dlerror(); 
 | 
    if (error != NULL) { 
 | 
        LOGE("Failed to resolve symbol getMeshSize: %s", error); 
 | 
        goto error_out; 
 | 
    } 
 | 
  
 | 
    ops_.GetOriginalMeshXY = (getOriginalMeshXY)dlsym(handle_, "getOriginalMeshXY"); 
 | 
    error            = dlerror(); 
 | 
    if (error != NULL) { 
 | 
        LOGE("Failed to resolve symbol getOriginalMeshXY: %s", error); 
 | 
        goto error_out; 
 | 
    } 
 | 
  
 | 
    ops_.PutImageFrame = (dvsPutImageFrame)dlsym(handle_, "dvsPutImageFrame"); 
 | 
    error              = dlerror(); 
 | 
    if (error != NULL) { 
 | 
        LOGE("Failed to resolve symbol dvsPutImageFrame: %s", error); 
 | 
        goto error_out; 
 | 
    } 
 | 
  
 | 
    ops_.PutMesh = (dvsPutMesh)dlsym(handle_, "dvsPutMesh"); 
 | 
    error        = dlerror(); 
 | 
    if (error != NULL) { 
 | 
        LOGE("Failed to resolve symbol dvsPutMesh: %s", error); 
 | 
        goto error_out; 
 | 
    } 
 | 
  
 | 
    ops_.PutImuFrame = (dvsPutImuFrame)dlsym(handle_, "dvsPutImuFrame"); 
 | 
    error            = dlerror(); 
 | 
    if (error != NULL) { 
 | 
        LOGE("Failed to resolve symbol dvsPutImuFrame: %s", error); 
 | 
        goto error_out; 
 | 
    } 
 | 
  
 | 
    ops_.InitFromXmlFile = (dvsInitFromXmlFile)dlsym(handle_, "dvsInitFromXmlFile"); 
 | 
    error                = dlerror(); 
 | 
    if (error != NULL) { 
 | 
        LOGE("Failed to resolve symbol dvsInitFromXmlFile: %s", error); 
 | 
        goto error_out; 
 | 
    } 
 | 
  
 | 
    ops_.InitParams = (dvsInitParams)dlsym(handle_, "dvsInitParams"); 
 | 
    error           = dlerror(); 
 | 
    if (error != NULL) { 
 | 
        LOGE("Failed to resolve symbol dvsInitParams: %s", error); 
 | 
        goto error_out; 
 | 
    } 
 | 
  
 | 
    ops_.Start = (dvsStart)dlsym(handle_, "dvsStart"); 
 | 
    error      = dlerror(); 
 | 
    if (error != NULL) { 
 | 
        LOGE("Failed to resolve symbol dvsStart: %s", error); 
 | 
        goto error_out; 
 | 
    } 
 | 
  
 | 
    ops_.RequestStop = (dvsRequestStop)dlsym(handle_, "dvsRequestStop"); 
 | 
    error            = dlerror(); 
 | 
    if (error != NULL) { 
 | 
        LOGE("Failed to resolve symbol dvsRequestStop: %s", error); 
 | 
        goto error_out; 
 | 
    } 
 | 
  
 | 
    ops_.DeInit = (dvsDeinit)dlsym(handle_, "dvsDeinit"); 
 | 
    error       = dlerror(); 
 | 
    if (error != NULL) { 
 | 
        LOGE("Failed to resolve symbol dvsDeinit: %s", error); 
 | 
        goto error_out; 
 | 
    } 
 | 
  
 | 
    return true; 
 | 
error_out: 
 | 
    dlclose(handle_); 
 | 
    handle_ = nullptr; 
 | 
    return false; 
 | 
} 
 | 
  
 | 
DvsOps* DvsLibrary::GetOps() { return &ops_; } 
 | 
  
 | 
};  // namespace RkCam 
 |