/*! * \brief Open the current log file. * * \return the file descriptor or -1 if open failed. */ static int prv_xopen_current_logfile( void ) { int fd_current_logfile; struct tm *pxDate; // TRACE_COM2( "open logfile begin==%d", xcptime_LocalTime ); while( 1 ) { fd_current_logfile = -1; // Init to default value. /* Open the log file. */ if( '\0' != *acLogFileName ) { // If we have an active current log file, simply open it in append mode. fd_current_logfile = open( acLogFileName, O_APPEND ); // Check if the max file size has been reached. if( -1 != fd_current_logfile ) { if( DATALOG_LOGFILE_MAXSIZE <= fsaccess_file_get_size( fd_current_logfile ) ) { // The current log file has reached the max size. // Get the current time in the "YYYYMMDDHHMMSSMS" string format. v_cptime_GetDateInFatStringFormat( pcTempoDate ); // Set the file date. nav_file_dateset( (FS_STRING)pcTempoDate, FS_DATE_LAST_WRITE ); close( fd_current_logfile ); // Close the file. *acLogFileName = '\0'; // Reset the current log file name. continue; // Do another loop to create/open a new file. } } else { // The file has been removed. *acLogFileName = '\0'; // Reset the current log file name. continue; // Do another loop to create/open a new file. } } else { // Create a new log file. // Get the broken-down representation of the current date. pxDate = gmtime( &xcptime_LocalTime ); // Build the filename: mmddyy_hhmm.log // WARNING: pxDate->tm_year == number of years since 1900. // For years >= 2000, we'll display the last 2 digits only. if( pxDate->tm_year >= 100 ) pxDate->tm_year -= 100; sprintf( acLogFileName, "%s/%.2d%.2d%.2d_%.2d%.2d.log", pcStringCurrentLogDirectoryName, pxDate->tm_mon +1, pxDate->tm_mday, pxDate->tm_year, pxDate->tm_hour, pxDate->tm_min ); NAKED_TRACE_COM2( "Creating log file %s", acLogFileName ); // Create the log file only if the /LOG directory exists. if( true == fsaccess_IsDirPresent( (const char *)pcStringCurrentLogDirectoryName ) ) { // The LOG/ directory exists. // Create and open the file. // if the file already exists, then the file size is reset. fd_current_logfile = open( acLogFileName, (O_CREAT|O_WRONLY) ); // previous file is closed, send a mail if ( *acPreviousLogFileName != '\0' ) { // post alarm to SMTP task v_SMTP_Post(acPreviousLogFileName, acPreviousLogFileName); } strncpy(acPreviousLogFileName, acLogFileName, strlen(acLogFileName)); } } if( -1 == fd_current_logfile ) { // The open failed. We're not in maintenance mode. // Just remove the oldest log file: TODO NAKED_TRACE_COM2( "Failed opening the current log file %s", acLogFileName ); /*########### TEMPORARY #############*/ break; /*###################################*/ } else break; } return( fd_current_logfile ); }
/*! * \brief Get the current temperature value. * * \param pxLog a Log structure. * * \return true upon success, false if error. */ bool b_temperature_get_value( xLogDef *pxLog ) { int i_current_val, value, index = 0; /* enable channel for sensor */ adc_enable( adc, ADC_TEMPERATURE_CHANNEL ); // start conversion adc_start( adc ); // get value for sensor value = adc_get_value( adc, ADC_TEMPERATURE_CHANNEL ); /* Disable channel for sensor */ adc_disable( adc, ADC_TEMPERATURE_CHANNEL ); if(value > temperature_code[0]) { i_current_val = -20; } else { while(temperature_code[index++] > value); i_current_val = (index - 1 - 20); } // Alloc memory for the log string. pxLog->pcStringLog = pvPortMalloc( 12*sizeof( char ) ); if( NULL == pxLog->pcStringLog ) { return( false ); } pxLog->pfFreeStringLog = vPortFree; // Because pvPortMalloc() was used to // alloc the log string. // Build the log string. if( i_current_val <= l_temp_min ) { sprintf( pxLog->pcStringLog, "%3dC | min", i_current_val ); // if alarms have to be checked and no alarm for min was pending if (( b_temp_alarm == pdTRUE ) && ( b_temp_alarm_min == pdFALSE )) { // alarm has been taken into account, // don't reenter this test before leaving min area b_temp_alarm_min = pdTRUE; // allow alarm if max is reached b_temp_alarm_max = pdFALSE; // post alarm to SMTP task v_SMTP_Post("Min Temp Alarm", NULL); } } else if( i_current_val >= l_temp_max ) { sprintf( pxLog->pcStringLog, "%3dC | max", i_current_val ); // if alarms have to be checked and no alarm for max was pending if (( b_temp_alarm == pdTRUE ) && ( b_temp_alarm_max == pdFALSE )) { // alarm has been taken into account, // don't reenter this test before leaving max area b_temp_alarm_max = pdTRUE; // allow alarm if min is reached b_temp_alarm_min = pdFALSE; // post alarm to SMTP task v_SMTP_Post("Max Temp Alarm", NULL); } } else { sprintf( pxLog->pcStringLog, "%3dC", i_current_val ); // if alarms have to be checked if ( b_temp_alarm == pdTRUE ) { // no alarm is pending b_temp_alarm_max = pdFALSE; b_temp_alarm_min = pdFALSE; } } return( true ); }
/*! * \brief Get the current potentiometer value. * * \param pxLog a Log structure. * * \return true upon success, false if error. */ bool b_potentiometer_get_value( xLogDef *pxLog ) { int i_current_val; /* enable channel for sensor */ adc_enable( adc, ADC_POTENTIOMETER_CHANNEL ); /* start conversion */ adc_start( adc ); /* get value for sensor */ i_current_val = adc_get_value( adc, ADC_POTENTIOMETER_CHANNEL ) * 100 / ADC_MAX_VALUE; /* Disable channel for sensor */ adc_disable( adc, ADC_POTENTIOMETER_CHANNEL ); // Alloc memory for the log string. pxLog->pcStringLog = pvPortMalloc( 16*sizeof( char ) ); if( NULL == pxLog->pcStringLog ) { return( false ); } pxLog->pfFreeStringLog = vPortFree; // Because pvPortMalloc() was used to // alloc the log string. // Build the log string. if( i_current_val <= ul_pot_min ) { sprintf( pxLog->pcStringLog, "%3d%% | min", i_current_val ); // if alarms have to be checked and no alarm for min was pending if (( b_pot_alarm == pdTRUE ) && ( b_pot_alarm_min == pdFALSE )) { // alarm has been taken into account, // don't reenter this test before leaving min area b_pot_alarm_min = pdTRUE; // allow alarm if max is reached b_pot_alarm_max = pdFALSE; // post alarm to SMTP task v_SMTP_Post("Min Potentiometer Alarm", NULL); } } else if( i_current_val >= ul_pot_max ) { sprintf( pxLog->pcStringLog, "%3d%% | max", i_current_val ); // if alarms have to be checked and no alarm for max was pending if (( b_pot_alarm == pdTRUE ) && ( b_pot_alarm_max == pdFALSE )) { // alarm has been taken into account, // don't reenter this test before leaving max area b_pot_alarm_max = pdTRUE; // allow alarm if min is reached b_pot_alarm_min = pdFALSE; // post alarm to SMTP task v_SMTP_Post("Max Potentiometer Alarm", NULL); } } else { sprintf( pxLog->pcStringLog, "%3d%%", i_current_val ); // if alarms have to be checked if ( b_pot_alarm == pdTRUE ) { // no alarm is pending b_pot_alarm_max = pdFALSE; b_pot_alarm_min = pdFALSE; } } return( true ); }