# HG changeset patch # User Florian Pose # Date 1313084628 -7200 # Node ID 01b30593e942013845a2f92cda09dfb30147b64d # Parent 0ce254664c81f0fb8da2d85bd321789064a34c9c Avoided casting-away constness in expected working counter calculation. diff -r 0ce254664c81 -r 01b30593e942 master/domain.c --- a/master/domain.c Tue Aug 09 22:10:45 2011 +0200 +++ b/master/domain.c Thu Aug 11 19:43:48 2011 +0200 @@ -96,8 +96,9 @@ ec_domain_t *domain /**< EtherCAT domain. */ ) { - if (domain->data_origin == EC_ORIG_INTERNAL && domain->data) + if (domain->data_origin == EC_ORIG_INTERNAL && domain->data) { kfree(domain->data); + } domain->data = NULL; domain->data_origin = EC_ORIG_INTERNAL; } @@ -137,7 +138,7 @@ uint32_t logical_offset, /**< Logical offset. */ size_t data_size, /**< Size of the data. */ uint8_t *data, /**< Process data. */ - const unsigned int used[] /**< Used by inputs/outputs. */ + const unsigned int used[] /**< Slave config counter for in/out. */ ) { ec_datagram_t *datagram; @@ -187,6 +188,35 @@ /*****************************************************************************/ +/** Domain finish helper function. + * + * Detects, if a slave configuration has already been taken into account for + * a datagram's expected working counter calculation. + * + * Walks through the list of all FMMU configurations for the current datagram + * and ends before the current datagram. + */ +int shall_count( + const ec_fmmu_config_t *cur_fmmu, /**< Current FMMU with direction to + search for. */ + const ec_fmmu_config_t *first_fmmu /**< Datagram's first FMMU. */ + ) +{ + for (; first_fmmu != cur_fmmu; + first_fmmu = list_entry(first_fmmu->list.next, + ec_fmmu_config_t, list)) { + + if (first_fmmu->sc == cur_fmmu->sc + && first_fmmu->dir == cur_fmmu->dir) { + return 0; // was already counted + } + } + + return 1; +} + +/*****************************************************************************/ + /** Finishes a domain. * * This allocates the necessary datagrams and writes the correct logical @@ -207,7 +237,7 @@ unsigned int datagram_count; unsigned int datagram_used[EC_DIR_COUNT]; ec_fmmu_config_t *fmmu; - ec_fmmu_config_t *fmmu_temp; + const ec_fmmu_config_t *datagram_first_fmmu = NULL; const ec_datagram_t *datagram; int ret; @@ -223,32 +253,31 @@ } } - // Cycle through all domain FMMUS and + // Cycle through all domain FMMUs and // - correct the logical base addresses // - set up the datagrams to carry the process data + // - calculate the datagrams' expected working counters datagram_offset = 0; datagram_size = 0; datagram_count = 0; datagram_used[EC_DIR_OUTPUT] = 0; datagram_used[EC_DIR_INPUT] = 0; - list_for_each_entry(fmmu_temp, &domain->fmmu_configs, list) { - // we have to remove the constness, sorry FIXME - ec_slave_config_t *sc = (ec_slave_config_t *) fmmu_temp->sc; - sc->used_for_fmmu_datagram[fmmu_temp->dir] = 0; + if (!list_empty(&domain->fmmu_configs)) { + datagram_first_fmmu = + list_entry(domain->fmmu_configs.next, ec_fmmu_config_t, list); } list_for_each_entry(fmmu, &domain->fmmu_configs, list) { + // Correct logical FMMU address fmmu->logical_start_address += base_address; fmmu->domain_address += base_address; - // Increment Input/Output counter to determine datagram types + // Increment input/output counter to determine datagram types // and calculate expected working counters - if (fmmu->sc->used_for_fmmu_datagram[fmmu->dir] == 0) { - ec_slave_config_t *sc = (ec_slave_config_t *)fmmu->sc; + if (shall_count(fmmu, datagram_first_fmmu)) { datagram_used[fmmu->dir]++; - sc->used_for_fmmu_datagram[fmmu->dir] = 1; } // If the current FMMU's data do not fit in the current datagram, @@ -260,15 +289,13 @@ datagram_used); if (ret < 0) return ret; + datagram_offset += datagram_size; datagram_size = 0; datagram_count++; datagram_used[EC_DIR_OUTPUT] = 0; datagram_used[EC_DIR_INPUT] = 0; - list_for_each_entry(fmmu_temp, &domain->fmmu_configs, list) { - ec_slave_config_t *sc = (ec_slave_config_t *)fmmu_temp->sc; - sc->used_for_fmmu_datagram[fmmu_temp->dir] = 0; - } + datagram_first_fmmu = fmmu; } datagram_size += fmmu->tx_size; @@ -337,7 +364,7 @@ } /****************************************************************************** - * Realtime interface + * Application interface *****************************************************************************/ int ecrt_domain_reg_pdo_entry_list(ec_domain_t *domain, diff -r 0ce254664c81 -r 01b30593e942 master/slave_config.c --- a/master/slave_config.c Tue Aug 09 22:10:45 2011 +0200 +++ b/master/slave_config.c Thu Aug 11 19:43:48 2011 +0200 @@ -77,8 +77,6 @@ ec_sync_config_init(&sc->sync_configs[i]); sc->used_fmmus = 0; - sc->used_for_fmmu_datagram[EC_DIR_INPUT] = 0; - sc->used_for_fmmu_datagram[EC_DIR_OUTPUT] = 0; sc->dc_assign_activate = 0x0000; sc->dc_sync[0].cycle_time = 0x00000000; sc->dc_sync[1].cycle_time = 0x00000000; diff -r 0ce254664c81 -r 01b30593e942 master/slave_config.h --- a/master/slave_config.h Tue Aug 09 22:10:45 2011 +0200 +++ b/master/slave_config.h Thu Aug 11 19:43:48 2011 +0200 @@ -135,9 +135,6 @@ configurations. */ ec_fmmu_config_t fmmu_configs[EC_MAX_FMMUS]; /**< FMMU configurations. */ uint8_t used_fmmus; /**< Number of FMMUs used. */ - unsigned int used_for_fmmu_datagram[EC_DIR_COUNT]; /**< Number of FMMUs - used for process data - exchange datagrams. */ uint16_t dc_assign_activate; /**< Vendor-specific AssignActivate word. */ ec_sync_signal_t dc_sync[EC_SYNC_SIGNAL_COUNT]; /**< DC sync signals. */