TSP: The Transport Sample Protocol



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

glue_stub.c

Go to the documentation of this file.
00001 
00039 #include <string.h>
00040 
00041 #include "tsp_sys_headers.h"
00042 #include "glue_sserver.h"
00043 #include "tsp_ringbuf.h"
00044 #include "tsp_time.h"
00045 #include "tsp_datapool.h"
00046 #include "calc_func.h"
00047 
00048 /*RINGBUF_DECLARE_TYPE_DYNAMIC(glu_ringbuf,glu_item_t);*/
00049 
00050 /* Glue server ringbuf size */
00051 #define GLU_RING_BUFSIZE (1000 * 100 * 10)
00052 
00053 /* TSP glue server defines */
00054 #define TSP_STUB_FREQ 100.0 /*Hz*/
00055 #define TSP_USLEEP_PERIOD_US (1000000/TSP_STUB_FREQ) /*given in µS, value 10ms*/
00056 #define GLU_MAX_SYMBOLS 1000
00057 
00058 /* Nasty static variables */
00059 static TSP_sample_symbol_info_t *X_sample_symbol_info_list_val;
00060 static tsp_hrtime_t X_lasttime;
00061 /*static glu_ringbuf* glu_ring = 0;*/
00062 pthread_t thread_id = 0;        
00063 static char* X_server_name = "StubbedServer";
00064 static time_stamp_t my_time = 0;
00065 
00066 
00067 char* GLU_get_server_name(void)
00068 {
00069   return X_server_name;
00070 }
00071 
00072 int  GLU_get_symbol_number(void)
00073 
00074 {
00075   int i = 0;
00076   TSP_sample_symbol_info_t* p  = X_sample_symbol_info_list_val;
00077         
00078   for( p=X_sample_symbol_info_list_val; p->name!=0 ; p++)
00079     {
00080       i++;
00081     }
00082 
00083   return i;
00084 }
00085 
00086 /*static int data_missed = FALSE;*/
00087 
00088 static void* GLU_thread(void* arg)
00089 {
00090   int i, symbols_nb, *ptr_index;
00091   tsp_hrtime_t current_time;
00092   glu_item_t item;
00093   double memo_val[GLU_MAX_SYMBOLS]; /*for debug informatin */
00094 
00095   current_time = X_lasttime = tsp_gethrtime();  
00096 
00097   /* infinite loop for symbols generation */
00098   while(1)
00099     {
00100       /* Must be call at each step in case of new samples wanted */
00101       TSP_datapool_get_reverse_list (&symbols_nb, &ptr_index); 
00102       for(i = 0 ; i <  symbols_nb ; i++)
00103         {
00104           int index=ptr_index[i];
00105           if(my_time%X_sample_symbol_info_list_val[index].period == 0)
00106             {
00107               item.time = my_time;
00108               item.provider_global_index = index;
00109               if (index!=0)
00110                 item.value = calc_func(index, my_time);
00111               else
00112                 item.value = (double)(my_time) / (double)(TSP_STUB_FREQ);
00113               memo_val[index]=item.value;
00114 
00115               TSP_datapool_push_next_item(&item);
00116               /*RINGBUF_PTR_PUT(glu_ring, item);*/
00117             }
00118         }
00119       /* Finalize the datapool state with new time : Ready to send */
00120       TSP_datapool_push_commit(my_time, GLU_GET_NEW_ITEM);
00121 
00122       if( current_time <= X_lasttime )
00123         { 
00124           tsp_usleep(TSP_USLEEP_PERIOD_US);
00125         }
00126 
00127       X_lasttime += TSP_USLEEP_PERIOD_US*1000;
00128       current_time = tsp_gethrtime();
00129       /*      
00130       if(last_missed!=RINGBUF_PTR_MISSED(glu_ring))
00131         {
00132           last_missed = RINGBUF_PTR_MISSED(glu_ring);
00133           data_missed = TRUE;
00134           }*/
00135       
00136       my_time++;    
00137       
00138       if (!(my_time%1000))  STRACE_INFO(("TOP %d : %s=%g \t%s=%g \t%s=%g \t%s=%g", my_time,
00139                                          X_sample_symbol_info_list_val[0].name, memo_val[0],
00140                                          X_sample_symbol_info_list_val[1].name, memo_val[1],
00141                                          X_sample_symbol_info_list_val[2].name, memo_val[2],
00142                                          X_sample_symbol_info_list_val[3].name, memo_val[3]
00143                                         ));
00144     }
00145     
00146   return arg;
00147 
00148 }
00149 
00150 int GLU_init(int fallback_argc, char* fallback_argv[])
00151 {
00152   int i;
00153   char symbol_buf[50];
00154   
00155   X_sample_symbol_info_list_val = calloc (GLU_MAX_SYMBOLS+1, sizeof (TSP_sample_symbol_info_t)) ;
00156   for (i=0; i<GLU_MAX_SYMBOLS; i++)
00157     {      
00158       sprintf(symbol_buf, "Symbol%d",i);
00159       X_sample_symbol_info_list_val[i].name = strdup(symbol_buf);
00160       X_sample_symbol_info_list_val[i].provider_global_index = i;
00161       X_sample_symbol_info_list_val[i].period = 1; 
00162     }  
00163   /*overide first name*/
00164   X_sample_symbol_info_list_val[0].name = strdup("t");
00165 
00166   /*  RINGBUF_PTR_INIT(glu_ringbuf, glu_ring, glu_item_t,  0, RINGBUF_SZ(GLU_RING_BUFSIZE));
00167       RINGBUF_PTR_RESET_CONSUMER (glu_ring);*/
00168   return TRUE;
00169 }
00170 
00171 int GLU_start(void)
00172 {
00173   /* start GLU only if it was not already started. */
00174   if (0==thread_id) {
00175     return pthread_create(&thread_id, NULL, GLU_thread, NULL);  
00176   } else {
00177     return 1;
00178   }
00179 }
00180 
00181 
00182 int  GLU_get_sample_symbol_info_list(GLU_handle_t h_glu,TSP_sample_symbol_info_list_t* symbol_list)
00183 {
00184   int i = 0;
00185   TSP_sample_symbol_info_t* p; 
00186         
00187   for (p=X_sample_symbol_info_list_val; p->name!=0 ; p++)
00188     {
00189       i++;
00190     }
00191 
00192   symbol_list->TSP_sample_symbol_info_list_t_len = i;
00193   symbol_list->TSP_sample_symbol_info_list_t_val = X_sample_symbol_info_list_val;
00194             
00195   return TRUE;
00196 }
00197 
00198 
00199 GLU_server_type_t GLU_get_server_type(void)
00200 {
00201   return GLU_SERVER_TYPE_ACTIVE;
00202 }
00203 
00204 
00205 GLU_handle_t GLU_get_instance(int argc, char* argv[], char** error_info)
00206 {
00207   if(error_info)
00208     *error_info = "";
00209 
00210   return GLU_GLOBAL_HANDLE;
00211 }
00212 
00213 double GLU_get_base_frequency(void)
00214 {
00215   /* Calculate base frequency */
00216   return TSP_STUB_FREQ;
00217 }
00218 
00219 
Framework Home Page.

Beware !! TSP wave is coming...