master/master.c
changeset 332 e16093374dfd
parent 331 17f58fe99511
child 334 2be97e069602
equal deleted inserted replaced
331:17f58fe99511 332:e16093374dfd
   238     master->debug_level = 0;
   238     master->debug_level = 0;
   239 
   239 
   240     master->stats.timeouts = 0;
   240     master->stats.timeouts = 0;
   241     master->stats.delayed = 0;
   241     master->stats.delayed = 0;
   242     master->stats.corrupted = 0;
   242     master->stats.corrupted = 0;
       
   243     master->stats.skipped = 0;
   243     master->stats.unmatched = 0;
   244     master->stats.unmatched = 0;
   244     master->stats.t_last = 0;
   245     master->stats.t_last = 0;
   245 
   246 
   246     master->mode = EC_MASTER_MODE_ORPHANED;
   247     master->mode = EC_MASTER_MODE_ORPHANED;
   247 
   248 
   285     ec_datagram_t *queued_datagram;
   286     ec_datagram_t *queued_datagram;
   286 
   287 
   287     // check, if the datagram is already queued
   288     // check, if the datagram is already queued
   288     list_for_each_entry(queued_datagram, &master->datagram_queue, queue) {
   289     list_for_each_entry(queued_datagram, &master->datagram_queue, queue) {
   289         if (queued_datagram == datagram) {
   290         if (queued_datagram == datagram) {
       
   291             master->stats.skipped++;
       
   292             ec_master_output_stats(master);
   290             datagram->state = EC_DATAGRAM_QUEUED;
   293             datagram->state = EC_DATAGRAM_QUEUED;
   291             if (unlikely(master->debug_level))
       
   292                 EC_WARN("datagram already queued.\n");
       
   293             return;
   294             return;
   294         }
   295         }
   295     }
   296     }
   296 
   297 
   297     list_add_tail(&datagram->queue, &master->datagram_queue);
   298     list_add_tail(&datagram->queue, &master->datagram_queue);
   535             master->stats.delayed = 0;
   536             master->stats.delayed = 0;
   536         }
   537         }
   537         if (master->stats.corrupted) {
   538         if (master->stats.corrupted) {
   538             EC_WARN("%i frame(s) CORRUPTED!\n", master->stats.corrupted);
   539             EC_WARN("%i frame(s) CORRUPTED!\n", master->stats.corrupted);
   539             master->stats.corrupted = 0;
   540             master->stats.corrupted = 0;
       
   541         }
       
   542         if (master->stats.skipped) {
       
   543             EC_WARN("%i datagram(s) SKIPPED!\n", master->stats.skipped);
       
   544             master->stats.skipped = 0;
   540         }
   545         }
   541         if (master->stats.unmatched) {
   546         if (master->stats.unmatched) {
   542             EC_WARN("%i datagram(s) UNMATCHED!\n", master->stats.unmatched);
   547             EC_WARN("%i datagram(s) UNMATCHED!\n", master->stats.unmatched);
   543             master->stats.unmatched = 0;
   548             master->stats.unmatched = 0;
   544         }
   549         }
  1232     cycles_t t_received, t_timeout;
  1237     cycles_t t_received, t_timeout;
  1233 
  1238 
  1234     ec_device_call_isr(master->device);
  1239     ec_device_call_isr(master->device);
  1235 
  1240 
  1236     t_received = get_cycles();
  1241     t_received = get_cycles();
  1237     t_timeout = (cycles_t) EC_IO_TIMEOUT * (cpu_khz / 1000);
  1242     t_timeout = EC_IO_TIMEOUT * cpu_khz / 1000;
  1238 
  1243 
  1239     // dequeue all received datagrams
  1244     // dequeue all received datagrams
  1240     list_for_each_entry_safe(datagram, next, &master->datagram_queue, queue)
  1245     list_for_each_entry_safe(datagram, next, &master->datagram_queue, queue)
  1241         if (datagram->state == EC_DATAGRAM_RECEIVED)
  1246         if (datagram->state == EC_DATAGRAM_RECEIVED)
  1242             list_del_init(&datagram->queue);
  1247             list_del_init(&datagram->queue);