svghmi/svghmi.c
branchsvghmi
changeset 2775 3b93409ba22c
parent 2771 361366b891ca
child 2776 246ae685ab65
equal deleted inserted replaced
2774:9857b4b0d979 2775:3b93409ba22c
   116 
   116 
   117     // check for variable being modified
   117     // check for variable being modified
   118     if(dsc->wstate == buf_tosend){
   118     if(dsc->wstate == buf_tosend){
   119         // send 
   119         // send 
   120 
   120 
   121         // TODO call the python callback 
   121         // TODO pack data in buffer
   122 
   122 
   123         dsc->wstate = buf_free; 
   123         dsc->wstate = buf_free;
   124     }
   124     }
   125 
   125 
   126     AtomicCompareExchange(&dsc->wlock, 1, 0);
   126     AtomicCompareExchange(&dsc->wlock, 1, 0);
   127 }
   127 }
   128 
   128 
   136 
   136 
   137 
   137 
   138     memcpy(visible_value_p, src_p, __get_type_enum_size(dsc->type));
   138     memcpy(visible_value_p, src_p, __get_type_enum_size(dsc->type));
   139 }
   139 }
   140 
   140 
       
   141 static pthread_cond_t UART_WakeCond = PTHREAD_COND_INITIALIZER;
       
   142 static pthread_mutex_t UART_WakeCondLock = PTHREAD_MUTEX_INITIALIZER;
       
   143 
   141 int __init_svghmi()
   144 int __init_svghmi()
   142 {
   145 {
   143     bzero(rbuf,sizeof(rbuf));
   146     bzero(rbuf,sizeof(rbuf));
   144     bzero(wbuf,sizeof(wbuf));
   147     bzero(wbuf,sizeof(wbuf));
   145     
   148     continue_collect = 1;
   146     // TODO - sending pthread condition variable
       
   147 
   149 
   148     return 0;
   150     return 0;
   149 }
   151 }
   150 
   152 
   151 void __cleanup_svghmi()
   153 void __cleanup_svghmi()
   152 {
   154 {
       
   155     pthread_mutex_lock(&UART_WakeCondLock);
       
   156     continue_collect = 0;
       
   157     pthread_cond_signal(&UART_WakeCond);
       
   158     pthread_mutex_unlock(&UART_WakeCondLock);
   153 }
   159 }
   154 
   160 
   155 void __retrieve_svghmi()
   161 void __retrieve_svghmi()
   156 {
   162 {
   157     traverse_hmi_tree(read_iterator);
   163     traverse_hmi_tree(read_iterator);
   160 void __publish_svghmi()
   166 void __publish_svghmi()
   161 {
   167 {
   162     global_write_dirty = 0;
   168     global_write_dirty = 0;
   163     traverse_hmi_tree(write_iterator);
   169     traverse_hmi_tree(write_iterator);
   164     if(global_write_dirty) {
   170     if(global_write_dirty) {
   165         // TODO : set condition variable to wakeup sending collector
   171         pthread_cond_signal(&UART_WakeCond);
   166     }
   172     }
   167 
   173 }
   168 }
   174 
   169 
   175 /* PYTHON CALLS */
   170 void* collect_updates_to_send(void* args){
   176 int svghmi_send_collect(uint32_t *size, void *ptr){
   171 
   177 
   172     // TODO : get callback from args
   178     pthread_mutex_lock(&UART_WakeCondLock);
   173 
   179     do_collect = continue_collect;
   174 
   180     if do_collect;
   175     // TODO : wait for 
   181         pthread_cond_wait(&UART_WakeCond, &UART_WakeCondLock);
   176     //        - condition variable
   182         do_collect = continue_collect;
   177 
   183     pthread_mutex_unlock(&UART_WakeCondLock);
   178     // TODO add arg to traverse_hmi_tree to pass callback
   184 
   179 
   185 
   180     traverse_hmi_tree(send_iterator);
   186     if(do_collect) {
   181 
   187         traverse_hmi_tree(send_iterator);
   182 }
   188         /* TODO set ptr and size to something  */
       
   189         return 0;
       
   190     }
       
   191     else
       
   192     {
       
   193         return EINTR;
       
   194     }
       
   195 }
       
   196 
       
   197 int svghmi_recv_dispatch(uint32_t size, void* ptr){
       
   198     /* TODO something with ptr and size
       
   199         - subscribe
       
   200          or
       
   201         - spread values
       
   202     */
       
   203 }
       
   204