Files

126 lines
4.2 KiB
C
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/*---------------------------------------------------------------------------
Copyright (c) 2020 Quectel Wireless Solution, Co., Ltd. All Rights Reserved.
Quectel Wireless Solution Proprietary and Confidential.
---------------------------------------------------------------------------*/
#include <stdio.h>
#include "ql_application.h"
#include "ql_rtos.h"
#include "ql_gpio.h"
#include "ql_camera.h"
#include "ql_uart.h"
#define APP_DEBUG(fmt, args...) printf(fmt, ##args)
#define SERIAL_RX_BUFFER_LEN 2048
static u8 m_RxBuf_Uart1[SERIAL_RX_BUFFER_LEN];
#define DECODER_COUNT 20
static ql_timer_t timerRef;
bool camera_close = 0;
int camera_open = 1;
ql_task_t taskRef;
#define __align(x) __attribute__ ((aligned (x)))
//static __align(32) unsigned char camdecodebuf[640*480*3/2*2]={0};
#define CAMERA_PREVIEW_TASK_PRIORITY 218
#define CAMERA_DECODE_TASK_PRIORITY 227
#define PREVIEW_BUF_CNT 2
void cam_callback_preview(P_CAL_IDENTITY_RESULT_STRUCT outdata);
static CAM_DECODE_CONFIG_CTX camconfig_test =
{
.camwidth =240, //
.camheight =320,
.dectaskprio =CAMERA_DECODE_TASK_PRIORITY,
.decbufcnt =1, //解码buffer的数量
.decbufaddr =NULL, //解码buffer的首地址
.decodecb =cam_callback_preview, //解码成功的回调
.preview =0, //是否需要进行预览
.pretaskprio =CAMERA_PREVIEW_TASK_PRIORITY,//预览任务的优先级
.prebufcnt =PREVIEW_BUF_CNT, //预览的buffer数量
.prebufaddr =NULL, //预览的buffer首地址---用于Camera预览数据(NV12)保存
.lcdmemeryaddr =NULL, //LCD的显存首地址,预览的时候,需要将预览的数据转化到此buffer,600n此处不需要传入
.lcdprewidth =320, //预览图像的宽度
.lcdpreheight =240, //预览图像的高度
};
/******************************************************************
ENGLISH:Please do not run time-consuming functions in this function
中文:请不要在此函数内运行比较耗时的代码或者函数
如果扫码成功,此回调函数将会被调用
attention:please don't "use ql_qr_camera_close" as callback in "ql_qr_camera_open".
注意:不要将use ql_qr_camera_close函数作为ql_qr_camera_open的回调函数。
回调类型为task级别
******************************************************************/
void cam_callback_preview(P_CAL_IDENTITY_RESULT_STRUCT outdata)
{
printf("<-- result=%d\r\n",outdata->result);
printf("<-- databuf=%s\r\n",outdata->DataBuf);
//解码成功,发送消息,告诉通讯线程进行数据通信,将解码结果上传到交易中心
//More.....
//关闭Camera
if(outdata->result==0){
camera_close =1;
}
}
/*Fias.fan 2021.11.17 测试解码功能和补光灯控制*/
//#define TEST_FILL_LIGHT //测试当有物体靠近摄像头时,打开补光灯
static void qr_code_light_test(void *arg)
{
int ret=0;
unsigned int value[10]={0};
unsigned int threshold=0x5; //阈值设置,当前环境光和遮挡时的环境光差值,可根据读取寄存器0x14环境光平均值,自行设定。
unsigned int current_val=0,last_val=0,last_last_val=0;
ql_rtos_task_sleep_s(5); //这里目前必须要延时,给camera时间初始化。
printf("<----------Camera qr_code_light_test++++++++++++++>\n");
//@20221208 初始化camera IO供电使能引脚(EC600M)
ql_gpio_init(GPIO_PIN_NO_77, PIN_DIRECTION_IN,PIN_PULL_PU,PIN_LEVEL_HIGH);
//Ql_Cam_Identify(1);//打开解码
ql_set_decode_mirror(AUTO_MODE); //此接口表示自动检测非镜像和镜像二维码
printf("[OPEN-START] Start Camera heap(%d)\r\n",ql_rtos_get_free_heap_size());
ret = ql_qr_camera_open(&camconfig_test);
if(ret != CAM_DECODE_SUCESS)
{
printf("camera code open failed\r\n");
printf("[OPEN-CAM] Camera heap(%d)\r\n",ql_rtos_get_free_heap_size());
}
else
{
printf("camera code open successd\r\n");
printf("[OPEN-CAM] Camera heap(%d)\r\n",ql_rtos_get_free_heap_size());
}
ql_rtos_task_sleep_s(5);
/*
ret=ql_qr_camera_close();
if(ret != CAM_DECODE_SUCESS)
{
printf("camera code close failed,ret=%d\r\n",ret);
printf("[OPEN-CAM] Camera heap(%d)\r\n",ql_rtos_get_free_heap_size());
}
else
{
printf("camera code close success\r\n");
printf("[OPEN-CAM] Camera heap(%d)\r\n",ql_rtos_get_free_heap_size());
}
*/
}
//application_init(qr_code_light_test, "qr_code_light_test", 2, 0);