TSP: The Transport Sample Protocol



Main Page | Modules | Alphabetical List | Data Structures | File List | Data Fields | Globals | Related Pages

glue_res.c

Go to the documentation of this file.
00001 
00038 #include "tsp_sys_headers.h"
00039 #include "glue_sserver.h"
00040 #include "tsp_ringbuf.h"
00041 #include "tsp_time.h"
00042 
00043 
00044 #define _LIBUTIL_REENTRANT 1
00045 #include "libUTIL.h"
00046 
00047 #define GLU_STREAM_INIT_USAGE "TSP RES Reader usage : filename[.res]  [-eof N]\n\t\twait N seconds after EOF to check file increment, default = 0 (NO WAIT)\n"
00048 #define GLU_RES_FILE_ARG_NUMBER 1
00049 #define GLU_RES_WAIT_EOF        3
00050 
00051 static int _wait_eof=0;
00052 static int _started = FALSE;
00053 
00054 struct GLU_state_t
00055 {
00056   void* res_values;
00057   int time_stamp;
00058   int nbvar;
00059   int use_dbl;
00060   double freq;
00061   d_rhandle h_res;
00062   TSP_sample_symbol_info_t* sample_symbol_info_list_val;
00063 };
00064 
00065 typedef struct GLU_state_t GLU_state_t;
00066 
00067 GLU_state_t glu_handler;
00068 
00069 
00070 void GLU_loop()
00071 {
00072   GLU_state_t* obj = &glu_handler;
00073   glu_item_t  item;
00074   int i;
00075   GLU_get_state_t state;
00076   int run = _wait_eof+1;
00077 
00078   while(!_started)
00079     sleep(1);
00080 
00081   while(run)
00082     {
00083       if(d_read_r(obj->h_res, obj->res_values) == EOF)
00084         {
00085           STRACE_DEBUG (("EOF for time=%d, val[0]=%g", obj->time_stamp, item.value));
00086           if(!_wait_eof)
00087             {
00088               state = GLU_GET_EOF;
00089               run = FALSE;
00090             }
00091           else
00092             {
00093               state = GLU_GET_NO_ITEM;
00094               sleep(1); /* wait 1 s for update of file */
00095               run--;
00096             }
00097         }
00098       else
00099         {
00100           /* got a new RES line : reset time-out counter and increment time_stamp */
00101           run = _wait_eof+1;
00102           obj->time_stamp++;
00103           state = GLU_GET_NEW_ITEM;
00104          
00105           /* push all data of line */
00106           for(i=0; i<obj->nbvar; i++)
00107             {
00108               item.provider_global_index = i;
00109               item.value = obj->use_dbl ?
00110                 ((double*)(obj->res_values)) [i] :
00111                 ((float*) (obj->res_values)) [i];
00112               
00113               TSP_datapool_push_next_item(&item);
00114 
00115               if(i==0)
00116                 STRACE_INFO (("New record : time=%d, val[0]=%g", obj->time_stamp, item.value));
00117             }
00118       
00119         }
00120 
00121       /* commit ... */
00122       TSP_datapool_push_commit(obj->time_stamp, state);     
00123     }
00124 
00125   /* close .res file */
00126   d_rclos_r(obj->h_res);
00127 }
00128 
00129 int GLU_start(void)
00130 {
00131   _started = TRUE;
00132   return TRUE;
00133 }
00134 
00135 
00136 int GLU_init(int fallback_argc, char* fallback_argv[])
00137 {
00138 
00139   int ret = TRUE;
00140   GLU_state_t* obj = &glu_handler;
00141   int i;
00142   double t1, t2;
00143   int nbrec;  
00144   char namev[RES_NAME_LEN];
00145   char descv[RES_DESC_LEN];
00146 
00147   /* is there a fallback stream ? */
00148   if(fallback_argc>1 && fallback_argv)
00149     {
00150       /* Yes, we must test it. We are expectig one arg */
00151       char* res_file = fallback_argv[GLU_RES_FILE_ARG_NUMBER];
00152       /* FIXME : quand la fonction renvera un code d'erreur, le verifier ! */
00153       obj->time_stamp = -1;
00154 
00155       STRACE_INFO(("stream_init = '%s'", res_file));
00156       obj->h_res = d_ropen_r(res_file, &(obj->use_dbl));
00157          
00158       if( obj->h_res )
00159         {
00160           obj->nbvar = d_rval_r(obj->h_res, 'v');
00161           nbrec = d_rval_r(obj->h_res, 'r');
00162 
00163           STRACE_INFO(("Total number of records = %d", nbrec));
00164           STRACE_INFO(("Total number of variables = %d", obj->nbvar));
00165           STRACE_INFO(("Data type = %s", obj->use_dbl ? "DOUBLE" : "FLOAT" ));
00166 
00167           obj->sample_symbol_info_list_val = calloc (obj->nbvar+1, sizeof (TSP_sample_symbol_info_t)) ;
00168           assert(obj->sample_symbol_info_list_val);
00169           for (i=0; i<obj->nbvar; i++)
00170             {      
00171               d_rnam_r(obj->h_res, namev, descv, i);
00172 
00173               obj->sample_symbol_info_list_val[i].name = strdup(namev);
00174               obj->sample_symbol_info_list_val[i].provider_global_index = i;
00175               obj->sample_symbol_info_list_val[i].period = 1;
00176             }
00177   
00178           obj->res_values = obj->use_dbl ?
00179             calloc((obj->nbvar+1),sizeof(double))
00180             : calloc((obj->nbvar+1),sizeof(float));
00181           TSP_CHECK_ALLOC(obj->res_values, FALSE);
00182               
00183           /* Try to compute res file frequency */
00184           d_read_r(obj->h_res, obj->res_values);
00185           t1 = obj->use_dbl ? ((double*)(obj->res_values)) [0] : ((float*)(obj->res_values)) [0];
00186           d_read_r(obj->h_res, obj->res_values);
00187           t2 = obj->use_dbl ? ((double*)(obj->res_values)) [0] : ((float*)(obj->res_values)) [0];
00188           if (t2!=t1)
00189             obj->freq = 1/(t2-t1);
00190           else
00191             obj->freq = 0;
00192           d_restart_r(obj->h_res); /* ask to restart from begining */
00193 
00194         }
00195       else
00196         {
00197           STRACE_ERROR(("Function d_rval_r failed for file : '%s'", res_file));
00198         }
00199 
00200        if(fallback_argc > GLU_RES_WAIT_EOF)
00201         {
00202           _wait_eof = atoi(fallback_argv[GLU_RES_WAIT_EOF]);
00203         }
00204     }
00205   else
00206     {
00207       STRACE_ERROR((GLU_STREAM_INIT_USAGE));
00208       ret = FALSE;
00209     }
00210 
00211   return ret;
00212 }
00213 
00214 
00215 
00216 int  GLU_get_sample_symbol_info_list(GLU_handle_t h_glu,TSP_sample_symbol_info_list_t* symbol_list)
00217 {
00218   GLU_state_t* obj = &glu_handler;
00219 
00220   symbol_list->TSP_sample_symbol_info_list_t_len = obj->nbvar;
00221   symbol_list->TSP_sample_symbol_info_list_t_val = obj->sample_symbol_info_list_val;
00222             
00223   return TRUE;
00224 }
00225 
00226 
00227 char* GLU_get_server_name(void)
00228 {
00229   return "ResServer";
00230 }
00231 
00232 GLU_server_type_t GLU_get_server_type(void)
00233 {
00234   return GLU_SERVER_TYPE_PASSIVE;
00235 }
00236 
00237 double GLU_get_base_frequency(void)
00238 {
00239   GLU_state_t* obj = &glu_handler;
00240   /* Server is passive, frequency is computed in GLU_init */
00241   return obj->freq;
00242 }
00243 
00244 /* following functions are meaningless : do nothing */  
00245 
00246 void GLU_forget_data(GLU_handle_t h_glu)
00247 {
00248 }
00249 
00250 GLU_handle_t GLU_get_instance(int argc, char* argv[], char** error_info)
00251 {
00252   return GLU_GLOBAL_HANDLE;
00253 }
00254 
Framework Home Page.

Beware !! TSP wave is coming...