diff --git a/ChangeLog b/ChangeLog old mode 100644 new mode 100755 diff --git a/LICENSE b/LICENSE old mode 100644 new mode 100755 diff --git a/Makefile b/Makefile old mode 100644 new mode 100755 diff --git a/README.md b/README.md old mode 100644 new mode 100755 diff --git a/TODO b/TODO old mode 100644 new mode 100755 diff --git a/configure.mk b/configure.mk old mode 100644 new mode 100755 index 55e77e2f..b75b31de --- a/configure.mk +++ b/configure.mk @@ -39,4 +39,3 @@ RTAIINCDIR = $(subst /rtai.h,,$(firstword $(wildcard $(foreach i,$(subst -I,,$(f ifneq ($(RTAIINCDIR),) RTAIDIR = $(realpath $(RTAIINCDIR)/..) endif - diff --git a/debian/changelog b/debian/changelog old mode 100644 new mode 100755 diff --git a/debian/compat b/debian/compat old mode 100644 new mode 100755 diff --git a/debian/control b/debian/control old mode 100644 new mode 100755 diff --git a/debian/copyright b/debian/copyright old mode 100644 new mode 100755 diff --git a/debian/docs b/debian/docs old mode 100644 new mode 100755 diff --git a/debian/source/format b/debian/source/format old mode 100644 new mode 100755 diff --git a/examples/Makefile b/examples/Makefile old mode 100644 new mode 100755 diff --git a/examples/generic-complex/CPD17/cpd17_x.hal b/examples/generic-complex/CPD17/cpd17_x.hal old mode 100644 new mode 100755 diff --git a/examples/generic-complex/CPD17/cpd17_x.ini b/examples/generic-complex/CPD17/cpd17_x.ini old mode 100644 new mode 100755 diff --git a/examples/generic-complex/CPD17/ethercat-conf_X.xml b/examples/generic-complex/CPD17/ethercat-conf_X.xml old mode 100644 new mode 100755 diff --git a/examples/generic-complex/README b/examples/generic-complex/README old mode 100644 new mode 100755 diff --git a/examples/generic-complex/ethercat-conf.xml b/examples/generic-complex/ethercat-conf.xml old mode 100644 new mode 100755 diff --git a/examples/swm-fm45a/ethercat-conf.xml b/examples/swm-fm45a/ethercat-conf.xml old mode 100644 new mode 100755 diff --git a/examples/swm-fm45a/swm-fm45a-axis.hal b/examples/swm-fm45a/swm-fm45a-axis.hal old mode 100644 new mode 100755 diff --git a/examples/swm-fm45a/swm-fm45a-io.hal b/examples/swm-fm45a/swm-fm45a-io.hal old mode 100644 new mode 100755 diff --git a/examples/swm-fm45a/swm-fm45a-spindle.hal b/examples/swm-fm45a/swm-fm45a-spindle.hal old mode 100644 new mode 100755 diff --git a/examples/swm-fm45a/swm-fm45a.hal b/examples/swm-fm45a/swm-fm45a.hal old mode 100644 new mode 100755 diff --git a/examples/swm-fm45a/swm-fm45a.ini b/examples/swm-fm45a/swm-fm45a.ini old mode 100644 new mode 100755 diff --git a/examples/swm-fm45a/tool.tbl b/examples/swm-fm45a/tool.tbl old mode 100644 new mode 100755 diff --git a/src/Kbuild b/src/Kbuild old mode 100644 new mode 100755 diff --git a/src/Makefile b/src/Makefile old mode 100644 new mode 100755 diff --git a/src/lcec.h b/src/lcec.h old mode 100644 new mode 100755 index 00b597b0..f5598f63 --- a/src/lcec.h +++ b/src/lcec.h @@ -109,6 +109,7 @@ typedef struct lcec_master { uint32_t app_time_period; int sync_ref_cnt; int sync_ref_cycles; + uint32_t reference_time; } lcec_master_t; typedef struct { @@ -155,6 +156,7 @@ typedef struct lcec_slave { ec_pdo_info_t *generic_pdos; ec_sync_info_t *generic_sync_managers; lcec_slave_sdoconf_t *sdo_config; + LCEC_CONF_ATTR_T attrs[LCEC_CONF_ATTR_MAX]; } lcec_slave_t; ec_sdo_request_t *lcec_read_sdo(struct lcec_slave *slave, uint16_t index, uint8_t subindex, size_t size); diff --git a/src/lcec_conf.c b/src/lcec_conf.c old mode 100644 new mode 100755 index cbcbf380..904b4879 --- a/src/lcec_conf.c +++ b/src/lcec_conf.c @@ -36,6 +36,12 @@ typedef struct { LCEC_SLAVE_TYPE_T type; } LCEC_CONF_TYPELIST_T; +typedef struct { + char *name; + LCEC_SLAVE_TYPE_T type; + char *attr[LCEC_CONF_ATTR_MAX]; +} LCEC_CONF_ATTRLIST_T; + typedef struct { hal_u32_t *master_count; hal_u32_t *slave_count; @@ -147,6 +153,12 @@ static const LCEC_CONF_TYPELIST_T slaveTypes[] = { { NULL } }; +static const LCEC_CONF_ATTRLIST_T slaveAttrs[] = { + {"DeASDA", lcecSlaveTypeDeASDA, "test","",""}, + {"EL7041-1000", lcecSlaveTypeEL7041_1000, "maxCurrent","nomVoltage",""}, + {NULL} +}; + char *modname = "lcec_conf"; int hal_comp_id; LCEC_CONF_HAL_T *conf_hal_data; @@ -627,6 +639,8 @@ void parseMasterAttrs(const char **attr) { void parseSlaveAttrs(const char **attr) { LCEC_CONF_SLAVE_T *p = getOutputBuffer(sizeof(LCEC_CONF_SLAVE_T)); + int i; + int attrcont= -1 ; if (p == NULL) { return; } @@ -687,7 +701,48 @@ void parseSlaveAttrs(const char **attr) { continue; } } - + else { //Atributos adicionales para tipos no genericos, hay que comprobar si son validos y si no estan repetidos. + //Additionals attributes for no generic type. It must check if they are valid and aren't repeated. + + const LCEC_CONF_ATTRLIST_T *slaveAttr; + for (slaveAttr = slaveAttrs; slaveAttr->name != NULL; slaveAttr++) { //recorremos lista con atributos validos por tipo de esclavo + if (p->type == slaveAttr->type){ //comprobamos si estamos en el esclavo correcto + for (i=0; iattr[i]) == 0){ + break; //vemos si el atributo es valido para el esclavo en cuestion + } + } + break; + } + } + if (slaveAttr->name == NULL) { //si no ha encontrado el esclavo en la lista o no tenia los atributos validos + fprintf(stderr, "%s: ERROR: Invalid slave attribute %s\n", modname, name); + XML_StopParser(parser, 0); + return; + } + + //hay que comprobar si no estaba repetido ya y guardarlo en el que este libre. + for (i=attrcont; i>=0; i--){ //comprobacion de repetido + if (strcmp(name, p->attrs[i].attr) == 0){ //ya estaba definido y por tanto error + fprintf(stderr, "%s: ERROR: Duplicated slave attribute %s\n", modname, name); + XML_StopParser(parser, 0); + return; + } + } + strncpy(p->attrs[attrcont+1].attr, name, LCEC_CONF_STR_MAXLEN); + p->attrs[attrcont+1].attr[LCEC_CONF_STR_MAXLEN - 1] = 0; + p->attrs[attrcont+1].val = atof(val); + attrcont++; + //POR seguridad y depuración comprobacion si pasa de LCEC_CONF_ATTR_MAX + if (attrcont >= LCEC_CONF_ATTR_MAX){ + fprintf(stderr, "%s: ERROR: Mas de LCEC_CONF_ATTR_MAX atributos para el esclavo\n", modname); + XML_StopParser(parser, 0); + return; + } + + continue; + + } // handle error fprintf(stderr, "%s: ERROR: Invalid slave attribute %s\n", modname, name); XML_StopParser(parser, 0); diff --git a/src/lcec_conf.h b/src/lcec_conf.h old mode 100644 new mode 100755 index c88cf0a7..b8455bf9 --- a/src/lcec_conf.h +++ b/src/lcec_conf.h @@ -28,6 +28,8 @@ #define LCEC_CONF_STR_MAXLEN 48 +#define LCEC_CONF_ATTR_MAX 3 + #define LCEC_CONF_SDO_COMPLETE_SUBIDX -1 #define LCEC_CONF_GENERIC_MAX_SUBPINS 32 #define LCEC_CONF_GENERIC_MAX_BITLEN 255 @@ -141,6 +143,11 @@ typedef struct { char name[LCEC_CONF_STR_MAXLEN]; } LCEC_CONF_MASTER_T; +typedef struct { + char attr[LCEC_CONF_STR_MAXLEN]; + float val; +} LCEC_CONF_ATTR_T; + typedef struct { LCEC_CONF_TYPE_T confType; int index; @@ -154,6 +161,7 @@ typedef struct { unsigned int pdoMappingCount; size_t sdoConfigLength; char name[LCEC_CONF_STR_MAXLEN]; + LCEC_CONF_ATTR_T attrs[LCEC_CONF_ATTR_MAX]; } LCEC_CONF_SLAVE_T; typedef struct { diff --git a/src/lcec_deasda.c b/src/lcec_deasda.c old mode 100644 new mode 100755 diff --git a/src/lcec_deasda.h b/src/lcec_deasda.h old mode 100644 new mode 100755 diff --git a/src/lcec_ek1100.h b/src/lcec_ek1100.h old mode 100644 new mode 100755 diff --git a/src/lcec_el1252.c b/src/lcec_el1252.c old mode 100644 new mode 100755 diff --git a/src/lcec_el1252.h b/src/lcec_el1252.h old mode 100644 new mode 100755 diff --git a/src/lcec_el1xxx.c b/src/lcec_el1xxx.c old mode 100644 new mode 100755 diff --git a/src/lcec_el1xxx.h b/src/lcec_el1xxx.h old mode 100644 new mode 100755 diff --git a/src/lcec_el2202.c b/src/lcec_el2202.c old mode 100644 new mode 100755 diff --git a/src/lcec_el2202.h b/src/lcec_el2202.h old mode 100644 new mode 100755 diff --git a/src/lcec_el2521.c b/src/lcec_el2521.c old mode 100644 new mode 100755 diff --git a/src/lcec_el2521.h b/src/lcec_el2521.h old mode 100644 new mode 100755 diff --git a/src/lcec_el2xxx.c b/src/lcec_el2xxx.c old mode 100644 new mode 100755 diff --git a/src/lcec_el2xxx.h b/src/lcec_el2xxx.h old mode 100644 new mode 100755 diff --git a/src/lcec_el31x2.c b/src/lcec_el31x2.c old mode 100644 new mode 100755 diff --git a/src/lcec_el31x2.h b/src/lcec_el31x2.h old mode 100644 new mode 100755 diff --git a/src/lcec_el40x1.c b/src/lcec_el40x1.c old mode 100644 new mode 100755 diff --git a/src/lcec_el40x1.h b/src/lcec_el40x1.h old mode 100644 new mode 100755 diff --git a/src/lcec_el40x2.c b/src/lcec_el40x2.c old mode 100644 new mode 100755 diff --git a/src/lcec_el40x2.h b/src/lcec_el40x2.h old mode 100644 new mode 100755 diff --git a/src/lcec_el41x2.c b/src/lcec_el41x2.c old mode 100644 new mode 100755 diff --git a/src/lcec_el41x2.h b/src/lcec_el41x2.h old mode 100644 new mode 100755 diff --git a/src/lcec_el5101.c b/src/lcec_el5101.c old mode 100644 new mode 100755 diff --git a/src/lcec_el5101.h b/src/lcec_el5101.h old mode 100644 new mode 100755 diff --git a/src/lcec_el5151.c b/src/lcec_el5151.c old mode 100644 new mode 100755 diff --git a/src/lcec_el5151.h b/src/lcec_el5151.h old mode 100644 new mode 100755 diff --git a/src/lcec_el5152.c b/src/lcec_el5152.c old mode 100644 new mode 100755 diff --git a/src/lcec_el5152.h b/src/lcec_el5152.h old mode 100644 new mode 100755 diff --git a/src/lcec_el7041_1000.c b/src/lcec_el7041_1000.c old mode 100644 new mode 100755 index b4129199..cb26af08 --- a/src/lcec_el7041_1000.c +++ b/src/lcec_el7041_1000.c @@ -241,7 +241,7 @@ int lcec_el7041_1000_init(int comp_id, struct lcec_slave *s, ec_pdo_entry_reg_t lcec_master_t *m = s->master; lcec_el7041_1000_data_t *hd; int err; - + int i; // initialize callbacks s->proc_read = lcec_el7041_1000_read; s->proc_write = lcec_el7041_1000_write; @@ -253,7 +253,20 @@ int lcec_el7041_1000_init(int comp_id, struct lcec_slave *s, ec_pdo_entry_reg_t } memset(hd, 0, sizeof(lcec_el7041_1000_data_t)); s->hal_data = hd; - + + for (i=0; iattrs[i].attr,"maxCurrent")==0){ + if (ecrt_slave_config_sdo16(s->config, 0x8010, 0x01, s->attrs[i].val) != 0) { + rtapi_print_msg (RTAPI_MSG_ERR, LCEC_MSG_PFX "fail to configure slave %s.%s sdo 8010 01\n", m->name, s->name); + } + } + else if (strcmp(s->attrs[i].attr,"nomVoltage")==0){ + if (ecrt_slave_config_sdo16(s->config, 0x8010, 0x03, s->attrs[i].val) != 0) { + rtapi_print_msg (RTAPI_MSG_ERR, LCEC_MSG_PFX "fail to configure slave %s.%s sdo 8010 03\n", m->name, s->name); + } + } + } + // initialize sync info s->sync_info = lcec_el7041_1000_syncs; diff --git a/src/lcec_el7041_1000.h b/src/lcec_el7041_1000.h old mode 100644 new mode 100755 diff --git a/src/lcec_el7342.c b/src/lcec_el7342.c old mode 100644 new mode 100755 diff --git a/src/lcec_el7342.h b/src/lcec_el7342.h old mode 100644 new mode 100755 diff --git a/src/lcec_el95xx.c b/src/lcec_el95xx.c old mode 100644 new mode 100755 diff --git a/src/lcec_el95xx.h b/src/lcec_el95xx.h old mode 100644 new mode 100755 diff --git a/src/lcec_em7004.c b/src/lcec_em7004.c old mode 100644 new mode 100755 diff --git a/src/lcec_em7004.h b/src/lcec_em7004.h old mode 100644 new mode 100755 diff --git a/src/lcec_generic.c b/src/lcec_generic.c old mode 100644 new mode 100755 diff --git a/src/lcec_generic.h b/src/lcec_generic.h old mode 100644 new mode 100755 diff --git a/src/lcec_main.c b/src/lcec_main.c old mode 100644 new mode 100755 index e945d585..08079b53 --- a/src/lcec_main.c +++ b/src/lcec_main.c @@ -24,6 +24,7 @@ #include "lcec_el2xxx.h" #include "lcec_el2202.h" #include "lcec_el31x2.h" +#include "lcec_el3255.h" #include "lcec_el40x1.h" #include "lcec_el40x2.h" #include "lcec_el41x2.h" @@ -96,6 +97,8 @@ static const lcec_typelist_t types[] = { { lcecSlaveTypeEL2798, LCEC_EL2xxx_VID, LCEC_EL2798_PID, LCEC_EL2798_PDOS, lcec_el2xxx_init}, { lcecSlaveTypeEL2809, LCEC_EL2xxx_VID, LCEC_EL2809_PID, LCEC_EL2809_PDOS, lcec_el2xxx_init}, + { lcecSlaveTypeEP2028, LCEC_EL2xxx_VID, LCEC_EP2028_PID, LCEC_EP2028_PDOS, lcec_el2xxx_init}, + // analog in, 2ch, 16 bits { lcecSlaveTypeEL3102, LCEC_EL31x2_VID, LCEC_EL3102_PID, LCEC_EL31x2_PDOS, lcec_el31x2_init}, { lcecSlaveTypeEL3112, LCEC_EL31x2_VID, LCEC_EL3112_PID, LCEC_EL31x2_PDOS, lcec_el31x2_init}, @@ -104,6 +107,9 @@ static const lcec_typelist_t types[] = { { lcecSlaveTypeEL3152, LCEC_EL31x2_VID, LCEC_EL3152_PID, LCEC_EL31x2_PDOS, lcec_el31x2_init}, { lcecSlaveTypeEL3162, LCEC_EL31x2_VID, LCEC_EL3162_PID, LCEC_EL31x2_PDOS, lcec_el31x2_init}, + // analog in, 5ch, 16 bits + { lcecSlaveTypeEL3255, LCEC_EL3255_VID, LCEC_EL3255_PID, LCEC_EL3255_PDOS, lcec_el3255_init}, + // analog out, 1ch, 12 bits { lcecSlaveTypeEL4001, LCEC_EL40x1_VID, LCEC_EL4001_PID, LCEC_EL40x1_PDOS, lcec_el40x1_init}, { lcecSlaveTypeEL4011, LCEC_EL40x1_VID, LCEC_EL4011_PID, LCEC_EL40x1_PDOS, lcec_el40x1_init}, @@ -464,6 +470,7 @@ int lcec_parse_config(void) { master->name[LCEC_CONF_STR_MAXLEN - 1] = 0; master->mutex = 0; master->app_time = 0; + master->reference_time = 0; master->app_time_period = master_conf->appTimePeriod; master->sync_ref_cnt = 0; master->sync_ref_cycles = master_conf->refClockSyncCycles; @@ -761,7 +768,6 @@ int lcec_parse_config(void) { generic_hal_data->dir = generic_hal_dir; generic_hal_data->pdo_idx = pe_conf->index; generic_hal_data->pdo_sidx = pe_conf->subindex; - generic_hal_data->pdo_len = pe_conf->bitLength; generic_hal_data++; } @@ -799,7 +805,6 @@ int lcec_parse_config(void) { generic_hal_data->dir = generic_hal_dir; generic_hal_data->pdo_idx = pe_conf->index; generic_hal_data->pdo_sidx = pe_conf->subindex; - generic_hal_data->pdo_len = pe_conf->bitLength; generic_hal_data++; } break; @@ -1110,7 +1115,11 @@ void lcec_write_master(void *arg, long period) { // send process data rtapi_mutex_get(&master->mutex); - + + + // update application time + master->app_time += master->app_time_period; +/* // update application time master->app_time += master->app_time_period; ecrt_master_application_time(master->master, master->app_time); @@ -1126,7 +1135,22 @@ void lcec_write_master(void *arg, long period) { // sync slaves to ref clock ecrt_master_sync_slave_clocks(master->master); - +*/if (master->reference_time == 0) + { + ecrt_master_reference_clock_time(master->master, &master->reference_time); //consigo el tiempo del reference clock y lo guardo en master->reference_time + master->app_time = master->reference_time; + } + else + { + ecrt_master_reference_clock_time(master->master, &master->reference_time); //consigo el tiempo del reference clock y lo guardo en master->reference_time + } + ecrt_master_sync_slave_clocks(master->master); // sync slaves to ref clock + ecrt_master_application_time(master->master, master->reference_time+master->app_time_period); + + + + + // send domain data ecrt_domain_queue(master->domain); ecrt_master_send(master->master); diff --git a/src/lcec_rtapi.h b/src/lcec_rtapi.h old mode 100644 new mode 100755 diff --git a/src/lcec_rtapi_kmod.h b/src/lcec_rtapi_kmod.h old mode 100644 new mode 100755 diff --git a/src/lcec_rtapi_user.h b/src/lcec_rtapi_user.h old mode 100644 new mode 100755 diff --git a/src/lcec_stmds5k.c b/src/lcec_stmds5k.c old mode 100644 new mode 100755 diff --git a/src/lcec_stmds5k.h b/src/lcec_stmds5k.h old mode 100644 new mode 100755 diff --git a/src/realtime.mk b/src/realtime.mk old mode 100644 new mode 100755 diff --git a/src/user.mk b/src/user.mk old mode 100644 new mode 100755