00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #include <stdio.h>
00022 #include <fcntl.h>
00023 #include <string.h>
00024 #include <limits.h>
00025
00026 #ifndef NAME_MAX
00027 # define NAME_MAX 255
00028 #endif
00029
00030 #include <utils/utils.h>
00031 #include <sed/sed_sedflux.h>
00032 #include "my_processes.h"
00033
00034
00035
00036
00037
00038
00039 gboolean init_met_station_data( Sed_process proc , Sed_cube prof , GError** error );
00040
00041 Sed_process_info
00042 run_met_station( Sed_process proc , Sed_cube prof )
00043 {
00044 Met_station_t* data = sed_process_user_data(proc);
00045 Sed_process_info info = SED_EMPTY_INFO;
00046
00047 if ( sed_process_run_count(proc)==0 )
00048 init_met_station_data( proc , prof , NULL );
00049
00050 sed_tripod_write( data->met_fp , prof );
00051
00052 return info;
00053 }
00054
00055 #define MET_KEY_PARAMETER "parameter to measure"
00056 #define MET_KEY_WHENCE "position wrt river mouth"
00057 #define MET_KEY_POSITION "position of station"
00058 #define MET_KEY_FILENAME "filename"
00059
00060 static gchar* measuring_station_req_labels[] =
00061 {
00062 MET_KEY_PARAMETER ,
00063 MET_KEY_WHENCE ,
00064 MET_KEY_POSITION ,
00065 MET_KEY_FILENAME ,
00066 NULL
00067 };
00068
00069 gboolean
00070 init_met_station( Sed_process p , Eh_symbol_table tab , GError** error )
00071 {
00072 Met_station_t* data = sed_process_new_user_data( p , Met_station_t );
00073 GError* tmp_err = NULL;
00074 gboolean is_ok = TRUE;
00075 gchar* pos_s = NULL;
00076
00077 eh_return_val_if_fail( error==NULL || *error==NULL , FALSE );
00078
00079 data->met_fp = NULL;
00080
00081 if ( eh_symbol_table_require_labels( tab , measuring_station_req_labels , &tmp_err ) )
00082 {
00083 data->parameter_str = eh_symbol_table_value ( tab , MET_KEY_PARAMETER );
00084 data->from_river_mouth = eh_symbol_table_bool_value( tab , MET_KEY_WHENCE );
00085 data->filename = eh_symbol_table_value ( tab , MET_KEY_FILENAME );
00086 data->parameter = sed_measurement_new( data->parameter_str );
00087
00088 eh_require( data->parameter );
00089
00090 pos_s = eh_symbol_table_lookup( tab , MET_KEY_POSITION );
00091
00092 if ( g_ascii_strcasecmp( pos_s , "all" ) == 0 )
00093 data->pos = g_array_new( FALSE , FALSE , sizeof(double) );
00094 else
00095 {
00096 gint i;
00097 double d_val;
00098 gchar** position = g_strsplit ( pos_s , "," , -1 );
00099
00100 data->pos = g_array_new( FALSE , FALSE , sizeof(double) );
00101 for ( i=0 ; !tmp_err && position[i] ; i++ )
00102 {
00103 d_val = eh_str_to_dbl( position[i] , &tmp_err );
00104
00105 if ( !tmp_err ) g_array_append_val( data->pos , d_val );
00106 }
00107 g_strfreev(position);
00108 }
00109
00110 eh_touch_file( data->filename , O_WRONLY|O_CREAT , &tmp_err );
00111 }
00112
00113 if ( tmp_err )
00114 {
00115 g_propagate_error( error , tmp_err );
00116 is_ok = FALSE;
00117 }
00118
00119 return is_ok;
00120 }
00121
00122 gboolean
00123 init_met_station_data( Sed_process proc , Sed_cube prof , GError** error )
00124 {
00125 Met_station_t* data = sed_process_user_data( proc );
00126
00127 if ( data )
00128 {
00129 data->met_fp = sed_tripod_new( data->filename , data->parameter , NULL );
00130
00131 if ( data->pos->len <= 0 )
00132 sed_tripod_set_len( data->met_fp , sed_cube_size(prof) );
00133 else
00134 sed_tripod_set_len( data->met_fp , data->pos->len );
00135
00136 sed_tripod_set_n_x( data->met_fp , sed_cube_n_x(prof) );
00137 sed_tripod_set_n_y( data->met_fp , sed_cube_n_y(prof) );
00138 }
00139
00140 return TRUE;
00141 }
00142
00143 gboolean
00144 destroy_met_station( Sed_process p )
00145 {
00146 if ( p )
00147 {
00148 Met_station_t* data = sed_process_user_data( p );
00149
00150 if ( data )
00151 {
00152 sed_tripod_destroy( data->met_fp );
00153
00154 if ( data->pos ) g_array_free( data->pos , FALSE );
00155
00156 sed_measurement_destroy( data->parameter );
00157
00158 eh_free( data->parameter_str );
00159 eh_free( data->filename );
00160 eh_free( data );
00161 }
00162 }
00163
00164 return TRUE;
00165 }
00166
00167 gboolean dump_measuring_station_data( gpointer ptr , FILE *fp )
00168 {
00169 Met_station_t *data = (Met_station_t*)ptr;
00170 gint64 len;
00171
00172 fwrite( &(data->from_river_mouth) , sizeof(gboolean) , 1 , fp );
00173
00174 len = strlen( data->filename )+1;
00175 fwrite( &len , sizeof(gint64) , 1 , fp );
00176 fwrite( data->filename , sizeof(char) , len , fp );
00177
00178 len = strlen( data->parameter_str )+1;
00179 fwrite( &len , sizeof(gint64) , 1 , fp );
00180 fwrite( data->parameter_str , sizeof(char) , len , fp );
00181
00182 len = data->pos->len;
00183 fwrite( &len , sizeof(gint64) , 1 , fp );
00184 fwrite( data->pos->data , sizeof(double) , len , fp );
00185
00186 return TRUE;
00187 }
00188
00189 gboolean load_measuring_station_data( gpointer ptr , FILE *fp )
00190 {
00191 Met_station_t *data = (Met_station_t*)ptr;
00192 guint len;
00193 double *pos_data;
00194
00195 fread( &(data->from_river_mouth) , sizeof(gboolean) , 1 , fp );
00196
00197 fread( &len , sizeof(guint) , 1 , fp );
00198 fread( data->filename , sizeof(char) , len , fp );
00199
00200 fread( &len , sizeof(guint) , 1 , fp );
00201 fread( data->parameter_str , sizeof(char) , len , fp );
00202
00203 fread( &len , sizeof(guint) , 1 , fp );
00204 pos_data = eh_new( double , len );
00205 fread( pos_data, sizeof(double) , len , fp );
00206
00207 data->pos = g_array_new( FALSE , FALSE , sizeof(double) );
00208 g_array_append_vals( data->pos , pos_data , len );
00209
00210 fread( &len , sizeof(guint) , 1 , fp );
00211 data->filename = eh_new( char , len );
00212 fread( data->filename , sizeof(char) , len , fp );
00213
00214 eh_free( pos_data );
00215
00216 return FALSE;
00217 }
00218
00219
00220
00221
00222
00223
00224
00225
00226
00227
00228
00229
00230
00231
00232
00233
00234
00235
00236
00237
00238
00239
00240
00241
00242
00243
00244
00245
00246
00247