[RK3399][Android7.1] 调试笔记 热成像传感器MLX90640(二)JNI

平台 内核版本 安卓版本
RK3399 Linux4.4 Android7.1

[RK3399][Android7.1] 调试笔记 热成像传感器MLX90640(一)驱动

JNI

文件:native-lib.cpp

#include "IICDev.h"
#include <android/log.h>
#include <jni.h>
#include <stdio.h>
#include<stdlib.h>

using namespace std;
#define TAG "i2c_dev"
#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG,TAG,__VA_ARGS__)
extern "C" {

IICDev_Callback_func g_funs;
int g_init = 0;

JNIEXPORT jboolean JNICALL
Java_com_hopechart_myapplication_MainActivity_initFun(JNIEnv *env, jobject instance) {
    if (IIC_DevSetCallbackFunc(&g_funs) < 0) {
        return false;
    }
    g_init = 1;
    return true;
}

JNIEXPORT jlong JNICALL
Java_com_hopechart_myapplication_MainActivity_open(JNIEnv *env, jobject instance) {
    if (g_init) {
        return g_funs.open();
    }
    return -1;
}

JNIEXPORT jint  JNICALL
Java_com_hopechart_myapplication_MainActivity_close(JNIEnv *env, jobject instance) {
    if (g_init) {
        g_funs.close();
        return 0;
    }
    return -1;
}

JNIEXPORT jint JNICALL
Java_com_hopechart_myapplication_MainActivity_init(JNIEnv *env, jobject instance) {
    if (g_init) {
        return g_funs.init();
    }
    return -1;
}

JNIEXPORT jintArray JNICALL
Java_com_hopechart_myapplication_MainActivity_getData(JNIEnv *env, jobject instance) {
    jint n = 768;
    jintArray rarr;
    jint *oarr;
    /*malloc*/
    oarr = (jint *) malloc(sizeof(n) * n);
    if (oarr == NULL) {
        return 0;
    }

    /* create jintArray*/
    rarr = env->NewIntArray(n);
    if (rarr == NULL) {
        return 0;
    }
    if (g_init) {
        (jintArray) g_funs.gettemperature(oarr);
    }
    env->SetIntArrayRegion(rarr, 0, n, oarr);
    return rarr;
}

}

回调函数

typedef int (*IICDev_Open)(void);
typedef void (*IICDev_Close)(void);
typedef int (*INIT)(void);
typedef int (*MLX_GetLatticeTe)(int *frameData);

typedef struct _IICDev_Callback_func {
    IICDev_Open open;
    IICDev_Close close;
    INIT init;
    MLX_GetLatticeTe gettemperature;

} IICDev_Callback_func;

回调函数的实现

int IIC_DevSetCallbackFunc(IICDev_Callback_func *pstIICDevCallbackfunc) {
    if (pstIICDevCallbackfunc == NULL) {
        printf("pstIICDevCallbackfunc null\n");
        return -1;
    }

    pstIICDevCallbackfunc->open = iicdev_open;

    pstIICDevCallbackfunc->close = iicdev_close;

    pstIICDevCallbackfunc->init = MLX90640_INIT;

    pstIICDevCallbackfunc->gettemperature = MLX90640_GetLatticeTe;

    return 0;
}

open

int iicdev_open(void) {
    LOGD("iicdev_open");
    fd = open("/dev/i2c-se0", O_RDWR);
    if (fd < 0) {
        printf("open /dev/hq_adasplus failed\n");
        return -1;
    }
    return 0;
}

close

void iicdev_close(void) {
    if (fd >= 0)
        close(fd);
}

初始化

//初始化
int MLX90640_INIT(void) {
    LOGD("MLX90640_INIT");
    int flesh;
    int mybit;
    int mymode;
    int ret;
    float Ta, tr, vdd;
    //0
    MLX90640_SetControlRegister(0b0001101000000001);

    //1、刷新率
    MLX90640_SetRefreshRate(0x03);
    flesh = MLX90640_GetRefreshRate();
    LOGD("xue this flesh %x \n", flesh);

    //2、bit
    MLX90640_SetResolution(0x01);
    mybit = MLX90640_GetCurResolution();
    LOGD("xue this mybit %x \n", mybit);

    //3、模式
    MLX90640_SetInterleavedMode();
    mymode = MLX90640_GetCurMode();
    LOGD("xue this mymode %x \n", mymode);

    //4、
    MLX90640_DumpEE(eeMLX90640);
    ret = MLX90640_ExtractParameters(eeMLX90640, &mlx90640);
    ret = MLX90640_GetFrameData(frame);
    LOGD("xue ret =  %d\n", ret);

    //电压:3.3
    vdd = MLX90640_GetVdd(frame, &mlx90640);
    LOGD("xue vdd = %f\n", vdd);

    Ta = MLX90640_GetTa(frame, &mlx90640);
    LOGD("xue ta F= %f\n", Ta);
    LOGD("xue ta D= %d\n", Ta);
    return vdd;
}
发布了270 篇原创文章 · 获赞 95 · 访问量 13万+

猜你喜欢

转载自blog.csdn.net/qq_33487044/article/details/104391667