/* * Battery s_stCharger driver for X-Powers AXP * * Copyright (C) 2013 X-Powers, Ltd. * Zhang Donglu * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. */ #include "kwrap/nvt_type.h" #include #include #define __MODULE__ sf_mcu #define __DBGLVL__ 2 // 0=FATAL, 1=ERR, 2=WRN, 3=UNIT, 4=FUNC, 5=IND, 6=MSG, 7=VALUE, 8=USER #define __DBGFLT__ "*" // *=All, [mark]=CustomClass #include "kwrap/debug.h" //#include #include #include #include "comm/hwclock.h" #include "comm/timer.h" //#include #include #include #include "GxUSB.h" #include #include "FileSysTsk.h" #include #include #include #include #include "PrjCfg.h" #include "sf_battery.h" #include #include #include "sys_fastboot.h" static UINT8 McuSubVersion = 0; static UINT16 McuVersion = 0; static UINT8 DailyReportStartMode = 0; UINT16 IRSHTTER = 0; static UINT8 PowerOnMode = 0; //=>PWR_ON_SETUP static UINT8 POWEROFF = 0; static BOOL ConfigureModeFlag = 0; /* 0: HTC Mode, 1: Nomal Mode */ static UINT8 AeNightMode = 0; /* 0:day 1:night */ //#define printf(fmt, args...) printk(fmt , ## args) static UINT32 simCardInsert=1; static UINT8 gModuleSleep = 1; static UINT32 SmsCheck = 0; //static SF_CAMERA_CMD_S CameraCmd = {0}; static UINT8 McuProductInfo = 0; #if defined(_MODEL_565_HUNTING_EVB_LINUX_4G_68CS_) static UINT8 drNoResetTimeSync = FALSE; //0:reset; 1:no reset; #elif (defined(_MODEL_565_HUNTING_EVB_LINUX_4G_S530_) || defined(_MODEL_565_HUNTING_EVB_LINUX_4G_S550_)) static UINT8 isSignalReady = 0; static UINT32 GPRS_ERRNO = 0; #endif SF_SRCFILE_ATTR_S *pThumbFileCfg = NULL; #if DIGITAL_PIR const UINT8 PirDigtSensRegValue[3] = { 7, 9, 16 }; /*digital Level PIR: 7/9/16 -> reg:9/7/5*/ #else /*analog PIR*/ const UINT8 PirDigtSensLevel[3] = { 0, 1, 2 }; /*analog PIR: High/Middle/Low/OFF*/ #endif const UINT8 digPirLevel[3] = {9, 7, 5}; const UINT8 digPirCount[3] = {1, 1, 0}; #if HUNTING_MCU_I2C == ENABLE static SF_I2C sf_i2c = { SF_I2C_ID_3, MCU_I2C_SLAVE_ADDR }; static INT32 sf_i2c_write(UINT32 addr, UINT32 data) { struct i2c_msg msgs; UINT8 buf[2]; INT32 ret; buf[0] = addr & 0xFF; buf[1] = data & 0xFF; msgs.addr = sf_i2c.addr; msgs.flags = 0;//w msgs.len = 2; msgs.buf = buf; ret = sf_i2c_transfer(&msgs, 1); return ret; } static INT32 sf_i2c_read(UINT32 addr, UINT8 *data) { struct i2c_msg msgs[2]; UINT8 buf[1], buf2[1]; INT32 ret; buf[0] = addr & 0xFF; msgs[0].addr = sf_i2c.addr; msgs[0].flags = 0;//w msgs[0].len = 1; msgs[0].buf = buf; buf2[0] = 0; msgs[1].addr = sf_i2c.addr; msgs[1].flags = 1;//r msgs[1].len = 1; msgs[1].buf = buf2; ret = sf_i2c_transfer(msgs, 2); if (ret == 0) { //OK *data = buf2[0]; } return ret; } UINT8 sf_mcu_read(UINT32 reg, UINT8 *data) { UINT8 data2 = 0; sf_i2c_read(reg, data); //vos_util_delay_us(30); sf_i2c_read(reg, &data2); printf("R_addr[%lu]=0x%02x\n", reg, data2); if(*data != data2) { printf("%s:%d ERROR\n", __FUNCTION__, __LINE__); printf("[ERROR]-[sf_i2c_read]reg:%lu,data:%d,data2:%d\n", reg, *data, data2); vos_util_delay_us(300); sf_i2c_read(reg, data); printf("[ERROR]-[sf_i2c_read]reg:%lu,data3:%d,data2:%d\n", reg, *data, data2); } //vos_util_delay_us(200); return 0; } UINT8 sf_mcu_write(UINT32 reg, UINT32 data) { UINT8 data2 = 0; sf_i2c_write(reg, data); //vos_util_delay_us(20); sf_i2c_read(reg, &data2); printf("W_addr[%lu]=0x%02x\n", reg, data2); if(data != data2) { printf("%s:%d ERROR reg:%lu,data:%lu,data2:%d\n", __FUNCTION__, __LINE__, reg, data, data2); vos_util_delay_us(300); sf_i2c_write(reg, data); } //vos_util_delay_us(200); return 0; } int sf_init_mcu(void) { CHKPNT; INT32 ret = 0; ret = sf_i2c_init_driver(sf_i2c.id); return ret; } UINT8 sf_mcu_write_multi(UINT8 reg[], UINT8 data[], UINT32 num) { UINT32 i; for(i = 0; i < num; i++) { sf_mcu_write(reg[i], data[i]); } return SUCCESS; } /************************************************* Function: sf_mcu_power_on_para_get Description: read MCU register data to update uipara and variable. Input: attrId:which kind of para want to get Output: N/A Return: start mode Others: N/A *************************************************/ UINT8 sf_mcu_power_on_para_get(MCUParam_t attrId) { UINT8 dataTemp1 = 0, dataTemp2 = 0; UINT8 startMode = 0; UINT8 mcuVer = 0; if(attrId != SF_MCU_POWERON) { sf_mcu_read(START_MODE, &dataTemp1); startMode = dataTemp1 & 0x1F; return startMode; } sf_mcu_read(MCU_SUB_VER, &McuSubVersion); #if 0//defined(_MODEL_565_HUNTING_EVB_LINUX_4G_S530_) sf_mcu_read(MCU_VER, &mcuVer); McuVersion = mcuVer; #else sf_mcu_read(MCU_VER_L, &mcuVer); McuVersion = mcuVer; sf_mcu_read(MCU_VER_H, &mcuVer); McuVersion = (UINT16)mcuVer << 8 | McuVersion; sf_mcu_read(MCU_PRODUCT_INFO, &McuProductInfo); #endif sf_mcu_read(START_MODE, &dataTemp1); startMode = dataTemp1 & 0x1F; DailyReportStartMode = (dataTemp1 & 0xc0) >> 6; #if 0 sf_mcu_i2c_read(CAMERA_MODE, &CameraMode); sf_mcu_i2c_read(IRLED_LUMINANCE, &IrLedPercent); #endif sf_mcu_read(LUMINANCE_L, &dataTemp1); sf_mcu_read(LUMINANCE_H, &dataTemp2); IRSHTTER = (dataTemp2 << 8) | dataTemp1; #if defined(_MODEL_565_HUNTING_EVB_LINUX_4G_S530_) if(startMode == PWR_ON_TIME_SYNC) { startMode = PWR_ON_DAILY_REPORT; } else #endif { if(startMode > PWR_ON_TIME_SEND) //if start mode err, USB IN default power on SETUP { startMode = PWR_ON_SETUP; } } printf(" start mode = %d IRSHTTER = %d\n", startMode, IRSHTTER); return startMode; } #else UINT8 sf_mcu_read(UINT32 reg, UINT8 *data) { //UINT8 data2 = 0; *data = sf_commu_get_mcu(reg); //vos_util_delay_us(30); //data2 = sf_commu_get_mcu(reg); printf("R_addr[%lu]=0x%02x\n", reg, *data); /*if(*data != data2) { printf("%s:%d ERROR\n", __FUNCTION__, __LINE__); printf("[ERROR]-[sf_i2c_read]reg:%lu,data:%d,data2:%d\n", reg, *data, data2); vos_util_delay_us(300); *data = sf_commu_get_mcu(reg); printf("[ERROR]-[sf_i2c_read]reg:%lu,data3:%d,data2:%d\n", reg, *data, data2); }*/ //vos_util_delay_us(200); return 0; } UINT8 sf_mcu_write(UINT32 reg, UINT32 data) { //UINT8 data2 = 0; sf_commu_set_mcu(reg, data); //vos_util_delay_us(20); printf("W_addr[%lu]=0x%lu\n", reg, data); /*data2 = sf_commu_get_mcu(reg); printf("W_addr[%lu]=0x%02x\n", reg, data2); if(data != data2) { printf("%s:%d ERROR reg:%lu,data:%lu,data2:%d\n", __FUNCTION__, __LINE__, reg, data, data2); vos_util_delay_us(300); sf_commu_set_mcu(reg, data); }*/ //vos_util_delay_us(200); return 0; } int sf_init_mcu(void) { CHKPNT; ER ret = 0; UART_INIT_PARA UartParaBasic; UartParaBasic.BaudRate = UART_BAUDRATE_115200; UartParaBasic.BaudRate = 115200; UartParaBasic.Length = UART_LEN_L8_S1; UartParaBasic.Parity = UART_PARITY_NONE; UartParaBasic.FlowCtrlMode = UART_FC_MODE_NONE; UartParaBasic.DataTransMode = UART_DATA_TRANS_PIO; //uart3_setConfig(UART_CONFIG_ID_RX_TRIGGER_LEVEL,0x0); ret = uart3_open(); uart3_initHW(&UartParaBasic); uart3_setConfig(UART_CONFIG_ID_RX_TRIGGER_LEVEL,0x0); /*UART_DATA_PARA DataPara; DataPara.Action = UART_ACT_GET; DataPara.BufferInfo.uiSize = 64; DataPara.BufferInfo.pBuffer = getbuffer; ret = uart3_operateData(&DataPara);*/ return ret; } UINT8 sf_mcu_write_multi(UINT8 reg[], UINT8 data[], UINT32 num) { UINT32 i; unsigned int pnum = num; if(0 <= sf_commu_set_mcu_many(reg, data, &pnum)) { for(i = 0; i < num; i++) { printf("W_addr[%d]=0x%02x\n", reg[i], data[i]); } return SUCCESS; } return FAIL; } UINT8 sf_mcu_read_multi(UINT8 reg[], UINT8 data[], UINT32 num) { UINT32 i; unsigned int pnum = num; if(0 <= sf_commu_get_mcu_many(reg, data, &pnum)) { for(i = 0; i < num; i++) { printf("R_addr[%d]=0x%02x\n", reg[i], data[i]); } return SUCCESS; } return FAIL; } /************************************************* Function: sf_mcu_power_on_para_get Description: read MCU register data to update uipara and variable. Input: attrId:which kind of para want to get Output: N/A Return: start mode Others: N/A *************************************************/ UINT8 sf_mcu_power_on_para_get(MCUParam_t attrId) { UINT8 dataTemp1 = 0;//, dataTemp2 = 0 UINT8 startMode = 0; //UINT8 mcuVer = 0; UINT8 mcuReg[REG_SIZE] = { 0 }; UINT8 mcuData[REG_SIZE] = { 0 }; UINT8 i = 0; if(attrId != SF_MCU_POWERON) { mcuReg[i++] = START_MODE; sf_mcu_read_multi(mcuReg, mcuData, i); i = 0; dataTemp1 = mcuData[i++]; startMode = dataTemp1 & 0xF; DailyReportStartMode = (dataTemp1 & 0xc0) >> 6; #if defined(_MODEL_565_HUNTING_EVB_LINUX_4G_S530_) /*if(startMode == PWR_ON_TIME_SYNC) { startMode = PWR_ON_DAILY_REPORT; } else */ #endif // { // if(startMode > PWR_ON_MCU_UPDATA) //if start mode err, USB IN default power on SETUP // { // startMode = PWR_ON_SETUP; // } // } printf(" start mode = %d \n", startMode); return startMode; } mcuReg[i++] = MCU_SUB_VER; mcuReg[i++] = MCU_VER_L; mcuReg[i++] = MCU_VER_H; mcuReg[i++] = MCU_PRODUCT_INFO; //mcuReg[i++] = START_MODE; //mcuReg[i++] = LUMINANCE_L; //mcuReg[i++] = LUMINANCE_H; sf_mcu_read_multi(mcuReg, mcuData, i); i = 0; McuSubVersion = mcuData[i++]; McuVersion = mcuData[i++]; McuVersion = (UINT16)mcuData[i++] << 8 | McuVersion; McuProductInfo = mcuData[i++]; //dataTemp1 = mcuData[i++]; //startMode = dataTemp1 & 0x1F; //DailyReportStartMode = (dataTemp1 & 0xc0) >> 6; //dataTemp1= mcuData[i++]; //dataTemp2 = mcuData[i++]; //IRSHTTER = (dataTemp2 << 8) | dataTemp1; #if 0 sf_mcu_read(MCU_SUB_VER, &McuSubVersion); #if 0//defined(_MODEL_565_HUNTING_EVB_LINUX_4G_S530_) sf_mcu_read(MCU_VER, &mcuVer); McuVersion = mcuVer; #else sf_mcu_read(MCU_VER_L, &mcuVer); McuVersion = mcuVer; sf_mcu_read(MCU_VER_H, &mcuVer); McuVersion = (UINT16)mcuVer << 8 | McuVersion; sf_mcu_read(MCU_PRODUCT_INFO, &McuProductInfo); #endif sf_mcu_read(START_MODE, &dataTemp1); startMode = dataTemp1 & 0x1F; DailyReportStartMode = (dataTemp1 & 0xc0) >> 6; #if 0 sf_mcu_i2c_read(CAMERA_MODE, &CameraMode); sf_mcu_i2c_read(IRLED_LUMINANCE, &IrLedPercent); #endif sf_mcu_read(LUMINANCE_L, &dataTemp1); sf_mcu_read(LUMINANCE_H, &dataTemp2); IRSHTTER = (dataTemp2 << 8) | dataTemp1; #endif /* #if defined(_MODEL_565_HUNTING_EVB_LINUX_4G_S530_) if(startMode == PWR_ON_TIME_SYNC) { startMode = PWR_ON_DAILY_REPORT; } else #endif { if(startMode > PWR_ON_TIME_SEND) //if start mode err, USB IN default power on SETUP { startMode = PWR_ON_SETUP; } } printf(" start mode = %d \n", startMode); */ //printf(" start mode = %d IRSHTTER = %d\n", startMode, IRSHTTER); sf_get_mcu_rtc_set_sys(); return startMode; } /************************************************* Function: sf_get_mcu_rtc_set_sys Description: get mcu rtc,set to sys Input: N/A Output: N/A Return: N/A Others: N/A *************************************************/ UINT8 sf_get_mcu_rtc_set_sys(void) { UINT8 mcuReg[REG_SIZE] = { 0 }; UINT8 mcuData[REG_SIZE] = { 0 }; UINT8 i = 0; UINT16 year; UINT16 mon; UINT16 day; UINT16 hour; UINT16 min; UINT16 sec; struct tm Curr_DateTime = {0}; mcuReg[i++] = SF_RTC_YEAR; mcuReg[i++] = SF_RTC_MONTH; mcuReg[i++] = SF_RTC_DAY; mcuReg[i++] = SF_RTC_HOUR; mcuReg[i++] = SF_RTC_MINUTE; mcuReg[i++] = SF_RTC_SEC; sf_mcu_read_multi(mcuReg, mcuData, i); i = 0; year = mcuData[i++] + 2000; mon = mcuData[i++]; day = mcuData[i++]; hour = mcuData[i++]; min = mcuData[i++]; sec = mcuData[i++]; if(sec == 0) { i = 0; mcuReg[i++] = SF_RTC_YEAR; mcuReg[i++] = SF_RTC_MONTH; mcuReg[i++] = SF_RTC_DAY; mcuReg[i++] = SF_RTC_HOUR; mcuReg[i++] = SF_RTC_MINUTE; mcuReg[i++] = SF_RTC_SEC; sf_mcu_read_multi(mcuReg, mcuData, i); i = 0; year = mcuData[i++] + 2000; mon = mcuData[i++]; day = mcuData[i++]; hour = mcuData[i++]; min = mcuData[i++]; sec = mcuData[i++]; } printf("%s:%d %d : %d : %d : %d : %d : %d\n", __FUNCTION__, __LINE__,year, mon,day,hour,min,sec); if((year >= SF_DATE_TIME_YEAR_MIN) && (year <= SF_DATE_TIME_YEAR_MAX) && (mon <= 12) && (day <= 31) && (hour < 24) && (min < 60) && (sec < 60)) { Curr_DateTime.tm_year = year; Curr_DateTime.tm_mon = mon; Curr_DateTime.tm_mday = day; Curr_DateTime.tm_hour = hour; Curr_DateTime.tm_min = min; Curr_DateTime.tm_sec = sec; hwclock_set_time(TIME_ID_CURRENT, *(struct tm*)&Curr_DateTime, 0); return SUCCESS; } return FAIL; } #endif int sf_off_mcu(void) { #if HUNTING_MCU_I2C != ENABLE uart3_close(); #endif return 0; } /************************************************* Function: sf_get_daily_report_start_mode Description: get dailyreport start mode Input: N/A Output: N/A Return: 0:ON mode 1:OFF mode Others: N/A *************************************************/ UINT8 sf_get_daily_report_start_mode(void) { return DailyReportStartMode; } UINT8 sf_mcu_wdg_set(UINT8 value) { UINT8 i = 0; UINT8 mcuReg[2] = {0}; UINT8 mcuPara[2] = {0}; printf("%s:%d s\n",__FUNCTION__,__LINE__); mcuReg[i] = WDT_TIME; mcuPara[i++] = value; mcuReg[i] = DSP_WRITE_FLG; mcuPara[i++] = 1; sf_mcu_write_multi(mcuReg, mcuPara, i); printf("%s:%d e\n",__FUNCTION__,__LINE__); return SUCCESS; } void sf_set_sim_insert(UINT32 sim) { simCardInsert = sim; } UINT32 sf_get_sim_insert(void) { return simCardInsert; } #if defined(_MODEL_565_HUNTING_EVB_LINUX_4G_68CS_) /************************************************* Function: sf_mcu_version_get Description: get mcu ver Input: N/A Output: ver str Return: N/A Others: N/A *************************************************/ void sf_mcu_version_get(UINT8 *mcuVer) { UINT8 str[10] = { 0 }; if(McuProductInfo == 1) { sprintf((char *)str, "SYAM"); } else if(McuProductInfo == 2) { sprintf((char *)str, "SYM"); } else { sprintf((char *)str, "SYPM"); } sprintf((char *)mcuVer, "%s%d.%d.%d", str, (McuVersion >> 8) & 0xFF, McuVersion & 0xFF, McuSubVersion); } #endif /************************************************* Function: sf_mcu_module_off Description: power off module Input: N/A Output: N/A Return: N/A Others: N/A *************************************************/ UINT8 sf_mcu_module_off(void) { UINT8 i = 0; UINT8 mcuReg[2] = { 0 }; UINT8 mcuPara[2] = { 0 }; mcuReg[i] = ANALOG_PIR_SENSITIVITY; mcuPara[i++] = 0x00; mcuReg[i] = DSP_WRITE_FLG; mcuPara[i++] = 1; sf_mcu_write_multi(mcuReg, mcuPara, i); return SUCCESS; } UINT8 sf_convert_power_on_mode(void) { PowerOnMode &= 0x0f; //printf("[%s:%d]PowerOnMode=0x%x\n",__FUNCTION__,__LINE__,PowerOnMode); return PowerOnMode; } UINT8 sf_get_power_off_flag(void) { //printf("[%s:%d]POWEROFF=0x%x\n", __FUNCTION__, __LINE__, POWEROFF); return POWEROFF; } void sf_set_power_off_flag(UINT8 flag) { POWEROFF = flag; } /************************************************* Function: sf_get_power_on_mode Description: get power start mode Input: N/A Output: N/A Return: 0:ON mode 1:OFF mode Others: N/A *************************************************/ UINT8 sf_get_power_on_mode(void) { static int ModeFlag = 1; if(ModeFlag) { ModeFlag = 0; if(gpio_getIntStatus(GPIO_INT_USBPLUGIN)) { PowerOnMode = PWR_ON_USB; ConfigureModeFlag = 1; } else{ //PowerOnMode = sf_mcu_power_on_para_get(SF_MCU_POWERON); PowerOnMode = sf_mcu_power_on_para_get(SF_MCU_STARTMODE); //PowerOnMode &= 0x0f; //sf_is_night_mode(1); if((PWR_ON_SETUP == PowerOnMode) || (PWR_ON_MCU_UPDATA == PowerOnMode) || (PWR_OFF == PowerOnMode)) { ConfigureModeFlag = 1; } } } return PowerOnMode; } /************************************************* Function: sf_is_night_mode Description: whether or not night mode Input: isRefresh: 1:refresh 0:unrefresh Output: N/A Return: TRUE:night mode; FALSE:day mode Others: N/A *************************************************/ BOOL sf_is_night_mode(BOOL isRefresh) { static BOOL nightMode = FALSE; static BOOL nightModeFlag = FALSE; if(sf_get_mode_flag()) //setup always use new status { return AeNightMode; } else if(isRefresh) { if((TRUE != nightModeFlag) && (0 == IRSHTTER)) { sf_mcu_get_irshtter(); nightModeFlag = TRUE; } if(IRSHTTER < SF_MCU_NIGHT_MODE_LUMINANCE) { nightMode = TRUE; } else { nightMode = FALSE; } } //printf("[%s:%d]nightMode=%d\n",__FUNCTION__,__LINE__,nightMode); return nightMode; } UINT32 sf_get_send_pic_sieze(void) { UINT32 SendPicSize = 0; if(sf_is_night_mode(0) != TRUE) { SendPicSize = 1; } return SendPicSize; } UINT32 sf_gpio_get_status(UINT32 ipin) { //printf("%s(%d) ipin:%d\n", __FUNCTION__, __LINE__,ipin); gpio_direction_input(ipin); return (UINT32) ((gpio_get_value(ipin) == 1) ? 1 : 0 ); } UINT32 sf_in_update(void) { /* int i = 0; if((sf_gpio_get_status(GPIO_KEY_TEST)) && (PWR_ON_SETUP == sf_get_power_on_mode())) { while((sf_gpio_get_status(GPIO_KEY_TEST)) && (10 > i)) { i++; vos_util_delay_us(100); } if(10 <= i) { return 1; } }*/ return 0; } UINT32 sf_in_mcu_update(void) { int i = 0; if((sf_gpio_get_status(GPIO_KEY_DOWN)) && (PWR_ON_SETUP == sf_get_power_on_mode())) { while((sf_gpio_get_status(GPIO_KEY_DOWN)) && (10 > i)) { i++; vos_util_delay_us(100); } if(10 <= i) { return 1; } } if(PWR_ON_MCU_UPDATA == sf_get_power_on_mode()) { return 1; } return 0; } /************************************************* Function: sf_mcu_dataready_get Description: Input: attrId:which kind of para want to get Output: N/A Return: N/A Others: N/A *************************************************/ void sf_mcu_dataready_get(void) { #if 0 UINT8 startMode = 0; startMode = sf_mcu_power_on_para_get(SF_MCU_STARTMODE); printf("startMode=%d\n", startMode); if(GxUSB_GetIsUSBPlug())//sf_gpio_get_status(GPIO_INT_USBPLUGIN)) { return; } if(sf_get_mode_flag()) { if(startMode == 0) //OFF { sf_set_power_off_flag(1); gModuleSleep = 0; //LCD_BACKLIGHT_OFF; //profLogPrintf(0,"[sf_mcu_dataready_get],APP_POWER_OFF_NORMAL"); printf("[power off] %s(%d)\n", __FUNCTION__, __LINE__); Ux_PostEvent(NVTEVT_SYSTEM_SHUTDOWN, 1, 0); //shutdown start } else if(startMode == 1) //SETUP { /*exit pir mode*/ } else if(startMode == 3) //ON { sf_set_auto_off_time(0); sf_set_pir_statu_flag(1); printf("%s:%d-------PIR Key Pressed.------\n", __FUNCTION__, __LINE__); //Ux_PostEvent(NVTEVT_SYSTEM_SHUTDOWN, 1, 0); //shutdown start } } else { if((startMode == 0) || (startMode == 1)) //PIR MODE: ON->OFF/ ON->SETUP { gModuleSleep = 0; //power off 4G module sf_set_power_off_flag(1); printf("[power off] %s(%d)\n", __FUNCTION__, __LINE__); Ux_PostEvent(NVTEVT_SYSTEM_SHUTDOWN, 1, 0); //shutdown start } } #endif } #if defined(_MODEL_565_HUNTING_EVB_LINUX_4G_68CS_) /************************************************* Function: sf_mcu_reg_set Description: set data to MCU Input: attrId:which kind of para want to get Output: N/A Return: N/A Others: N/A *************************************************/ UINT8 sf_mcu_reg_set(MCUParam_t attrId, UINT8 val) { UINT8 mcuReg[REG_SIZE] = { 0 }; UINT8 mcuData[REG_SIZE] = { 0 }; UINT8 i = 0; //UINT8 j = 0; UINT8 temp = 0; UINT8 paraSyncFlag = 0; UINT8 gpsAlwaysFlag = 0; UINT8 PowerOnMode = 0; UINT8 DailyHour = 0; UINT8 DailyMin = 0; printf("Firmware compile time:%s %s VER:%s\n", __DATE__, __TIME__,SF_BASE_VERSION); UIMenuStoreInfo *puiPara = sf_ui_para_get(); PowerOnMode = sf_get_power_on_mode(); gpsAlwaysFlag = gpsAlwaysFlag; if(attrId > SF_MCU_PARAM_MAX) { printf("%s:%d attrId ERROR!\n", __FUNCTION__, __LINE__); return FAIL; } printf("%s:%d attrId=%d val=%d\n", __FUNCTION__, __LINE__, attrId, val); //4G if((simCardInsert) && (1 == SysGetFlag(NeedTimeSyncStartUp))) { paraSyncFlag = 1; } if(attrId == SF_MCU_POWEROFF) { struct tm ctv = {0}; ctv = hwclock_get_time(TIME_ID_CURRENT); /*if(ctv.tm_year < DEFAULT_YEAR) { ctv.tm_year = DEFAULT_YEAR; ctv.tm_mon = DEFAULT_MON; ctv.tm_mday = DEFAULT_DAY; ctv.tm_hour = DEFAULT_HOUR; ctv.tm_min = DEFAULT_MIN; ctv.tm_sec = DEFAULT_SEC; hwclock_set_time(TIME_ID_CURRENT, ctv, 0); }*/ mcuReg[i] = SF_RTC_YEAR; mcuData[i++] = ctv.tm_year - 2000; mcuReg[i] = SF_RTC_MONTH; mcuData[i++] = ctv.tm_mon; mcuReg[i] = SF_RTC_DAY; mcuData[i++] = ctv.tm_mday; mcuReg[i] = SF_RTC_HOUR; mcuData[i++] = ctv.tm_hour; mcuReg[i] = SF_RTC_MINUTE; mcuData[i++] = ctv.tm_min; mcuReg[i] = SF_RTC_SEC; mcuData[i++] = ctv.tm_sec; gpsAlwaysFlag = 0; if(1 == SysGetFlag(PirSwitch)) { temp = 0x01; } else { temp = 0x00; } if(1 == SysGetFlag(TimelapseSwitch)) { temp |= 0x02; } if(1 == SysGetFlag(PirDelaySwitch)) { temp |= 0x04; } printf("[%s:%d]paraSyncFlag=%d\n", __FUNCTION__, __LINE__, paraSyncFlag); if(paraSyncFlag) { temp |= 0x08; } if(((simCardInsert) && (1 == SysGetFlag(GprsMode))) || (1 == SysGetFlag(DailyReportSwitch))) //dailyreport open { temp |= 0x10; } else { temp &= ~0x10; } mcuReg[i] = FUNCTION_SWTICH0; mcuData[i++] = temp; temp = 0; if((1 == SysGetFlag(GpsSwitch)) && (sf_get_mode_flag() || paraSyncFlag)) { mcuReg[i] = GPS_POWER_TIMER_CLEAR; mcuData[i++] = 1; mcuReg[i] = GPS_POWER_CTRL; mcuData[i++] = 1; } else { mcuReg[i] = GPS_POWER_CTRL; mcuData[i++] = 0; } printf("PirSensitivity:%lu\n", SysGetFlag(PirSensitivity)); mcuReg[i] = ANALOG_PIR_SENSITIVITY; temp = SysGetFlag(PirSensitivity); printf("[%s:%d] GprsMode=%lu,gModuleSleep=%d,NetWorkNeedSearch=%lu\n", __FUNCTION__, __LINE__, SysGetFlag(GprsMode), gModuleSleep, SysGetFlag(NetWorkNeedSearch)); if(simCardInsert && (SysGetFlag(NetWorkNeedSearch))) { //4.0PCG, first to PIR mode, will power on in A,search net. so 4G mode should power down //instant mode ,dp power on, 4G mode should power down temp &= ~0x60; /*bit5&bit6=0,daily mode*/ } else if(simCardInsert && (1 == SysGetFlag(GprsMode)) && gModuleSleep) { temp |= 0x40; /*bit6=1,instant mode*/ } else if(simCardInsert && (0 == SysGetFlag(GprsMode)) && gModuleSleep) { temp |= 0x20; /*bit5=1,hybrid mode*/ } printf("[%s:%d]drNoResetTimeSync=%d\n", __FUNCTION__, __LINE__, drNoResetTimeSync); if((PowerOnMode == PWR_ON_AUTO) || (PowerOnMode == PWR_ON_SETUP) || (PowerOnMode == PWR_ON_GPRS_INIT) || ((PowerOnMode == PWR_ON_DAILY_REPORT) && (drNoResetTimeSync != TRUE))) { temp |= 0x10; /*bit4 rest*/ } if(SysGetFlag(GprsSwitch) && (simCardInsert)) { temp |= 0x80; } mcuData[i++] = temp; #if DIGITAL_PIR mcuReg[i] = DIGITAL_PIR_SENSITIVITY; mcuData[i++] = PirDigtSensRegValue[SysGetFlag(PirSensitivity)]; mcuReg[i] = DIGITAL_PIR_CFG; mcuData[i++] = (0 << 4)| (PirDigtSensRegValue[SysGetFlag(PirSensitivity)] <= 10 ? 1 : 0); #endif //DSP busy/idle mcuReg[i] = DSP_BUSY_STATUS; mcuData[i++] = 0; mcuReg[i] = SF_SYS_STATUS; mcuData[i++] = sf_is_usb_flag() << 2 | sf_is_card_full() << 1 | sf_in_card_exist() << 0; temp = 0; if(simCardInsert && (SysGetFlag(NetWorkNeedSearch)) && ((PowerOnMode == PWR_ON_AUTO) || (PowerOnMode == PWR_ON_SETUP) || (PowerOnMode == PWR_ON_DAILY_REPORT)))/* SET->ON, OFF->ON*/ { temp = 1; } /*else if(simCardInsert && (TRUE == sf_get_net_reboot()))//reboot net { temp = 1; }*/ else if(SmsCheck) { temp = 2; } mcuReg[i] = POWEROFF_TYPE; mcuData[i++] = (0) << 7 | (val == APP_POWER_OFF_BATT_EMPTY) << 6 | (val == APP_POWER_OFF_APO) << 6 | temp; //battery recovery mcuReg[i] = VBAT_RECOVER_VAL; if(SF_BATT_LI == SysGetFlag(BatteryType)) { mcuData[i++] = SF_LI_BATT_RECOVERY; } else { mcuData[i++] = SF_OTHER_BATT_RECOVERY; } if(SysGetFlag(TimelapseSwitch)) { mcuReg[i] = TIMELAPSE_HOUR; mcuData[i++] = puiPara->TimelapseTime.Hour; mcuReg[i] = TIMELAPSE_MINUTE; mcuData[i++] = puiPara->TimelapseTime.Min; mcuReg[i] = TIMELAPSE_SEC; if((SysGetFlag(TimelapseSwitch)) && (puiPara->TimelapseTime.Hour == 0) && (puiPara->TimelapseTime.Min == 0) && (puiPara->TimelapseTime.Sec == 0)) { mcuData[i++] = 5; } else { mcuData[i++] = puiPara->TimelapseTime.Sec; } } else { mcuReg[i] = TIMELAPSE_HOUR; mcuData[i++] = 0; mcuReg[i] = TIMELAPSE_MINUTE; mcuData[i++] = 0; mcuReg[i] = TIMELAPSE_SEC; mcuData[i++] = 0; } if(SysGetFlag(PirDelaySwitch)) { mcuReg[i] = PIR_DELAY_HOUR; mcuData[i++] = puiPara->PirDelayTime.Hour; mcuReg[i] = PIR_DELAY_MINUTE; mcuData[i++] = puiPara->PirDelayTime.Min; mcuReg[i] = PIR_DELAY_SEC; mcuData[i++] = puiPara->PirDelayTime.Sec; } else { mcuReg[i] = PIR_DELAY_HOUR; mcuData[i++] = 0; mcuReg[i] = PIR_DELAY_MINUTE; mcuData[i++] = 0; mcuReg[i] = PIR_DELAY_SEC; mcuData[i++] = 0; } if(paraSyncFlag) { mcuReg[i] = TIME_SYNC_HOUR; mcuData[i++] = 0; mcuReg[i] = TIME_SYNC_MINUTE; mcuData[i++] = 1; mcuReg[i] = TIME_SYNC_SEC; mcuData[i++] = 30; } printf("end dailyHour:%d,dailyMin:%d\n", puiPara->DailyReportTime.Hour, puiPara->DailyReportTime.Min); //set dr time. sf_calculate_daily_report(&DailyHour, &DailyMin); printf("end dailyHour:%d,dailyMin:%d\n",DailyHour,DailyMin); //rtcTime mcuReg[i] = DAILY_REPORT_HOUR; if(SF_REMOTE_CONTROL_DEALY_24H == SysGetFlag(GprsMode)) { if((ctv.tm_min + DailyMin) == 0) { if((ctv.tm_hour + DailyHour) == 0) { mcuData[i++] = (ctv.tm_hour + DailyHour + 24 - 1)%24; } else { mcuData[i++] = (ctv.tm_hour + DailyHour - 1)%24; } } else { mcuData[i++] = (ctv.tm_hour + DailyHour)%24; } } else { if((ctv.tm_min + DailyMin) >= 60) { mcuData[i++] = (ctv.tm_hour + DailyHour+1)%24; } else { mcuData[i++] = (ctv.tm_hour + DailyHour)%24; } } mcuReg[i] = DAILY_REPORT_MINUTE; if(SF_REMOTE_CONTROL_DEALY_24H == SysGetFlag(GprsMode)) { if((ctv.tm_min + DailyMin) == 0) { mcuData[i++] = (ctv.tm_min + DailyMin + 60 - 1)%60; } else { mcuData[i++] = (ctv.tm_min + DailyMin - 1)%60; } } else { mcuData[i++] = (ctv.tm_min + DailyMin)%60; } if(SysGetFlag(WorkTime1Switch)) { mcuReg[i] = WORKTIME1_SWITCH; mcuData[i++] = 0xFF; mcuReg[i] = WORKTIME1_START_HOUR; mcuData[i++] = puiPara->WorkTime[0].StartTime.Hour; mcuReg[i] = WORKTIME1_START_MINUTE; mcuData[i++] = puiPara->WorkTime[0].StartTime.Min; mcuReg[i] = WORKTIME1_STOP_HOUR; mcuData[i++] = puiPara->WorkTime[0].StopTime.Hour; mcuReg[i] = WORKTIME1_STOP_MINUTE; mcuData[i++] = puiPara->WorkTime[0].StopTime.Min; } else { mcuReg[i] = WORKTIME1_SWITCH; mcuData[i++] = 0; mcuReg[i] = WORKTIME1_START_HOUR; mcuData[i++] = 0; mcuReg[i] = WORKTIME1_START_MINUTE; mcuData[i++] = 0; mcuReg[i] = WORKTIME1_STOP_HOUR; mcuData[i++] = 0; mcuReg[i] = WORKTIME1_STOP_MINUTE; mcuData[i++] = 0; } if(SysGetFlag(WorkTime2Switch)) { mcuReg[i] = WORKTIME2_SWITCH; mcuData[i++] = 0xFF; mcuReg[i] = WORKTIME2_START_HOUR; mcuData[i++] = puiPara->WorkTime[1].StartTime.Hour; mcuReg[i] = WORKTIME2_START_MINUTE; mcuData[i++] = puiPara->WorkTime[1].StartTime.Min; mcuReg[i] = WORKTIME2_STOP_HOUR; mcuData[i++] = puiPara->WorkTime[1].StopTime.Hour; mcuReg[i] = WORKTIME2_STOP_MINUTE; mcuData[i++] = puiPara->WorkTime[1].StopTime.Min; } else { mcuReg[i] = WORKTIME2_SWITCH; mcuData[i++] = 0; mcuReg[i] = WORKTIME2_START_HOUR; mcuData[i++] = 0; mcuReg[i] = WORKTIME2_START_MINUTE; mcuData[i++] = 0; mcuReg[i] = WORKTIME2_STOP_HOUR; mcuData[i++] = 0; mcuReg[i] = WORKTIME2_STOP_MINUTE; mcuData[i++] = 0; } } else if(attrId == SF_MCU_CTRL_MODULE_PIR) { if((SysGetFlag(GpsSwitch))&& (ConfigureModeFlag || paraSyncFlag)) { mcuReg[i] = GPS_POWER_TIMER_CLEAR; mcuData[i++] = 1; mcuReg[i] = GPS_POWER_CTRL; mcuData[i++] = 1; } else { mcuReg[i] = GPS_POWER_CTRL; mcuData[i++] = 0; } mcuReg[i] = ANALOG_PIR_SENSITIVITY; temp = SysGetFlag(PirSensitivity); //sf_mcu_analog_pir_sen_convert(puiPara->PirSensitivity); if(SF_REMOTE_CONTROL_REAL_TIME == SysGetFlag(GprsMode)) //hybrid mode 4G module keep sleep { temp |= 0x40; } if((SysGetFlag(GprsSwitch)) && (val == 1)) { temp |= 0x80; } mcuData[i++] = temp; printf("[%s:%d] temp:0x%02x GprsSwitch:%lu simCardInsert:%lu\n", __FUNCTION__, __LINE__, temp, SysGetFlag(GprsSwitch), simCardInsert); if(ConfigureModeFlag) { mcuReg[i] = DIGITAL_PIR_SENSITIVITY; mcuData[i++] = digPirLevel[SysGetFlag(PirSensitivity)];//PirDigtSensRegValue[SysGetFlag(PirSensitivity)]; mcuReg[i] = DIGITAL_PIR_CFG; mcuData[i++] = (/*SysGetFlag(DigitPirWindowTime)*/0 << 4) | (PirDigtSensRegValue[SysGetFlag(PirSensitivity)] <= 10 ? 1 : 0); } } else if(attrId == SF_MCU_PARA) { if((SysGetFlag(GpsSwitch)) && (ConfigureModeFlag || paraSyncFlag)) { mcuReg[i] = GPS_POWER_TIMER_CLEAR; mcuData[i++] = 1; mcuReg[i] = GPS_POWER_CTRL; mcuData[i++] = 1; } else { mcuReg[i] = GPS_POWER_CTRL; mcuData[i++] = 0; } mcuReg[i] = ANALOG_PIR_SENSITIVITY; temp = SysGetFlag(PirSensitivity); //sf_mcu_analog_pir_sen_convert(puiPara->PirSensitivity); if((SF_REMOTE_CONTROL_REAL_TIME == SysGetFlag(GprsMode)) && (gModuleSleep == 1)) //hybrid mode 4G module keep sleep { temp |= 0x40; } if((SysGetFlag(GprsSwitch)) && (simCardInsert)) { temp |= 0x80; } mcuData[i++] = temp; printf("[%s:%d] temp:0x%02x GprsSwitch:%lu simCardInsert:%lu\n", __FUNCTION__, __LINE__, temp, SysGetFlag(GprsSwitch), simCardInsert); mcuReg[i] = DIGITAL_PIR_SENSITIVITY; mcuData[i++] = digPirLevel[SysGetFlag(PirSensitivity)];//PirDigtSensRegValue[SysGetFlag(PirSensitivity)]; mcuReg[i] = DIGITAL_PIR_CFG; mcuData[i++] = (0 << 4) | (PirDigtSensRegValue[SysGetFlag(PirSensitivity)] <= 10 ? 1 : 0); mcuReg[i] = SF_SYS_STATUS; mcuData[i++] = SysGetFlag(CamArmDiable) << 6 | sf_is_usb_flag() << 2 | sf_is_card_full() << 1 | sf_in_card_exist() << 0; } else if(attrId == SF_MCU_RESET_MODULE) { mcuReg[i] = SF_SYS_STATUS; mcuData[i++] = SysGetFlag(CamArmDiable) << 6 | sf_is_usb_flag() << 2 | sf_is_card_full() << 1 | sf_in_card_exist() << 0 | 0x10; } else if(attrId == SF_MCU_SOFT_UPDATE) { mcuReg[i] = SF_SYS_STATUS; if(val == 1) { mcuData[i++] = SysGetFlag(CamArmDiable) << 6 | sf_is_usb_flag() << 2 | sf_is_card_full() << 1 | sf_in_card_exist() << 0 | 0x08; } else { mcuData[i++] = SysGetFlag(CamArmDiable) << 6 | sf_is_usb_flag() << 2 | sf_is_card_full() << 1 | sf_in_card_exist() << 0; } } else if(attrId == SF_MCU_POWER_RESTART) { mcuReg[i] = SF_SYS_STATUS; mcuData[i++] = SysGetFlag(CamArmDiable) << 6 | sf_is_usb_flag() << 2 | sf_is_card_full() << 1 | sf_in_card_exist() << 0 | 0x20; } else if(attrId == SF_MCU_PIR_RESTART) { mcuReg[i] = SF_SYS_STATUS; mcuData[i++] = SysGetFlag(CamArmDiable) << 6 | sf_is_usb_flag() << 2 | sf_is_card_full() << 1 | sf_in_card_exist() << 0 | 0x80; } mcuReg[i] = DSP_WRITE_FLG; //MCU set end mcuData[i++] = 1; printf("[%s:%d] mcuData[%d]0x%02x\n", __FUNCTION__, __LINE__, (i - 1), mcuData[(i - 1)]); #if 0 if((attrId == SF_MCU_POWEROFF) /*&& puiPara->DebugSwitch && IS_CARD_EXIST*/) { for(j = 0; j < i; j++) { printf("W_addr[%2d]=0x%02x\n", mcuReg[j], mcuData[j]); } //sf_debug_save_log(); } #endif sf_mcu_write_multi(mcuReg, mcuData, i); return SUCCESS; } //#if 1 #elif (defined(_MODEL_565_HUNTING_EVB_LINUX_4G_S530_) || defined(_MODEL_565_HUNTING_EVB_LINUX_4G_S550_)) /************************************************* Function: sf_mcu_analog_pir_sen_convert Description: Analog PIR Sensitivity Convert Input: digPir sensitivity Output: N/A Return: Analog PIR Sensitivity Others: N/A *************************************************/ UINT8 sf_mcu_analog_pir_sen_convert(UINT8 pirs) { UINT8 pirlevel = 0; if(pirs > 6) pirlevel = 0; else if(pirs > 3) pirlevel = 1; else pirlevel = 2; return pirlevel; } /************************************************* Function: sf_mcu_power_on_para_get Description: set data to MCU Input: attrId:which kind of para want to get Output: N/A Return: N/A Others: N/A *************************************************/ UINT8 sf_mcu_reg_set(MCUParam_t attrId, UINT8 val) { unsigned char mcuReg[REG_SIZE] = {0}; unsigned char mcuData[REG_SIZE] = {0}; //unsigned char regsize =0; unsigned char i = 0; unsigned char temp = 0; //unsigned char dailyReportFlag = 1; unsigned char paraSyncFlag = 0; unsigned char gpsAlwaysFlag = 0; //unsigned char DigPirPulseCount = 0; //unsigned char DigPirWindowTime = 0; UIMenuStoreInfo *puiPara = sf_ui_para_get(); //SF_PARA_TIME_S date = { 0 }; UINT8 PowerOnMode = 0; signed int isUsb = 0; signed int isCard = 0; signed int isCardFull = 0; if(attrId != SF_MCU_CTRL_MODULE_PIR)//AND LDS SECTION_01 loading order. { isUsb = sf_is_usb_flag(); isCard = 1;//sf_in_card_exist(); isCardFull = sf_is_card_full(); PowerOnMode = sf_get_power_on_mode(); if(APP_POWER_OFF_BATT_EMPTY == sf_get_power_off_flag()) { val = APP_POWER_OFF_BATT_EMPTY; } } sf_set_sim_insert(1);//Remove hardware detection SIM card printf("Firmware compile time:%s %s VER:%s\n", __DATE__, __TIME__,SF_BASE_VERSION); printf("%s:%d DailyReportSwitch=%d %02d:%02d\n",__FUNCTION__,__LINE__, puiPara->DailyReportSwitch, puiPara->DailyReportTime2.Hour, puiPara->DailyReportTime2.Min); printf("%s:%d isUsb = %d isCard = %d isCardFull = %d val = %d simCardInsert = %ld\n",__FUNCTION__,__LINE__, isUsb, isCard, isCardFull, val, simCardInsert); if (attrId > SF_MCU_PARAM_MAX) { printf("attrId ERROR!\n"); return -1; } if(attrId == SF_MCU_POWEROFF) { if(0 == IRSHTTER) sf_mcu_get_irshtter(); //printf("SynMcuSet = %x\n", statisPara->SynMcuSet); printf("NeedTimeSyncStartUp = %d\n", puiPara->NeedTimeSyncStartUp); if(puiPara->NeedTimeSyncStartUp == 1) { paraSyncFlag = 1; } #if 0 struct tm ctv = {0}; ctv = hwclock_get_time(TIME_ID_CURRENT); printf("%s:%d %d : %d : %d : %d : %d : %d\n", __FUNCTION__, __LINE__,ctv.tm_year, ctv.tm_mon,ctv.tm_mday,ctv.tm_hour,ctv.tm_min,ctv.tm_sec); mcuReg[i] = SF_RTC_YEAR; mcuData[i++] = ctv.tm_year - 2000; mcuReg[i] = SF_RTC_MONTH; mcuData[i++] = ctv.tm_mon; mcuReg[i] = SF_RTC_DAY; mcuData[i++] = ctv.tm_mday; mcuReg[i] = SF_RTC_HOUR; mcuData[i++] = ctv.tm_hour; mcuReg[i] = SF_RTC_MINUTE; mcuData[i++] = ctv.tm_min; mcuReg[i] = SF_RTC_SEC; mcuData[i++] = ctv.tm_sec; #endif if((puiPara->GpsSwitch == 1) && (puiPara->GpsNumber)) { gpsAlwaysFlag=1; } else { gpsAlwaysFlag=0; } if(puiPara->PirSensitivity) temp = 0x01; else temp = 0x00; if(1 == puiPara->TimelapseSwitch) { temp |= 0x02; } if(1 == puiPara->PirDelaySwitch) { temp |= 0x04; } printf("[%s:%d]paraSyncFlag=%d\n", __FUNCTION__, __LINE__, paraSyncFlag); if(paraSyncFlag) { temp |= 0x08; } //if(puiPara->dailyReport) if(/*(puiPara->GpsSwitch) && */(1 == paraSyncFlag)) { temp &= ~0x10; } else if(simCardInsert) //dailyreport alway open { temp |= 0x10; } if(puiPara->TimeSend1Switch == 1) temp |= 0x20; if(puiPara->TimeSend2Switch == 1) temp |= 0x40; if(gpsAlwaysFlag && simCardInsert) temp |= 0x80; temp |= 0x10; mcuReg[i] = FUNCTION_SWTICH0; mcuData[i++] = temp; temp = 0; if(puiPara->TimelapseSwitch) { mcuReg[i] = TIMELAPSE_HOUR; mcuData[i++] = puiPara->TimelapseTime.Hour; mcuReg[i] = TIMELAPSE_MINUTE; mcuData[i++] = puiPara->TimelapseTime.Min; mcuReg[i] = TIMELAPSE_SEC; if((puiPara->TimelapseSwitch) && (puiPara->TimelapseTime.Hour == 0) && (puiPara->TimelapseTime.Min == 0) && (puiPara->TimelapseTime.Sec == 0)) mcuData[i++] = 5; else mcuData[i++] = puiPara->TimelapseTime.Sec; } else { mcuReg[i] = TIMELAPSE_HOUR; mcuData[i++] = 0; mcuReg[i] = TIMELAPSE_MINUTE; mcuData[i++] = 0; mcuReg[i] = TIMELAPSE_SEC; mcuData[i++] = 0; } if(puiPara->PirDelaySwitch) { mcuReg[i] = PIR_DELAY_HOUR; mcuData[i++] = puiPara->PirDelayTime.Hour; mcuReg[i] = PIR_DELAY_MINUTE; mcuData[i++] = puiPara->PirDelayTime.Min; mcuReg[i] = PIR_DELAY_SEC; mcuData[i++] = puiPara->PirDelayTime.Sec; } else { mcuReg[i] = PIR_DELAY_HOUR; mcuData[i++] = 0; mcuReg[i] = PIR_DELAY_MINUTE; mcuData[i++] = 0; mcuReg[i] = PIR_DELAY_SEC; mcuData[i++] = 0; } if(paraSyncFlag) { mcuReg[i] = TIME_SYNC_HOUR; mcuData[i++] = 0; mcuReg[i] = TIME_SYNC_MINUTE; mcuData[i++] = 1; mcuReg[i] = TIME_SYNC_SEC; mcuData[i++] = 30; } if(puiPara->DailyReportSwitch) { mcuReg[i] = DAILY_REPORT_HOUR; mcuData[i++] = puiPara->DailyReportTime2.Hour; mcuReg[i] = DAILY_REPORT_MINUTE; mcuData[i++] = puiPara->DailyReportTime2.Min; } else { mcuReg[i] = DAILY_REPORT_HOUR; mcuData[i++] =0; mcuReg[i] = DAILY_REPORT_MINUTE; mcuData[i++] =0; } mcuReg[i] = DAILY_SEND1_HOUR; mcuData[i++] = puiPara->TimeSend1.Hour; mcuReg[i] = DAILY_SEND1_MINUTE; mcuData[i++] = puiPara->TimeSend1.Min; mcuReg[i] = DAILY_SEND2_HOUR; mcuData[i++] = puiPara->TimeSend2.Hour; mcuReg[i] = DAILY_SEND2_MINUTE; mcuData[i++] = puiPara->TimeSend2.Min; mcuReg[i] = ANALOG_PIR_SENSITIVITY; temp = sf_mcu_analog_pir_sen_convert(puiPara->PirSensitivity); //hybrid mode 4G module keep sleep if(((puiPara->NetWorkNeedSearch) != 3) && simCardInsert && gModuleSleep) { //bit 5-bit 6, daily mode 0, hybrid mode 1, instant mode 2 if(((puiPara->GprsMode) == 1) || (paraSyncFlag)) { temp |= 0x40; } else { if (((puiPara->GprsMode) == 2) && isSignalReady && (GPRS_ERRNO == 0)) temp |= 0x20; //sf_pdp_flg_set(0); } } if((PowerOnMode == PWR_ON_AUTO) || (PowerOnMode == PWR_ON_SETUP) || (PowerOnMode == PWR_ON_GPRS_INIT) || ((PowerOnMode == PWR_ON_DAILY_REPORT) /*&& (drNoResetTimeSync != SF_TRUE)*/)) { temp |= 0x10; /*bit4 rest*/ } if(((puiPara->GprsSwitch) && (simCardInsert) && ((puiPara->SendType) == 0)) || (paraSyncFlag)) { temp |= 0x80; } else { //sf_pdp_flg_set(0); } mcuData[i++] = temp; mcuReg[i] = DIGITAL_PIR_SENSITIVITY; mcuData[i++] = (puiPara->DigitPirSensitivity);//PirDigtSensRegValue[SysGetFlag(PirSensitivity)]; mcuReg[i] = DIGITAL_PIR_CFG; mcuData[i++] = ((puiPara->DigitPirWindowTime) << 4) | (puiPara->DigitPirCnt); //mcuData[i++] = (PirDigtSensRegValue[SysGetFlag(PirSensitivity)] <= 10 ? 1 : 0); //DSP busy/idle mcuReg[i] = DSP_BUSY_STATUS; mcuData[i++] = 0; mcuReg[i] = SF_SYS_STATUS; mcuData[i++] = isUsb << 2 | isCardFull << 1 | isCard << 0; mcuReg[i] = POWEROFF_TYPE; temp = 0; if(simCardInsert && (puiPara->NetWorkNeedSearch) && ((PowerOnMode == PWR_ON_AUTO) || (PowerOnMode == PWR_ON_SETUP) || (PowerOnMode == PWR_ON_DAILY_REPORT)))/* SET->ON, OFF->ON*/ temp = 1; else if(SmsCheck) temp = 2; //if (!(sf_get_pir_statu_flag() || (PowerOnMode == PWR_ON_AUTO))) temp |= (val == APP_POWER_OFF_BATT_EMPTY) << 6; mcuData[i++] = (val==APP_POWER_OFF_APO)<<7 | temp; //battery recovery mcuReg[i] = VBAT_RECOVER_VAL; mcuData[i++] = SF_BATT_RECOVERY; if(puiPara->WorkTime1Switch) { mcuReg[i] = WORKTIME1_SWITCH; mcuData[i++] = 0xFF; mcuReg[i] = WORKTIME1_START_HOUR; mcuData[i++] = puiPara->WorkTime[0].StartTime.Hour; mcuReg[i] = WORKTIME1_START_MINUTE; mcuData[i++] = puiPara->WorkTime[0].StartTime.Min; mcuReg[i] = WORKTIME1_STOP_HOUR; mcuData[i++] = puiPara->WorkTime[0].StopTime.Hour; mcuReg[i] = WORKTIME1_STOP_MINUTE; mcuData[i++] = puiPara->WorkTime[0].StopTime.Min; } else { mcuReg[i] = WORKTIME1_SWITCH; mcuData[i++] = 0; mcuReg[i] = WORKTIME1_START_HOUR; mcuData[i++] = 0; mcuReg[i] = WORKTIME1_START_MINUTE; mcuData[i++] = 0; mcuReg[i] = WORKTIME1_STOP_HOUR; mcuData[i++] = 0; mcuReg[i] = WORKTIME1_STOP_MINUTE; mcuData[i++] = 0; } if(puiPara->WorkTime2Switch) { mcuReg[i] = WORKTIME2_SWITCH; mcuData[i++] = 0xFF; mcuReg[i] = WORKTIME2_START_HOUR; mcuData[i++] = puiPara->WorkTime[1].StartTime.Hour; mcuReg[i] = WORKTIME2_START_MINUTE; mcuData[i++] = puiPara->WorkTime[1].StartTime.Min; mcuReg[i] = WORKTIME2_STOP_HOUR; mcuData[i++] = puiPara->WorkTime[1].StopTime.Hour; mcuReg[i] = WORKTIME2_STOP_MINUTE; mcuData[i++] = puiPara->WorkTime[1].StopTime.Min; } else { mcuReg[i] = WORKTIME2_SWITCH; mcuData[i++] = 0; mcuReg[i] = WORKTIME2_START_HOUR; mcuData[i++] = 0; mcuReg[i] = WORKTIME2_START_MINUTE; mcuData[i++] = 0; mcuReg[i] = WORKTIME2_STOP_HOUR; mcuData[i++] = 0; mcuReg[i] = WORKTIME2_STOP_MINUTE; mcuData[i++] = 0; } if(((puiPara->GpsSwitch) || (puiPara->FristSendDailyAndGps)) && (((sf_get_mode_flag())) || paraSyncFlag)) { mcuReg[i] = GPS_POWER_TIMER_CLEAR; mcuData[i++] = 1; mcuReg[i] = GPS_POWER_CTRL; mcuData[i++] = 1; } else { mcuReg[i] = GPS_POWER_CTRL; mcuData[i++] = 0; } temp = 0; if((puiPara->TimeSend3Switch) == 1) temp |= 0x01; if((puiPara->TimeSend4Switch) == 1) temp |= 0x02; mcuReg[i] = FUNCTION_SWTICH1; mcuData[i++] = temp; mcuReg[i] = DAILY_SEND3_HOUR; mcuData[i++] = puiPara->TimeSend3.Hour; mcuReg[i] = DAILY_SEND3_MINUTE; mcuData[i++] = puiPara->TimeSend3.Min; mcuReg[i] = DAILY_SEND4_HOUR; mcuData[i++] = puiPara->TimeSend4.Hour; mcuReg[i] = DAILY_SEND4_MINUTE; mcuData[i++] = puiPara->TimeSend4.Min; }else if(attrId == SF_MCU_CTRL_MODULE_PIR){ PowerOnMode = sf_get_power_on_mode(); if((0 != puiPara->SendType) && ((PowerOnMode == PWR_ON_TIMELAPSE) || (PowerOnMode == PWR_ON_PIR))) { mcuReg[i] = FUNCTION_SWTICH2;//dbg test mcuData[i++] = 2; mcuReg[i] = WDT_TIME; mcuData[i++] = 5;//sf_mcu_wdg_set(5); } else { mcuReg[i] = FUNCTION_SWTICH2;//dbg test mcuData[i++] = 2; mcuReg[i] = WDT_TIME; mcuData[i++] = 5;//sf_mcu_wdg_set(5); mcuReg[i] = ANALOG_PIR_SENSITIVITY; temp = (puiPara->PirSensitivity);//sf_mcu_analog_pir_sen_convert(SysGetFlag(DigPirSensitivity)); if(puiPara->GprsMode)//hybrid mode 4G module keep sleep { temp |= 0x40; } #if SF_4G_MODE_TEST == ENABLE temp |= 0x80; #else if((puiPara->GprsSwitch) && (val == 1)) { temp |= 0x80; } else { //sf_pdp_flg_set(0); } #endif mcuData[i++] = temp; if(ConfigureModeFlag) { mcuReg[i] = DIGITAL_PIR_SENSITIVITY; mcuData[i++] = (puiPara->DigitPirSensitivity);//PirDigtSensRegValue[SysGetFlag(PirSensitivity)]; mcuReg[i] = DIGITAL_PIR_CFG; mcuData[i++] = ((puiPara->DigitPirWindowTime) << 4) | (puiPara->DigitPirCnt); } if(((puiPara->GpsSwitch) || (puiPara->FristSendDailyAndGps)) && (ConfigureModeFlag || paraSyncFlag)) { mcuReg[i] = GPS_POWER_TIMER_CLEAR; mcuData[i++] = 1; mcuReg[i] = GPS_POWER_CTRL; mcuData[i++] = 1; } else { mcuReg[i] = GPS_POWER_CTRL; mcuData[i++] = 0; } } }else if(attrId == SF_MCU_PARA){ mcuReg[i] = ANALOG_PIR_SENSITIVITY; temp = (puiPara->PirSensitivity);//sf_mcu_analog_pir_sen_convert(puiPara->PirSensitivity); if((puiPara->GprsMode) && (gModuleSleep == 1))//hybrid mode 4G module keep sleep { temp |= 0x40; } if((puiPara->GprsSwitch) && (simCardInsert)) { temp |= 0x80; } else { //sf_pdp_flg_set(0); } mcuData[i++] = temp; printf("[%s:%d] temp:0x%02x GprsSwitch:%d simCardInsert:%lu\n", __FUNCTION__, __LINE__, temp, puiPara->GprsSwitch, simCardInsert); mcuReg[i] = DIGITAL_PIR_SENSITIVITY; mcuData[i++] = (puiPara->DigitPirSensitivity);//PirDigtSensRegValue[SysGetFlag(PirSensitivity)]; mcuReg[i] = DIGITAL_PIR_CFG; mcuData[i++] = ((puiPara->DigitPirWindowTime) << 4) | (puiPara->DigitPirCnt); mcuReg[i] = SF_SYS_STATUS; mcuData[i++] = (puiPara->CamArmDiable) << 6 | isUsb << 2 | isCardFull << 1 | isCard << 0; if(((puiPara->GpsSwitch) || (puiPara->FristSendDailyAndGps)) && (ConfigureModeFlag || paraSyncFlag)) { mcuReg[i] = GPS_POWER_TIMER_CLEAR; mcuData[i++] = 1; mcuReg[i] = GPS_POWER_CTRL; mcuData[i++] = 1; } else { mcuReg[i] = GPS_POWER_CTRL; mcuData[i++] = 0; } }else if(attrId == SF_MCU_RESET_MODULE){ mcuReg[i] = SF_SYS_STATUS; mcuData[i++] = (puiPara->CamArmDiable) << 6 | isUsb << 2 | isCardFull << 1 | isCard << 0 | 0x10; //sf_pdp_flg_set(0); }else if(attrId == SF_MCU_SOFT_UPDATE){ mcuReg[i] = SF_SYS_STATUS; if(val == 1) { mcuData[i++] = (puiPara->CamArmDiable) << 6 | isUsb << 2 | isCardFull << 1 | isCard << 0 | 0x08; } else { mcuData[i++] = (puiPara->CamArmDiable) << 6 | isUsb << 2 | isCardFull << 1 | isCard << 0; } }else if(attrId == SF_MCU_POWER_RESTART){ mcuReg[i] = SF_SYS_STATUS; mcuData[i++] = (puiPara->CamArmDiable) << 6 | isUsb << 2 | isCardFull << 1 | isCard << 0 | 0x20; }else if(attrId == SF_MCU_PIR_RESTART){ mcuReg[i] = SF_SYS_STATUS; mcuData[i++] = (puiPara->CamArmDiable) << 6 | isUsb << 2 | isCardFull << 1 | isCard << 0 | 0x80; } mcuReg[i] = DSP_WRITE_FLG; //MCU set end mcuData[i++] = 1; //printf("[%s:%d] mcuData[%d]0x%02x\n", __FUNCTION__, __LINE__, (i - 1), mcuData[(i - 1)]); #if 0 if((attrId == SF_MCU_POWEROFF) && puiPara->DebugMode && IS_CARD_EXIST) { for(j = 0; j < i; j++) { printf("W_addr[%2d]=0x%02x\n",mcuReg[j],mcuData[j]); } sf_debug_save_log(); } #endif sf_mcu_write_multi(mcuReg, mcuData, i); return SUCCESS; } #endif BOOL sf_get_mode_flag(void) { //printf("[%s:%d] ConfigureModeFlag:%d\n",__FUNCTION__,__LINE__,ConfigureModeFlag); return ConfigureModeFlag; } BOOL sf_is_usb_flag(void) { return gpio_getIntStatus(GPIO_INT_USBPLUGIN); } #if 0 void sf_cmd_camera_restart(UINT8 cameraRestart) { CameraCmd.cameraRestart = cameraRestart; printf("[%s:%d] e cameraRestart:%d\n",__FUNCTION__,__LINE__,CameraCmd.cameraRestart); } UINT8 sf_get_camera_restart(void) { printf("[%s:%d] s cameraRestart:%d\n",__FUNCTION__,__LINE__,CameraCmd.cameraRestart); return CameraCmd.cameraRestart; } void sf_calculate_daily_report(UINT8*dailyHour, UINT8*dailyMin) { UIMenuStoreInfo *puiPara = sf_ui_para_get(); UINT16 daily_sum_min = 0; UINT16 timelapse_sum_min = 0; struct tm mcuTime = {0}; //Daily report is always ON if(puiPara->ReDailyReport) { mcuTime = hwclock_get_time(TIME_ID_CURRENT); if(puiPara->DailyReportTime2.Hour >= mcuTime.tm_hour) { daily_sum_min = (puiPara->DailyReportTime2.Hour * 60 + puiPara->DailyReportTime2.Min) - (mcuTime.tm_hour * 60 + mcuTime.tm_min); *dailyHour = daily_sum_min / 60; *dailyMin = daily_sum_min % 60; } else { daily_sum_min = (puiPara->DailyReportTime2.Hour * 60 + puiPara->DailyReportTime2.Min + (24*60)) - (mcuTime.tm_hour * 60 + mcuTime.tm_min); *dailyHour = daily_sum_min / 60; *dailyMin = daily_sum_min % 60; } printf("mcuTime.hour:%d,mcuTime.min:%d\n",mcuTime.tm_hour,mcuTime.tm_min); printf("ReDailyHour:%d,ReDailyMinute:%d\n",puiPara->DailyReportTime2.Hour,puiPara->DailyReportTime2.Min); printf("daily_sum_min:%d\n",daily_sum_min); } else if(puiPara->GprsMode == SF_REMOTE_CONTROL_REAL_TIME) { if((!sf_get_mode_flag()) && (sf_get_camera_restart() == 1)) { // PIR mode,if remote control is setted real time,need reboot to connect ACM,use DailyReport. *dailyHour = 0; *dailyMin = 1; } else { // if remote control set real time,check the socket every two hour ,to keep alive *dailyHour = 2; *dailyMin = 0; } } else if(puiPara->GpsAntiTheftSwitch == 1) { if((!sf_get_mode_flag()) && (sf_get_camera_restart() == 1)) { // PIR mode,if gpsTheftPrevention ON, have not update gps in 24H,need to reseach gps then update to acm,use DailyReport. *dailyHour = 0; *dailyMin = 1; } else { *dailyHour = puiPara->DailyReportTime.Hour; *dailyMin = puiPara->DailyReportTime.Min; } } else { *dailyHour = puiPara->DailyReportTime.Hour; *dailyMin = puiPara->DailyReportTime.Min; } printf("%s:%d dailyHour:%d,dailyMin:%d\n", __FUNCTION__, __LINE__,*dailyHour,*dailyMin); printf("%s:%d TimerHstartT:%d,TimerMstartT:%d,TimerSstartT:%d\n", __FUNCTION__, __LINE__,puiPara->TimelapseTime.Hour,puiPara->TimelapseTime.Min,puiPara->TimelapseTime.Sec); //need check dailyReport & timelapse ? if((sf_convert_power_on_mode() == PWR_ON_TIMELAPSE)/* || (sf_get_timelapse_change())*/ || (sf_get_mode_flag())) { //dailyHour = dailyHour + 60; daily_sum_min = (*dailyHour) * 60 + (*dailyMin);// + 60 + dailyMin if(puiPara->TimelapseTime.Sec) { timelapse_sum_min = (puiPara->TimelapseTime.Hour) * 60 + puiPara->TimelapseTime.Min + 1; } else { timelapse_sum_min = (puiPara->TimelapseTime.Hour) * 60 + puiPara->TimelapseTime.Min; } if(timelapse_sum_min >= daily_sum_min) { if((timelapse_sum_min - daily_sum_min) <= 5) { if((puiPara->ReDailyReport == 1) && (timelapse_sum_min < 5)) { puiPara->ReDailyReport = 2; puiPara->DailyReportTime2.Hour = 0; puiPara->DailyReportTime2.Min = 0; } else { *dailyMin = *dailyMin + 5; } } } // only timelapse < dailyReport+5,daily report = daily report + 5 } printf("%s:%d Calculated:dailyHour:%d,dailyMin:%d\n", __FUNCTION__, __LINE__,*dailyHour,*dailyMin); } #endif int sf_while_flag(void) { if((!sf_is_usb_flag()) && (POWEROFF != 1)) { return 1; } else { return 0; } } /************************************************* Function: sf_mcu_get_irshtter Description: get IRSHTTER. Input: N/A Output: N/A Return: IRSHTTER Others: N/A *************************************************/ UINT16 sf_mcu_get_irshtter(void) { //static BOOL isRefresh = 1; UINT8 dataTemp1 = 0, dataTemp2 = 0; UINT8 mcuReg[REG_SIZE] = { 0 }; UINT8 mcuData[REG_SIZE] = { 0 }; UINT8 i = 0; if(gpio_getIntStatus(GPIO_INT_USBPLUGIN)) { return IRSHTTER; } //if(isRefresh){ //isRefresh = 0; mcuReg[i++] = LUMINANCE_L; mcuReg[i++] = LUMINANCE_H; sf_mcu_read_multi(mcuReg, mcuData, i); i = 0; dataTemp1= mcuData[i++]; dataTemp2 = mcuData[i++]; IRSHTTER = (dataTemp2 << 8) | dataTemp1; //} printf("%s:%d IRSHTTER = %d\n", __FUNCTION__, __LINE__, IRSHTTER); return IRSHTTER; } UINT32 sf_set_pir_sensitivity(UINT8 pirs) { UINT8 digPirLevel[10] = {200, 38, 30, 24, 18, 16, 10, 9, 8, 7}; UINT8 digPirCount[10] = {0, 0, 0, 0, 0, 0, 1, 1, 1, 1}; UIMenuStoreInfo *puiPara = sf_ui_para_get(); //UIMenuStoreInfo *puiPara = sf_ui_para_get(); if(pirs >= 10) return FAIL; puiPara->PirSensitivity = pirs; puiPara->DigitPirSensitivity = digPirLevel[pirs]; puiPara->DigitPirCnt = digPirCount[pirs]; puiPara->DigitPirWindowTime = 0; //#if SF_IS_RELEASE == ENABLE if(puiPara->PirSensitivity) { puiPara->TimelapseSwitch = SF_OFF; puiPara->TimelapseTime.Hour = 0; puiPara->TimelapseTime.Min = 0; puiPara->TimelapseTime.Sec = 0; //Save_MenuInfo(); } //#endif return SUCCESS; } void sf_set_module_sleep_flag(UINT8 flag) { gModuleSleep = flag; } void sf_file_thumb_cfg_fill(char* filepath,char* fileName, UINT32 size, SF_FILE_TYPE_E enFileType) { if (pThumbFileCfg == NULL) { pThumbFileCfg = malloc(sizeof(SF_SRCFILE_ATTR_S)); if (pThumbFileCfg == NULL) { printf("%s:%d pThumbFileCfg malloc err\n", __FUNCTION__, __LINE__); return; } memset(pThumbFileCfg, 0, sizeof(SF_SRCFILE_ATTR_S)); printf("%s:%d pThumbFileCfg malloc\n", __FUNCTION__, __LINE__); } if(pThumbFileCfg->filecnt >= SF_SRCFILE_MAX) { pThumbFileCfg->filecnt = 0; } snprintf(pThumbFileCfg->stfileattr[pThumbFileCfg->filecnt].thumbfilePath, sizeof(pThumbFileCfg->stfileattr[pThumbFileCfg->filecnt].thumbfilePath), "%s", filepath); //sprintf(pThumbFileCfg->stfileattr[pThumbFileCfg->filecnt].thumbfilePath, "%s", filepath); snprintf(pThumbFileCfg->stfileattr[pThumbFileCfg->filecnt].thumbfileName, sizeof(pThumbFileCfg->stfileattr[pThumbFileCfg->filecnt].thumbfileName), "%s", fileName); //sprintf(pThumbFileCfg->stfileattr[pThumbFileCfg->filecnt].thumbfileName, "%s", fileName); printf("sf_file_thumb_cfg_fill:enFileType:%d\n",enFileType); pThumbFileCfg->stfileattr[pThumbFileCfg->filecnt].enFileTye = enFileType; pThumbFileCfg->stfileattr[pThumbFileCfg->filecnt].thumbfileSize = size; pThumbFileCfg->filecnt++; } void sf_file_thumb_cfg_set(SF_SRCFILE_ATTR_S *pThumbFileCfgl) { pThumbFileCfg = pThumbFileCfgl; //memcpy(&pThumbFileCfg,pThumbFileCfgl,sizeof(pThumbFileCfg)); } SF_SRCFILE_ATTR_S* sf_file_thumb_cfg_get(void) { return pThumbFileCfg; } void sf_file_thumb_cfg_clear(void) { pThumbFileCfg->filecnt = 0; } void sf_file_thumb_cfg_sava(void) { //printf("%s:%d s\n", __FUNCTION__, __LINE__); #if 0 char tmp[64] = {'\0'}; snprintf(tmp, sizeof(tmp), "%s", SF_SD_THUMB_PATH); if (FileSys_DeleteFile(tmp) != FST_STA_OK) { printf("%s:%d delete failed\n", __FUNCTION__, __LINE__); } //FST_FILE fp = FileSys_OpenFile(tmp, FST_CREATE_ALWAYS | FST_OPEN_WRITE); int fd = open(tmp, O_WRONLY | O_CREAT, S_IRUSR | S_IWUSR); if (fd == -1) { printf("%s:%d err\n", __FUNCTION__, __LINE__); // 处理文件打开失败的错误 return ; } lseek(fd, 0, SEEK_SET); UINT32 size = sizeof(SF_SRCFILE_ATTR_S); write(fd, pThumbFileCfg, size); close(fd); //FileSys_WriteFile(fp, (UINT8*)pThumbFileCfg, &size, 0, NULL); //FileSys_CloseFile(fp); free(pThumbFileCfg); #endif //printf("%s:%d test\n", __FUNCTION__, __LINE__); //return ; UINT8 fileIndex = 0; INT32 ret_fs = 0; FST_FILE_STATUS FileStat; UIMenuStoreInfo *puiPara = sf_ui_para_get(); #if USE_RTOS_MMC_CHECK SF_RTOS_ST_MMC_DEV *mmc_dev = SF_RtosStrgCheckWorkableDev(); if(mmc_dev ==NULL) { DBG_ERR("No MMC_Dev Can use!\n"); return; } if(mmc_dev->dcf_handle < 0) { DBG_ERR("dcf_handle err\n"); return; } #endif if (pThumbFileCfg != NULL) { char sendListName[64] = {0}; FST_FILE fs = 0; //char buff[SF_SEND_LIST_ITEM_LENGTH+1] = {0}; //int fd = 0; //static int flag = 0; //struct stat st; #if SF_IQ_TEST != ENABLE char tmp[64] = {'\0'}; INT32 uiStatus = 0; UINT8 ucAttrib = 0; #if USE_RTOS_MMC_CHECK if(mmc_dev->dev_type == MMC_DEV_SD) { snprintf(tmp, sizeof(tmp), "%c%s", 'A', PHOTO_THUMB_PATH); } else { snprintf(tmp, sizeof(tmp), "%c%s", 'B', PHOTO_THUMB_PATH); } #else snprintf(tmp, sizeof(tmp), "%c%s", 'A', PHOTO_THUMB_PATH); #endif uiStatus = FileSys_GetAttrib(tmp, &ucAttrib); if (uiStatus == FST_STA_OK) { if(!(ucAttrib&FST_ATTRIB_HIDDEN)){ FileSys_SetAttrib(tmp, FST_ATTRIB_HIDDEN/* | FST_ATTRIB_SYSTEM*/, TRUE); } } #endif #if USE_RTOS_MMC_CHECK if(mmc_dev->dev_type == MMC_DEV_SD) { if(0 == puiPara->SendType){ snprintf(sendListName, sizeof(sendListName), "A%s", SF_THUMB_SEND_AUTO); fs = FileSys_OpenFile(sendListName, FST_CREATE_ALWAYS | FST_OPEN_WRITE); }else { snprintf(sendListName, sizeof(sendListName), "A%s", SF_THUMB_SEND_LIST); fs = FileSys_OpenFile(sendListName, FST_OPEN_ALWAYS | FST_OPEN_WRITE); } } else { if(0 == puiPara->SendType){ snprintf(sendListName, sizeof(sendListName), "B%s", SF_THUMB_SEND_AUTO); fs = FileSys_OpenFile(sendListName, FST_CREATE_ALWAYS | FST_OPEN_WRITE); }else { snprintf(sendListName, sizeof(sendListName), "B%s", SF_THUMB_SEND_LIST); fs = FileSys_OpenFile(sendListName, FST_OPEN_ALWAYS | FST_OPEN_WRITE); } } #else if(0 == puiPara->SendType){ snprintf(sendListName, sizeof(sendListName), "A%s", SF_THUMB_SEND_AUTO); fs = FileSys_OpenFile(sendListName, FST_CREATE_ALWAYS | FST_OPEN_WRITE); }else { snprintf(sendListName, sizeof(sendListName), "A%s", SF_THUMB_SEND_LIST); fs = FileSys_OpenFile(sendListName, FST_OPEN_ALWAYS | FST_OPEN_WRITE); } #endif //printf("Add %s to send.List\n", sendfname); /*if(access(sendListName, F_OK) == 0) { printf("sendListName:%s\n",sendListName); fd = open(sendListName, O_APPEND | O_WRONLY); } else { fd = open(sendListName, O_APPEND | O_WRONLY | O_CREAT); }*/ if(/*fd*/fs) { FileSys_StatFile(fs, &FileStat); // printf("%s:%d qFileStat:%llu\n", __FUNCTION__, __LINE__, FileStat.uiFileSize); ret_fs = FileSys_SeekFile(fs, 0, FST_SEEK_END); if (ret_fs != FST_STA_OK) { printf("%s:%d seek file failed\r\n", __FUNCTION__, __LINE__); } for(fileIndex = 0; fileIndex < pThumbFileCfg->filecnt; fileIndex++) { if((0 == fileIndex) || ((1 == puiPara->SendMulti))){ sf_add_file_name_to_send_list(pThumbFileCfg->stfileattr[fileIndex].thumbfileName, fs); printf("%s:%d thumbfileSize:%ld thumbfileName:%s thumbfilePath:%s\n", __FUNCTION__, __LINE__,pThumbFileCfg->stfileattr[fileIndex].thumbfileSize,pThumbFileCfg->stfileattr[fileIndex].thumbfileName,pThumbFileCfg->stfileattr[fileIndex].thumbfilePath); FileSys_FlushFile(fs); } } FileSys_CloseFile(fs); //close(fd); } #if SF_BATTERY_TEST == ENABLE fs = 0; fileIndex = 0; char str1[6] = { 0 }; char str2[6] = { 0 }; printf("fileName:%s\n",SF_BATTERY_TEST_FILE); fs = FileSys_OpenFile(SF_BATTERY_TEST_FILE, FST_OPEN_ALWAYS | FST_OPEN_WRITE); if(fs) { ret_fs = FileSys_SeekFile(fs, 0, FST_SEEK_END); if (ret_fs != FST_STA_OK) { printf("%s:%d seek file failed\r\n", __FUNCTION__, __LINE__); } for(fileIndex = 0; fileIndex < pThumbFileCfg->filecnt; fileIndex++) { if((0 == fileIndex) || ((1 == puiPara->SendMulti))){ memset(str1,'\0', sizeof(str1)); memset(str2,'\0', sizeof(str2)); memcpy(str1, pThumbFileCfg->stfileattr[fileIndex].thumbfileName + 4, 4); snprintf((char *)str2, sizeof(str2), "%s", str1); printf("%s:%d thumbfileName:%s str2:%s\n", __FUNCTION__, __LINE__, pThumbFileCfg->stfileattr[fileIndex].thumbfileName, str2); sf_BatteryInfoSave(str2,fs); FileSys_FlushFile(fs); } } FileSys_CloseFile(fs); //close(fd); } #endif #if SF_HW_TEST == ENABLE fs = 0; fileIndex = 0; char str3[6] = { 0 }; char str4[6] = { 0 }; printf("fileName:%s\n",SF_HW_TEST_FILE); fs = FileSys_OpenFile(SF_HW_TEST_FILE, FST_OPEN_ALWAYS | FST_OPEN_WRITE); if(fs) { ret_fs = FileSys_SeekFile(fs, 0, FST_SEEK_END); if (ret_fs != FST_STA_OK) { printf("%s:%d seek file failed\r\n", __FUNCTION__, __LINE__); } for(fileIndex = 0; fileIndex < pThumbFileCfg->filecnt; fileIndex++) { if((0 == fileIndex) || ((1 == puiPara->SendMulti))){ memset(str3,'\0', sizeof(str3)); memset(str4,'\0', sizeof(str4)); memcpy(str3, pThumbFileCfg->stfileattr[fileIndex].thumbfileName + 4, 4); snprintf((char *)str4, sizeof(str4), "%s", str3); printf("%s:%d thumbfileName:%s str2:%s\n", __FUNCTION__, __LINE__, pThumbFileCfg->stfileattr[fileIndex].thumbfileName, str4); sf_hw_info_save(str4,fs); FileSys_FlushFile(fs); } } FileSys_CloseFile(fs); //close(fd); } #endif //printf("%s:%d e Size:%ld\n", __FUNCTION__, __LINE__,pThumbFileCfg->stfileattr[fileIndex].thumbfileSize); free(pThumbFileCfg); } } /************************************************* Function: sf_add_file_name_to_send_list Description: add file name to send list Input: sendfname Output: N/A Return: N/A Others: N/A *************************************************/ void sf_add_file_name_to_send_list(char *sendfname, FST_FILE fd) { //char sendListName[64] = {0}; char buff[SF_SEND_LIST_ITEM_LENGTH+1] = {0}; //struct stat st; UINT32 size = 0; INT32 ret_fs = 0; UIMenuStoreInfo *puiPara = sf_ui_para_get(); FST_FILE_STATUS FileStat; if (sendfname == NULL) { printf("%s:%d sendfname err\n", __FUNCTION__, __LINE__); return; } if(strlen(sendfname) != SF_SEND_LIST_ITEM_LENGTH-3) //3 ->CamMode \r\n { printf("%s:%d AddFileNameToSenddist fail: send file name format error\n", __FUNCTION__, __LINE__); return; } if(fd) { //fstat(fd, &st); //lseek(fd, 0, SEEK_END); /*ret_fs = FileSys_SeekFile(fd, 0, FST_SEEK_END); if (ret_fs != FST_STA_OK) { printf("%s:%d seek file failed\r\n", __FUNCTION__, __LINE__); }*/ snprintf(buff, sizeof(buff), "%d%s\r\n", puiPara->CamMode, sendfname); size = SF_SEND_LIST_ITEM_LENGTH; ret_fs = FileSys_WriteFile(fd, (UINT8*)buff, &size, 0, NULL); if (ret_fs != FST_STA_OK) { printf("%s:%d FileSys_WriteFile failed\r\n", __FUNCTION__, __LINE__); } FileSys_StatFile(fd, &FileStat); // printf("%s:%d FileStat:%llu\n", __FUNCTION__, __LINE__, FileStat.uiFileSize); //write(fd, buff, SF_SEND_LIST_ITEM_LENGTH); //printf("Add Success st_size:%ld\n", st.st_size); } } /************************************************* Function: sf_para_print Description: printf para Input: N/A Output: N/A Return: N/A Others: N/A *************************************************/ void sf_para_print(void) { struct tm ctv = {0}; UINT8 PowerOnMode = 0; signed int isUsb = 0; signed int isCard = 0; signed int isCardFull = 0; isUsb = sf_is_usb_flag(); isCard = sf_in_card_exist(); isCardFull = sf_is_card_full(); PowerOnMode = sf_get_power_on_mode(); ctv = hwclock_get_time(TIME_ID_CURRENT); printf("Firmware compile time:%s %s VER:%s\n", __DATE__, __TIME__,SF_BASE_VERSION); printf("%s:%d sys time: %d : %d : %d : %d : %d : %d\n", __FUNCTION__, __LINE__,ctv.tm_year, ctv.tm_mon,ctv.tm_mday,ctv.tm_hour,ctv.tm_min,ctv.tm_sec); printf("%s:%d isUsb = %d isCard = %d isCardFull = %d simCardInsert = %ld start mode = %d IRSHTTER = %d\n",__FUNCTION__,__LINE__, isUsb, isCard, isCardFull, simCardInsert, PowerOnMode, IRSHTTER); sf_battery_print(); } static char * base64char = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; int sf_base64_decode(const char * base64, char * bindata) { int i, j; unsigned char k; unsigned char temp[4]; for (i = 0, j = 0; base64[i] != '\0'; i += 4) { memset(temp, 0xFF, sizeof(temp)); for (k = 0; k < 64; k++) { if (base64char[k] == base64[i]) temp[0] = k; } for (k = 0; k < 64; k++) { if (base64char[k] == base64[i + 1]) temp[1] = k; } for (k = 0; k < 64; k++) { if (base64char[k] == base64[i + 2]) temp[2] = k; } for (k = 0; k < 64; k++) { if (base64char[k] == base64[i + 3]) temp[3] = k; } bindata[j++] = ((unsigned char)(((unsigned char)(temp[0] << 2)) & 0xFC)) | ((unsigned char)((unsigned char)(temp[1] >> 4) & 0x03)); if (base64[i + 2] == '=') break; bindata[j++] = ((unsigned char)(((unsigned char)(temp[1] << 4)) & 0xF0)) | ((unsigned char)((unsigned char)(temp[2] >> 2) & 0x0F)); if (base64[i + 3] == '=') break; bindata[j++] = ((unsigned char)(((unsigned char)(temp[2] << 6)) & 0xF0)) | ((unsigned char)(temp[3] & 0x3F)); } return j; } #if SF_HW_TEST == ENABLE UINT32 testadj = 0; UINT32 testiso = 0; UINT32 testexp = 0; UINT32 testlv = 0; void sf_set_iso_exp_lv(UINT32 adj, UINT32 iso, UINT32 exp, UINT32 lv) { testadj = adj; testiso = iso; testexp = exp; testlv = lv; } void sf_hw_info_save(char *name,FST_FILE fd) { char *tmpBuf = NULL; //UINT32 LibatAdc = 0; //UINT32 batAdc = 0; //char fileName[64] = {0}; //FST_FILE fd = 0; //struct stat st; UINT32 size = 0; INT32 ret_fs = 0; struct tm drRtcTime; UIMenuStoreInfo *pPara = sf_ui_para_get(); char datestr[30] = { 0 }; tmpBuf = malloc(100); if (tmpBuf == NULL) { printf("%s:%d tmpBuf malloc err\n", __FUNCTION__, __LINE__); return; } drRtcTime = hwclock_get_time(TIME_ID_CURRENT); if(pPara->DateStyle == SF_DATE_TIME_YYMMDD) { sprintf(datestr, "%d/%02d/%02d/%02d :%02d:%02d", drRtcTime.tm_year, drRtcTime.tm_mon, drRtcTime.tm_mday, drRtcTime.tm_hour, drRtcTime.tm_min, drRtcTime.tm_sec); } else if (pPara->DateStyle == SF_DATE_TIME_MMDDYY) { sprintf(datestr, "%02d/%02d/%d %02d:%02d:%02d", drRtcTime.tm_mon, drRtcTime.tm_mday, drRtcTime.tm_year, drRtcTime.tm_hour, drRtcTime.tm_min, drRtcTime.tm_sec); } else { sprintf(datestr, "%02d/%02d/%d %02d:%02d:%02d", drRtcTime.tm_mday, drRtcTime.tm_mon, drRtcTime.tm_year,drRtcTime.tm_hour, drRtcTime.tm_min, drRtcTime.tm_sec); } //printf("[%s:%d]customStr:%s\n", __FUNCTION__, __LINE__, datestr); //snprintf(fileName, sizeof(fileName), "%s", SF_HW_TEST_FILE); /*if(access(SF_HW_TEST_FILE, F_OK) == 0) { printf("fileName:%s\n",SF_HW_TEST_FILE); fd = open(SF_HW_TEST_FILE, O_APPEND | O_WRONLY); } else { fd = open(SF_HW_TEST_FILE, O_APPEND | O_WRONLY | O_CREAT); }*/ //printf("fileName:%s\n",SF_HW_TEST_FILE); //fd = FileSys_OpenFile(SF_HW_TEST_FILE, FST_OPEN_ALWAYS | FST_OPEN_WRITE); sprintf(tmpBuf, "%s %s IRSHTTER=%d TemperAdc=%lu ae_adj=%lu iso=%lu exp=%lu lv=%lu\r\n", datestr, name, IRSHTTER, sf_get_temper_adc(), testadj, testiso, testexp, testlv); printf("%s\r", tmpBuf); if(fd) { //fstat(fd, &st); /*lseek(fd, 0, SEEK_END); write(fd, tmpBuf, strlen(tmpBuf)); close(fd);*/ //printf("Add Success st_size:%ld\n", st.st_size); size = strlen(tmpBuf); ret_fs = FileSys_WriteFile(fd, (UINT8*)tmpBuf, &size, 0, NULL); if (ret_fs != FST_STA_OK) { printf("%s:%d FileSys_WriteFile failed\r\n", __FUNCTION__, __LINE__); } //FileSys_CloseFile(fd); } free(tmpBuf); } #endif /************************************************* Function: sf_dailyReport_refresh Description: refresh dailyreport Input: N/A Output: N/A Return: N/A Others: N/A *************************************************/ void sf_dailyReport_refresh(void) { UIMenuStoreInfo *puiPara = sf_ui_para_get(); UINT32 preTimeValue = 0; UINT32 dr1TimeValue = 0; UINT32 dr2TimeValue = 0; SF_PARA_TIME_S preRtcTime = { 0 }; //sf_sys_rtc_time_get(&preRtcTime); struct tm ctv = {0}; ctv = hwclock_get_time(TIME_ID_CURRENT); printf("%s:%d tm: %d : %d : %d : %d : %d : %d\n", __FUNCTION__, __LINE__,ctv.tm_year, ctv.tm_mon,ctv.tm_mday,ctv.tm_hour,ctv.tm_min,ctv.tm_sec); preRtcTime.Year = ctv.tm_year; preRtcTime.Mon = ctv.tm_mon; preRtcTime.Day = ctv.tm_mday; preRtcTime.Hour = ctv.tm_hour; preRtcTime.Min = ctv.tm_min; preRtcTime.Sec = ctv.tm_sec; preTimeValue = preRtcTime.Hour * 60 + preRtcTime.Min; dr1TimeValue = puiPara->DailyReportTime.Hour * 60 + puiPara->DailyReportTime.Min; dr2TimeValue = dr1TimeValue + (12 * 60); if(puiPara->ReDailyReport == 0) { //twice a day if(((preTimeValue < dr1TimeValue) && (preTimeValue < dr2TimeValue)) || ((preTimeValue >= dr1TimeValue) && (preTimeValue >= dr2TimeValue))) { puiPara->DailyReportTime2.Hour = puiPara->DailyReportTime.Hour; puiPara->DailyReportTime2.Min = puiPara->DailyReportTime.Min; } else { puiPara->DailyReportTime2.Hour = (puiPara->DailyReportTime.Hour + 12) % 24; puiPara->DailyReportTime2.Min = puiPara->DailyReportTime.Min; } } else { if((preTimeValue >= dr1TimeValue) && (preTimeValue < dr1TimeValue + 60)) { puiPara->DailyReportTime2.Hour = (puiPara->DailyReportTime.Hour + 1) % 24; puiPara->DailyReportTime2.Min = puiPara->DailyReportTime.Min; } else if((preTimeValue >= dr1TimeValue + 60) && (preTimeValue < dr2TimeValue)) { puiPara->DailyReportTime2.Hour = (puiPara->DailyReportTime.Hour + 12) % 24; puiPara->DailyReportTime2.Min = puiPara->DailyReportTime.Min; } else if((preTimeValue >= dr2TimeValue) && (preTimeValue < dr2TimeValue + 60)) { puiPara->DailyReportTime2.Hour = (puiPara->DailyReportTime.Hour + 12 + 1) % 24; puiPara->DailyReportTime2.Min = puiPara->DailyReportTime.Min; } else { puiPara->DailyReportTime2.Hour = puiPara->DailyReportTime.Hour; puiPara->DailyReportTime2.Min = puiPara->DailyReportTime.Min; } } if(puiPara->DailyReportTestSwitch) { if(puiPara->ReDailyReport) { puiPara->DailyReportTime2.Hour = (preRtcTime.Hour + (preRtcTime.Min + 15) / 60) % 24; puiPara->DailyReportTime2.Min = (preRtcTime.Min + 15) % 60; } else { puiPara->DailyReportTime2.Hour = (preRtcTime.Hour + (preRtcTime.Min + 5) / 60) % 24; puiPara->DailyReportTime2.Min = (preRtcTime.Min + 5) % 60; } } } void sf_fastboot_msg_en(int en) { UIMenuStoreInfo *puiPara = sf_ui_para_get(); if((!puiPara->DebugMode) && (!puiPara->AutoLogSwitch)) { fastboot_msg_en(ENABLE); } } #if defined __FREERTOS int sf_mod_init(void) { int rt = 0; static int InitFlag = 1; if(InitFlag) { InitFlag = 0; #if defined(_MODEL_565_HUNTING_EVB_LINUX_4G_68CS_) rt = sf_init_mcu(); #elif (defined(_MODEL_565_HUNTING_EVB_LINUX_4G_S530_) || defined(_MODEL_565_HUNTING_EVB_LINUX_4G_S550_)) #if HUNTING_MCU_I2C == ENABLE rt = sf_init_mcu(); #else rt = sf_commu_mcu_task_start(); #endif #endif } return rt; } void sf_mod_exit(void) { sf_off_mcu(); #if HUNTING_MCU_I2C == ENABLE sf_i2c_remove_driver(sf_i2c.id); #endif } #elif defined __KERNEL__ static int __init sf_init(void) { int rt; rt = sf_init_mcu(); return rt; } static void __exit sf_exit(void) { sf_i2c_remove_driver(sf_i2c.id); } module_init(sf_init); module_exit(sf_exit); MODULE_DESCRIPTION("SIFAR MCU"); MODULE_AUTHOR("SiFar."); MODULE_LICENSE("GPL"); #endif