#include "rkaiq_raw_protocol.h" #include "multiframe_process.h" #include "rkaiq_protocol.h" #include "rk-camera-module.h" #include #include #include #include using namespace std; #ifdef LOG_TAG #undef LOG_TAG #endif #define LOG_TAG "aiqtool" static int capture_status = READY; static int capture_mode = CAPTURE_NORMAL; static int capture_frames = 1; static int capture_frames_index = 0; static uint16_t capture_check_sum; static struct capture_info cap_info; static uint32_t* averge_frame0; static uint16_t* averge_frame1; static int needSetParamFlag = 1; extern std::string g_sensor_name; extern std::shared_ptr rkaiq_media; extern int g_device_id; extern uint32_t g_sensorHdrMode; static void ExecuteCMD(const char* cmd, char* result) { char buf_ps[2048]; char ps[2048] = {0}; FILE* ptr; strcpy(ps, cmd); if ((ptr = popen(ps, "r")) != NULL) { while (fgets(buf_ps, 2048, ptr) != NULL) { strcat(result, buf_ps); if (strlen(result) > 2048) { break; } } pclose(ptr); ptr = NULL; } else { printf("popen %s error\n", ps); } } static int SetLHcg(int mode) { if (needSetParamFlag == 0) { LOG_INFO("Online mode, not set SetLHcg\n"); return 0; } int fd = device_open(cap_info.sd_path.device_name); LOG_DEBUG("SetLHcg, sensor subdev path: %s\n", cap_info.sd_path.device_name); if (fd < 0) { LOG_ERROR("Open %s failed.\n", cap_info.sd_path.device_name); } else { int ret = ioctl(fd, RKMODULE_SET_CONVERSION_GAIN, &mode); if (ret > 0) { LOG_ERROR("SetLHcg failed\n"); } else { LOG_INFO("SetLHcg :%d\n", mode); } } close(fd); return 0; } static void InitCommandStreamingAns(CommandData_t* cmd, int ret_status) { strncpy((char*)cmd->RKID, TAG_DEVICE_TO_PC, sizeof(cmd->RKID)); cmd->cmdType = CMD_TYPE_STREAMING; cmd->cmdID = 0xffff; cmd->datLen = 1; memset(cmd->dat, 0, sizeof(cmd->dat)); cmd->dat[0] = ret_status; cmd->checkSum = 0; for (int i = 0; i < cmd->datLen; i++) { cmd->checkSum += cmd->dat[i]; } } static void InitCommandPingAns(CommandData_t* cmd, int ret_status) { strncpy((char*)cmd->RKID, TAG_DEVICE_TO_PC, sizeof(cmd->RKID)); cmd->cmdType = DEVICE_TO_PC; cmd->cmdID = CMD_ID_CAPTURE_STATUS; cmd->datLen = 1; memset(cmd->dat, 0, sizeof(cmd->dat)); cmd->dat[0] = ret_status; cmd->checkSum = 0; for (int i = 0; i < cmd->datLen; i++) { cmd->checkSum += cmd->dat[i]; } } static void InitCommandRawCapAns(CommandData_t* cmd, int ret_status) { strncpy((char*)cmd->RKID, TAG_DEVICE_TO_PC, sizeof(cmd->RKID)); cmd->cmdType = DEVICE_TO_PC; cmd->cmdID = CMD_ID_CAPTURE_RAW_CAPTURE; cmd->datLen = 2; memset(cmd->dat, 0, sizeof(cmd->dat)); cmd->dat[0] = 0x00; // ProcessID cmd->dat[1] = ret_status; cmd->checkSum = 0; for (int i = 0; i < cmd->datLen; i++) { cmd->checkSum += cmd->dat[i]; } } static void RawCaptureinit(CommandData_t* cmd) { char* buf = (char*)(cmd->dat); Capture_Reso_t* Reso = (Capture_Reso_t*)(cmd->dat + 1); media_info_t mi = rkaiq_media->GetMediaInfoT(g_device_id); if (mi.cif.linked_sensor) { cap_info.link = link_to_vicap; strcpy(cap_info.sd_path.device_name, mi.cif.sensor_subdev_path.c_str()); strcpy(cap_info.cif_path.cif_video_path, mi.cif.mipi_id0.c_str()); cap_info.dev_name = cap_info.cif_path.cif_video_path; } else if (mi.dvp.linked_sensor) { cap_info.link = link_to_dvp; strcpy(cap_info.sd_path.device_name, mi.dvp.sensor_subdev_path.c_str()); strcpy(cap_info.cif_path.cif_video_path, mi.dvp.dvp_id0.c_str()); cap_info.dev_name = cap_info.cif_path.cif_video_path; } else { cap_info.link = link_to_isp; strcpy(cap_info.sd_path.device_name, mi.isp.sensor_subdev_path.c_str()); strcpy(cap_info.vd_path.isp_main_path, mi.isp.main_path.c_str()); cap_info.dev_name = cap_info.vd_path.isp_main_path; } strcpy(cap_info.vd_path.media_dev_path, mi.isp.media_dev_path.c_str()); strcpy(cap_info.vd_path.isp_sd_path, mi.isp.isp_dev_path.c_str()); if (mi.lens.module_lens_dev_name.length()) { strcpy(cap_info.lens_path.lens_device_name, mi.lens.module_lens_dev_name.c_str()); } else { cap_info.lens_path.lens_device_name[0] = '\0'; } cap_info.dev_fd = -1; cap_info.subdev_fd = -1; cap_info.lensdev_fd = -1; LOG_DEBUG("cap_info.link: %d \n", cap_info.link); LOG_DEBUG("cap_info.dev_name: %s \n", cap_info.dev_name); LOG_DEBUG("cap_info.isp_media_path: %s \n", cap_info.vd_path.media_dev_path); LOG_DEBUG("cap_info.vd_path.isp_sd_path: %s \n", cap_info.vd_path.isp_sd_path); LOG_DEBUG("cap_info.sd_path.device_name: %s \n", cap_info.sd_path.device_name); LOG_DEBUG("cap_info.lens_path.lens_dev_name: %s \n", cap_info.lens_path.lens_device_name); cap_info.io = IO_METHOD_MMAP; cap_info.height = Reso->height; cap_info.width = Reso->width; // cap_info.format = v4l2_fourcc('B', 'G', '1', '2'); LOG_DEBUG("get ResW: %d ResH: %d\n", cap_info.width, cap_info.height); // int fd = device_open(cap_info.sd_path.device_name); LOG_DEBUG("sensor subdev path: %s\n", cap_info.sd_path.device_name); LOG_DEBUG("cap_info.subdev_fd: %d\n", fd); if (fd < 0) { LOG_ERROR("Open %s failed.\n", cap_info.sd_path.device_name); } else { rkmodule_hdr_cfg hdrCfg; int ret = ioctl(fd, RKMODULE_GET_HDR_CFG, &hdrCfg); if (ret > 0) { g_sensorHdrMode = NO_HDR; LOG_ERROR("Get sensor hdr mode failed, use default, No HDR\n"); } else { g_sensorHdrMode = hdrCfg.hdr_mode; LOG_INFO("Get sensor hdr mode:%u\n", g_sensorHdrMode); } } close(fd); if (mi.cif.linked_sensor) { if (g_sensorHdrMode == NO_HDR) { LOG_INFO("Get sensor mode: NO_HDR\n"); strcpy(cap_info.cif_path.cif_video_path, mi.cif.mipi_id0.c_str()); cap_info.dev_name = cap_info.cif_path.cif_video_path; } else if (g_sensorHdrMode == HDR_X2) { LOG_INFO("Get sensor mode: HDR_2\n"); strcpy(cap_info.cif_path.cif_video_path, mi.cif.mipi_id1.c_str()); cap_info.dev_name = cap_info.cif_path.cif_video_path; } else if (g_sensorHdrMode == HDR_X3) { LOG_INFO("Get sensor mode: HDR_3\n"); strcpy(cap_info.cif_path.cif_video_path, mi.cif.mipi_id2.c_str()); cap_info.dev_name = cap_info.cif_path.cif_video_path; } } } static void RawCaptureDeinit() { if (cap_info.subdev_fd > 0) { device_close(cap_info.subdev_fd); cap_info.subdev_fd = -1; LOG_DEBUG("device_close(cap_info.subdev_fd)\n"); } if (cap_info.dev_fd > 0) { device_close(cap_info.dev_fd); cap_info.dev_fd = -1; LOG_DEBUG("device_close(cap_info.dev_fd)\n"); } } static void GetSensorPara(CommandData_t* cmd, int ret_status) { struct v4l2_queryctrl ctrl; struct v4l2_subdev_frame_interval finterval; struct v4l2_subdev_format fmt; struct v4l2_format format; memset(cmd, 0, sizeof(CommandData_t)); Sensor_Params_t* sensorParam = (Sensor_Params_t*)(&cmd->dat[1]); int hblank, vblank; int vts, hts, ret; float fps; int endianness = 0; cap_info.subdev_fd = device_open(cap_info.sd_path.device_name); LOG_DEBUG("sensor subdev path: %s\n", cap_info.sd_path.device_name); uint16_t sensorFormat; // set capture image data format if (g_sensorHdrMode == NO_HDR) { sensorFormat = PROC_ID_CAPTURE_RAW_NON_COMPACT_LINEAR; LOG_INFO("NO_HDR | sensorFormat:%d\n", sensorFormat); } else if (g_sensorHdrMode == HDR_X2) { sensorFormat = PROC_ID_CAPTURE_RAW_COMPACT_HDR2_ALIGN256; LOG_INFO("HDR_X2 | sensorFormat:%d\n", sensorFormat); } else if (g_sensorHdrMode == HDR_X3) { sensorFormat = PROC_ID_CAPTURE_RAW_COMPACT_HDR3_ALIGN256; LOG_INFO("HDR_X3 | sensorFormat:%d\n", sensorFormat); } else { LOG_ERROR("Get sensor hdr mode failed, hdr mode:%u, use default.No HDR\n", g_sensorHdrMode); sensorFormat = PROC_ID_CAPTURE_RAW_NON_COMPACT_LINEAR; LOG_INFO("NO_HDR | sensorFormat:%d\n", sensorFormat); } memset(&ctrl, 0, sizeof(ctrl)); ctrl.id = V4L2_CID_HBLANK; if (device_getblank(cap_info.subdev_fd, &ctrl) < 0) { // todo sensorParam->status = RES_FAILED; goto end; } hblank = ctrl.minimum; LOG_DEBUG("get hblank: %d\n", hblank); memset(&ctrl, 0, sizeof(ctrl)); ctrl.id = V4L2_CID_VBLANK; if (device_getblank(cap_info.subdev_fd, &ctrl) < 0) { // todo sensorParam->status = RES_FAILED; goto end; } vblank = ctrl.minimum; LOG_DEBUG("get vblank: %d\n", vblank); memset(&fmt, 0, sizeof(fmt)); fmt.pad = 0; fmt.which = V4L2_SUBDEV_FORMAT_ACTIVE; if (device_getsubdevformat(cap_info.subdev_fd, &fmt) < 0) { sensorParam->status = RES_FAILED; goto end; } vts = vblank + fmt.format.height; hts = hblank + fmt.format.width; LOG_DEBUG("get hts: %d vts: %d\n", hts, vts); cap_info.format = convert_to_v4l2fmt(&cap_info, fmt.format.code); cap_info.sd_path.sen_fmt = fmt.format.code; cap_info.sd_path.width = fmt.format.width; cap_info.sd_path.height = fmt.format.height; LOG_DEBUG("get sensor code: %d bits: %d, cap_info.format: %d\n", cap_info.sd_path.sen_fmt, cap_info.sd_path.bits, cap_info.format); /* set isp subdev fmt to bayer raw*/ if (cap_info.link == link_to_isp) { ret = rkisp_set_ispsd_fmt(&cap_info, fmt.format.width, fmt.format.height, fmt.format.code, cap_info.width, cap_info.height, fmt.format.code); endianness = 1; LOG_DEBUG("rkisp_set_ispsd_fmt: %d endianness = %d\n", ret, endianness); if (ret) { LOG_ERROR("subdev choose the best fit fmt: %dx%d, 0x%08x\n", fmt.format.width, fmt.format.height, fmt.format.code); sensorParam->status = RES_FAILED; goto end; } } memset(&finterval, 0, sizeof(finterval)); finterval.pad = 0; if (device_getsensorfps(cap_info.subdev_fd, &finterval) < 0) { sensorParam->status = RES_FAILED; goto end; } fps = (float)(finterval.interval.denominator) / finterval.interval.numerator; LOG_DEBUG("get fps: %f\n", fps); strncpy((char*)cmd->RKID, TAG_DEVICE_TO_PC, sizeof(cmd->RKID)); cmd->cmdType = DEVICE_TO_PC; cmd->cmdID = CMD_ID_CAPTURE_RAW_CAPTURE; cmd->datLen = sizeof(Sensor_Params_t); memset(cmd->dat, 0, sizeof(cmd->dat)); cmd->dat[0] = 0x01; sensorParam->status = ret_status; sensorParam->fps = fps; sensorParam->hts = hts; sensorParam->vts = vts; sensorParam->bits = cap_info.sd_path.bits; sensorParam->endianness = endianness; sensorParam->sensorImageFormat = sensorFormat; LOG_DEBUG("sensorParam->endianness: %d\n", endianness); cmd->checkSum = 0; for (int i = 0; i < cmd->datLen; i++) { cmd->checkSum += cmd->dat[i]; } LOG_DEBUG("cmd->checkSum %d\n", cmd->checkSum); if (cap_info.subdev_fd > 0) { device_close(cap_info.subdev_fd); cap_info.subdev_fd = -1; } if (cap_info.dev_fd > 0) { device_close(cap_info.dev_fd); cap_info.dev_fd = -1; } return; end: strncpy((char*)cmd->RKID, TAG_DEVICE_TO_PC, sizeof(cmd->RKID)); cmd->cmdType = PC_TO_DEVICE; cmd->cmdID = CMD_ID_CAPTURE_RAW_CAPTURE; cmd->datLen = sizeof(Sensor_Params_t); cmd->dat[0] = 0x01; cmd->checkSum = 0; for (int i = 0; i < cmd->datLen; i++) { cmd->checkSum += cmd->dat[i]; } if (cap_info.subdev_fd > 0) { device_close(cap_info.subdev_fd); cap_info.subdev_fd = -1; } } static void SetCapConf(CommandData_t* recv_cmd, CommandData_t* cmd, int ret_status) { // change raw cap format to no compact LOG_INFO("change raw cap format to no compact\n"); int fd = open(cap_info.dev_name, O_RDWR, 0); LOG_INFO("fd: %d\n", fd); if (fd < 0) { LOG_ERROR("Open dev %s failed.\n", cap_info.dev_name); } else { if (g_sensorHdrMode == NO_HDR) { int value = CSI_LVDS_MEM_WORD_LOW_ALIGN; int ret = ioctl(fd, RKCIF_CMD_SET_CSI_MEMORY_MODE, &value); // set to no compact if (ret > 0) { LOG_ERROR("set cif node %s compact mode failed.\n", cap_info.dev_name); } else { LOG_INFO("cif node %s set to no compact mode.\n", cap_info.dev_name); } } else { LOG_INFO("cif node HDR mode, compact format as default.\n"); } } close(fd); // needSetParamFlag = 1; char result[2048] = {0}; std::string pattern{"Isp online"}; std::regex re(pattern); std::smatch results; ExecuteCMD("cat /proc/rkisp0-vir0", result); std::string srcStr = result; // LOG_INFO("#### srcStr:%s\n", srcStr.c_str()); std::regex_search(srcStr, results, re); if (results.length() > 0) { needSetParamFlag = 0; LOG_INFO("Online capture raw not set param.\n"); } memset(result, 0, sizeof(result)); ExecuteCMD("cat /proc/rkisp1-vir0", result); srcStr = result; // LOG_INFO("#### srcStr:%s\n", srcStr.c_str()); std::regex_search(srcStr, results, re); if (results.length() > 0) { needSetParamFlag = 0; LOG_INFO("Online capture raw not set param.\n"); } memset(result, 0, sizeof(result)); ExecuteCMD("cat /proc/rkisp-vir0", result); srcStr = result; // LOG_INFO("#### srcStr:%s\n", srcStr.c_str()); std::regex_search(srcStr, results, re); if (results.length() > 0) { needSetParamFlag = 0; LOG_INFO("Online capture raw not set param.\n"); } memset(result, 0, sizeof(result)); ExecuteCMD("cat /proc/rkisp-unite", result); srcStr = result; // LOG_INFO("#### srcStr:%s\n", srcStr.c_str()); std::regex_search(srcStr, results, re); if (results.length() > 0) { needSetParamFlag = 0; LOG_INFO("Online capture raw not set param.\n"); } // bool focus_enable = false; memset(cmd, 0, sizeof(CommandData_t)); Capture_Params_t* CapParam = (Capture_Params_t*)(recv_cmd->dat + 1); for (int i = 0; i < recv_cmd->datLen; i++) { LOG_DEBUG("data[%d]: 0x%x\n", i, recv_cmd->dat[i]); } cap_info.subdev_fd = device_open(cap_info.sd_path.device_name); if (strlen(cap_info.lens_path.lens_device_name) > 0) { focus_enable = true; } if (focus_enable) cap_info.lensdev_fd = device_open(cap_info.lens_path.lens_device_name); capture_frames = CapParam->framenumber; capture_frames_index = 0; cap_info.frame_count = CapParam->framenumber; cap_info.lhcg = CapParam->lhcg; capture_mode = CapParam->multiframe; capture_check_sum = 0; if (needSetParamFlag == 1) { LOG_INFO(" set gain : %d\n", CapParam->gain); LOG_INFO(" set exposure : %d\n", CapParam->time); LOG_INFO(" set lhcg : %d\n", CapParam->lhcg); LOG_INFO(" set bits : %d\n", CapParam->bits); LOG_INFO(" set framenumber : %d\n", CapParam->framenumber); LOG_INFO(" set multiframe : %d\n", CapParam->multiframe); LOG_INFO(" set vblank : %d\n", CapParam->vblank); LOG_INFO(" set focus : %d\n", CapParam->focus_position); LOG_INFO(" sd_path subdev : %s\n", cap_info.sd_path.device_name); struct v4l2_control exp; exp.id = V4L2_CID_EXPOSURE; exp.value = CapParam->time; struct v4l2_control gain; gain.id = V4L2_CID_ANALOGUE_GAIN; gain.value = CapParam->gain; struct v4l2_control vblank; vblank.id = V4L2_CID_VBLANK; vblank.value = CapParam->vblank; struct v4l2_control focus; if (focus_enable) { struct v4l2_queryctrl focus_query; focus_query.id = V4L2_CID_FOCUS_ABSOLUTE; if (device_queryctrl(cap_info.lensdev_fd, &focus_query) < 0) { LOG_ERROR(" query focus result failed to device\n"); focus_enable = false; } focus.id = V4L2_CID_FOCUS_ABSOLUTE; focus.value = CapParam->focus_position; if (CapParam->focus_position > focus_query.maximum) focus.value = focus_query.maximum; if (CapParam->focus_position < focus_query.minimum) focus.value = focus_query.minimum; } if (device_setctrl(cap_info.subdev_fd, &vblank) < 0) { LOG_ERROR(" set vblank result failed to device\n"); ret_status = RES_FAILED; } if (device_setctrl(cap_info.subdev_fd, &exp) < 0) { LOG_ERROR(" set exposure result failed to device\n"); ret_status = RES_FAILED; } if (device_setctrl(cap_info.subdev_fd, &gain) < 0) { LOG_ERROR(" set gain result failed to device\n"); ret_status = RES_FAILED; } if (focus_enable) { if (device_setctrl(cap_info.lensdev_fd, &focus) < 0) { LOG_ERROR(" set focus result failed to device\n"); ret_status = RES_FAILED; } } } strncpy((char*)cmd->RKID, TAG_DEVICE_TO_PC, sizeof(cmd->RKID)); cmd->cmdType = DEVICE_TO_PC; cmd->cmdID = CMD_ID_CAPTURE_RAW_CAPTURE; cmd->datLen = 2; memset(cmd->dat, 0, sizeof(cmd->dat)); cmd->dat[0] = 0x02; cmd->dat[1] = ret_status; for (int i = 0; i < cmd->datLen; i++) { LOG_DEBUG("data[%d]: 0x%x\n", i, cmd->dat[i]); } cmd->checkSum = 0; for (int i = 0; i < cmd->datLen; i++) { cmd->checkSum += cmd->dat[i]; } LOG_DEBUG("cmd->checkSum %d\n", cmd->checkSum); if (cap_info.subdev_fd > 0) { device_close(cap_info.subdev_fd); cap_info.subdev_fd = -1; } } static void SendRawData(int socket, int index, void* buffer, int size) { LOG_DEBUG("SendRawData\n"); assert(buffer); char* buf = NULL; int total = size; int packet_len = MAXPACKETSIZE; int send_size = 0; int ret_val; uint16_t check_sum = 0; buf = (char*)buffer; while (total > 0) { if (total < packet_len) { send_size = total; } else { send_size = packet_len; } ret_val = send(socket, buf, send_size, 0); total -= send_size; buf += ret_val; } buf = (char*)buffer; for (int i = 0; i < size; i++) { check_sum += buf[i]; } LOG_INFO("capture raw index %d, check_sum %d capture_check_sum %d\n", index, check_sum, capture_check_sum); capture_check_sum = check_sum; } static void DoCaptureCallBack(int socket, int index, void* buffer, int size) { LOG_DEBUG("DoCaptureCallBack size %d\n", size); int width = cap_info.width; int height = cap_info.height; LOG_DEBUG("cap_info.width %d\n", cap_info.width); LOG_DEBUG("cap_info.height %d\n", cap_info.height); if (g_sensorHdrMode == NO_HDR && size > (width * height * 2)) { LOG_ERROR("DoMultiFrameCallBack size error\n"); return; } SendRawData(socket, index, buffer, size); } static void DoCapture(int socket) { LOG_DEBUG("DoCapture entry!!!!!\n"); AutoDuration ad; int skip_frame = 5; if (capture_frames_index == 0) { for (int i = 0; i < skip_frame; i++) { if (i == 0 && cap_info.lhcg != 2) { SetLHcg(cap_info.lhcg); } read_frame(socket, i, &cap_info, nullptr); LOG_DEBUG("DoCapture skip frame %d ...\n", i); } } read_frame(socket, capture_frames_index, &cap_info, DoCaptureCallBack); capture_frames_index++; LOG_INFO("DoCapture %ld ms %ld us\n", ad.Get() / 1000, ad.Get() % 1000); LOG_DEBUG("DoCapture exit!!!!!\n"); } #if DEBUG_RAW void WriteToFile(int index, void* buffer, int size) { std::string path = "/data/frame_"; path.append(std::to_string(index)); path.append(".raw"); std::ofstream ofs(path, std::ios::binary); ofs.write(reinterpret_cast(buffer), size); } #endif static void DoMultiFrameCallBack(int socket, int index, void* buffer, int size) { LOG_DEBUG("DoMultiFrameCallBack index %d buffer %p size %d\n", index, buffer, size); AutoDuration ad; int width = cap_info.width; int height = cap_info.height; if (size > (width * height * 2)) { LOG_ERROR(" DoMultiFrameCallBack size error\n"); return; } #if DEBUG_RAW WriteToFile(index, buffer, size); #endif int offset = (((height / 2) + 10) * width) + (width / 2); DumpRawData((uint16_t*)buffer + offset, size, 2); if (cap_info.link == link_to_vicap) { MultiFrameAddition((uint32_t*)averge_frame0, (uint16_t*)buffer, width, height, false); } else { MultiFrameAddition((uint32_t*)averge_frame0, (uint16_t*)buffer, width, height); } DumpRawData32((uint32_t*)averge_frame0 + offset, size, 2); LOG_DEBUG("index %d MultiFrameAddition %ld ms %ld us\n", index, ad.Get() / 1000, ad.Get() % 1000); ad.Reset(); if (index == (capture_frames - 1)) { MultiFrameAverage(averge_frame0, averge_frame1, width, height, capture_frames); #if DEBUG_RAW WriteToFile(88, averge_frame0, size); WriteToFile(89, averge_frame1, size); #endif DumpRawData32((uint32_t*)averge_frame0 + offset, size, 2); DumpRawData((uint16_t*)averge_frame1 + offset, size, 2); LOG_DEBUG("index %d MultiFrameAverage %ld ms %ld us\n", index, ad.Get() / 1000, ad.Get() % 1000); ad.Reset(); SendRawData(socket, index, averge_frame1, size); LOG_DEBUG("index %d SendRawData %ld ms %ld us\n", index, ad.Get() / 1000, ad.Get() % 1000); } else if (index == ((capture_frames >> 1) - 1)) { SendRawData(socket, index, buffer, size); LOG_DEBUG("index %d SendRawData %ld ms %ld us\n", index, ad.Get() / 1000, ad.Get() % 1000); } } static int InitMultiFrame() { uint32_t one_frame_size = cap_info.width * cap_info.height * sizeof(uint32_t); averge_frame0 = (uint32_t*)malloc(one_frame_size); memset(averge_frame0, 0, one_frame_size); one_frame_size = one_frame_size >> 1; averge_frame1 = (uint16_t*)malloc(one_frame_size); memset(averge_frame1, 0, one_frame_size); return 0; } static int deInitMultiFrame() { if (averge_frame0 != nullptr) { free(averge_frame0); } if (averge_frame1 != nullptr) { free(averge_frame1); } averge_frame0 = nullptr; averge_frame1 = nullptr; return 0; } static void DoMultiFrameCapture(int socket) { LOG_DEBUG("DoMultiFrameCapture entry!!!!!\n"); AutoDuration ad; int skip_frame = 5; if (capture_frames_index == 0) { for (int i = 0; i < skip_frame; i++) { if (i == 0 && cap_info.lhcg != 2) { SetLHcg(cap_info.lhcg); } read_frame(socket, i, &cap_info, nullptr); LOG_DEBUG("DoCapture skip frame %d ...\n", i); } } if (capture_frames_index == 0) { for (int i = 0; i < (capture_frames >> 1); i++) { read_frame(socket, i, &cap_info, DoMultiFrameCallBack); capture_frames_index++; } } else if (capture_frames_index == (capture_frames >> 1)) { for (int i = (capture_frames >> 1); i < capture_frames; i++) { read_frame(socket, i, &cap_info, DoMultiFrameCallBack); capture_frames_index++; } } LOG_INFO("DoMultiFrameCapture %ld ms %ld us\n", ad.Get() / 1000, ad.Get() % 1000); LOG_DEBUG("DoMultiFrameCapture exit!!!!!\n"); } static void DumpCapinfo() { LOG_INFO("DumpCapinfo: \n"); LOG_INFO(" dev_name ------------- %s\n", cap_info.dev_name); LOG_INFO(" dev_fd --------------- %d\n", cap_info.dev_fd); LOG_INFO(" io ------------------- %d\n", cap_info.io); LOG_INFO(" width ---------------- %d\n", cap_info.width); LOG_INFO(" height --------------- %d\n", cap_info.height); LOG_INFO(" format --------------- %d\n", cap_info.format); LOG_INFO(" capture_buf_type ----- %d\n", cap_info.capture_buf_type); LOG_INFO(" out_file ------------- %s\n", cap_info.out_file); LOG_INFO(" frame_count ---------- %d\n", cap_info.frame_count); } static int StartCapture() { LOG_DEBUG("enter\n"); init_device(&cap_info); DumpCapinfo(); start_capturing(&cap_info); if (capture_mode != CAPTURE_NORMAL) { InitMultiFrame(); } LOG_DEBUG("exit\n"); return 0; } static int StopCapture() { LOG_DEBUG("enter\n"); stop_capturing(&cap_info); uninit_device(&cap_info); RawCaptureDeinit(); if (capture_mode != CAPTURE_NORMAL) { deInitMultiFrame(); } LOG_DEBUG("exit\n"); return 0; } static void RawCaputure(CommandData_t* cmd, int socket) { LOG_DEBUG("enter\n"); LOG_DEBUG("capture_frames %d capture_frames_index %d\n", capture_frames, capture_frames_index); if (capture_frames_index == 0) { StartCapture(); } if (capture_mode == CAPTURE_NORMAL) { DoCapture(socket); } else { DoMultiFrameCapture(socket); } if (capture_frames_index == capture_frames) { StopCapture(); } LOG_DEBUG("exit\n"); } static void SendRawDataResult(CommandData_t* cmd, CommandData_t* recv_cmd) { unsigned short* checksum; checksum = (unsigned short*)&recv_cmd->dat[1]; strncpy((char*)cmd->RKID, TAG_DEVICE_TO_PC, sizeof(cmd->RKID)); cmd->cmdType = DEVICE_TO_PC; cmd->cmdID = CMD_ID_CAPTURE_RAW_CAPTURE; cmd->datLen = 2; memset(cmd->dat, 0, sizeof(cmd->dat)); cmd->dat[0] = 0x04; LOG_DEBUG("capture_check_sum %d, recieve %d\n", capture_check_sum, *checksum); if (capture_check_sum == *checksum) { cmd->dat[1] = RES_SUCCESS; } else { cmd->dat[1] = RES_FAILED; StopCapture(); } cmd->checkSum = 0; for (int i = 0; i < cmd->datLen; i++) { cmd->checkSum += cmd->dat[i]; } } static void DoAnswer(int sockfd, CommandData_t* cmd, int cmd_id, int ret_status) { char send_data[MAXPACKETSIZE]; LOG_DEBUG("enter\n"); strncpy((char*)cmd->RKID, RKID_ISP_ON, sizeof(cmd->RKID)); cmd->cmdType = CMD_TYPE_CAPTURE; cmd->cmdID = cmd_id; strncpy((char*)cmd->version, RKAIQ_TOOL_VERSION, sizeof(cmd->version)); cmd->datLen = 4; memset(cmd->dat, 0, sizeof(cmd->dat)); cmd->dat[0] = ret_status; cmd->checkSum = 0; for (int i = 0; i < cmd->datLen; i++) { cmd->checkSum += cmd->dat[i]; } memcpy(send_data, cmd, sizeof(CommandData_t)); send(sockfd, send_data, sizeof(CommandData_t), 0); LOG_DEBUG("exit\n"); } static void DoAnswer2(int sockfd, CommandData_t* cmd, int cmd_id, uint16_t check_sum, uint32_t result) { char send_data[MAXPACKETSIZE]; LOG_DEBUG("enter\n"); strncpy((char*)cmd->RKID, RKID_ISP_ON, sizeof(cmd->RKID)); cmd->cmdType = CMD_TYPE_CAPTURE; cmd->cmdID = cmd_id; strncpy((char*)cmd->version, RKAIQ_TOOL_VERSION, sizeof(cmd->version)); cmd->datLen = 4; memset(cmd->dat, 0, sizeof(cmd->dat)); cmd->dat[0] = result; cmd->dat[1] = check_sum & 0xFF; cmd->dat[2] = (check_sum >> 8) & 0xFF; cmd->checkSum = 0; for (int i = 0; i < cmd->datLen; i++) { cmd->checkSum += cmd->dat[i]; } memcpy(send_data, cmd, sizeof(CommandData_t)); send(sockfd, send_data, sizeof(CommandData_t), 0); LOG_DEBUG("exit\n"); } static void OnLineSet(int sockfd, CommandData_t* cmd, uint16_t& check_sum, uint32_t& result) { int recv_size = 0; int param_size = *(int*)cmd->dat; int remain_size = param_size; LOG_DEBUG("enter\n"); LOG_DEBUG("expect recv param_size 0x%x\n", param_size); char* param = (char*)malloc(param_size); while (remain_size > 0) { int offset = param_size - remain_size; recv_size = recv(sockfd, param + offset, remain_size, 0); remain_size = remain_size - recv_size; } LOG_DEBUG("recv ready\n"); for (int i = 0; i < param_size; i++) { check_sum += param[i]; } LOG_DEBUG("DO Sycn Setting, CmdId: 0x%x, expect ParamSize %d\n", cmd->cmdID, param_size); #if 0 if (rkaiq_manager) { result = rkaiq_manager->IoCtrl(cmd->cmdID, param, param_size); } #endif if (param != NULL) { free(param); } LOG_DEBUG("exit\n"); } void RKAiqRawProtocol::HandlerRawCapMessage(int sockfd, char* buffer, int size) { CommandData_t* common_cmd = (CommandData_t*)buffer; CommandData_t send_cmd; char send_data[MAXPACKETSIZE]; int ret_val, ret; LOG_DEBUG("HandlerRawCapMessage:\n"); // for (int i = 0; i < common_cmd->datLen; i++) { // LOG_DEBUG("DATA[%d]: 0x%x\n", i, common_cmd->dat[i]); // } // if (strcmp((char *)common_cmd->RKID, TAG_PC_TO_DEVICE) == 0) { // LOG_DEBUG("RKID: %s\n", common_cmd->RKID); // } else { // LOG_DEBUG("RKID: Unknow\n"); // return; // } if (common_cmd->cmdType == CMD_TYPE_CAPTURE) { RKAiqProtocol::DoChangeAppMode(APP_RUN_STATUS_CAPTURE); LOG_DEBUG("cmdType: CMD_TYPE_CAPTURE\n"); } else if (common_cmd->cmdType == CMD_TYPE_STREAMING) { RKAiqProtocol::DoChangeAppMode(APP_RUN_STATUS_STREAMING); InitCommandStreamingAns(&send_cmd, RES_SUCCESS); send(sockfd, &send_cmd, sizeof(CommandData_t), 0); LOG_DEBUG("cmdType: CMD_TYPE_STREAMING\n"); if (common_cmd->cmdID == 0xffff) { uint16_t check_sum; uint32_t result; DoAnswer(sockfd, &send_cmd, common_cmd->cmdID, READY); OnLineSet(sockfd, common_cmd, check_sum, result); DoAnswer2(sockfd, &send_cmd, common_cmd->cmdID, check_sum, result ? RES_FAILED : RES_SUCCESS); return; } } else { LOG_DEBUG("cmdType: Unknow %x\n", common_cmd->cmdType); return; } LOG_DEBUG("cmdID: %x\n", common_cmd->cmdID); switch (common_cmd->cmdID) { case CMD_ID_CAPTURE_STATUS: LOG_DEBUG("CmdID CMD_ID_CAPTURE_STATUS in\n"); if (common_cmd->dat[0] == KNOCK_KNOCK) { InitCommandPingAns(&send_cmd, READY); LOG_DEBUG("Device is READY\n"); } else { LOG_ERROR("Unknow CMD_ID_CAPTURE_STATUS message\n"); } memcpy(send_data, &send_cmd, sizeof(CommandData_t)); send(sockfd, send_data, sizeof(CommandData_t), 0); LOG_DEBUG("cmdID CMD_ID_CAPTURE_STATUS out\n\n"); break; case CMD_ID_CAPTURE_RAW_CAPTURE: { LOG_DEBUG("CmdID RAW_CAPTURE in\n"); char* datBuf = (char*)(common_cmd->dat); switch (datBuf[0]) { case DATA_ID_CAPTURE_RAW_STATUS: LOG_DEBUG("ProcID DATA_ID_CAPTURE_RAW_STATUS in\n"); if (common_cmd->dat[1] == KNOCK_KNOCK) { if (capture_status == RAW_CAP) { LOG_DEBUG("capture_status BUSY\n"); InitCommandRawCapAns(&send_cmd, BUSY); } else { LOG_DEBUG("capture_status READY\n"); InitCommandRawCapAns(&send_cmd, READY); } } else { LOG_ERROR("Unknow DATA_ID_CAPTURE_RAW_STATUS message\n"); } memcpy(send_data, &send_cmd, sizeof(CommandData_t)); send(sockfd, send_data, sizeof(CommandData_t), 0); LOG_DEBUG("ProcID DATA_ID_CAPTURE_RAW_STATUS out\n"); break; case DATA_ID_CAPTURE_RAW_GET_PARAM: LOG_DEBUG("ProcID DATA_ID_CAPTURE_RAW_GET_PARAM in\n"); RawCaptureinit(common_cmd); GetSensorPara(&send_cmd, RES_SUCCESS); LOG_DEBUG("send_cmd.checkSum %d\n", send_cmd.checkSum); memcpy(send_data, &send_cmd, sizeof(CommandData_t)); ret_val = send(sockfd, send_data, sizeof(CommandData_t), 0); LOG_DEBUG("ProcID DATA_ID_CAPTURE_RAW_GET_PARAM out\n"); break; case DATA_ID_CAPTURE_RAW_SET_PARAM: LOG_DEBUG("ProcID DATA_ID_CAPTURE_RAW_SET_PARAM in\n"); SetCapConf(common_cmd, &send_cmd, READY); memcpy(send_data, &send_cmd, sizeof(CommandData_t)); send(sockfd, send_data, sizeof(CommandData_t), 0); LOG_DEBUG("ProcID DATA_ID_CAPTURE_RAW_SET_PARAM out\n"); break; case DATA_ID_CAPTURE_RAW_START: { LOG_DEBUG("ProcID DATA_ID_CAPTURE_RAW_START in\n"); capture_status = RAW_CAP; RawCaputure(&send_cmd, sockfd); capture_status = AVALIABLE; LOG_DEBUG("ProcID DATA_ID_CAPTURE_RAW_START out\n"); break; } case DATA_ID_CAPTURE_RAW_CHECKSUM: LOG_DEBUG("ProcID DATA_ID_CAPTURE_RAW_CHECKSUM in\n"); SendRawDataResult(&send_cmd, common_cmd); memcpy(send_data, &send_cmd, sizeof(CommandData_t)); ret_val = send(sockfd, send_data, sizeof(CommandData_t), 0); LOG_DEBUG("ProcID DATA_ID_CAPTURE_RAW_CHECKSUM out\n"); break; default: break; } LOG_DEBUG("CmdID RAW_CAPTURE out\n\n"); break; } default: break; } }