From e939c01afd679c96ef823e7ae940b9cfd5733e8c Mon Sep 17 00:00:00 2001 From: zhyinch <zhyinch@gmail.com> Date: 星期三, 03 十一月 2021 15:23:44 +0800 Subject: [PATCH] 天津定制 --- Src/main.c | 365 ++++++++++++++++++++++++++++++++++++++------------- 1 files changed, 272 insertions(+), 93 deletions(-) diff --git a/Src/main.c b/Src/main.c index 6a5c18e..632fe84 100644 --- a/Src/main.c +++ b/Src/main.c @@ -17,7 +17,6 @@ ****************************************************************************** */ /* USER CODE END Header */ - /* Includes ------------------------------------------------------------------*/ #include "main.h" @@ -29,6 +28,9 @@ #include "global_param.h" #include "TrackingDiff.h" #include "dw_app.h" + +#define NSH1 0x0001 +#define GP 0x0002 //#define DEBUG_MODE /* USER CODE END Includes */ @@ -40,8 +42,7 @@ /* Private define ------------------------------------------------------------*/ /* USER CODE BEGIN PD */ //#define DEBUG_MODE -#define Period (uint32_t) 32768 - 1 -#define Timeout (uint32_t) 32768 - 1//(32768 - 1) + /* USER CODE END PD */ /* Private macro -------------------------------------------------------------*/ @@ -55,6 +56,8 @@ LPTIM_HandleTypeDef hlptim1; SPI_HandleTypeDef hspi1; + +TIM_HandleTypeDef htim2; UART_HandleTypeDef huart1; DMA_HandleTypeDef hdma_usart1_rx; @@ -72,6 +75,7 @@ static void MX_SPI1_Init(void); static void MX_ADC_Init(void); static void MX_DMA_Init(void); +static void MX_TIM2_Init(void); /* USER CODE BEGIN PFP */ /* USER CODE END PFP */ @@ -88,6 +92,7 @@ uint16_t lastpoll_count,interval_count,slot_startcount,tag_frequency,lastpoll_time,current_time; extern uint8_t module_power; extern float nomove_count; +float motor_keeptime; uint8_t imu_enable,motor_enable; u16 GetLPTime(void) { @@ -104,9 +109,11 @@ Error_Handler(); } } +uint16_t hardware_version,hardware_pici,hardware_type; +u16 current_time; uint8_t state5v; void IdleTask(void) -{u16 current_time; +{ UART_CheckReceive(); UART_CheckSend(); @@ -125,36 +132,68 @@ //motor_state=2; if(g_com_map[MOTOR_ENABLE]) { + + if(motor_keeptime>0) + { + motor_state = 2; + }else{ + motor_state = 0; + } switch(motor_state) {case 0: - MOTOR_OFF; + if(hardware_type==NSH1) + {MOTOR_OFF; + }else if(hardware_type==GP) + { + HAL_TIM_PWM_Stop(&htim2, TIM_CHANNEL_3); + } break; case 1: if(current_time<MOTOR_ONTIME) { - MOTOR_ON; + if(hardware_type==NSH1) + {MOTOR_ON; + }else if(hardware_type==GP) + { + HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_3); + } }else{ - MOTOR_OFF; - } - + if(hardware_type==NSH1) + {MOTOR_OFF; + }else if(hardware_type==GP) + { + HAL_TIM_PWM_Stop(&htim2, TIM_CHANNEL_3); + } + } break; case 2: - MOTOR_ON; + if(hardware_type==NSH1) + {MOTOR_ON; + }else if(hardware_type==GP) + { + HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_3); + } break; case 3: - MOTOR_OFF; + if(hardware_type==NSH1) + {MOTOR_OFF; + }else if(hardware_type==GP) + { + HAL_TIM_PWM_Stop(&htim2, TIM_CHANNEL_3); + } break; } } + bat_percent=Get_Battary(); if(HAL_GPIO_ReadPin(INPUT_5V_GPIO_Port,INPUT_5V_Pin)) { - nomove_count = 0; + //nomove_count = 0; if(state5v==0) { state5v=1; UsartInit(); } - if(bat_percent>99) + if(HAL_GPIO_ReadPin(PWR_ON_GPIO_Port,PWR_ON_Pin)) { LED_LR_OFF; LED_LG_ON; @@ -211,20 +250,24 @@ u16 current_slotnum; extern int32_t offsettimeus; //#define FIXSLOT -#define FIXSLOTPOS 6 +#define FIXSLOTPOS 4 u16 slotpos_intoatl; uint16_t bigslot_num; uint8_t fix_slotpos =FIXSLOTPOS; int32_t lpcount,lptime,target_time; -void SetNextPollTime(u16 slotpos) +extern u16 tagslotpos; +void SetNextPollTime(u16 slotpos) //时间片逻辑:上来默认计算一个时间,时间同步之后,就近选择时间片。SetNextPollTime会调整下次发送 { #ifdef FIXSLOT + fix_slotpos =FIXSLOTPOS; + fix_slotpos = g_com_map[ALARM_DISTANCE2]; slotpos = fix_slotpos; + tagslotpos = fix_slotpos; #endif - if(current_slotnum>=tag_frequency) - current_slotnum-=tag_frequency; + while(current_slotnum>=tag_frequency) + { current_slotnum-=tag_frequency;} slotpos_intoatl = current_slotnum*bigslot_num+slotpos; if(current_slotnum==19) @@ -233,7 +276,7 @@ //if(target_time<90000) { - lptime=target_time-offsettimeus-10000; + lptime=target_time-offsettimeus+1200; lpcount = lptime/LPTIMER_LSB; if(lpcount>LPTIMER_1S_COUNT) lpcount-=LPTIMER_1S_COUNT; @@ -244,27 +287,9 @@ __HAL_LPTIM_COMPARE_SET(&hlptim1, lpcount); } } -void Program_Init(void) -{ float temp; - uint16_t temp2; - uint16_t i; - Usart1ParseDataCallback = UsartParseDataHandler; - parameter_init(); - //deca_sleep(1000); - g_com_map[VERSION] = 0x020a; -#ifdef DEBUG_MODE -// g_com_map[DEV_ROLE]=1; -// g_com_map[DEV_ID]=0x123; -// g_com_map[COM_INTERVAL]=100; -// g_com_map[MAX_REPORT_ANC_NUM]=1; -// g_com_map[NOMOVESLEEP_TIME]=10; - // g_com_map[IMU_ENABLE]=0; - //g_com_map[COM_INTERVAL]=50; -#endif -//g_com_map[NOMOVESLEEP_TIME]=10; -// g_com_map[IMU_ENABLE]=0; -// g_com_map[COM_INTERVAL]=50; - if(g_com_map[COM_INTERVAL]==0) +void ErrorConfig_Handler(void) +{ + if(g_com_map[COM_INTERVAL]==0||g_com_map[COM_INTERVAL]>1000) { g_com_map[COM_INTERVAL]=100; } @@ -274,6 +299,45 @@ {g_com_map[POWER]=MAX_RFPOWER;} if(g_com_map[POWER]<0) {g_com_map[POWER]=0;} +} +u8 active_flag=0; +void Program_Init(void) +{ float temp; + uint16_t temp2; + uint16_t i; + Usart1ParseDataCallback = UsartParseDataHandler; + parameter_init(); + hardware_version= STMFLASH_ReadHalfWord(FLASH_HARDWARE_VERSION_MAP); + hardware_pici= STMFLASH_ReadHalfWord(FLASH_HARDWARE_VERSION_MAP+2); + hardware_type= STMFLASH_ReadHalfWord(FLASH_HARDWARE_VERSION_MAP+4); + //deca_sleep(1000); + g_com_map[VERSION] = 0x0224; + + g_com_map[DEV_ID]=0x3496; + g_com_map[IMU_ENABLE]=0; +#ifdef DEBUG_MODE +// g_com_map[DEV_ROLE]=1; +// g_com_map[DEV_ID]=0x4009; +// g_com_map[ACTIVE_INDEX]=1; + g_com_map[COM_INTERVAL]=100; +// g_com_map[MAX_REPORT_ANC_NUM]=1; +// g_com_map[NOMOVESLEEP_TIME]=10; +// g_com_map[IMU_ENABLE]=0; +// g_com_map[COM_INTERVAL]=50; +#endif +//g_com_map[NOMOVESLEEP_TIME]=10; +// g_com_map[IMU_ENABLE]=0; +// g_com_map[COM_INTERVAL]=1000; + active_flag = g_com_map[ACTIVE_INDEX]; + active_flag = 1; + if(active_flag==0) + { + g_com_map[COM_INTERVAL]=1000; + g_com_map[IMU_ENABLE]=1; + g_com_map[NOMOVESLEEP_TIME]=10; + g_com_map[MOTOR_ENABLE]=0; + } +g_com_map[HEIGHTOFFEST_INDEX]=g_com_map[MAX_REPORT_ANC_NUM]; module_power = g_com_map[POWER]; imu_enable=g_com_map[IMU_ENABLE]; motor_enable=g_com_map[MOTOR_ENABLE]; @@ -295,9 +359,9 @@ Error_Handler(); } //g_com_map[NOMOVESLEEP_TIME]=5; - printf("标签ID: %d .\r\n",dev_id); - printf("通讯间隔: %d ms.\r\n",g_com_map[COM_INTERVAL]); - printf("单次通讯基站数量: %d个.\r\n",g_com_map[MAX_REPORT_ANC_NUM]); +// printf("标签ID: %d .\r\n",dev_id); +// printf("通讯间隔: %d ms.\r\n",g_com_map[COM_INTERVAL]); +// printf("单次通讯基站数量: %d个.\r\n",g_com_map[MAX_REPORT_ANC_NUM]); // printf("DEVICE PAIRID: %d .\r\n",g_com_map[PAIR_ID]); @@ -317,13 +381,30 @@ uint32_t temp; extern uint8_t sleep_flag,m_bEUARTTxEn; uint16_t waitusart_timer; -//void HAL_UART_RxCpltCallback(UART_HandleTypeDef *UartHandle) -//{ -// /* Set transmission flag: trasfer complete*/ -// waitusart_timer = tag_frequency*USART_KEEPWAKE_TIME; -// -//} +void HardWareTypeDiffConfig(void) +{ +GPIO_InitTypeDef GPIO_InitStruct = {0}; +//hardware_type=2; +if(hardware_type == 0) + hardware_type = 1; + switch(hardware_type) + { + case 1: + + HAL_GPIO_WritePin(GPIOB, MOTOR_Pin, GPIO_PIN_SET); + GPIO_InitStruct.Pin = MOTOR_Pin; + GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; + HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); + break; + case 2: + MX_TIM2_Init(); + BarInit(); + break; + } +} void HAL_UART_ErrorCallback(UART_HandleTypeDef *huart) { //SCB->AIRCR = 0X05FA0000|(unsigned int)0x04; //软复位回到bootloader @@ -339,7 +420,6 @@ /* USER CODE BEGIN 1 */ /* USER CODE END 1 */ - /* MCU Configuration--------------------------------------------------------*/ @@ -360,25 +440,28 @@ /* Initialize all configured peripherals */ MX_GPIO_Init(); MX_LPTIM1_Init(); - MX_DMA_Init(); + MX_DMA_Init(); MX_USART1_UART_Init(); MX_SPI1_Init(); MX_ADC_Init(); + //MX_TIM2_Init(); /* USER CODE BEGIN 2 */ LED_LG_ON; Program_Init(); LIS3DH_Data_Init(); + // BarInit(); Dw1000_Init(); Dw1000_App_Init(); - + HardWareTypeDiffConfig(); dwt_configuresleep(DWT_PRESRV_SLEEP | DWT_CONFIG, DWT_WAKE_CS | DWT_WAKE_WK| DWT_SLP_EN); - //dwt_entersleep(); + dwt_entersleep(); waitusart_timer=tag_frequency*USART_KEEPWAKE_TIME;; DW_DISABLE; if(HAL_UART_Receive_DMA(&huart1,m_EUART_DMA_RXBuf,EUART_RX_BUF_SIZE)) { Error_Handler(); } + // HAL_Delay(2000); // mcu_sleep(); //LED0_BLINK; @@ -397,11 +480,11 @@ // { // MODBUS_Poll(); // } - if(g_start_send_flag) + if(g_start_send_flag&&active_flag) { static uint16_t blink_count=0; SystemClock_Config(); g_start_send_flag = 0; - + // GetPressAndTemp(); // if(current_count>slot_startcount&¤t_count<slot_startcount+interval_count) // { // HAL_GPIO_WritePin(LED0_GPIO, GPIO_PIN_9, GPIO_PIN_SET); @@ -409,8 +492,6 @@ // HAL_GPIO_WritePin(LED0_GPIO, GPIO_PIN_9, GPIO_PIN_RESET); // } // LED_TR_BLINK; - - bat_percent=Get_Battary(); if(bat_percent>15) { LED_TB_ON; Tag_App(); @@ -426,7 +507,7 @@ { waitusart_timer--; } - if(m_bEUARTTxEn==0&&waitusart_timer==0) + if(m_bEUARTTxEn==0&&waitusart_timer==0&&(motor_state==0||motor_state==3)) { #ifndef DEBUG_MODE if(!HAL_GPIO_ReadPin(INPUT_5V_GPIO_Port,INPUT_5V_Pin)) @@ -457,14 +538,15 @@ RCC_ClkInitTypeDef RCC_ClkInitStruct = {0}; RCC_PeriphCLKInitTypeDef PeriphClkInit = {0}; - /** Configure the main internal regulator output voltage + /** Configure the main internal regulator output voltage */ __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1); - /** Configure LSE Drive Capability + /** Configure LSE Drive Capability */ HAL_PWR_EnableBkUpAccess(); __HAL_RCC_LSEDRIVE_CONFIG(RCC_LSEDRIVE_LOW); - /** Initializes the CPU, AHB and APB busses clocks + /** Initializes the RCC Oscillators according to the specified parameters + * in the RCC_OscInitTypeDef structure. */ RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI|RCC_OSCILLATORTYPE_LSE; RCC_OscInitStruct.LSEState = RCC_LSE_ON; @@ -478,7 +560,7 @@ { Error_Handler(); } - /** Initializes the CPU, AHB and APB busses clocks + /** Initializes the CPU, AHB and APB buses clocks */ RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2; @@ -518,7 +600,7 @@ /* USER CODE BEGIN ADC_Init 1 */ /* USER CODE END ADC_Init 1 */ - /** Configure the global features of the ADC (Clock, Resolution, Data Alignment and number of conversion) + /** Configure the global features of the ADC (Clock, Resolution, Data Alignment and number of conversion) */ hadc.Instance = ADC1; hadc.Init.OversamplingMode = DISABLE; @@ -541,7 +623,7 @@ { Error_Handler(); } - /** Configure for the selected ADC regular channel to be converted. + /** Configure for the selected ADC regular channel to be converted. */ sConfig.Channel = ADC_CHANNEL_1; sConfig.Rank = ADC_RANK_CHANNEL_NUMBER; @@ -629,6 +711,69 @@ } /** + * @brief TIM2 Initialization Function + * @param None + * @retval None + */ +static void MX_TIM2_Init(void) +{ + + /* USER CODE BEGIN TIM2_Init 0 */ + + /* USER CODE END TIM2_Init 0 */ + + TIM_ClockConfigTypeDef sClockSourceConfig = {0}; + TIM_MasterConfigTypeDef sMasterConfig = {0}; + TIM_OC_InitTypeDef sConfigOC = {0}; + + /* USER CODE BEGIN TIM2_Init 1 */ + + /* USER CODE END TIM2_Init 1 */ + htim2.Instance = TIM2; + htim2.Init.Prescaler = 9; + htim2.Init.CounterMode = TIM_COUNTERMODE_UP; + htim2.Init.Period = 1171; + htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; + htim2.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE; + if (HAL_TIM_Base_Init(&htim2) != HAL_OK) + { + Error_Handler(); + } + sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL; + if (HAL_TIM_ConfigClockSource(&htim2, &sClockSourceConfig) != HAL_OK) + { + Error_Handler(); + } + if (HAL_TIM_PWM_Init(&htim2) != HAL_OK) + { + Error_Handler(); + } + sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET; + sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE; + if (HAL_TIMEx_MasterConfigSynchronization(&htim2, &sMasterConfig) != HAL_OK) + { + Error_Handler(); + } + sConfigOC.OCMode = TIM_OCMODE_PWM1; + sConfigOC.Pulse = 599; + sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH; + sConfigOC.OCFastMode = TIM_OCFAST_DISABLE; + if (HAL_TIM_PWM_ConfigChannel(&htim2, &sConfigOC, TIM_CHANNEL_3) != HAL_OK) + { + Error_Handler(); + } + /* USER CODE BEGIN TIM2_Init 2 */ +//if(HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_3) != HAL_OK) +// { +// /* Starting Error */ +// Error_Handler(); +// } + /* USER CODE END TIM2_Init 2 */ + HAL_TIM_MspPostInit(&htim2); + +} + +/** * @brief USART1 Initialization Function * @param None * @retval None @@ -675,10 +820,10 @@ } -/** +/** * Enable DMA controller clock */ -static void MX_DMA_Init(void) +static void MX_DMA_Init(void) { /* DMA controller clock enable */ @@ -710,7 +855,7 @@ HAL_GPIO_WritePin(GPIOA, SCL_Pin|SDA_Pin|SPI_CS_Pin, GPIO_PIN_SET); /*Configure GPIO pin Output Level */ - HAL_GPIO_WritePin(GPIOB, BAT_MEAS_GND_Pin|MOTOR_Pin|PWR_CTL_Pin, GPIO_PIN_SET); + HAL_GPIO_WritePin(GPIOB, BAT_MEAS_GND_Pin|PWR_CTL_Pin, GPIO_PIN_SET); /*Configure GPIO pin Output Level */ HAL_GPIO_WritePin(GPIOB, LED1_G_Pin|LED1_R_Pin|LED2_R_Pin, GPIO_PIN_RESET); @@ -723,12 +868,6 @@ GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING; GPIO_InitStruct.Pull = GPIO_NOPULL; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); - - /*Configure GPIO pin : BAT_MEAS_Pin */ - GPIO_InitStruct.Pin = BAT_MEAS_Pin; - GPIO_InitStruct.Mode = GPIO_MODE_ANALOG; - GPIO_InitStruct.Pull = GPIO_NOPULL; - HAL_GPIO_Init(BAT_MEAS_GPIO_Port, &GPIO_InitStruct); /*Configure GPIO pins : SCL_Pin SDA_Pin */ GPIO_InitStruct.Pin = SCL_Pin|SDA_Pin; @@ -757,20 +896,18 @@ GPIO_InitStruct.Pull = GPIO_PULLUP; HAL_GPIO_Init(USER_KEY_GPIO_Port, &GPIO_InitStruct); - /*Configure GPIO pins : MOTOR_Pin LED1_G_Pin LED1_R_Pin LED2_R_Pin - PWR_CTL_Pin */ - GPIO_InitStruct.Pin = MOTOR_Pin|LED1_G_Pin|LED1_R_Pin|LED2_R_Pin - |PWR_CTL_Pin; - GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; - GPIO_InitStruct.Pull = GPIO_NOPULL; - GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; - HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); - /*Configure GPIO pin : INPUT_5V_Pin */ GPIO_InitStruct.Pin = INPUT_5V_Pin; GPIO_InitStruct.Mode = GPIO_MODE_INPUT; GPIO_InitStruct.Pull = GPIO_PULLDOWN; HAL_GPIO_Init(INPUT_5V_GPIO_Port, &GPIO_InitStruct); + + /*Configure GPIO pins : LED1_G_Pin LED1_R_Pin LED2_R_Pin PWR_CTL_Pin */ + GPIO_InitStruct.Pin = LED1_G_Pin|LED1_R_Pin|LED2_R_Pin|PWR_CTL_Pin; + GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; + HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); /*Configure GPIO pins : DW_WKUP_Pin DW_CTRL_Pin LED2_G_Pin */ GPIO_InitStruct.Pin = DW_WKUP_Pin|DW_CTRL_Pin|LED2_G_Pin; @@ -824,28 +961,63 @@ { static uint8_t i=0; i++; + g_start_send_flag=1; current_slotnum++; SetNextPollTime(tagslotpos); - nomove_count+=(float)g_com_map[COM_INTERVAL]/1000; - if(motor_ontime>0) - { - motor_ontime-=(float)1/tag_frequency; - motor_state = 2; - }else{ - motor_state = 0; + nomove_count+=1/(float)tag_frequency; + if(motor_keeptime>0) + { + motor_keeptime-=1/(float)tag_frequency; } + if(motor_keeptime<0) + {motor_keeptime = 0;} + if(active_flag==0) + { if(!GET_USERKEY) { - key_keeptime+=(float)g_com_map[COM_INTERVAL]/1000; + LED_LG_ON; + key_keeptime+=1/(float)tag_frequency; + if(key_keeptime>3) + { + u8 i=250,keystate=1; + while(i--) + { + if(i%10==0) + { + LED_LG_BLINK; + } + if(GET_USERKEY) + {keystate = 0;} + if(keystate==0&&!GET_USERKEY) + { + parameter_init(); + g_com_map[ACTIVE_INDEX] = 1; + save_com_map_to_flash(); + delay_ms(100); + SCB->AIRCR = 0X05FA0000|(unsigned int)0x04; //软复位回到bootloader + } + delay_ms(10); + } + } + }else{ + LED_LG_OFF; + key_keeptime=0; + } + + } + + if(!GET_USERKEY) + { + key_keeptime+=1/(float)tag_frequency; if(key_keeptime>=KEY_KEEPRESET_TIME) { - SCB->AIRCR = 0X05FA0000|(unsigned int)0x04; + // SCB->AIRCR = 0X05FA0000|(unsigned int)0x04; } }else{ key_keeptime=0; } - if(nomove_count>STATIONARY_TIME) + if(nomove_count>g_com_map[STATIONARY_TIME]) { stationary_flag = 1; }else{ @@ -857,10 +1029,12 @@ }else{ gotosleep_flag=0; } +#ifndef DEBUG_MODE if(nomove_count>g_com_map[NOMOVESLEEP_TIME]&&imu_enable) { mcu_sleep(); } +#endif } /* USER CODE END 4 */ @@ -872,7 +1046,12 @@ { /* USER CODE BEGIN Error_Handler_Debug */ /* User can add his own implementation to report the HAL error return state */ - +// while (1) +// {} +// /* USER CODE BEGIN W1_HardFault_IRQn 0 */ +// //SCB->AIRCR = 0X05FA0000|(unsigned int)0x04; +// /* USER CODE END W1_HardFault_IRQn 0 */ +// } /* USER CODE END Error_Handler_Debug */ } @@ -885,7 +1064,7 @@ * @retval None */ void assert_failed(uint8_t *file, uint32_t line) -{ +{ /* USER CODE BEGIN 6 */ /* User can add his own implementation to report the file name and line number, tex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */ -- Gitblit v1.9.3