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

Beware !! TSP wave is coming...