]> git.feebdaed.xyz Git - 0xmirror/SOEM.git/commitdiff
Inline ecx_contextt
authorHans-Erik Floryd <hans-erik.floryd@rt-labs.com>
Thu, 10 Jul 2025 08:22:28 +0000 (10:22 +0200)
committerHans-Erik Floryd <hans-erik.floryd@rt-labs.com>
Thu, 10 Jul 2025 09:38:59 +0000 (11:38 +0200)
Simplify user applications by allocating space for exc_contextt
members in the struct directly.

Change-Id: If53062539e265326c420020188621887435681f3

15 files changed:
include/soem/ec_main.h
samples/coetest/coetest.c
samples/eepromtool/eepromtool.c
samples/eni_test/eni_test.c
samples/eoe_test/eoe_test.c
samples/firm_update/firm_update.c
samples/red_test/red_test.c
samples/simple_ng/simple_ng.c
samples/simple_test/simple_test.c
samples/slaveinfo/slaveinfo.c
src/ec_coe.c
src/ec_config.c
src/ec_dc.c
src/ec_main.c
src/ec_soe.c

index 7806cc9f0f3fc30860ead237eb1f449e7dd4d04e..b5a5aef74566991e54714b4d5393b8f9f3dd1136 100644 (file)
@@ -113,7 +113,10 @@ typedef struct ecx_context ecx_contextt;
 #define ECT_MBXH_CYCLIC 1
 #define ECT_MBXH_LOST   2
 
-/** for list of ethercat slaves detected */
+/** Slave state
+ * All slave information is put in this structure. Needed for most
+ * user interaction with slaves.
+ */
 typedef struct ec_slave
 {
    /** state of slave */
@@ -500,49 +503,53 @@ typedef struct OSAL_PACKED ec_PDOdesc
 } ec_PDOdesct;
 OSAL_PACKED_END
 
-/** Context structure , referenced by all ecx functions*/
+/** Context structure, referenced by all ecx functions*/
 struct ecx_context
 {
-   /** port reference, may include red_port */
-   ecx_portt *port;
-   /** slavelist reference */
-   ec_slavet *slavelist;
+   /** @publicsection */
+   /* Network state */
+
+   /** port, may include red_port */
+   ecx_portt port;
+   /** list of detected slaves */
+   ec_slavet slavelist[EC_MAXSLAVE];
    /** number of slaves found in configuration */
-   int *slavecount;
-   /** maximum number of slaves allowed in slavelist */
-   int maxslave;
-   /** grouplist reference */
-   ec_groupt *grouplist;
-   /** maximum number of groups allowed in grouplist */
-   int maxgroup;
-   /** internal, reference to eeprom cache buffer */
-   uint8 *esibuf;
-   /** internal, reference to eeprom cache map */
-   uint32 *esimap;
+   int slavecount;
+   /** list of groups */
+   ec_groupt grouplist[EC_MAXGROUP];
+   /** ecaterror state */
+   boolean ecaterror;
+   /** last DC time from slaves */
+   int64 DCtime;
+
+   /** @privatesection */
+   /* Internal state */
+
+   /** internal, eeprom cache buffer */
+   uint8 esibuf[EC_MAXEEPBUF];
+   /** internal, eeprom cache map */
+   uint32 esimap[EC_MAXEEPBITMAP];
    /** internal, current slave for eeprom cache */
    uint16 esislave;
-   /** internal, reference to error list */
-   ec_eringt *elist;
-   /** internal, reference to processdata stack buffer info */
-   ec_idxstackT *idxstack;
-   /** reference to ecaterror state */
-   boolean *ecaterror;
-   /** reference to last DC time from slaves */
-   int64 *DCtime;
+   /** internal, error list */
+   ec_eringt elist;
+   /** internal, processdata stack buffer info */
+   ec_idxstackT idxstack;
    /** internal, SM buffer */
-   ec_SMcommtypet *SMcommtype;
+   ec_SMcommtypet SMcommtype[EC_MAX_MAPT];
    /** internal, PDO assign list */
-   ec_PDOassignt *PDOassign;
+   ec_PDOassignt PDOassign[EC_MAX_MAPT];
    /** internal, PDO description list */
-   ec_PDOdesct *PDOdesc;
+   ec_PDOdesct PDOdesc[EC_MAX_MAPT];
    /** internal, SM list from eeprom */
-   ec_eepromSMt *eepSM;
+   ec_eepromSMt eepSM;
    /** internal, FMMU list from eeprom */
-   ec_eepromFMMUt *eepFMMU;
+   ec_eepromFMMUt eepFMMU;
    /** internal, mailbox pool */
-   ec_mbxpoolt *mbxpool;
+   ec_mbxpoolt mbxpool;
 
-   /* Configuration options */
+   /** @publicsection */
+   /* Configurable settings */
 
    /** network information hook */
    ec_enit *ENI;
index 625446a59d9ffeef9741518f7d011d5db5af97eb..cb11bade12cf3792177ca6d3f4517f873ef8be52 100644 (file)
 #include "soem/soem.h"
 
 #define EC_TIMEOUTMON 500
-
-char IOmap[4096];
-OSAL_THREAD_HANDLE threadrt, thread1;
-int expectedWKC;
-int mappingdone, dorun, inOP, dowkccheck;
-int adapterisbound, conf_io_size, currentgroup;
-int64_t cycletime = 1000000;
-#define NSEC_PER_MSEC 1000000
 #define NSEC_PER_SEC  1000000000
 
-static ec_slavet ec_slave[EC_MAXSLAVE];
-static int ec_slavecount;
-static ec_groupt ec_group[EC_MAXGROUP];
-static uint8 ec_esibuf[EC_MAXEEPBUF];
-static uint32 ec_esimap[EC_MAXEEPBITMAP];
-static ec_eringt ec_elist;
-static ec_idxstackT ec_idxstack;
-static ec_SMcommtypet ec_SMcommtype[EC_MAX_MAPT];
-static ec_PDOassignt ec_PDOassign[EC_MAX_MAPT];
-static ec_PDOdesct ec_PDOdesc[EC_MAX_MAPT];
-static ec_eepromSMt ec_SM;
-static ec_eepromFMMUt ec_FMMU;
-static boolean EcatError = FALSE;
-static int64 ec_DCtime;
-static ecx_portt ecx_port;
-static ec_mbxpoolt ec_mbxpool;
+static uint8 IOmap[4096];
+static OSAL_THREAD_HANDLE threadrt, thread1;
+static int expectedWKC;
+static int mappingdone, dorun, inOP, dowkccheck;
+static int adapterisbound, conf_io_size, currentgroup;
+static int64_t cycletime = 1000000;
 
-static ecx_contextt ctx = {
-    .port = &ecx_port,
-    .slavelist = &ec_slave[0],
-    .slavecount = &ec_slavecount,
-    .maxslave = EC_MAXSLAVE,
-    .grouplist = &ec_group[0],
-    .maxgroup = EC_MAXGROUP,
-    .esibuf = &ec_esibuf[0],
-    .esimap = &ec_esimap[0],
-    .esislave = 0,
-    .elist = &ec_elist,
-    .idxstack = &ec_idxstack,
-    .ecaterror = &EcatError,
-    .DCtime = &ec_DCtime,
-    .SMcommtype = &ec_SMcommtype[0],
-    .PDOassign = &ec_PDOassign[0],
-    .PDOdesc = &ec_PDOdesc[0],
-    .eepSM = &ec_SM,
-    .eepFMMU = &ec_FMMU,
-    .mbxpool = &ec_mbxpool,
-    .FOEhook = NULL,
-    .EOEhook = NULL,
-    .manualstatechange = 0,
-    .userdata = NULL,
-};
+static ecx_contextt ctx;
 
 /* add ns to ec_timet */
 void add_time_ns(ec_timet *ts, int64 addtime)
@@ -127,10 +85,10 @@ OSAL_THREAD_FUNC_RT ecatthread(void)
             dowkccheck++;
          else
             dowkccheck = 0;
-         if (ec_slave[0].hasdc && (wkc > 0))
+         if (ctx.slavelist[0].hasdc && (wkc > 0))
          {
             /* calulate toff to get linux time and DC synced */
-            ec_sync(ec_DCtime, cycletime, &toff);
+            ec_sync(ctx.DCtime, cycletime, &toff);
          }
          ecx_mbxhandler(&ctx, 0, 4);
          ecx_send_processdata(&ctx);
@@ -140,77 +98,79 @@ OSAL_THREAD_FUNC_RT ecatthread(void)
 
 OSAL_THREAD_FUNC ecatcheck(void)
 {
-   int slave;
+   int slaveix;
 
    while (1)
    {
-      if (inOP && ((dowkccheck > 2) || ec_group[currentgroup].docheckstate))
+      if (inOP && ((dowkccheck > 2) || ctx.grouplist[currentgroup].docheckstate))
       {
          /* one ore more slaves are not responding */
-         ec_group[currentgroup].docheckstate = FALSE;
+         ctx.grouplist[currentgroup].docheckstate = FALSE;
          ecx_readstate(&ctx);
-         for (slave = 1; slave <= ec_slavecount; slave++)
+         for (slaveix = 1; slaveix <= ctx.slavecount; slaveix++)
          {
-            if ((ec_slave[slave].group == currentgroup) && (ec_slave[slave].state != EC_STATE_OPERATIONAL))
+            ec_slavet *slave = &ctx.slavelist[slaveix];
+
+            if ((slave->group == currentgroup) && (slave->state != EC_STATE_OPERATIONAL))
             {
-               ec_group[currentgroup].docheckstate = TRUE;
-               if (ec_slave[slave].state == (EC_STATE_SAFE_OP + EC_STATE_ERROR))
+               ctx.grouplist[currentgroup].docheckstate = TRUE;
+               if (slave->state == (EC_STATE_SAFE_OP + EC_STATE_ERROR))
                {
-                  printf("ERROR : slave %d is in SAFE_OP + ERROR, attempting ack.\n", slave);
-                  ec_slave[slave].state = (EC_STATE_SAFE_OP + EC_STATE_ACK);
-                  ecx_writestate(&ctx, slave);
+                  printf("ERROR : slave %d is in SAFE_OP + ERROR, attempting ack.\n", slaveix);
+                  slave->state = (EC_STATE_SAFE_OP + EC_STATE_ACK);
+                  ecx_writestate(&ctx, slaveix);
                }
-               else if (ec_slave[slave].state == EC_STATE_SAFE_OP)
+               else if (slave->state == EC_STATE_SAFE_OP)
                {
-                  printf("WARNING : slave %d is in SAFE_OP, change to OPERATIONAL.\n", slave);
-                  ec_slave[slave].state = EC_STATE_OPERATIONAL;
-                  if (ec_slave[slave].mbxhandlerstate == ECT_MBXH_LOST) ec_slave[slave].mbxhandlerstate = ECT_MBXH_CYCLIC;
-                  ecx_writestate(&ctx, slave);
+                  printf("WARNING : slave %d is in SAFE_OP, change to OPERATIONAL.\n", slaveix);
+                  slave->state = EC_STATE_OPERATIONAL;
+                  if (slave->mbxhandlerstate == ECT_MBXH_LOST) slave->mbxhandlerstate = ECT_MBXH_CYCLIC;
+                  ecx_writestate(&ctx, slaveix);
                }
-               else if (ec_slave[slave].state > EC_STATE_NONE)
+               else if (slave->state > EC_STATE_NONE)
                {
-                  if (ecx_reconfig_slave(&ctx, slave, EC_TIMEOUTMON) >= EC_STATE_PRE_OP)
+                  if (ecx_reconfig_slave(&ctx, slaveix, EC_TIMEOUTMON) >= EC_STATE_PRE_OP)
                   {
-                     ec_slave[slave].islost = FALSE;
-                     printf("MESSAGE : slave %d reconfigured\n", slave);
+                     slave->islost = FALSE;
+                     printf("MESSAGE : slave %d reconfigured\n", slaveix);
                   }
                }
-               else if (!ec_slave[slave].islost)
+               else if (!slave->islost)
                {
                   /* re-check state */
-                  ecx_statecheck(&ctx, slave, EC_STATE_OPERATIONAL, EC_TIMEOUTRET);
-                  if (ec_slave[slave].state == EC_STATE_NONE)
+                  ecx_statecheck(&ctx, slaveix, EC_STATE_OPERATIONAL, EC_TIMEOUTRET);
+                  if (slave->state == EC_STATE_NONE)
                   {
-                     ec_slave[slave].islost = TRUE;
-                     ec_slave[slave].mbxhandlerstate = ECT_MBXH_LOST;
+                     slave->islost = TRUE;
+                     slave->mbxhandlerstate = ECT_MBXH_LOST;
                      /* zero input data for this slave */
-                     if (ec_slave[slave].Ibytes)
+                     if (slave->Ibytes)
                      {
-                        memset(ec_slave[slave].inputs, 0x00, ec_slave[slave].Ibytes);
-                        printf("zero inputs %p %d\n\r", ec_slave[slave].inputs, ec_slave[slave].Ibytes);
+                        memset(slave->inputs, 0x00, slave->Ibytes);
+                        printf("zero inputs %p %d\n\r", slave->inputs, slave->Ibytes);
                      }
-                     printf("ERROR : slave %d lost\n", slave);
+                     printf("ERROR : slave %d lost\n", slaveix);
                   }
                }
             }
-            if (ec_slave[slave].islost)
+            if (slave->islost)
             {
-               if (ec_slave[slave].state <= EC_STATE_INIT)
+               if (slave->state <= EC_STATE_INIT)
                {
-                  if (ecx_recover_slave(&ctx, slave, EC_TIMEOUTMON))
+                  if (ecx_recover_slave(&ctx, slaveix, EC_TIMEOUTMON))
                   {
-                     ec_slave[slave].islost = FALSE;
-                     printf("MESSAGE : slave %d recovered\n", slave);
+                     slave->islost = FALSE;
+                     printf("MESSAGE : slave %d recovered\n", slaveix);
                   }
                }
                else
                {
-                  ec_slave[slave].islost = FALSE;
-                  printf("MESSAGE : slave %d found\n", slave);
+                  slave->islost = FALSE;
+                  printf("MESSAGE : slave %d found\n", slaveix);
                }
             }
          }
-         if (!ec_group[currentgroup].docheckstate)
+         if (!ctx.grouplist[currentgroup].docheckstate)
             printf("OK : all slaves resumed OPERATIONAL.\n");
          dowkccheck = 0;
       }
@@ -226,14 +186,16 @@ void ethercatstartup(char *ifname)
    {
       adapterisbound = 1;
       ecx_config_init(&ctx);
-      if (ec_slavecount > 0)
+      if (ctx.slavecount > 0)
       {
-         conf_io_size = ecx_config_map_group(&ctx, &IOmap, 0);
-         expectedWKC = (ctx.grouplist[0].outputsWKC * 2) + ctx.grouplist[0].inputsWKC;
+         ec_groupt *group = &ctx.grouplist[0];
+
+         conf_io_size = ecx_config_map_group(&ctx, IOmap, 0);
+         expectedWKC = (group->outputsWKC * 2) + group->inputsWKC;
          mappingdone = 1;
          ecx_configdc(&ctx);
          int sdoslave = -1;
-         for (int si = 1; si <= *ctx.slavecount; si++)
+         for (int si = 1; si <= ctx.slavecount; si++)
          {
             ec_slavet *slave = &ctx.slavelist[si];
             printf("Slave %d name:%s man:%8.8x id:%8.8x rev:%d ser:%d\n", si, slave->name, slave->eep_man, slave->eep_id, slave->eep_rev, slave->eep_ser);
index 2b7e8080f74e87f0f98a4276b13260c75f7b4d79..51da73b8a7da489dc8654d885a11e1cfa4ed382e 100644 (file)
@@ -46,48 +46,7 @@ int wkc;
 int mode;
 char sline[MAXSLENGTH];
 
-static ec_slavet ec_slave[EC_MAXSLAVE];
-static int ec_slavecount;
-static ec_groupt ec_group[EC_MAXGROUP];
-static uint8 ec_esibuf[EC_MAXEEPBUF];
-static uint32 ec_esimap[EC_MAXEEPBITMAP];
-static ec_eringt ec_elist;
-static ec_idxstackT ec_idxstack;
-static ec_SMcommtypet ec_SMcommtype[EC_MAX_MAPT];
-static ec_PDOassignt ec_PDOassign[EC_MAX_MAPT];
-static ec_PDOdesct ec_PDOdesc[EC_MAX_MAPT];
-static ec_eepromSMt ec_SM;
-static ec_eepromFMMUt ec_FMMU;
-static boolean EcatError = FALSE;
-static int64 ec_DCtime;
-static ecx_portt ecx_port;
-static ec_mbxpoolt ec_mbxpool;
-
-static ecx_contextt ctx = {
-    .port = &ecx_port,
-    .slavelist = &ec_slave[0],
-    .slavecount = &ec_slavecount,
-    .maxslave = EC_MAXSLAVE,
-    .grouplist = &ec_group[0],
-    .maxgroup = EC_MAXGROUP,
-    .esibuf = &ec_esibuf[0],
-    .esimap = &ec_esimap[0],
-    .esislave = 0,
-    .elist = &ec_elist,
-    .idxstack = &ec_idxstack,
-    .ecaterror = &EcatError,
-    .DCtime = &ec_DCtime,
-    .SMcommtype = &ec_SMcommtype[0],
-    .PDOassign = &ec_PDOassign[0],
-    .PDOdesc = &ec_PDOdesc[0],
-    .eepSM = &ec_SM,
-    .eepFMMU = &ec_FMMU,
-    .mbxpool = &ec_mbxpool,
-    .FOEhook = NULL,
-    .EOEhook = NULL,
-    .manualstatechange = 0,
-    .userdata = NULL,
-};
+static ecx_contextt ctx;
 
 #define IHEXLENGTH 0x20
 
@@ -249,17 +208,17 @@ int eeprom_read(int slave, int start, int length)
    uint64 b8;
    uint8 eepctl;
 
-   if ((ec_slavecount >= slave) && (slave > 0) && ((start + length) <= MAXBUF))
+   if ((ctx.slavecount >= slave) && (slave > 0) && ((start + length) <= MAXBUF))
    {
       aiadr = 1 - slave;
       eepctl = 2;
-      ecx_APWR(&ctx.port[0], aiadr, ECT_REG_EEPCFG, sizeof(eepctl), &eepctl, EC_TIMEOUTRET); /* force Eeprom from PDI */
+      ecx_APWR(&ctx.port, aiadr, ECT_REG_EEPCFG, sizeof(eepctl), &eepctl, EC_TIMEOUTRET); /* force Eeprom from PDI */
       eepctl = 0;
-      ecx_APWR(&ctx.port[0], aiadr, ECT_REG_EEPCFG, sizeof(eepctl), &eepctl, EC_TIMEOUTRET); /* set Eeprom to master */
+      ecx_APWR(&ctx.port, aiadr, ECT_REG_EEPCFG, sizeof(eepctl), &eepctl, EC_TIMEOUTRET); /* set Eeprom to master */
 
       estat = 0x0000;
       aiadr = 1 - slave;
-      ecx_APRD(&ctx.port[0], aiadr, ECT_REG_EEPSTAT, sizeof(estat), &estat, EC_TIMEOUTRET); /* read eeprom status */
+      ecx_APRD(&ctx.port, aiadr, ECT_REG_EEPSTAT, sizeof(estat), &estat, EC_TIMEOUTRET); /* read eeprom status */
       estat = etohs(estat);
       if (estat & EC_ESTAT_R64)
       {
@@ -301,13 +260,13 @@ int eeprom_write(int slave, int start, int length)
    uint16 aiadr, *wbuf;
    uint8 eepctl;
 
-   if ((ec_slavecount >= slave) && (slave > 0) && ((start + length) <= MAXBUF))
+   if ((ctx.slavecount >= slave) && (slave > 0) && ((start + length) <= MAXBUF))
    {
       aiadr = 1 - slave;
       eepctl = 2;
-      ecx_APWR(&ctx.port[0], aiadr, ECT_REG_EEPCFG, sizeof(eepctl), &eepctl, EC_TIMEOUTRET); /* force Eeprom from PDI */
+      ecx_APWR(&ctx.port, aiadr, ECT_REG_EEPCFG, sizeof(eepctl), &eepctl, EC_TIMEOUTRET); /* force Eeprom from PDI */
       eepctl = 0;
-      ecx_APWR(&ctx.port[0], aiadr, ECT_REG_EEPCFG, sizeof(eepctl), &eepctl, EC_TIMEOUTRET); /* set Eeprom to master */
+      ecx_APWR(&ctx.port, aiadr, ECT_REG_EEPCFG, sizeof(eepctl), &eepctl, EC_TIMEOUTRET); /* set Eeprom to master */
 
       aiadr = 1 - slave;
       wbuf = (uint16 *)&ebuf[0];
@@ -334,13 +293,13 @@ int eeprom_writealias(int slave, int alias, uint16 crc)
    uint8 eepctl;
    int ret;
 
-   if ((ec_slavecount >= slave) && (slave > 0) && (alias <= 0xffff))
+   if ((ctx.slavecount >= slave) && (slave > 0) && (alias <= 0xffff))
    {
       aiadr = 1 - slave;
       eepctl = 2;
-      ecx_APWR(&ctx.port[0], aiadr, ECT_REG_EEPCFG, sizeof(eepctl), &eepctl, EC_TIMEOUTRET); /* force Eeprom from PDI */
+      ecx_APWR(&ctx.port, aiadr, ECT_REG_EEPCFG, sizeof(eepctl), &eepctl, EC_TIMEOUTRET); /* force Eeprom from PDI */
       eepctl = 0;
-      ecx_APWR(&ctx.port[0], aiadr, ECT_REG_EEPCFG, sizeof(eepctl), &eepctl, EC_TIMEOUTRET); /* set Eeprom to master */
+      ecx_APWR(&ctx.port, aiadr, ECT_REG_EEPCFG, sizeof(eepctl), &eepctl, EC_TIMEOUTRET); /* set Eeprom to master */
 
       ret = ecx_writeeepromAP(&ctx, aiadr, 0x04, alias, EC_TIMEOUTEEP);
       if (ret)
@@ -363,13 +322,13 @@ void eepromtool(char *ifname, int slave, int mode, char *fname)
       printf("ecx_init on %s succeeded.\n", ifname);
 
       w = 0x0000;
-      wkc = ecx_BRD(&ctx.port[0], 0x0000, ECT_REG_TYPE, sizeof(w), &w, EC_TIMEOUTSAFE); /* detect number of slaves */
+      wkc = ecx_BRD(&ctx.port, 0x0000, ECT_REG_TYPE, sizeof(w), &w, EC_TIMEOUTSAFE); /* detect number of slaves */
       if (wkc > 0)
       {
-         ec_slavecount = wkc;
+         ctx.slavecount = wkc;
 
-         printf("%d slaves found.\n", ec_slavecount);
-         if ((ec_slavecount >= slave) && (slave > 0))
+         printf("%d slaves found.\n", ctx.slavecount);
+         if ((ctx.slavecount >= slave) && (slave > 0))
          {
             if ((mode == MODE_INFO) || (mode == MODE_READBIN) || (mode == MODE_READINTEL))
             {
index 56712a946c0de2f6ce49018d429f59cc280ac3f4..ee8694e8b850dd4c2b58686b73fc2b6ee2ac0e7c 100644 (file)
 
 #define EC_TIMEOUTMON 500
 
-char IOmap[4096];
-OSAL_THREAD_HANDLE thread1;
-int expectedWKC;
-boolean needlf;
-volatile int wkc;
-boolean inOP;
-uint8 currentgroup = 0;
-
-static ec_slavet ec_slave[EC_MAXSLAVE];
-static int ec_slavecount;
-static ec_groupt ec_group[EC_MAXGROUP];
-static uint8 ec_esibuf[EC_MAXEEPBUF];
-static uint32 ec_esimap[EC_MAXEEPBITMAP];
-static ec_eringt ec_elist;
-static ec_idxstackT ec_idxstack;
-static ec_SMcommtypet ec_SMcommtype[EC_MAX_MAPT];
-static ec_PDOassignt ec_PDOassign[EC_MAX_MAPT];
-static ec_PDOdesct ec_PDOdesc[EC_MAX_MAPT];
-static ec_eepromSMt ec_SM;
-static ec_eepromFMMUt ec_FMMU;
-static boolean EcatError = FALSE;
-static int64 ec_DCtime;
-static ecx_portt ecx_port;
-static ec_mbxpoolt ec_mbxpool;
+static uint8 IOmap[4096];
+static OSAL_THREAD_HANDLE thread1;
+static int expectedWKC;
+static boolean needlf;
+static volatile int wkc;
+static boolean inOP;
+static uint8 currentgroup = 0;
 
 extern ec_enit ec_eni;
 
 static ecx_contextt ctx = {
-    .port = &ecx_port,
-    .slavelist = &ec_slave[0],
-    .slavecount = &ec_slavecount,
-    .maxslave = EC_MAXSLAVE,
-    .grouplist = &ec_group[0],
-    .maxgroup = EC_MAXGROUP,
-    .esibuf = &ec_esibuf[0],
-    .esimap = &ec_esimap[0],
-    .esislave = 0,
-    .elist = &ec_elist,
-    .idxstack = &ec_idxstack,
-    .ecaterror = &EcatError,
-    .DCtime = &ec_DCtime,
-    .SMcommtype = &ec_SMcommtype[0],
-    .PDOassign = &ec_PDOassign[0],
-    .PDOdesc = &ec_PDOdesc[0],
-    .eepSM = &ec_SM,
-    .eepFMMU = &ec_FMMU,
-    .mbxpool = &ec_mbxpool,
-    .ENI = &ec_eni,
-    .FOEhook = NULL,
-    .EOEhook = NULL,
-    .manualstatechange = 0,
-    .userdata = NULL,
+   .ENI = &ec_eni,
 };
 
 void eni_test(char *ifname)
@@ -87,26 +47,28 @@ void eni_test(char *ifname)
       /* find and auto-config slaves */
       if (ecx_config_init(&ctx) > 0)
       {
-         ecx_config_map_group(&ctx, &IOmap, 0);
+         ec_groupt *group = &ctx.grouplist[0];
+
+         ecx_config_map_group(&ctx, IOmap, 0);
 
          ecx_configdc(&ctx);
 
-         printf("%d slaves found and configured.\n", ec_slavecount);
+         printf("%d slaves found and configured.\n", ctx.slavecount);
 
          /* wait for all slaves to reach SAFE_OP state */
          ecx_statecheck(&ctx, 0, EC_STATE_SAFE_OP, EC_TIMEOUTSTATE * 4);
 
-         oloop = ec_group[0].Obytes;
+         oloop = group->Obytes;
          if (oloop > 8) oloop = 8;
-         iloop = ec_group[0].Ibytes;
+         iloop = group->Ibytes;
          if (iloop > 8) iloop = 8;
 
-         printf("segments : %d : %d %d %d %d\n", ec_group[0].nsegments, ec_group[0].IOsegment[0], ec_group[0].IOsegment[1], ec_group[0].IOsegment[2], ec_group[0].IOsegment[3]);
+         printf("segments : %d : %d %d %d %d\n", group->nsegments, group->IOsegment[0], group->IOsegment[1], group->IOsegment[2], group->IOsegment[3]);
 
          printf("Request operational state for all slaves\n");
-         expectedWKC = (ec_group[0].outputsWKC * 2) + ec_group[0].inputsWKC;
+         expectedWKC = (group->outputsWKC * 2) + group->inputsWKC;
          printf("Calculated workcounter %d\n", expectedWKC);
-         ec_slave[0].state = EC_STATE_OPERATIONAL;
+         ctx.slavelist[0].state = EC_STATE_OPERATIONAL;
          /* send one valid process data to make outputs in slaves happy*/
          ecx_send_processdata(&ctx);
          ecx_receive_processdata(&ctx, EC_TIMEOUTRET);
@@ -119,8 +81,8 @@ void eni_test(char *ifname)
             ecx_send_processdata(&ctx);
             ecx_receive_processdata(&ctx, EC_TIMEOUTRET);
             ecx_statecheck(&ctx, 0, EC_STATE_OPERATIONAL, 50000);
-         } while (chk-- && (ec_slave[0].state != EC_STATE_OPERATIONAL));
-         if (ec_slave[0].state == EC_STATE_OPERATIONAL)
+         } while (chk-- && (ctx.slavelist[0].state != EC_STATE_OPERATIONAL));
+         if (ctx.slavelist[0].state == EC_STATE_OPERATIONAL)
          {
             printf("Operational state reached for all slaves.\n");
             inOP = TRUE;
@@ -136,15 +98,15 @@ void eni_test(char *ifname)
 
                   for (j = 0; j < oloop; j++)
                   {
-                     printf(" %2.2x", *(ec_slave[0].outputs + j));
+                     printf(" %2.2x", *(ctx.slavelist[0].outputs + j));
                   }
 
                   printf(" I:");
                   for (j = 0; j < iloop; j++)
                   {
-                     printf(" %2.2x", *(ec_slave[0].inputs + j));
+                     printf(" %2.2x", *(ctx.slavelist[0].inputs + j));
                   }
-                  printf(" T:%" PRId64 "\r", ec_DCtime);
+                  printf(" T:%" PRId64 "\r", ctx.DCtime);
                   needlf = TRUE;
                }
                osal_usleep(5000);
@@ -155,17 +117,18 @@ void eni_test(char *ifname)
          {
             printf("Not all slaves reached operational state.\n");
             ecx_readstate(&ctx);
-            for (i = 1; i <= ec_slavecount; i++)
+            for (i = 1; i <= ctx.slavecount; i++)
             {
-               if (ec_slave[i].state != EC_STATE_OPERATIONAL)
+               ec_slavet *slave = &ctx.slavelist[i];
+               if (slave->state != EC_STATE_OPERATIONAL)
                {
                   printf("Slave %d State=0x%2.2x StatusCode=0x%4.4x : %s\n",
-                         i, ec_slave[i].state, ec_slave[i].ALstatuscode, ec_ALstatuscode2string(ec_slave[i].ALstatuscode));
+                         i, slave->state, slave->ALstatuscode, ec_ALstatuscode2string(slave->ALstatuscode));
                }
             }
          }
          printf("\nRequest init state for all slaves\n");
-         ec_slave[0].state = EC_STATE_INIT;
+         ctx.slavelist[0].state = EC_STATE_INIT;
          /* request INIT state for all slaves */
          ecx_writestate(&ctx, 0);
       }
@@ -185,84 +148,86 @@ void eni_test(char *ifname)
 
 OSAL_THREAD_FUNC ecatcheck(void *ptr)
 {
-   int slave;
+   int slaveix;
    (void)ptr; /* Not used */
 
    while (1)
    {
-      if (inOP && ((wkc < expectedWKC) || ec_group[currentgroup].docheckstate))
+      if (inOP && ((wkc < expectedWKC) || ctx.grouplist[currentgroup].docheckstate))
       {
-         printf("check wkc=%d/%d docheckstate=%d!\n", wkc, expectedWKC, ec_group[currentgroup].docheckstate);
+         printf("check wkc=%d/%d docheckstate=%d!\n", wkc, expectedWKC, ctx.grouplist[currentgroup].docheckstate);
          if (needlf)
          {
             needlf = FALSE;
             printf("\n");
          }
          /* one ore more slaves are not responding */
-         ec_group[currentgroup].docheckstate = FALSE;
+         ctx.grouplist[currentgroup].docheckstate = FALSE;
          ecx_readstate(&ctx);
-         for (slave = 1; slave <= ec_slavecount; slave++)
+         for (slaveix = 1; slaveix <= ctx.slavecount; slaveix++)
          {
-            if ((ec_slave[slave].group == currentgroup) && (ec_slave[slave].state != EC_STATE_OPERATIONAL))
+            ec_slavet *slave = &ctx.slavelist[slaveix];
+
+            if ((slave->group == currentgroup) && (slave->state != EC_STATE_OPERATIONAL))
             {
-               ec_group[currentgroup].docheckstate = TRUE;
-               if (ec_slave[slave].state == (EC_STATE_SAFE_OP + EC_STATE_ERROR))
+               ctx.grouplist[currentgroup].docheckstate = TRUE;
+               if (slave->state == (EC_STATE_SAFE_OP + EC_STATE_ERROR))
                {
-                  printf("ERROR : slave %d is in SAFE_OP + ERROR, attempting ack.\n", slave);
-                  ec_slave[slave].state = (EC_STATE_SAFE_OP + EC_STATE_ACK);
-                  ecx_writestate(&ctx, slave);
+                  printf("ERROR : slave %d is in SAFE_OP + ERROR, attempting ack.\n", slaveix);
+                  slave->state = (EC_STATE_SAFE_OP + EC_STATE_ACK);
+                  ecx_writestate(&ctx, slaveix);
                }
-               else if (ec_slave[slave].state == EC_STATE_SAFE_OP)
+               else if (slave->state == EC_STATE_SAFE_OP)
                {
-                  printf("WARNING : slave %d is in SAFE_OP, change to OPERATIONAL.\n", slave);
-                  ec_slave[slave].state = EC_STATE_OPERATIONAL;
-                  if (ec_slave[slave].mbxhandlerstate == ECT_MBXH_LOST) ec_slave[slave].mbxhandlerstate = ECT_MBXH_CYCLIC;
-                  ecx_writestate(&ctx, slave);
+                  printf("WARNING : slave %d is in SAFE_OP, change to OPERATIONAL.\n", slaveix);
+                  slave->state = EC_STATE_OPERATIONAL;
+                  if (slave->mbxhandlerstate == ECT_MBXH_LOST) slave->mbxhandlerstate = ECT_MBXH_CYCLIC;
+                  ecx_writestate(&ctx, slaveix);
                }
-               else if (ec_slave[slave].state > EC_STATE_NONE)
+               else if (slave->state > EC_STATE_NONE)
                {
-                  if (ecx_reconfig_slave(&ctx, slave, EC_TIMEOUTMON) >= EC_STATE_PRE_OP)
+                  if (ecx_reconfig_slave(&ctx, slaveix, EC_TIMEOUTMON) >= EC_STATE_PRE_OP)
                   {
-                     ec_slave[slave].islost = FALSE;
-                     printf("MESSAGE : slave %d reconfigured\n", slave);
+                     slave->islost = FALSE;
+                     printf("MESSAGE : slave %d reconfigured\n", slaveix);
                   }
                }
-               else if (!ec_slave[slave].islost)
+               else if (!slave->islost)
                {
                   /* re-check state */
-                  ecx_statecheck(&ctx, slave, EC_STATE_OPERATIONAL, EC_TIMEOUTRET);
-                  if (ec_slave[slave].state == EC_STATE_NONE)
+                  ecx_statecheck(&ctx, slaveix, EC_STATE_OPERATIONAL, EC_TIMEOUTRET);
+                  if (slave->state == EC_STATE_NONE)
                   {
-                     ec_slave[slave].islost = TRUE;
-                     ec_slave[slave].mbxhandlerstate = ECT_MBXH_LOST;
+                     slave->islost = TRUE;
+                     slave->mbxhandlerstate = ECT_MBXH_LOST;
                      /* zero input data for this slave */
-                     if (ec_slave[slave].Ibytes)
+                     if (slave->Ibytes)
                      {
-                        memset(ec_slave[slave].inputs, 0x00, ec_slave[slave].Ibytes);
-                        printf("zero inputs %p %d\n\r", ec_slave[slave].inputs, ec_slave[slave].Ibytes);
+                        memset(slave->inputs, 0x00, slave->Ibytes);
+                        printf("zero inputs %p %d\n\r", slave->inputs, slave->Ibytes);
                      }
-                     printf("ERROR : slave %d lost\n", slave);
+                     printf("ERROR : slave %d lost\n", slaveix);
                   }
                }
             }
-            if (ec_slave[slave].islost)
+            if (slave->islost)
             {
-               if (ec_slave[slave].state <= EC_STATE_INIT)
+               if (slave->state <= EC_STATE_INIT)
                {
-                  if (ecx_recover_slave(&ctx, slave, EC_TIMEOUTMON))
+                  if (ecx_recover_slave(&ctx, slaveix, EC_TIMEOUTMON))
                   {
-                     ec_slave[slave].islost = FALSE;
-                     printf("MESSAGE : slave %d recovered\n", slave);
+                     slave->islost = FALSE;
+                     printf("MESSAGE : slave %d recovered\n", slaveix);
                   }
                }
                else
                {
-                  ec_slave[slave].islost = FALSE;
-                  printf("MESSAGE : slave %d found\n", slave);
+                  slave->islost = FALSE;
+                  printf("MESSAGE : slave %d found\n", slaveix);
                }
             }
          }
-         if (!ec_group[currentgroup].docheckstate)
+         if (!ctx.grouplist[currentgroup].docheckstate)
             printf("OK : all slaves resumed OPERATIONAL.\n");
       }
       osal_usleep(10000);
index 2ea986e6ef90a9b39784899252c47bd3879ad39c..6d957624b52f3c841def47c86f3ac6a0fdf49f39 100644 (file)
 
 #define EC_TIMEOUTMON 500
 
-char IOmap[4096];
-OSAL_THREAD_HANDLE thread1;
-OSAL_THREAD_HANDLE thread2;
-int expectedWKC;
-boolean needlf;
-volatile int wkc;
-boolean inOP;
-uint8 currentgroup = 0;
+static uint8 IOmap[4096];
+static OSAL_THREAD_HANDLE thread1;
+static OSAL_THREAD_HANDLE thread2;
+static int expectedWKC;
+static boolean needlf;
+static volatile int wkc;
+static boolean inOP;
+static uint8 currentgroup = 0;
 
 #ifndef PACKET_LOG
 #define PACKET_LOG 0
@@ -68,48 +68,7 @@ uint16_t rxframeno = 0;
 uint8_t rx[ETHERNET_FRAME_SIZE];
 uint8_t tx[ETHERNET_FRAME_SIZE];
 
-static ec_slavet ec_slave[EC_MAXSLAVE];
-static int ec_slavecount;
-static ec_groupt ec_group[EC_MAXGROUP];
-static uint8 ec_esibuf[EC_MAXEEPBUF];
-static uint32 ec_esimap[EC_MAXEEPBITMAP];
-static ec_eringt ec_elist;
-static ec_idxstackT ec_idxstack;
-static ec_SMcommtypet ec_SMcommtype[EC_MAX_MAPT];
-static ec_PDOassignt ec_PDOassign[EC_MAX_MAPT];
-static ec_PDOdesct ec_PDOdesc[EC_MAX_MAPT];
-static ec_eepromSMt ec_SM;
-static ec_eepromFMMUt ec_FMMU;
-static boolean EcatError = FALSE;
-static int64 ec_DCtime;
-static ecx_portt ecx_port;
-static ec_mbxpoolt ec_mbxpool;
-
-static ecx_contextt ctx = {
-    .port = &ecx_port,
-    .slavelist = &ec_slave[0],
-    .slavecount = &ec_slavecount,
-    .maxslave = EC_MAXSLAVE,
-    .grouplist = &ec_group[0],
-    .maxgroup = EC_MAXGROUP,
-    .esibuf = &ec_esibuf[0],
-    .esimap = &ec_esimap[0],
-    .esislave = 0,
-    .elist = &ec_elist,
-    .idxstack = &ec_idxstack,
-    .ecaterror = &EcatError,
-    .DCtime = &ec_DCtime,
-    .SMcommtype = &ec_SMcommtype[0],
-    .PDOassign = &ec_PDOassign[0],
-    .PDOdesc = &ec_PDOdesc[0],
-    .eepSM = &ec_SM,
-    .eepFMMU = &ec_FMMU,
-    .mbxpool = &ec_mbxpool,
-    .FOEhook = NULL,
-    .EOEhook = NULL,
-    .manualstatechange = 0,
-    .userdata = NULL,
-};
+static ecx_contextt ctx;
 
 /** registered EoE hook */
 int eoe_hook(ecx_contextt *context, uint16 slave, void *eoembx)
@@ -216,13 +175,15 @@ void teststarter(char *ifname)
       /* find and auto-config slaves */
       if (ecx_config_init(&ctx) > 0)
       {
-         ecx_config_map_group(&ctx, &IOmap, 0);
+         ec_groupt *group = &ctx.grouplist[0];
+
+         ecx_config_map_group(&ctx, IOmap, 0);
 
          ecx_configdc(&ctx);
 
-         for (int si = 1; si <= ec_slavecount; si++)
+         for (int si = 1; si <= ctx.slavecount; si++)
          {
-            if (ec_slave[si].CoEdetails > 0)
+            if (ctx.slavelist[si].CoEdetails > 0)
             {
                ecx_slavembxcyclic(&ctx, si);
                printf(" Slave added to cyclic mailbox handler\n");
@@ -231,22 +192,22 @@ void teststarter(char *ifname)
 
          test_eoe(&ctx);
 
-         printf("%d slaves found and configured.\n", ec_slavecount);
+         printf("%d slaves found and configured.\n", ctx.slavecount);
 
          /* wait for all slaves to reach SAFE_OP state */
          ecx_statecheck(&ctx, 0, EC_STATE_SAFE_OP, EC_TIMEOUTSTATE * 4);
 
-         oloop = ec_group[0].Obytes;
+         oloop = group->Obytes;
          if (oloop > 8) oloop = 8;
-         iloop = ec_group[0].Ibytes;
+         iloop = group->Ibytes;
          if (iloop > 8) iloop = 8;
 
-         printf("segments : %d : %d %d %d %d\n", ec_group[0].nsegments, ec_group[0].IOsegment[0], ec_group[0].IOsegment[1], ec_group[0].IOsegment[2], ec_group[0].IOsegment[3]);
+         printf("segments : %d : %d %d %d %d\n", group->nsegments, group->IOsegment[0], group->IOsegment[1], group->IOsegment[2], group->IOsegment[3]);
 
          printf("Request operational state for all slaves\n");
-         expectedWKC = (ec_group[0].outputsWKC * 2) + ec_group[0].inputsWKC;
+         expectedWKC = (group->outputsWKC * 2) + group->inputsWKC;
          printf("Calculated workcounter %d\n", expectedWKC);
-         ec_slave[0].state = EC_STATE_OPERATIONAL;
+         ctx.slavelist[0].state = EC_STATE_OPERATIONAL;
          /* send one valid process data to make outputs in slaves happy*/
          ecx_send_processdata(&ctx);
          ecx_receive_processdata(&ctx, EC_TIMEOUTRET);
@@ -259,8 +220,8 @@ void teststarter(char *ifname)
             ecx_send_processdata(&ctx);
             ecx_receive_processdata(&ctx, EC_TIMEOUTRET);
             ecx_statecheck(&ctx, 0, EC_STATE_OPERATIONAL, 50000);
-         } while (chk-- && (ec_slave[0].state != EC_STATE_OPERATIONAL));
-         if (ec_slave[0].state == EC_STATE_OPERATIONAL)
+         } while (chk-- && (ctx.slavelist[0].state != EC_STATE_OPERATIONAL));
+         if (ctx.slavelist[0].state == EC_STATE_OPERATIONAL)
          {
             printf("Operational state reached for all slaves.\n");
             inOP = TRUE;
@@ -279,15 +240,15 @@ void teststarter(char *ifname)
 
                   for (int j = 0; j < oloop; j++)
                   {
-                     printf(" %2.2x", *(ec_slave[0].outputs + j));
+                     printf(" %2.2x", *(ctx.slavelist[0].outputs + j));
                   }
 
                   printf(" I:");
                   for (int j = 0; j < iloop; j++)
                   {
-                     printf(" %2.2x", *(ec_slave[0].inputs + j));
+                     printf(" %2.2x", *(ctx.slavelist[0].inputs + j));
                   }
-                  printf(" T:%" PRId64 "\r", ec_DCtime);
+                  printf(" T:%" PRId64 "\r", ctx.DCtime);
                   needlf = TRUE;
                }
 #endif
@@ -302,17 +263,17 @@ void teststarter(char *ifname)
          {
             printf("Not all slaves reached operational state.\n");
             ecx_readstate(&ctx);
-            for (i = 1; i <= ec_slavecount; i++)
+            for (i = 1; i <= ctx.slavecount; i++)
             {
-               if (ec_slave[i].state != EC_STATE_OPERATIONAL)
+               if (ctx.slavelist[i].state != EC_STATE_OPERATIONAL)
                {
                   printf("Slave %d State=0x%2.2x StatusCode=0x%4.4x : %s\n",
-                         i, ec_slave[i].state, ec_slave[i].ALstatuscode, ec_ALstatuscode2string(ec_slave[i].ALstatuscode));
+                         i, ctx.slavelist[i].state, ctx.slavelist[i].ALstatuscode, ec_ALstatuscode2string(ctx.slavelist[i].ALstatuscode));
                }
             }
          }
          printf("\nRequest init state for all slaves\n");
-         ec_slave[0].state = EC_STATE_INIT;
+         ctx.slavelist[0].state = EC_STATE_INIT;
          /* request INIT state for all slaves */
          ecx_writestate(&ctx, 0);
       }
@@ -332,84 +293,86 @@ void teststarter(char *ifname)
 
 OSAL_THREAD_FUNC ecatcheck(void *ptr)
 {
-   int slave;
+   int slaveix;
    (void)ptr; /* Not used */
 
    while (1)
    {
-      if (inOP && ((wkc < expectedWKC) || ec_group[currentgroup].docheckstate))
+      if (inOP && ((wkc < expectedWKC) || ctx.grouplist[currentgroup].docheckstate))
       {
-         printf("check wkc=%d/%d docheckstate=%d!\n", wkc, expectedWKC, ec_group[currentgroup].docheckstate);
+         printf("check wkc=%d/%d docheckstate=%d!\n", wkc, expectedWKC, ctx.grouplist[currentgroup].docheckstate);
          if (needlf)
          {
             needlf = FALSE;
             printf("\n");
          }
          /* one ore more slaves are not responding */
-         ec_group[currentgroup].docheckstate = FALSE;
+         ctx.grouplist[currentgroup].docheckstate = FALSE;
          ecx_readstate(&ctx);
-         for (slave = 1; slave <= ec_slavecount; slave++)
+         for (slaveix = 1; slaveix <= ctx.slavecount; slaveix++)
          {
-            if ((ec_slave[slave].group == currentgroup) && (ec_slave[slave].state != EC_STATE_OPERATIONAL))
+            ec_slavet *slave = &ctx.slavelist[slaveix];
+
+            if ((slave->group == currentgroup) && (slave->state != EC_STATE_OPERATIONAL))
             {
-               ec_group[currentgroup].docheckstate = TRUE;
-               if (ec_slave[slave].state == (EC_STATE_SAFE_OP + EC_STATE_ERROR))
+               ctx.grouplist[currentgroup].docheckstate = TRUE;
+               if (slave->state == (EC_STATE_SAFE_OP + EC_STATE_ERROR))
                {
-                  printf("ERROR : slave %d is in SAFE_OP + ERROR, attempting ack.\n", slave);
-                  ec_slave[slave].state = (EC_STATE_SAFE_OP + EC_STATE_ACK);
-                  ecx_writestate(&ctx, slave);
+                  printf("ERROR : slave %d is in SAFE_OP + ERROR, attempting ack.\n", slaveix);
+                  slave->state = (EC_STATE_SAFE_OP + EC_STATE_ACK);
+                  ecx_writestate(&ctx, slaveix);
                }
-               else if (ec_slave[slave].state == EC_STATE_SAFE_OP)
+               else if (slave->state == EC_STATE_SAFE_OP)
                {
-                  printf("WARNING : slave %d is in SAFE_OP, change to OPERATIONAL.\n", slave);
-                  ec_slave[slave].state = EC_STATE_OPERATIONAL;
-                  if (ec_slave[slave].mbxhandlerstate == ECT_MBXH_LOST) ec_slave[slave].mbxhandlerstate = ECT_MBXH_CYCLIC;
-                  ecx_writestate(&ctx, slave);
+                  printf("WARNING : slave %d is in SAFE_OP, change to OPERATIONAL.\n", slaveix);
+                  slave->state = EC_STATE_OPERATIONAL;
+                  if (slave->mbxhandlerstate == ECT_MBXH_LOST) slave->mbxhandlerstate = ECT_MBXH_CYCLIC;
+                  ecx_writestate(&ctx, slaveix);
                }
-               else if (ec_slave[slave].state > EC_STATE_NONE)
+               else if (slave->state > EC_STATE_NONE)
                {
-                  if (ecx_reconfig_slave(&ctx, slave, EC_TIMEOUTMON) >= EC_STATE_PRE_OP)
+                  if (ecx_reconfig_slave(&ctx, slaveix, EC_TIMEOUTMON) >= EC_STATE_PRE_OP)
                   {
-                     ec_slave[slave].islost = FALSE;
-                     printf("MESSAGE : slave %d reconfigured\n", slave);
+                     slave->islost = FALSE;
+                     printf("MESSAGE : slave %d reconfigured\n", slaveix);
                   }
                }
-               else if (!ec_slave[slave].islost)
+               else if (!slave->islost)
                {
                   /* re-check state */
-                  ecx_statecheck(&ctx, slave, EC_STATE_OPERATIONAL, EC_TIMEOUTRET);
-                  if (ec_slave[slave].state == EC_STATE_NONE)
+                  ecx_statecheck(&ctx, slaveix, EC_STATE_OPERATIONAL, EC_TIMEOUTRET);
+                  if (slave->state == EC_STATE_NONE)
                   {
-                     ec_slave[slave].islost = TRUE;
-                     ec_slave[slave].mbxhandlerstate = ECT_MBXH_LOST;
+                     slave->islost = TRUE;
+                     slave->mbxhandlerstate = ECT_MBXH_LOST;
                      /* zero input data for this slave */
-                     if (ec_slave[slave].Ibytes)
+                     if (slave->Ibytes)
                      {
-                        memset(ec_slave[slave].inputs, 0x00, ec_slave[slave].Ibytes);
-                        printf("zero inputs %p %d\n\r", ec_slave[slave].inputs, ec_slave[slave].Ibytes);
+                        memset(slave->inputs, 0x00, slave->Ibytes);
+                        printf("zero inputs %p %d\n\r", slave->inputs, slave->Ibytes);
                      }
-                     printf("ERROR : slave %d lost\n", slave);
+                     printf("ERROR : slave %d lost\n", slaveix);
                   }
                }
             }
-            if (ec_slave[slave].islost)
+            if (slave->islost)
             {
-               if (ec_slave[slave].state <= EC_STATE_INIT)
+               if (slave->state <= EC_STATE_INIT)
                {
-                  if (ecx_recover_slave(&ctx, slave, EC_TIMEOUTMON))
+                  if (ecx_recover_slave(&ctx, slaveix, EC_TIMEOUTMON))
                   {
-                     ec_slave[slave].islost = FALSE;
-                     printf("MESSAGE : slave %d recovered\n", slave);
+                     slave->islost = FALSE;
+                     printf("MESSAGE : slave %d recovered\n", slaveix);
                   }
                }
                else
                {
-                  ec_slave[slave].islost = FALSE;
-                  printf("MESSAGE : slave %d found\n", slave);
+                  slave->islost = FALSE;
+                  printf("MESSAGE : slave %d found\n", slaveix);
                }
             }
          }
-         if (!ec_group[currentgroup].docheckstate)
+         if (!ctx.grouplist[currentgroup].docheckstate)
             printf("OK : all slaves resumed OPERATIONAL.\n");
       }
       osal_usleep(10000);
index 234eaa1aa34a285a7119c65d01de195313cf4685..ceed2b2d0d1ae6e73a08a0af5e516add0517b10b 100644 (file)
@@ -30,48 +30,7 @@ int j;
 uint16 argslave;
 boolean forceByteAlignment = FALSE;
 
-static ec_slavet ec_slave[EC_MAXSLAVE];
-static int ec_slavecount;
-static ec_groupt ec_group[EC_MAXGROUP];
-static uint8 ec_esibuf[EC_MAXEEPBUF];
-static uint32 ec_esimap[EC_MAXEEPBITMAP];
-static ec_eringt ec_elist;
-static ec_idxstackT ec_idxstack;
-static ec_SMcommtypet ec_SMcommtype[EC_MAX_MAPT];
-static ec_PDOassignt ec_PDOassign[EC_MAX_MAPT];
-static ec_PDOdesct ec_PDOdesc[EC_MAX_MAPT];
-static ec_eepromSMt ec_SM;
-static ec_eepromFMMUt ec_FMMU;
-static boolean EcatError = FALSE;
-static int64 ec_DCtime;
-static ecx_portt ecx_port;
-static ec_mbxpoolt ec_mbxpool;
-
-static ecx_contextt ctx = {
-    .port = &ecx_port,
-    .slavelist = &ec_slave[0],
-    .slavecount = &ec_slavecount,
-    .maxslave = EC_MAXSLAVE,
-    .grouplist = &ec_group[0],
-    .maxgroup = EC_MAXGROUP,
-    .esibuf = &ec_esibuf[0],
-    .esimap = &ec_esimap[0],
-    .esislave = 0,
-    .elist = &ec_elist,
-    .idxstack = &ec_idxstack,
-    .ecaterror = &EcatError,
-    .DCtime = &ec_DCtime,
-    .SMcommtype = &ec_SMcommtype[0],
-    .PDOassign = &ec_PDOassign[0],
-    .PDOdesc = &ec_PDOdesc[0],
-    .eepSM = &ec_SM,
-    .eepFMMU = &ec_FMMU,
-    .mbxpool = &ec_mbxpool,
-    .FOEhook = NULL,
-    .EOEhook = NULL,
-    .manualstatechange = 0,
-    .userdata = NULL,
-};
+static ecx_contextt ctx;
 
 int input_bin(char *fname, int *length)
 {
@@ -101,13 +60,13 @@ void boottest(char *ifname, uint16 slave, char *filename)
       /* find and auto-config slaves */
       if (ecx_config_init(&ctx) > 0)
       {
-         printf("%d slaves found and configured.\n", ec_slavecount);
+         printf("%d slaves found and configured.\n", ctx.slavecount);
 
          /* wait for all slaves to reach PRE_OP state */
          ecx_statecheck(&ctx, 0, EC_STATE_PRE_OP, EC_TIMEOUTSTATE * 4);
 
          printf("Request init state for slave %d\n", slave);
-         ec_slave[slave].state = EC_STATE_INIT;
+         ctx.slavelist[slave].state = EC_STATE_INIT;
          ecx_writestate(&ctx, slave);
 
          /* wait for slave to reach INIT state */
@@ -116,33 +75,33 @@ void boottest(char *ifname, uint16 slave, char *filename)
 
          /* read BOOT mailbox data, master -> slave */
          data = ecx_readeeprom(&ctx, slave, ECT_SII_BOOTRXMBX, EC_TIMEOUTEEP);
-         ec_slave[slave].SM[0].StartAddr = (uint16)LO_WORD(data);
-         ec_slave[slave].SM[0].SMlength = (uint16)HI_WORD(data);
+         ctx.slavelist[slave].SM[0].StartAddr = (uint16)LO_WORD(data);
+         ctx.slavelist[slave].SM[0].SMlength = (uint16)HI_WORD(data);
          /* store boot write mailbox address */
-         ec_slave[slave].mbx_wo = (uint16)LO_WORD(data);
+         ctx.slavelist[slave].mbx_wo = (uint16)LO_WORD(data);
          /* store boot write mailbox size */
-         ec_slave[slave].mbx_l = (uint16)HI_WORD(data);
+         ctx.slavelist[slave].mbx_l = (uint16)HI_WORD(data);
 
          /* read BOOT mailbox data, slave -> master */
          data = ecx_readeeprom(&ctx, slave, ECT_SII_BOOTTXMBX, EC_TIMEOUTEEP);
-         ec_slave[slave].SM[1].StartAddr = (uint16)LO_WORD(data);
-         ec_slave[slave].SM[1].SMlength = (uint16)HI_WORD(data);
+         ctx.slavelist[slave].SM[1].StartAddr = (uint16)LO_WORD(data);
+         ctx.slavelist[slave].SM[1].SMlength = (uint16)HI_WORD(data);
          /* store boot read mailbox address */
-         ec_slave[slave].mbx_ro = (uint16)LO_WORD(data);
+         ctx.slavelist[slave].mbx_ro = (uint16)LO_WORD(data);
          /* store boot read mailbox size */
-         ec_slave[slave].mbx_rl = (uint16)HI_WORD(data);
+         ctx.slavelist[slave].mbx_rl = (uint16)HI_WORD(data);
 
-         printf(" SM0 A:%4.4x L:%4d F:%8.8x\n", ec_slave[slave].SM[0].StartAddr, ec_slave[slave].SM[0].SMlength,
-                (int)ec_slave[slave].SM[0].SMflags);
-         printf(" SM1 A:%4.4x L:%4d F:%8.8x\n", ec_slave[slave].SM[1].StartAddr, ec_slave[slave].SM[1].SMlength,
-                (int)ec_slave[slave].SM[1].SMflags);
+         printf(" SM0 A:%4.4x L:%4d F:%8.8x\n", ctx.slavelist[slave].SM[0].StartAddr, ctx.slavelist[slave].SM[0].SMlength,
+                (int)ctx.slavelist[slave].SM[0].SMflags);
+         printf(" SM1 A:%4.4x L:%4d F:%8.8x\n", ctx.slavelist[slave].SM[1].StartAddr, ctx.slavelist[slave].SM[1].SMlength,
+                (int)ctx.slavelist[slave].SM[1].SMflags);
          /* program SM0 mailbox in for slave */
-         ecx_FPWR(ctx.port, ec_slave[slave].configadr, ECT_REG_SM0, sizeof(ec_smt), &ec_slave[slave].SM[0], EC_TIMEOUTRET);
+         ecx_FPWR(&ctx.port, ctx.slavelist[slave].configadr, ECT_REG_SM0, sizeof(ec_smt), &ctx.slavelist[slave].SM[0], EC_TIMEOUTRET);
          /* program SM1 mailbox out for slave */
-         ecx_FPWR(ctx.port, ec_slave[slave].configadr, ECT_REG_SM1, sizeof(ec_smt), &ec_slave[slave].SM[1], EC_TIMEOUTRET);
+         ecx_FPWR(&ctx.port, ctx.slavelist[slave].configadr, ECT_REG_SM1, sizeof(ec_smt), &ctx.slavelist[slave].SM[1], EC_TIMEOUTRET);
 
          printf("Request BOOT state for slave %d\n", slave);
-         ec_slave[slave].state = EC_STATE_BOOT;
+         ctx.slavelist[slave].state = EC_STATE_BOOT;
          ecx_writestate(&ctx, slave);
 
          /* wait for slave to reach BOOT state */
@@ -157,7 +116,7 @@ void boottest(char *ifname, uint16 slave, char *filename)
                j = ecx_FOEwrite(&ctx, slave, filename, 0, filesize, &filebuffer, EC_TIMEOUTSTATE);
                printf("result %d.\n", j);
                printf("Request init state for slave %d\n", slave);
-               ec_slave[slave].state = EC_STATE_INIT;
+               ctx.slavelist[slave].state = EC_STATE_INIT;
                ecx_writestate(&ctx, slave);
             }
             else
index cb33fcf705d6c006981cbb8bee539f8d39ce8de7..f89c76c2521e26fe7b33f85f5ebb302f569fd362 100644 (file)
 
 #include "soem/soem.h"
 
-#define NSEC_PER_SEC  1000000000
 #define EC_TIMEOUTMON 500
+#define NSEC_PER_SEC  1000000000
+
+static uint8 IOmap[4096];
+static OSAL_THREAD_HANDLE thread1;
+static OSAL_THREAD_HANDLE thread2;
+static int expectedWKC;
+static boolean needlf;
+static volatile int wkc;
+static boolean inOP;
+static uint8 currentgroup = 0;
+static uint8 *digout = NULL;
+static int dorun = 0;
+static int64 toff, gl_delta;
 
-char IOmap[4096];
-OSAL_THREAD_HANDLE thread1;
-OSAL_THREAD_HANDLE thread2;
-int expectedWKC;
-boolean needlf;
-volatile int wkc;
-boolean inOP;
-uint8 currentgroup = 0;
-uint8 *digout = NULL;
-int dorun = 0;
-int64 toff, gl_delta;
-
-static ec_slavet ec_slave[EC_MAXSLAVE];
-static int ec_slavecount;
-static ec_groupt ec_group[EC_MAXGROUP];
-static uint8 ec_esibuf[EC_MAXEEPBUF];
-static uint32 ec_esimap[EC_MAXEEPBITMAP];
-static ec_eringt ec_elist;
-static ec_idxstackT ec_idxstack;
-static ec_SMcommtypet ec_SMcommtype[EC_MAX_MAPT];
-static ec_PDOassignt ec_PDOassign[EC_MAX_MAPT];
-static ec_PDOdesct ec_PDOdesc[EC_MAX_MAPT];
-static ec_eepromSMt ec_SM;
-static ec_eepromFMMUt ec_FMMU;
-static boolean EcatError = FALSE;
-static int64 ec_DCtime;
-static ecx_portt ecx_port;
-static ec_mbxpoolt ec_mbxpool;
-
-static ecx_contextt ctx = {
-    .port = &ecx_port,
-    .slavelist = &ec_slave[0],
-    .slavecount = &ec_slavecount,
-    .maxslave = EC_MAXSLAVE,
-    .grouplist = &ec_group[0],
-    .maxgroup = EC_MAXGROUP,
-    .esibuf = &ec_esibuf[0],
-    .esimap = &ec_esimap[0],
-    .esislave = 0,
-    .elist = &ec_elist,
-    .idxstack = &ec_idxstack,
-    .ecaterror = &EcatError,
-    .DCtime = &ec_DCtime,
-    .SMcommtype = &ec_SMcommtype[0],
-    .PDOassign = &ec_PDOassign[0],
-    .PDOdesc = &ec_PDOdesc[0],
-    .eepSM = &ec_SM,
-    .eepFMMU = &ec_FMMU,
-    .mbxpool = &ec_mbxpool,
-    .FOEhook = NULL,
-    .EOEhook = NULL,
-    .manualstatechange = 0,
-    .userdata = NULL,
-};
+static ecx_contextt ctx;
 
 void redtest(char *ifname, char *ifname2)
 {
@@ -91,35 +50,37 @@ void redtest(char *ifname, char *ifname2)
       /* find and auto-config slaves */
       if (ecx_config_init(&ctx) > 0)
       {
-         ecx_config_map_group(&ctx, &IOmap, 0);
+         ec_groupt *group = &ctx.grouplist[0];
 
-         printf("%d slaves found and configured.\n", ec_slavecount);
+         ecx_config_map_group(&ctx, IOmap, 0);
+
+         printf("%d slaves found and configured.\n", ctx.slavecount);
 
          /* wait for all slaves to reach SAFE_OP state */
          ecx_statecheck(&ctx, 0, EC_STATE_SAFE_OP, EC_TIMEOUTSTATE);
 
          ecx_configdc(&ctx);
 
-         /* read indevidual slave state and store in ec_slave[] */
+         /* read indevidual slave state and store in ctx.slavelist[] */
          ecx_readstate(&ctx);
-         for (cnt = 1; cnt <= ec_slavecount; cnt++)
+         for (cnt = 1; cnt <= ctx.slavecount; cnt++)
          {
             printf("Slave:%d Name:%s Output size:%3dbits Input size:%3dbits State:%2d delay:%d.%d\n",
-                   cnt, ec_slave[cnt].name, ec_slave[cnt].Obits, ec_slave[cnt].Ibits,
-                   ec_slave[cnt].state, (int)ec_slave[cnt].pdelay, ec_slave[cnt].hasdc);
+                   cnt, ctx.slavelist[cnt].name, ctx.slavelist[cnt].Obits, ctx.slavelist[cnt].Ibits,
+                   ctx.slavelist[cnt].state, (int)ctx.slavelist[cnt].pdelay, ctx.slavelist[cnt].hasdc);
             printf("         Out:%p,%4d In:%p,%4d\n",
-                   ec_slave[cnt].outputs, ec_slave[cnt].Obytes, ec_slave[cnt].inputs, ec_slave[cnt].Ibytes);
+                   ctx.slavelist[cnt].outputs, ctx.slavelist[cnt].Obytes, ctx.slavelist[cnt].inputs, ctx.slavelist[cnt].Ibytes);
             /* check for EL2004 or EL2008 */
-            if (!digout && ((ec_slave[cnt].eep_id == 0x0af83052) || (ec_slave[cnt].eep_id == 0x07d83052)))
+            if (!digout && ((ctx.slavelist[cnt].eep_id == 0x0af83052) || (ctx.slavelist[cnt].eep_id == 0x07d83052)))
             {
-               digout = ec_slave[cnt].outputs;
+               digout = ctx.slavelist[cnt].outputs;
             }
          }
-         expectedWKC = (ec_group[0].outputsWKC * 2) + ec_group[0].inputsWKC;
+         expectedWKC = (group->outputsWKC * 2) + group->inputsWKC;
          printf("Calculated workcounter %d\n", expectedWKC);
 
          printf("Request operational state for all slaves\n");
-         ec_slave[0].state = EC_STATE_OPERATIONAL;
+         ctx.slavelist[0].state = EC_STATE_OPERATIONAL;
          /* request OP state for all slaves */
          ecx_writestate(&ctx, 0);
          /* activate cyclic process data */
@@ -127,12 +88,12 @@ void redtest(char *ifname, char *ifname2)
          /* wait for all slaves to reach OP state */
          ecx_statecheck(&ctx, 0, EC_STATE_OPERATIONAL, 5 * EC_TIMEOUTSTATE);
 
-         oloop = ec_group[0].Obytes;
+         oloop = group->Obytes;
          if (oloop > 8) oloop = 8;
-         iloop = ec_group[0].Ibytes;
+         iloop = group->Ibytes;
          if (iloop > 8) iloop = 8;
 
-         if (ec_slave[0].state == EC_STATE_OPERATIONAL)
+         if (ctx.slavelist[0].state == EC_STATE_OPERATIONAL)
          {
             printf("Operational state reached for all slaves.\n");
             inOP = TRUE;
@@ -140,15 +101,15 @@ void redtest(char *ifname, char *ifname2)
             for (i = 1; i <= 5000; i++)
             {
                printf("Processdata cycle %5d , Wck %3d, DCtime %12" PRId64 ", dt %12" PRId64 ", O:",
-                      dorun, wkc, ec_DCtime, gl_delta);
+                      dorun, wkc, ctx.DCtime, gl_delta);
                for (j = 0; j < oloop; j++)
                {
-                  printf(" %2.2x", *(ec_slave[0].outputs + j));
+                  printf(" %2.2x", *(ctx.slavelist[0].outputs + j));
                }
                printf(" I:");
                for (j = 0; j < iloop; j++)
                {
-                  printf(" %2.2x", *(ec_slave[0].inputs + j));
+                  printf(" %2.2x", *(ctx.slavelist[0].inputs + j));
                }
                printf("\r");
                fflush(stdout);
@@ -161,17 +122,18 @@ void redtest(char *ifname, char *ifname2)
          {
             printf("Not all slaves reached operational state.\n");
             ecx_readstate(&ctx);
-            for (i = 1; i <= ec_slavecount; i++)
+            for (i = 1; i <= ctx.slavecount; i++)
             {
-               if (ec_slave[i].state != EC_STATE_OPERATIONAL)
+               ec_slavet *slave = &ctx.slavelist[i];
+               if (slave->state != EC_STATE_OPERATIONAL)
                {
                   printf("Slave %d State=0x%2.2x StatusCode=0x%4.4x : %s\n",
-                         i, ec_slave[i].state, ec_slave[i].ALstatuscode, ec_ALstatuscode2string(ec_slave[i].ALstatuscode));
+                         i, slave->state, slave->ALstatuscode, ec_ALstatuscode2string(slave->ALstatuscode));
                }
             }
          }
          printf("Request safe operational state for all slaves\n");
-         ec_slave[0].state = EC_STATE_SAFE_OP;
+         ctx.slavelist[0].state = EC_STATE_SAFE_OP;
          /* request SAFE_OP state for all slaves */
          ecx_writestate(&ctx, 0);
       }
@@ -255,10 +217,10 @@ OSAL_THREAD_FUNC_RT ecatthread(void *ptr)
          /* if we have some digital output, cycle */
          if (digout) *digout = (uint8)((dorun / 16) & 0xff);
 
-         if (ec_slave[0].hasdc)
+         if (ctx.slavelist[0].hasdc)
          {
             /* calulate toff to get linux time and DC synced */
-            ec_sync(ec_DCtime, cycletime, &toff);
+            ec_sync(ctx.DCtime, cycletime, &toff);
          }
          ecx_send_processdata(&ctx);
       }
@@ -267,12 +229,12 @@ OSAL_THREAD_FUNC_RT ecatthread(void *ptr)
 
 OSAL_THREAD_FUNC ecatcheck(void *ptr)
 {
-   int slave;
+   int slaveix;
    (void)ptr; /* Not used */
 
    while (1)
    {
-      if (inOP && ((wkc < expectedWKC) || ec_group[currentgroup].docheckstate))
+      if (inOP && ((wkc < expectedWKC) || ctx.grouplist[currentgroup].docheckstate))
       {
          if (needlf)
          {
@@ -280,70 +242,72 @@ OSAL_THREAD_FUNC ecatcheck(void *ptr)
             printf("\n");
          }
          /* one ore more slaves are not responding */
-         ec_group[currentgroup].docheckstate = FALSE;
+         ctx.grouplist[currentgroup].docheckstate = FALSE;
          ecx_readstate(&ctx);
-         for (slave = 1; slave <= ec_slavecount; slave++)
+         for (slaveix = 1; slaveix <= ctx.slavecount; slaveix++)
          {
-            if ((ec_slave[slave].group == currentgroup) && (ec_slave[slave].state != EC_STATE_OPERATIONAL))
+            ec_slavet *slave = &ctx.slavelist[slaveix];
+
+            if ((slave->group == currentgroup) && (slave->state != EC_STATE_OPERATIONAL))
             {
-               ec_group[currentgroup].docheckstate = TRUE;
-               if (ec_slave[slave].state == (EC_STATE_SAFE_OP + EC_STATE_ERROR))
+               ctx.grouplist[currentgroup].docheckstate = TRUE;
+               if (slave->state == (EC_STATE_SAFE_OP + EC_STATE_ERROR))
                {
-                  printf("ERROR : slave %d is in SAFE_OP + ERROR, attempting ack.\n", slave);
-                  ec_slave[slave].state = (EC_STATE_SAFE_OP + EC_STATE_ACK);
-                  ecx_writestate(&ctx, slave);
+                  printf("ERROR : slave %d is in SAFE_OP + ERROR, attempting ack.\n", slaveix);
+                  slave->state = (EC_STATE_SAFE_OP + EC_STATE_ACK);
+                  ecx_writestate(&ctx, slaveix);
                }
-               else if (ec_slave[slave].state == EC_STATE_SAFE_OP)
+               else if (slave->state == EC_STATE_SAFE_OP)
                {
-                  printf("WARNING : slave %d is in SAFE_OP, change to OPERATIONAL.\n", slave);
-                  ec_slave[slave].state = EC_STATE_OPERATIONAL;
-                  if (ec_slave[slave].mbxhandlerstate == ECT_MBXH_LOST) ec_slave[slave].mbxhandlerstate = ECT_MBXH_CYCLIC;
-                  ecx_writestate(&ctx, slave);
+                  printf("WARNING : slave %d is in SAFE_OP, change to OPERATIONAL.\n", slaveix);
+                  slave->state = EC_STATE_OPERATIONAL;
+                  if (slave->mbxhandlerstate == ECT_MBXH_LOST) slave->mbxhandlerstate = ECT_MBXH_CYCLIC;
+                  ecx_writestate(&ctx, slaveix);
                }
-               else if (ec_slave[slave].state > EC_STATE_NONE)
+               else if (slave->state > EC_STATE_NONE)
                {
-                  if (ecx_reconfig_slave(&ctx, slave, EC_TIMEOUTMON) >= EC_STATE_PRE_OP)
+                  if (ecx_reconfig_slave(&ctx, slaveix, EC_TIMEOUTMON) >= EC_STATE_PRE_OP)
                   {
-                     ec_slave[slave].islost = FALSE;
-                     printf("MESSAGE : slave %d reconfigured\n", slave);
+                     slave->islost = FALSE;
+                     printf("MESSAGE : slave %d reconfigured\n", slaveix);
                   }
                }
-               else if (!ec_slave[slave].islost)
+               else if (!slave->islost)
                {
                   /* re-check state */
-                  ecx_statecheck(&ctx, slave, EC_STATE_OPERATIONAL, EC_TIMEOUTRET);
-                  if (ec_slave[slave].state == EC_STATE_NONE)
+                  ecx_statecheck(&ctx, slaveix, EC_STATE_OPERATIONAL, EC_TIMEOUTRET);
+                  if (slave->state == EC_STATE_NONE)
                   {
-                     ec_slave[slave].islost = TRUE;
-                     ec_slave[slave].mbxhandlerstate = ECT_MBXH_LOST;
+                     slave->islost = TRUE;
+                     slave->mbxhandlerstate = ECT_MBXH_LOST;
                      /* zero input data for this slave */
-                     if (ec_slave[slave].Ibytes)
+                     if (slave->Ibytes)
                      {
-                        memset(ec_slave[slave].inputs, 0x00, ec_slave[slave].Ibytes);
-                        printf("zero inputs %p %d\n\r", ec_slave[slave].inputs, ec_slave[slave].Ibytes);
+                        memset(slave->inputs, 0x00, slave->Ibytes);
+                        printf("zero inputs %p %d\n\r", slave->inputs, slave->Ibytes);
                      }
-                     printf("ERROR : slave %d lost\n", slave);
+                     printf("ERROR : slave %d lost\n", slaveix);
                   }
                }
             }
-            if (ec_slave[slave].islost)
+            if (slave->islost)
             {
-               if (ec_slave[slave].state <= EC_STATE_INIT)
+               if (slave->state <= EC_STATE_INIT)
                {
-                  if (ecx_recover_slave(&ctx, slave, EC_TIMEOUTMON))
+                  if (ecx_recover_slave(&ctx, slaveix, EC_TIMEOUTMON))
                   {
-                     ec_slave[slave].islost = FALSE;
-                     printf("MESSAGE : slave %d recovered\n", slave);
+                     slave->islost = FALSE;
+                     printf("MESSAGE : slave %d recovered\n", slaveix);
                   }
                }
                else
                {
-                  ec_slave[slave].islost = FALSE;
-                  printf("MESSAGE : slave %d found\n", slave);
+                  slave->islost = FALSE;
+                  printf("MESSAGE : slave %d found\n", slaveix);
                }
             }
          }
-         if (!ec_group[currentgroup].docheckstate)
+         if (!ctx.grouplist[currentgroup].docheckstate)
             printf("OK : all slaves resumed OPERATIONAL.\n");
       }
       osal_usleep(10000);
index b30724896dd1f5f7a8ace1303718998c8d594c29..e8c26d64b02485019dfa9a411f24ccc76128bbff 100644 (file)
@@ -18,64 +18,18 @@ typedef struct
    char *iface;
    uint8 group;
    int roundtrip_time;
-
-   /* Used by the context */
    uint8 map[4096];
-   ecx_portt port;
-   ec_slavet slavelist[EC_MAXSLAVE];
-   int slavecount;
-   ec_groupt grouplist[EC_MAXGROUP];
-   uint8 esibuf[EC_MAXEEPBUF];
-   uint32 esimap[EC_MAXEEPBITMAP];
-   ec_eringt elist;
-   ec_idxstackT idxstack;
-   boolean ecaterror;
-   int64 DCtime;
-   ec_SMcommtypet SMcommtype[EC_MAX_MAPT];
-   ec_PDOassignt PDOassign[EC_MAX_MAPT];
-   ec_PDOdesct PDOdesc[EC_MAX_MAPT];
-   ec_eepromSMt eepSM;
-   ec_eepromFMMUt eepFMMU;
-   ec_mbxpoolt mbxpool;
 } Fieldbus;
 
 static void
 fieldbus_initialize(Fieldbus *fieldbus, char *iface)
 {
-   ecx_contextt *context;
-
    /* Let's start by 0-filling `fieldbus` to avoid surprises */
    memset(fieldbus, 0, sizeof(*fieldbus));
 
    fieldbus->iface = iface;
    fieldbus->group = 0;
    fieldbus->roundtrip_time = 0;
-   fieldbus->ecaterror = FALSE;
-
-   /* Initialize the ecx_contextt data structure */
-   context = &fieldbus->context;
-   context->port = &fieldbus->port;
-   context->slavelist = fieldbus->slavelist;
-   context->slavecount = &fieldbus->slavecount;
-   context->maxslave = EC_MAXSLAVE;
-   context->grouplist = fieldbus->grouplist;
-   context->maxgroup = EC_MAXGROUP;
-   context->esibuf = fieldbus->esibuf;
-   context->esimap = fieldbus->esimap;
-   context->esislave = 0;
-   context->elist = &fieldbus->elist;
-   context->idxstack = &fieldbus->idxstack;
-   context->ecaterror = &fieldbus->ecaterror;
-   context->DCtime = &fieldbus->DCtime;
-   context->SMcommtype = fieldbus->SMcommtype;
-   context->PDOassign = fieldbus->PDOassign;
-   context->PDOdesc = fieldbus->PDOdesc;
-   context->eepSM = &fieldbus->eepSM;
-   context->eepFMMU = &fieldbus->eepFMMU;
-   context->mbxpool = &fieldbus->mbxpool;
-   context->FOEhook = NULL;
-   context->EOEhook = NULL;
-   context->manualstatechange = 0;
 }
 
 static int
@@ -106,7 +60,7 @@ fieldbus_start(Fieldbus *fieldbus)
    int i;
 
    context = &fieldbus->context;
-   grp = fieldbus->grouplist + fieldbus->group;
+   grp = context->grouplist + fieldbus->group;
 
    printf("Initializing SOEM on '%s'... ", fieldbus->iface);
    if (!ecx_init(context, fieldbus->iface))
@@ -122,7 +76,7 @@ fieldbus_start(Fieldbus *fieldbus)
       printf("no slaves found\n");
       return FALSE;
    }
-   printf("%d slaves found\n", fieldbus->slavecount);
+   printf("%d slaves found\n", context->slavecount);
 
    printf("Sequential mapping of I/O... ");
    ecx_config_map_group(context, fieldbus->map, fieldbus->group);
@@ -153,7 +107,7 @@ fieldbus_start(Fieldbus *fieldbus)
 
    printf("Setting operational state..");
    /* Act on slave 0 (a virtual slave used for broadcasting) */
-   slave = fieldbus->slavelist;
+   slave = context->slavelist;
    slave->state = EC_STATE_OPERATIONAL;
    ecx_writestate(context, 0);
    /* Poll the result ten times before giving up */
@@ -171,9 +125,9 @@ fieldbus_start(Fieldbus *fieldbus)
 
    printf(" failed,");
    ecx_readstate(context);
-   for (i = 1; i <= fieldbus->slavecount; ++i)
+   for (i = 1; i <= context->slavecount; ++i)
    {
-      slave = fieldbus->slavelist + i;
+      slave = context->slavelist + i;
       if (slave->state != EC_STATE_OPERATIONAL)
       {
          printf(" slave %d is 0x%04X (AL-status=0x%04X %s)",
@@ -194,7 +148,7 @@ fieldbus_stop(Fieldbus *fieldbus)
 
    context = &fieldbus->context;
    /* Act on slave 0 (a virtual slave used for broadcasting) */
-   slave = fieldbus->slavelist;
+   slave = context->slavelist;
 
    printf("Requesting init state on all slaves... ");
    slave->state = EC_STATE_INIT;
@@ -209,11 +163,13 @@ fieldbus_stop(Fieldbus *fieldbus)
 static boolean
 fieldbus_dump(Fieldbus *fieldbus)
 {
+   ecx_contextt *context;
    ec_groupt *grp;
    uint32 n;
    int wkc, expected_wkc;
 
-   grp = fieldbus->grouplist + fieldbus->group;
+   context = &fieldbus->context;
+   grp = context->grouplist + fieldbus->group;
 
    wkc = fieldbus_roundtrip(fieldbus);
    expected_wkc = grp->outputsWKC * 2 + grp->inputsWKC;
@@ -234,7 +190,7 @@ fieldbus_dump(Fieldbus *fieldbus)
    {
       printf(" %02X", grp->inputs[n]);
    }
-   printf("  T: %lld\r", (long long)fieldbus->DCtime);
+   printf("  T: %lld\r", (long long)context->DCtime);
    return TRUE;
 }
 
@@ -250,7 +206,7 @@ fieldbus_check_state(Fieldbus *fieldbus)
    grp = context->grouplist + fieldbus->group;
    grp->docheckstate = FALSE;
    ecx_readstate(context);
-   for (i = 1; i <= fieldbus->slavecount; ++i)
+   for (i = 1; i <= context->slavecount; ++i)
    {
       slave = context->slavelist + i;
       if (slave->group != fieldbus->group)
index 210d7d622cd2fa8c4d02a67a5785f39832687872..c9d8e7cd4fe0f3fdea3f70de915578459dbaa719 100644 (file)
 
 #define EC_TIMEOUTMON 500
 
-char IOmap[4096];
-OSAL_THREAD_HANDLE thread1;
-int expectedWKC;
-boolean needlf;
-volatile int wkc;
-boolean inOP;
-uint8 currentgroup = 0;
+static uint8 IOmap[4096];
+static OSAL_THREAD_HANDLE thread1;
+static int expectedWKC;
+static boolean needlf;
+static volatile int wkc;
+static boolean inOP;
+static uint8 currentgroup = 0;
 
-static ec_slavet ec_slave[EC_MAXSLAVE];
-static int ec_slavecount;
-static ec_groupt ec_group[EC_MAXGROUP];
-static uint8 ec_esibuf[EC_MAXEEPBUF];
-static uint32 ec_esimap[EC_MAXEEPBITMAP];
-static ec_eringt ec_elist;
-static ec_idxstackT ec_idxstack;
-static ec_SMcommtypet ec_SMcommtype[EC_MAX_MAPT];
-static ec_PDOassignt ec_PDOassign[EC_MAX_MAPT];
-static ec_PDOdesct ec_PDOdesc[EC_MAX_MAPT];
-static ec_eepromSMt ec_SM;
-static ec_eepromFMMUt ec_FMMU;
-static boolean EcatError = FALSE;
-static int64 ec_DCtime;
-static ecx_portt ecx_port;
-static ec_mbxpoolt ec_mbxpool;
-
-static ecx_contextt ctx = {
-    .port = &ecx_port,
-    .slavelist = &ec_slave[0],
-    .slavecount = &ec_slavecount,
-    .maxslave = EC_MAXSLAVE,
-    .grouplist = &ec_group[0],
-    .maxgroup = EC_MAXGROUP,
-    .esibuf = &ec_esibuf[0],
-    .esimap = &ec_esimap[0],
-    .esislave = 0,
-    .elist = &ec_elist,
-    .idxstack = &ec_idxstack,
-    .ecaterror = &EcatError,
-    .DCtime = &ec_DCtime,
-    .SMcommtype = &ec_SMcommtype[0],
-    .PDOassign = &ec_PDOassign[0],
-    .PDOdesc = &ec_PDOdesc[0],
-    .eepSM = &ec_SM,
-    .eepFMMU = &ec_FMMU,
-    .mbxpool = &ec_mbxpool,
-    .FOEhook = NULL,
-    .EOEhook = NULL,
-    .manualstatechange = 0,
-    .userdata = NULL,
-};
+static ecx_contextt ctx;
 
 void simpletest(char *ifname)
 {
@@ -84,26 +43,28 @@ void simpletest(char *ifname)
       /* find and auto-config slaves */
       if (ecx_config_init(&ctx) > 0)
       {
-         ecx_config_map_group(&ctx, &IOmap, 0);
+         ec_groupt *group = &ctx.grouplist[0];
+
+         ecx_config_map_group(&ctx, IOmap, 0);
 
          ecx_configdc(&ctx);
 
-         printf("%d slaves found and configured.\n", ec_slavecount);
+         printf("%d slaves found and configured.\n", ctx.slavecount);
 
          /* wait for all slaves to reach SAFE_OP state */
          ecx_statecheck(&ctx, 0, EC_STATE_SAFE_OP, EC_TIMEOUTSTATE * 4);
 
-         oloop = ec_group[0].Obytes;
+         oloop = group->Obytes;
          if (oloop > 8) oloop = 8;
-         iloop = ec_group[0].Ibytes;
+         iloop = group->Ibytes;
          if (iloop > 8) iloop = 8;
 
-         printf("segments : %d : %d %d %d %d\n", ec_group[0].nsegments, ec_group[0].IOsegment[0], ec_group[0].IOsegment[1], ec_group[0].IOsegment[2], ec_group[0].IOsegment[3]);
+         printf("segments : %d : %d %d %d %d\n", group->nsegments, group->IOsegment[0], group->IOsegment[1], group->IOsegment[2], group->IOsegment[3]);
 
          printf("Request operational state for all slaves\n");
-         expectedWKC = (ec_group[0].outputsWKC * 2) + ec_group[0].inputsWKC;
+         expectedWKC = (group->outputsWKC * 2) + group->inputsWKC;
          printf("Calculated workcounter %d\n", expectedWKC);
-         ec_slave[0].state = EC_STATE_OPERATIONAL;
+         ctx.slavelist[0].state = EC_STATE_OPERATIONAL;
          /* send one valid process data to make outputs in slaves happy*/
          ecx_send_processdata(&ctx);
          ecx_receive_processdata(&ctx, EC_TIMEOUTRET);
@@ -116,8 +77,8 @@ void simpletest(char *ifname)
             ecx_send_processdata(&ctx);
             ecx_receive_processdata(&ctx, EC_TIMEOUTRET);
             ecx_statecheck(&ctx, 0, EC_STATE_OPERATIONAL, 50000);
-         } while (chk-- && (ec_slave[0].state != EC_STATE_OPERATIONAL));
-         if (ec_slave[0].state == EC_STATE_OPERATIONAL)
+         } while (chk-- && (ctx.slavelist[0].state != EC_STATE_OPERATIONAL));
+         if (ctx.slavelist[0].state == EC_STATE_OPERATIONAL)
          {
             printf("Operational state reached for all slaves.\n");
             inOP = TRUE;
@@ -133,15 +94,15 @@ void simpletest(char *ifname)
 
                   for (j = 0; j < oloop; j++)
                   {
-                     printf(" %2.2x", *(ec_slave[0].outputs + j));
+                     printf(" %2.2x", *(ctx.slavelist[0].outputs + j));
                   }
 
                   printf(" I:");
                   for (j = 0; j < iloop; j++)
                   {
-                     printf(" %2.2x", *(ec_slave[0].inputs + j));
+                     printf(" %2.2x", *(ctx.slavelist[0].inputs + j));
                   }
-                  printf(" T:%" PRId64 "\r", ec_DCtime);
+                  printf(" T:%" PRId64 "\r", ctx.DCtime);
                   needlf = TRUE;
                }
                osal_usleep(5000);
@@ -152,17 +113,18 @@ void simpletest(char *ifname)
          {
             printf("Not all slaves reached operational state.\n");
             ecx_readstate(&ctx);
-            for (i = 1; i <= ec_slavecount; i++)
+            for (i = 1; i <= ctx.slavecount; i++)
             {
-               if (ec_slave[i].state != EC_STATE_OPERATIONAL)
+               ec_slavet *slave = &ctx.slavelist[i];
+               if (slave->state != EC_STATE_OPERATIONAL)
                {
                   printf("Slave %d State=0x%2.2x StatusCode=0x%4.4x : %s\n",
-                         i, ec_slave[i].state, ec_slave[i].ALstatuscode, ec_ALstatuscode2string(ec_slave[i].ALstatuscode));
+                         i, slave->state, slave->ALstatuscode, ec_ALstatuscode2string(slave->ALstatuscode));
                }
             }
          }
          printf("\nRequest init state for all slaves\n");
-         ec_slave[0].state = EC_STATE_INIT;
+         ctx.slavelist[0].state = EC_STATE_INIT;
          /* request INIT state for all slaves */
          ecx_writestate(&ctx, 0);
       }
@@ -182,84 +144,86 @@ void simpletest(char *ifname)
 
 OSAL_THREAD_FUNC ecatcheck(void *ptr)
 {
-   int slave;
+   int slaveix;
    (void)ptr; /* Not used */
 
    while (1)
    {
-      if (inOP && ((wkc < expectedWKC) || ec_group[currentgroup].docheckstate))
+      if (inOP && ((wkc < expectedWKC) || ctx.grouplist[currentgroup].docheckstate))
       {
-         printf("check wkc=%d/%d docheckstate=%d!\n", wkc, expectedWKC, ec_group[currentgroup].docheckstate);
+         printf("check wkc=%d/%d docheckstate=%d!\n", wkc, expectedWKC, ctx.grouplist[currentgroup].docheckstate);
          if (needlf)
          {
             needlf = FALSE;
             printf("\n");
          }
          /* one ore more slaves are not responding */
-         ec_group[currentgroup].docheckstate = FALSE;
+         ctx.grouplist[currentgroup].docheckstate = FALSE;
          ecx_readstate(&ctx);
-         for (slave = 1; slave <= ec_slavecount; slave++)
+         for (slaveix = 1; slaveix <= ctx.slavecount; slaveix++)
          {
-            if ((ec_slave[slave].group == currentgroup) && (ec_slave[slave].state != EC_STATE_OPERATIONAL))
+            ec_slavet *slave = &ctx.slavelist[slaveix];
+
+            if ((slave->group == currentgroup) && (slave->state != EC_STATE_OPERATIONAL))
             {
-               ec_group[currentgroup].docheckstate = TRUE;
-               if (ec_slave[slave].state == (EC_STATE_SAFE_OP + EC_STATE_ERROR))
+               ctx.grouplist[currentgroup].docheckstate = TRUE;
+               if (slave->state == (EC_STATE_SAFE_OP + EC_STATE_ERROR))
                {
-                  printf("ERROR : slave %d is in SAFE_OP + ERROR, attempting ack.\n", slave);
-                  ec_slave[slave].state = (EC_STATE_SAFE_OP + EC_STATE_ACK);
-                  ecx_writestate(&ctx, slave);
+                  printf("ERROR : slave %d is in SAFE_OP + ERROR, attempting ack.\n", slaveix);
+                  slave->state = (EC_STATE_SAFE_OP + EC_STATE_ACK);
+                  ecx_writestate(&ctx, slaveix);
                }
-               else if (ec_slave[slave].state == EC_STATE_SAFE_OP)
+               else if (slave->state == EC_STATE_SAFE_OP)
                {
-                  printf("WARNING : slave %d is in SAFE_OP, change to OPERATIONAL.\n", slave);
-                  ec_slave[slave].state = EC_STATE_OPERATIONAL;
-                  if (ec_slave[slave].mbxhandlerstate == ECT_MBXH_LOST) ec_slave[slave].mbxhandlerstate = ECT_MBXH_CYCLIC;
-                  ecx_writestate(&ctx, slave);
+                  printf("WARNING : slave %d is in SAFE_OP, change to OPERATIONAL.\n", slaveix);
+                  slave->state = EC_STATE_OPERATIONAL;
+                  if (slave->mbxhandlerstate == ECT_MBXH_LOST) slave->mbxhandlerstate = ECT_MBXH_CYCLIC;
+                  ecx_writestate(&ctx, slaveix);
                }
-               else if (ec_slave[slave].state > EC_STATE_NONE)
+               else if (slave->state > EC_STATE_NONE)
                {
-                  if (ecx_reconfig_slave(&ctx, slave, EC_TIMEOUTMON) >= EC_STATE_PRE_OP)
+                  if (ecx_reconfig_slave(&ctx, slaveix, EC_TIMEOUTMON) >= EC_STATE_PRE_OP)
                   {
-                     ec_slave[slave].islost = FALSE;
-                     printf("MESSAGE : slave %d reconfigured\n", slave);
+                     slave->islost = FALSE;
+                     printf("MESSAGE : slave %d reconfigured\n", slaveix);
                   }
                }
-               else if (!ec_slave[slave].islost)
+               else if (!slave->islost)
                {
                   /* re-check state */
-                  ecx_statecheck(&ctx, slave, EC_STATE_OPERATIONAL, EC_TIMEOUTRET);
-                  if (ec_slave[slave].state == EC_STATE_NONE)
+                  ecx_statecheck(&ctx, slaveix, EC_STATE_OPERATIONAL, EC_TIMEOUTRET);
+                  if (slave->state == EC_STATE_NONE)
                   {
-                     ec_slave[slave].islost = TRUE;
-                     ec_slave[slave].mbxhandlerstate = ECT_MBXH_LOST;
+                     slave->islost = TRUE;
+                     slave->mbxhandlerstate = ECT_MBXH_LOST;
                      /* zero input data for this slave */
-                     if (ec_slave[slave].Ibytes)
+                     if (slave->Ibytes)
                      {
-                        memset(ec_slave[slave].inputs, 0x00, ec_slave[slave].Ibytes);
-                        printf("zero inputs %p %d\n\r", ec_slave[slave].inputs, ec_slave[slave].Ibytes);
+                        memset(slave->inputs, 0x00, slave->Ibytes);
+                        printf("zero inputs %p %d\n\r", slave->inputs, slave->Ibytes);
                      }
-                     printf("ERROR : slave %d lost\n", slave);
+                     printf("ERROR : slave %d lost\n", slaveix);
                   }
                }
             }
-            if (ec_slave[slave].islost)
+            if (slave->islost)
             {
-               if (ec_slave[slave].state <= EC_STATE_INIT)
+               if (slave->state <= EC_STATE_INIT)
                {
-                  if (ecx_recover_slave(&ctx, slave, EC_TIMEOUTMON))
+                  if (ecx_recover_slave(&ctx, slaveix, EC_TIMEOUTMON))
                   {
-                     ec_slave[slave].islost = FALSE;
-                     printf("MESSAGE : slave %d recovered\n", slave);
+                     slave->islost = FALSE;
+                     printf("MESSAGE : slave %d recovered\n", slaveix);
                   }
                }
                else
                {
-                  ec_slave[slave].islost = FALSE;
-                  printf("MESSAGE : slave %d found\n", slave);
+                  slave->islost = FALSE;
+                  printf("MESSAGE : slave %d found\n", slaveix);
                }
             }
          }
-         if (!ec_group[currentgroup].docheckstate)
+         if (!ctx.grouplist[currentgroup].docheckstate)
             printf("OK : all slaves resumed OPERATIONAL.\n");
       }
       osal_usleep(10000);
index 982c5f7b1b04bc0092fa20f9ce220daf066e5740..05b489541129625e785b540d06687aca26e0cdec 100644 (file)
 
 #include "soem/soem.h"
 
-static char IOmap[4096];
+static uint8 IOmap[4096];
 static ec_ODlistt ODlist;
 static ec_OElistt OElist;
 static boolean printSDO = FALSE;
 static boolean printMAP = FALSE;
 static char usdo[128];
 
-static ec_slavet ec_slave[EC_MAXSLAVE];
-static int ec_slavecount;
-static ec_groupt ec_group[EC_MAXGROUP];
-static uint8 ec_esibuf[EC_MAXEEPBUF];
-static uint32 ec_esimap[EC_MAXEEPBITMAP];
-static ec_eringt ec_elist;
-static ec_idxstackT ec_idxstack;
-static ec_SMcommtypet ec_SMcommtype[EC_MAX_MAPT];
-static ec_PDOassignt ec_PDOassign[EC_MAX_MAPT];
-static ec_PDOdesct ec_PDOdesc[EC_MAX_MAPT];
-static ec_eepromSMt ec_SM;
-static ec_eepromFMMUt ec_FMMU;
-static boolean EcatError = FALSE;
-static int64 ec_DCtime;
-static ecx_portt ecx_port;
-static ec_mbxpoolt ec_mbxpool;
-
-static ecx_contextt ctx = {
-    .port = &ecx_port,
-    .slavelist = &ec_slave[0],
-    .slavecount = &ec_slavecount,
-    .maxslave = EC_MAXSLAVE,
-    .grouplist = &ec_group[0],
-    .maxgroup = EC_MAXGROUP,
-    .esibuf = &ec_esibuf[0],
-    .esimap = &ec_esimap[0],
-    .esislave = 0,
-    .elist = &ec_elist,
-    .idxstack = &ec_idxstack,
-    .ecaterror = &EcatError,
-    .DCtime = &ec_DCtime,
-    .SMcommtype = &ec_SMcommtype[0],
-    .PDOassign = &ec_PDOassign[0],
-    .PDOdesc = &ec_PDOdesc[0],
-    .eepSM = &ec_SM,
-    .eepFMMU = &ec_FMMU,
-    .mbxpool = &ec_mbxpool,
-    .FOEhook = NULL,
-    .EOEhook = NULL,
-    .manualstatechange = 0,
-    .userdata = NULL,
-};
+static ecx_contextt ctx;
 
 #define OTYPE_VAR    0x0007
 #define OTYPE_ARRAY  0x0008
@@ -212,7 +171,7 @@ char *SDO2string(uint16 slave, uint16 index, uint8 subidx, uint16 dtype)
 
    memset(&usdo, 0, sizeof(usdo));
    ecx_SDOread(&ctx, slave, index, subidx, FALSE, &l, &usdo, EC_TIMEOUTRXM);
-   if (EcatError)
+   if (ctx.ecaterror)
    {
       return ecx_elist2string(&ctx);
    }
@@ -426,14 +385,15 @@ int si_map_sdo(int slave)
             {
                /* read the assign RXPDO */
                printf("  SM%1d outputs\n     addr b   index: sub bitl data_type    name\n", iSM);
-               Tsize = si_PDOassign(slave, ECT_SDO_PDOASSIGN + iSM, (int)(ec_slave[slave].outputs - (uint8 *)&IOmap[0]), outputs_bo);
+               Tsize = si_PDOassign(slave, ECT_SDO_PDOASSIGN + iSM, (int)(ctx.slavelist[slave].outputs - IOmap), outputs_bo);
                outputs_bo += Tsize;
             }
             if (tSM == 4) // inputs
             {
                /* read the assign TXPDO */
                printf("  SM%1d inputs\n     addr b   index: sub bitl data_type    name\n", iSM);
-               Tsize = si_PDOassign(slave, ECT_SDO_PDOASSIGN + iSM, (int)(ec_slave[slave].inputs - (uint8 *)&IOmap[0]), inputs_bo);
+
+               Tsize = si_PDOassign(slave, ECT_SDO_PDOASSIGN + iSM, (int)(ctx.slavelist[slave].inputs - IOmap), inputs_bo);
                inputs_bo += Tsize;
             }
          }
@@ -461,7 +421,7 @@ int si_siiPDO(uint16 slave, uint8 t, int mapoffset, int bitoffset)
    int abs_offset, abs_bit;
    char str_name[EC_MAXNAME + 1];
 
-   eectl = ec_slave[slave].eep_pdi;
+   eectl = ctx.slavelist[slave].eep_pdi;
 
    totalsize = 0;
    PDO = &eepPDO;
@@ -560,10 +520,10 @@ int si_map_sii(int slave)
    outputs_bo = 0;
    inputs_bo = 0;
    /* read the assign RXPDOs */
-   Tsize = si_siiPDO(slave, 1, (int)(ec_slave[slave].outputs - (uint8 *)&IOmap), outputs_bo);
+   Tsize = si_siiPDO(slave, 1, (int)(ctx.slavelist[slave].outputs - IOmap), outputs_bo);
    outputs_bo += Tsize;
    /* read the assign TXPDOs */
-   Tsize = si_siiPDO(slave, 0, (int)(ec_slave[slave].inputs - (uint8 *)&IOmap), inputs_bo);
+   Tsize = si_siiPDO(slave, 0, (int)(ctx.slavelist[slave].inputs - IOmap), inputs_bo);
    inputs_bo += Tsize;
    /* found some I/O bits ? */
    if ((outputs_bo > 0) || (inputs_bo > 0))
@@ -586,7 +546,7 @@ void si_sdo(int cnt)
          char name[128] = {0};
 
          ecx_readODdescription(&ctx, i, &ODlist);
-         while (EcatError)
+         while (ctx.ecaterror)
             printf(" - %s\n", ecx_elist2string(&ctx));
          snprintf(name, sizeof(name) - 1, "\"%s\"", ODlist.Name[i]);
          if (ODlist.ObjectCode[i] == OTYPE_VAR)
@@ -602,7 +562,7 @@ void si_sdo(int cnt)
          }
          memset(&OElist, 0, sizeof(OElist));
          ecx_readOE(&ctx, i, &ODlist, &OElist);
-         while (EcatError)
+         while (ctx.ecaterror)
             printf("- %s\n", ecx_elist2string(&ctx));
 
          if (ODlist.ObjectCode[i] != OTYPE_VAR)
@@ -634,7 +594,7 @@ void si_sdo(int cnt)
    }
    else
    {
-      while (EcatError)
+      while (ctx.ecaterror)
          printf("%s", ecx_elist2string(&ctx));
    }
 }
@@ -655,85 +615,87 @@ void slaveinfo(char *ifname)
       /* find and auto-config slaves */
       if (ecx_config_init(&ctx) > 0)
       {
-         ecx_config_map_group(&ctx, &IOmap, 0);
+         ec_groupt *group = &ctx.grouplist[0];
+
+         ecx_config_map_group(&ctx, IOmap, 0);
 
          ecx_configdc(&ctx);
-         while (EcatError)
+         while (ctx.ecaterror)
             printf("%s", ecx_elist2string(&ctx));
-         printf("%d slaves found and configured.\n", ec_slavecount);
-         expectedWKC = (ec_group[0].outputsWKC * 2) + ec_group[0].inputsWKC;
+         printf("%d slaves found and configured.\n", ctx.slavecount);
+         expectedWKC = (group->outputsWKC * 2) + group->inputsWKC;
          printf("Calculated workcounter %d\n", expectedWKC);
          /* wait for all slaves to reach SAFE_OP state */
          ecx_statecheck(&ctx, 0, EC_STATE_SAFE_OP, EC_TIMEOUTSTATE * 3);
-         if (ec_slave[0].state != EC_STATE_SAFE_OP)
+         if (ctx.slavelist[0].state != EC_STATE_SAFE_OP)
          {
             printf("Not all slaves reached safe operational state.\n");
             ecx_readstate(&ctx);
-            for (i = 1; i <= ec_slavecount; i++)
+            for (i = 1; i <= ctx.slavecount; i++)
             {
-               if (ec_slave[i].state != EC_STATE_SAFE_OP)
+               if (ctx.slavelist[i].state != EC_STATE_SAFE_OP)
                {
                   printf("Slave %d State=%2x StatusCode=%4x : %s\n",
-                         i, ec_slave[i].state, ec_slave[i].ALstatuscode, ec_ALstatuscode2string(ec_slave[i].ALstatuscode));
+                         i, ctx.slavelist[i].state, ctx.slavelist[i].ALstatuscode, ec_ALstatuscode2string(ctx.slavelist[i].ALstatuscode));
                }
             }
          }
 
          ecx_readstate(&ctx);
-         for (cnt = 1; cnt <= ec_slavecount; cnt++)
+         for (cnt = 1; cnt <= ctx.slavecount; cnt++)
          {
             printf("\nSlave:%d\n Name:%s\n Output size: %dbits\n Input size: %dbits\n State: %d\n Delay: %d[ns]\n Has DC: %d\n",
-                   cnt, ec_slave[cnt].name, ec_slave[cnt].Obits, ec_slave[cnt].Ibits,
-                   ec_slave[cnt].state, ec_slave[cnt].pdelay, ec_slave[cnt].hasdc);
-            if (ec_slave[cnt].hasdc) printf(" DCParentport:%d\n", ec_slave[cnt].parentport);
-            printf(" Activeports:%d.%d.%d.%d\n", (ec_slave[cnt].activeports & 0x01) > 0,
-                   (ec_slave[cnt].activeports & 0x02) > 0,
-                   (ec_slave[cnt].activeports & 0x04) > 0,
-                   (ec_slave[cnt].activeports & 0x08) > 0);
-            printf(" Configured address: %4.4x\n", ec_slave[cnt].configadr);
-            printf(" Man: %8.8x ID: %8.8x Rev: %8.8x\n", (int)ec_slave[cnt].eep_man, (int)ec_slave[cnt].eep_id, (int)ec_slave[cnt].eep_rev);
+                   cnt, ctx.slavelist[cnt].name, ctx.slavelist[cnt].Obits, ctx.slavelist[cnt].Ibits,
+                   ctx.slavelist[cnt].state, ctx.slavelist[cnt].pdelay, ctx.slavelist[cnt].hasdc);
+            if (ctx.slavelist[cnt].hasdc) printf(" DCParentport:%d\n", ctx.slavelist[cnt].parentport);
+            printf(" Activeports:%d.%d.%d.%d\n", (ctx.slavelist[cnt].activeports & 0x01) > 0,
+                   (ctx.slavelist[cnt].activeports & 0x02) > 0,
+                   (ctx.slavelist[cnt].activeports & 0x04) > 0,
+                   (ctx.slavelist[cnt].activeports & 0x08) > 0);
+            printf(" Configured address: %4.4x\n", ctx.slavelist[cnt].configadr);
+            printf(" Man: %8.8x ID: %8.8x Rev: %8.8x\n", (int)ctx.slavelist[cnt].eep_man, (int)ctx.slavelist[cnt].eep_id, (int)ctx.slavelist[cnt].eep_rev);
             for (nSM = 0; nSM < EC_MAXSM; nSM++)
             {
-               if (ec_slave[cnt].SM[nSM].StartAddr > 0)
-                  printf(" SM%1d A:%4.4x L:%4d F:%8.8x Type:%d\n", nSM, etohs(ec_slave[cnt].SM[nSM].StartAddr), etohs(ec_slave[cnt].SM[nSM].SMlength),
-                         etohl(ec_slave[cnt].SM[nSM].SMflags), ec_slave[cnt].SMtype[nSM]);
+               if (ctx.slavelist[cnt].SM[nSM].StartAddr > 0)
+                  printf(" SM%1d A:%4.4x L:%4d F:%8.8x Type:%d\n", nSM, etohs(ctx.slavelist[cnt].SM[nSM].StartAddr), etohs(ctx.slavelist[cnt].SM[nSM].SMlength),
+                         etohl(ctx.slavelist[cnt].SM[nSM].SMflags), ctx.slavelist[cnt].SMtype[nSM]);
             }
-            for (j = 0; j < ec_slave[cnt].FMMUunused; j++)
+            for (j = 0; j < ctx.slavelist[cnt].FMMUunused; j++)
             {
                printf(" FMMU%1d Ls:%8.8x Ll:%4d Lsb:%d Leb:%d Ps:%4.4x Psb:%d Ty:%2.2x Act:%2.2x\n", j,
-                      etohl(ec_slave[cnt].FMMU[j].LogStart), etohs(ec_slave[cnt].FMMU[j].LogLength), ec_slave[cnt].FMMU[j].LogStartbit,
-                      ec_slave[cnt].FMMU[j].LogEndbit, etohs(ec_slave[cnt].FMMU[j].PhysStart), ec_slave[cnt].FMMU[j].PhysStartBit,
-                      ec_slave[cnt].FMMU[j].FMMUtype, ec_slave[cnt].FMMU[j].FMMUactive);
+                      etohl(ctx.slavelist[cnt].FMMU[j].LogStart), etohs(ctx.slavelist[cnt].FMMU[j].LogLength), ctx.slavelist[cnt].FMMU[j].LogStartbit,
+                      ctx.slavelist[cnt].FMMU[j].LogEndbit, etohs(ctx.slavelist[cnt].FMMU[j].PhysStart), ctx.slavelist[cnt].FMMU[j].PhysStartBit,
+                      ctx.slavelist[cnt].FMMU[j].FMMUtype, ctx.slavelist[cnt].FMMU[j].FMMUactive);
             }
             printf(" FMMUfunc 0:%d 1:%d 2:%d 3:%d\n",
-                   ec_slave[cnt].FMMU0func, ec_slave[cnt].FMMU1func, ec_slave[cnt].FMMU2func, ec_slave[cnt].FMMU3func);
-            printf(" MBX length wr: %d rd: %d MBX protocols : %2.2x\n", ec_slave[cnt].mbx_l, ec_slave[cnt].mbx_rl, ec_slave[cnt].mbx_proto);
+                   ctx.slavelist[cnt].FMMU0func, ctx.slavelist[cnt].FMMU1func, ctx.slavelist[cnt].FMMU2func, ctx.slavelist[cnt].FMMU3func);
+            printf(" MBX length wr: %d rd: %d MBX protocols : %2.2x\n", ctx.slavelist[cnt].mbx_l, ctx.slavelist[cnt].mbx_rl, ctx.slavelist[cnt].mbx_proto);
             ssigen = ecx_siifind(&ctx, cnt, ECT_SII_GENERAL);
             /* SII general section */
             if (ssigen)
             {
-               ec_slave[cnt].CoEdetails = ecx_siigetbyte(&ctx, cnt, ssigen + 0x07);
-               ec_slave[cnt].FoEdetails = ecx_siigetbyte(&ctx, cnt, ssigen + 0x08);
-               ec_slave[cnt].EoEdetails = ecx_siigetbyte(&ctx, cnt, ssigen + 0x09);
-               ec_slave[cnt].SoEdetails = ecx_siigetbyte(&ctx, cnt, ssigen + 0x0a);
+               ctx.slavelist[cnt].CoEdetails = ecx_siigetbyte(&ctx, cnt, ssigen + 0x07);
+               ctx.slavelist[cnt].FoEdetails = ecx_siigetbyte(&ctx, cnt, ssigen + 0x08);
+               ctx.slavelist[cnt].EoEdetails = ecx_siigetbyte(&ctx, cnt, ssigen + 0x09);
+               ctx.slavelist[cnt].SoEdetails = ecx_siigetbyte(&ctx, cnt, ssigen + 0x0a);
                if ((ecx_siigetbyte(&ctx, cnt, ssigen + 0x0d) & 0x02) > 0)
                {
-                  ec_slave[cnt].blockLRW = 1;
-                  ec_slave[0].blockLRW++;
+                  ctx.slavelist[cnt].blockLRW = 1;
+                  ctx.slavelist[0].blockLRW++;
                }
-               ec_slave[cnt].Ebuscurrent = ecx_siigetbyte(&ctx, cnt, ssigen + 0x0e);
-               ec_slave[cnt].Ebuscurrent += ecx_siigetbyte(&ctx, cnt, ssigen + 0x0f) << 8;
-               ec_slave[0].Ebuscurrent += ec_slave[cnt].Ebuscurrent;
+               ctx.slavelist[cnt].Ebuscurrent = ecx_siigetbyte(&ctx, cnt, ssigen + 0x0e);
+               ctx.slavelist[cnt].Ebuscurrent += ecx_siigetbyte(&ctx, cnt, ssigen + 0x0f) << 8;
+               ctx.slavelist[0].Ebuscurrent += ctx.slavelist[cnt].Ebuscurrent;
             }
             printf(" CoE details: %2.2x FoE details: %2.2x EoE details: %2.2x SoE details: %2.2x\n",
-                   ec_slave[cnt].CoEdetails, ec_slave[cnt].FoEdetails, ec_slave[cnt].EoEdetails, ec_slave[cnt].SoEdetails);
+                   ctx.slavelist[cnt].CoEdetails, ctx.slavelist[cnt].FoEdetails, ctx.slavelist[cnt].EoEdetails, ctx.slavelist[cnt].SoEdetails);
             printf(" Ebus current: %d[mA]\n only LRD/LWR:%d\n",
-                   ec_slave[cnt].Ebuscurrent, ec_slave[cnt].blockLRW);
-            if ((ec_slave[cnt].mbx_proto & ECT_MBXPROT_COE) && printSDO)
+                   ctx.slavelist[cnt].Ebuscurrent, ctx.slavelist[cnt].blockLRW);
+            if ((ctx.slavelist[cnt].mbx_proto & ECT_MBXPROT_COE) && printSDO)
                si_sdo(cnt);
             if (printMAP)
             {
-               if (ec_slave[cnt].mbx_proto & ECT_MBXPROT_COE)
+               if (ctx.slavelist[cnt].mbx_proto & ECT_MBXPROT_COE)
                   si_map_sdo(cnt);
                else
                   si_map_sii(cnt);
index 6ac2113e5eedb064c91dc1f87b60ab83a0906472..9df2821333218ca5f48c3f1a26148338843e4061 100644 (file)
@@ -69,7 +69,7 @@ void ecx_SDOerror(ecx_contextt *context, uint16 Slave, uint16 Index, uint8 SubId
    Ec.Slave = Slave;
    Ec.Index = Index;
    Ec.SubIdx = SubIdx;
-   *(context->ecaterror) = TRUE;
+   context->ecaterror = TRUE;
    Ec.Etype = EC_ERR_TYPE_SDO_ERROR;
    Ec.AbortCode = AbortCode;
    ecx_pusherror(context, &Ec);
@@ -91,7 +91,7 @@ static void ecx_SDOinfoerror(ecx_contextt *context, uint16 Slave, uint16 Index,
    Ec.Slave = Slave;
    Ec.Index = Index;
    Ec.SubIdx = SubIdx;
-   *(context->ecaterror) = TRUE;
+   context->ecaterror = TRUE;
    Ec.Etype = EC_ERR_TYPE_SDOINFO_ERROR;
    Ec.AbortCode = AbortCode;
    ecx_pusherror(context, &Ec);
index efa67eacbbd2a712d2e77d16efb5515a10ad437f..d564309331b2f9cffce314423e3c6827b0219124 100644 (file)
@@ -41,13 +41,13 @@ OSAL_THREAD_HANDLE ecx_threadh[EC_MAX_MAPT];
 void ecx_init_context(ecx_contextt *context)
 {
    int lp;
-   *(context->slavecount) = 0;
+   context->slavecount = 0;
    /* clean ec_slave array */
-   memset(context->slavelist, 0x00, sizeof(ec_slavet) * context->maxslave);
-   memset(context->grouplist, 0x00, sizeof(ec_groupt) * context->maxgroup);
+   memset(context->slavelist, 0x00, sizeof(context->slavelist));
+   memset(context->grouplist, 0x00, sizeof(context->grouplist));
    /* clear slave eeprom cache, does not actually read any eeprom */
    ecx_siigetbyte(context, 0, EC_MAXEEPBUF);
-   for (lp = 0; lp < context->maxgroup; lp++)
+   for (lp = 0; lp < EC_MAXGROUP; lp++)
    {
       /* default start address per group entry */
       context->grouplist[lp].logstartaddr = lp << EC_LOGGROUPOFFSET;
@@ -64,23 +64,23 @@ int ecx_detect_slaves(ecx_contextt *context)
    /* make special pre-init register writes to enable MAC[1] local administered bit *
     * setting for old netX100 slaves */
    b = 0x00;
-   ecx_BWR(context->port, 0x0000, ECT_REG_DLALIAS, sizeof(b), &b, EC_TIMEOUTRET3); /* Ignore Alias register */
+   ecx_BWR(&context->port, 0x0000, ECT_REG_DLALIAS, sizeof(b), &b, EC_TIMEOUTRET3); /* Ignore Alias register */
    w = htoes(EC_STATE_INIT | EC_STATE_ACK);
-   ecx_BWR(context->port, 0x0000, ECT_REG_ALCTL, sizeof(w), &w, EC_TIMEOUTRET3); /* Reset all slaves to Init */
+   ecx_BWR(&context->port, 0x0000, ECT_REG_ALCTL, sizeof(w), &w, EC_TIMEOUTRET3); /* Reset all slaves to Init */
    /* netX100 should now be happy */
-   ecx_BWR(context->port, 0x0000, ECT_REG_ALCTL, sizeof(w), &w, EC_TIMEOUTRET3);      /* Reset all slaves to Init */
-   wkc = ecx_BRD(context->port, 0x0000, ECT_REG_TYPE, sizeof(w), &w, EC_TIMEOUTSAFE); /* detect number of slaves */
+   ecx_BWR(&context->port, 0x0000, ECT_REG_ALCTL, sizeof(w), &w, EC_TIMEOUTRET3);      /* Reset all slaves to Init */
+   wkc = ecx_BRD(&context->port, 0x0000, ECT_REG_TYPE, sizeof(w), &w, EC_TIMEOUTSAFE); /* detect number of slaves */
    if (wkc > 0)
    {
       /* this is strictly "less than" since the master is "slave 0" */
-      if (wkc < context->maxslave)
+      if (wkc < EC_MAXSLAVE)
       {
-         *(context->slavecount) = wkc;
+         context->slavecount = wkc;
       }
       else
       {
          EC_PRINT("Error: too many slaves on network: num_slaves=%d, max_slaves=%d\n",
-                  wkc, context->maxslave);
+                  wkc, EC_MAXSLAVE);
          return EC_SLAVECOUNTEXCEEDED;
       }
    }
@@ -94,27 +94,27 @@ static void ecx_set_slaves_to_default(ecx_contextt *context)
    uint8 zbuf[64];
    memset(&zbuf, 0x00, sizeof(zbuf));
    b = 0x00;
-   ecx_BWR(context->port, 0x0000, ECT_REG_DLPORT, sizeof(b), &b, EC_TIMEOUTRET3); /* deact loop manual */
+   ecx_BWR(&context->port, 0x0000, ECT_REG_DLPORT, sizeof(b), &b, EC_TIMEOUTRET3); /* deact loop manual */
    w = htoes(0x0004);
-   ecx_BWR(context->port, 0x0000, ECT_REG_IRQMASK, sizeof(w), &w, EC_TIMEOUTRET3); /* set IRQ mask */
-   ecx_BWR(context->port, 0x0000, ECT_REG_RXERR, 8, &zbuf, EC_TIMEOUTRET3);        /* reset CRC counters */
-   ecx_BWR(context->port, 0x0000, ECT_REG_FMMU0, 16 * 3, &zbuf, EC_TIMEOUTRET3);   /* reset FMMU's */
-   ecx_BWR(context->port, 0x0000, ECT_REG_SM0, 8 * 4, &zbuf, EC_TIMEOUTRET3);      /* reset SyncM */
+   ecx_BWR(&context->port, 0x0000, ECT_REG_IRQMASK, sizeof(w), &w, EC_TIMEOUTRET3); /* set IRQ mask */
+   ecx_BWR(&context->port, 0x0000, ECT_REG_RXERR, 8, &zbuf, EC_TIMEOUTRET3);        /* reset CRC counters */
+   ecx_BWR(&context->port, 0x0000, ECT_REG_FMMU0, 16 * 3, &zbuf, EC_TIMEOUTRET3);   /* reset FMMU's */
+   ecx_BWR(&context->port, 0x0000, ECT_REG_SM0, 8 * 4, &zbuf, EC_TIMEOUTRET3);      /* reset SyncM */
    b = 0x00;
-   ecx_BWR(context->port, 0x0000, ECT_REG_DCSYNCACT, sizeof(b), &b, EC_TIMEOUTRET3); /* reset activation register */
-   ecx_BWR(context->port, 0x0000, ECT_REG_DCSYSTIME, 4, &zbuf, EC_TIMEOUTRET3);      /* reset system time+ofs */
+   ecx_BWR(&context->port, 0x0000, ECT_REG_DCSYNCACT, sizeof(b), &b, EC_TIMEOUTRET3); /* reset activation register */
+   ecx_BWR(&context->port, 0x0000, ECT_REG_DCSYSTIME, 4, &zbuf, EC_TIMEOUTRET3);      /* reset system time+ofs */
    w = htoes(0x1000);
-   ecx_BWR(context->port, 0x0000, ECT_REG_DCSPEEDCNT, sizeof(w), &w, EC_TIMEOUTRET3); /* DC speedstart */
+   ecx_BWR(&context->port, 0x0000, ECT_REG_DCSPEEDCNT, sizeof(w), &w, EC_TIMEOUTRET3); /* DC speedstart */
    w = htoes(0x0c00);
-   ecx_BWR(context->port, 0x0000, ECT_REG_DCTIMEFILT, sizeof(w), &w, EC_TIMEOUTRET3); /* DC filt expr */
+   ecx_BWR(&context->port, 0x0000, ECT_REG_DCTIMEFILT, sizeof(w), &w, EC_TIMEOUTRET3); /* DC filt expr */
    b = 0x00;
-   ecx_BWR(context->port, 0x0000, ECT_REG_DLALIAS, sizeof(b), &b, EC_TIMEOUTRET3); /* Ignore Alias register */
+   ecx_BWR(&context->port, 0x0000, ECT_REG_DLALIAS, sizeof(b), &b, EC_TIMEOUTRET3); /* Ignore Alias register */
    w = htoes(EC_STATE_INIT | EC_STATE_ACK);
-   ecx_BWR(context->port, 0x0000, ECT_REG_ALCTL, sizeof(w), &w, EC_TIMEOUTRET3); /* Reset all slaves to Init */
+   ecx_BWR(&context->port, 0x0000, ECT_REG_ALCTL, sizeof(w), &w, EC_TIMEOUTRET3); /* Reset all slaves to Init */
    b = 2;
-   ecx_BWR(context->port, 0x0000, ECT_REG_EEPCFG, sizeof(b), &b, EC_TIMEOUTRET3); /* force Eeprom from PDI */
+   ecx_BWR(&context->port, 0x0000, ECT_REG_EEPCFG, sizeof(b), &b, EC_TIMEOUTRET3); /* force Eeprom from PDI */
    b = 0;
-   ecx_BWR(context->port, 0x0000, ECT_REG_EEPCFG, sizeof(b), &b, EC_TIMEOUTRET3); /* set Eeprom to master */
+   ecx_BWR(&context->port, 0x0000, ECT_REG_EEPCFG, sizeof(b), &b, EC_TIMEOUTRET3); /* set Eeprom to master */
 }
 
 /* If slave has SII and same slave ID done before, use previous data.
@@ -123,7 +123,7 @@ static void ecx_set_slaves_to_default(ecx_contextt *context)
 static int ecx_lookup_prev_sii(ecx_contextt *context, uint16 slave)
 {
    int i, nSM;
-   if ((slave > 1) && (*(context->slavecount) > 0))
+   if ((slave > 1) && (context->slavecount > 0))
    {
       i = 1;
       while (((context->slavelist[i].eep_man != context->slavelist[slave].eep_man) ||
@@ -186,14 +186,14 @@ int ecx_config_init(ecx_contextt *context)
    if (wkc > 0)
    {
       ecx_set_slaves_to_default(context);
-      for (slave = 1; slave <= *(context->slavecount); slave++)
+      for (slave = 1; slave <= context->slavecount; slave++)
       {
          ADPh = (uint16)(1 - slave);
-         val16 = ecx_APRDw(context->port, ADPh, ECT_REG_PDICTL, EC_TIMEOUTRET3); /* read interface type of slave */
+         val16 = ecx_APRDw(&context->port, ADPh, ECT_REG_PDICTL, EC_TIMEOUTRET3); /* read interface type of slave */
          context->slavelist[slave].Itype = etohs(val16);
          /* a node offset is used to improve readability of network frames */
          /* this has no impact on the number of addressable slaves (auto wrap around) */
-         ecx_APWRw(context->port, ADPh, ECT_REG_STADR, htoes(slave + EC_NODEOFFSET), EC_TIMEOUTRET3); /* set node address of slave */
+         ecx_APWRw(&context->port, ADPh, ECT_REG_STADR, htoes(slave + EC_NODEOFFSET), EC_TIMEOUTRET3); /* set node address of slave */
          if (slave == 1)
          {
             b = 1; /* kill non ecat frames for first slave */
@@ -202,13 +202,13 @@ int ecx_config_init(ecx_contextt *context)
          {
             b = 0; /* pass all frames for following slaves */
          }
-         ecx_APWRw(context->port, ADPh, ECT_REG_DLCTL, htoes(b), EC_TIMEOUTRET3); /* set non ecat frame behaviour */
-         configadr = ecx_APRDw(context->port, ADPh, ECT_REG_STADR, EC_TIMEOUTRET3);
+         ecx_APWRw(&context->port, ADPh, ECT_REG_DLCTL, htoes(b), EC_TIMEOUTRET3); /* set non ecat frame behaviour */
+         configadr = ecx_APRDw(&context->port, ADPh, ECT_REG_STADR, EC_TIMEOUTRET3);
          configadr = etohs(configadr);
          context->slavelist[slave].configadr = configadr;
-         ecx_FPRD(context->port, configadr, ECT_REG_ALIAS, sizeof(aliasadr), &aliasadr, EC_TIMEOUTRET3);
+         ecx_FPRD(&context->port, configadr, ECT_REG_ALIAS, sizeof(aliasadr), &aliasadr, EC_TIMEOUTRET3);
          context->slavelist[slave].aliasadr = etohs(aliasadr);
-         ecx_FPRD(context->port, configadr, ECT_REG_EEPSTAT, sizeof(estat), &estat, EC_TIMEOUTRET3);
+         ecx_FPRD(&context->port, configadr, ECT_REG_EEPSTAT, sizeof(estat), &estat, EC_TIMEOUTRET3);
          estat = etohs(estat);
          if (estat & EC_ESTAT_R64) /* check if slave can read 8 byte chunks */
          {
@@ -216,31 +216,31 @@ int ecx_config_init(ecx_contextt *context)
          }
          ecx_readeeprom1(context, slave, ECT_SII_MANUF); /* Manuf */
       }
-      for (slave = 1; slave <= *(context->slavecount); slave++)
+      for (slave = 1; slave <= context->slavecount; slave++)
       {
          eedat = ecx_readeeprom2(context, slave, EC_TIMEOUTEEP); /* Manuf */
          context->slavelist[slave].eep_man = etohl(eedat);
          ecx_readeeprom1(context, slave, ECT_SII_ID); /* ID */
       }
-      for (slave = 1; slave <= *(context->slavecount); slave++)
+      for (slave = 1; slave <= context->slavecount; slave++)
       {
          eedat = ecx_readeeprom2(context, slave, EC_TIMEOUTEEP); /* ID */
          context->slavelist[slave].eep_id = etohl(eedat);
          ecx_readeeprom1(context, slave, ECT_SII_REV); /* revision */
       }
-      for (slave = 1; slave <= *(context->slavecount); slave++)
+      for (slave = 1; slave <= context->slavecount; slave++)
       {
          eedat = ecx_readeeprom2(context, slave, EC_TIMEOUTEEP); /* revision */
          context->slavelist[slave].eep_rev = etohl(eedat);
          ecx_readeeprom1(context, slave, ECT_SII_SER); /* serial number */
       }
-      for (slave = 1; slave <= *(context->slavecount); slave++)
+      for (slave = 1; slave <= context->slavecount; slave++)
       {
          eedat = ecx_readeeprom2(context, slave, EC_TIMEOUTEEP); /* serial number */
          context->slavelist[slave].eep_ser = etohl(eedat);
          ecx_readeeprom1(context, slave, ECT_SII_RXMBXADR); /* write mailbox address + mailboxsize */
       }
-      for (slave = 1; slave <= *(context->slavecount); slave++)
+      for (slave = 1; slave <= context->slavecount; slave++)
       {
          eedat = ecx_readeeprom2(context, slave, EC_TIMEOUTEEP); /* write mailbox address and mailboxsize */
          context->slavelist[slave].mbx_wo = (uint16)LO_WORD(etohl(eedat));
@@ -250,7 +250,7 @@ int ecx_config_init(ecx_contextt *context)
             ecx_readeeprom1(context, slave, ECT_SII_TXMBXADR); /* read mailbox offset */
          }
       }
-      for (slave = 1; slave <= *(context->slavecount); slave++)
+      for (slave = 1; slave <= context->slavecount; slave++)
       {
          if (context->slavelist[slave].mbx_l > 0)
          {
@@ -264,7 +264,7 @@ int ecx_config_init(ecx_contextt *context)
             ecx_readeeprom1(context, slave, ECT_SII_MBXPROTO);
          }
          configadr = context->slavelist[slave].configadr;
-         val16 = ecx_FPRDw(context->port, configadr, ECT_REG_ESCSUP, EC_TIMEOUTRET3);
+         val16 = ecx_FPRDw(&context->port, configadr, ECT_REG_ESCSUP, EC_TIMEOUTRET3);
          if ((etohs(val16) & 0x04) > 0) /* Support DC? */
          {
             context->slavelist[slave].hasdc = TRUE;
@@ -273,7 +273,7 @@ int ecx_config_init(ecx_contextt *context)
          {
             context->slavelist[slave].hasdc = FALSE;
          }
-         topology = ecx_FPRDw(context->port, configadr, ECT_REG_DLSTAT, EC_TIMEOUTRET3); /* extract topology from DL status */
+         topology = ecx_FPRDw(&context->port, configadr, ECT_REG_DLSTAT, EC_TIMEOUTRET3); /* extract topology from DL status */
          topology = etohs(topology);
          h = 0;
          b = 0;
@@ -298,7 +298,7 @@ int ecx_config_init(ecx_contextt *context)
             b |= 0x08;
          }
          /* ptype = Physical type*/
-         val16 = ecx_FPRDw(context->port, configadr, ECT_REG_PORTDES, EC_TIMEOUTRET3);
+         val16 = ecx_FPRDw(&context->port, configadr, ECT_REG_PORTDES, EC_TIMEOUTRET3);
          context->slavelist[slave].ptype = LO_BYTE(etohs(val16));
          context->slavelist[slave].topology = h;
          context->slavelist[slave].activeports = b;
@@ -388,41 +388,41 @@ int ecx_config_init(ecx_contextt *context)
                        (unsigned int)context->slavelist[slave].eep_id);
             }
             /* SII SM section */
-            nSM = ecx_siiSM(context, slave, context->eepSM);
+            nSM = ecx_siiSM(context, slave, &context->eepSM);
             if (nSM > 0)
             {
-               context->slavelist[slave].SM[0].StartAddr = htoes(context->eepSM->PhStart);
-               context->slavelist[slave].SM[0].SMlength = htoes(context->eepSM->Plength);
+               context->slavelist[slave].SM[0].StartAddr = htoes(context->eepSM.PhStart);
+               context->slavelist[slave].SM[0].SMlength = htoes(context->eepSM.Plength);
                context->slavelist[slave].SM[0].SMflags =
-                   htoel((context->eepSM->Creg) + (context->eepSM->Activate << 16));
+                   htoel((context->eepSM.Creg) + (context->eepSM.Activate << 16));
                SMc = 1;
-               while ((SMc < EC_MAXSM) && ecx_siiSMnext(context, slave, context->eepSM, SMc))
+               while ((SMc < EC_MAXSM) && ecx_siiSMnext(context, slave, &context->eepSM, SMc))
                {
-                  context->slavelist[slave].SM[SMc].StartAddr = htoes(context->eepSM->PhStart);
-                  context->slavelist[slave].SM[SMc].SMlength = htoes(context->eepSM->Plength);
+                  context->slavelist[slave].SM[SMc].StartAddr = htoes(context->eepSM.PhStart);
+                  context->slavelist[slave].SM[SMc].SMlength = htoes(context->eepSM.Plength);
                   context->slavelist[slave].SM[SMc].SMflags =
-                      htoel((context->eepSM->Creg) + (context->eepSM->Activate << 16));
+                      htoel((context->eepSM.Creg) + (context->eepSM.Activate << 16));
                   SMc++;
                }
             }
             /* SII FMMU section */
-            if (ecx_siiFMMU(context, slave, context->eepFMMU))
+            if (ecx_siiFMMU(context, slave, &context->eepFMMU))
             {
-               if (context->eepFMMU->FMMU0 != 0xff)
+               if (context->eepFMMU.FMMU0 != 0xff)
                {
-                  context->slavelist[slave].FMMU0func = context->eepFMMU->FMMU0;
+                  context->slavelist[slave].FMMU0func = context->eepFMMU.FMMU0;
                }
-               if (context->eepFMMU->FMMU1 != 0xff)
+               if (context->eepFMMU.FMMU1 != 0xff)
                {
-                  context->slavelist[slave].FMMU1func = context->eepFMMU->FMMU1;
+                  context->slavelist[slave].FMMU1func = context->eepFMMU.FMMU1;
                }
-               if (context->eepFMMU->FMMU2 != 0xff)
+               if (context->eepFMMU.FMMU2 != 0xff)
                {
-                  context->slavelist[slave].FMMU2func = context->eepFMMU->FMMU2;
+                  context->slavelist[slave].FMMU2func = context->eepFMMU.FMMU2;
                }
-               if (context->eepFMMU->FMMU3 != 0xff)
+               if (context->eepFMMU.FMMU3 != 0xff)
                {
-                  context->slavelist[slave].FMMU3func = context->eepFMMU->FMMU3;
+                  context->slavelist[slave].FMMU3func = context->eepFMMU.FMMU3;
                }
             }
          }
@@ -447,7 +447,7 @@ int ecx_config_init(ecx_contextt *context)
             }
             /* program SM0 mailbox in and SM1 mailbox out for slave */
             /* writing both SM in one datagram will solve timing issue in old NETX */
-            ecx_FPWR(context->port, configadr, ECT_REG_SM0, sizeof(ec_smt) * 2,
+            ecx_FPWR(&context->port, configadr, ECT_REG_SM0, sizeof(ec_smt) * 2,
                      &(context->slavelist[slave].SM[0]), EC_TIMEOUTRET3);
          }
          /* some slaves need eeprom available to PDI in init->preop transition */
@@ -456,7 +456,7 @@ int ecx_config_init(ecx_contextt *context)
          if (context->manualstatechange == 0)
          {
             /* request pre_op for slave */
-            ecx_FPWRw(context->port,
+            ecx_FPWRw(&context->port,
                       configadr,
                       ECT_REG_ALCTL,
                       htoes(EC_STATE_PRE_OP | EC_STATE_ACK),
@@ -473,7 +473,7 @@ int ecx_config_init(ecx_contextt *context)
 static int ecx_lookup_mapping(ecx_contextt *context, uint16 slave, uint32 *Osize, uint32 *Isize)
 {
    int i, nSM;
-   if ((slave > 1) && (*(context->slavecount) > 0))
+   if ((slave > 1) && (context->slavecount > 0))
    {
       i = 1;
       while (((context->slavelist[i].eep_man != context->slavelist[slave].eep_man) ||
@@ -609,7 +609,7 @@ static int ecx_map_sm(ecx_contextt *context, uint16 slave)
    EC_PRINT("  SM programming\n");
    if (!context->slavelist[slave].mbx_l && context->slavelist[slave].SM[0].StartAddr)
    {
-      ecx_FPWR(context->port, configadr, ECT_REG_SM0,
+      ecx_FPWR(&context->port, configadr, ECT_REG_SM0,
                sizeof(ec_smt), &(context->slavelist[slave].SM[0]), EC_TIMEOUTRET3);
       EC_PRINT("    SM0 Type:%d StartAddr:%4.4x Flags:%8.8x\n",
                context->slavelist[slave].SMtype[0],
@@ -618,7 +618,7 @@ static int ecx_map_sm(ecx_contextt *context, uint16 slave)
    }
    if (!context->slavelist[slave].mbx_l && context->slavelist[slave].SM[1].StartAddr)
    {
-      ecx_FPWR(context->port, configadr, ECT_REG_SM1,
+      ecx_FPWR(&context->port, configadr, ECT_REG_SM1,
                sizeof(ec_smt), &context->slavelist[slave].SM[1], EC_TIMEOUTRET3);
       EC_PRINT("    SM1 Type:%d StartAddr:%4.4x Flags:%8.8x\n",
                context->slavelist[slave].SMtype[1],
@@ -642,7 +642,7 @@ static int ecx_map_sm(ecx_contextt *context, uint16 slave)
             context->slavelist[slave].SM[nSM].SMflags =
                 htoel(etohl(context->slavelist[slave].SM[nSM].SMflags) | ~EC_SMENABLEMASK);
          }
-         ecx_FPWR(context->port, configadr, (uint16)(ECT_REG_SM0 + (nSM * sizeof(ec_smt))),
+         ecx_FPWR(&context->port, configadr, (uint16)(ECT_REG_SM0 + (nSM * sizeof(ec_smt))),
                   sizeof(ec_smt), &context->slavelist[slave].SM[nSM], EC_TIMEOUTRET3);
          EC_PRINT("    SM%d Type:%d StartAddr:%4.4x Flags:%8.8x\n", nSM,
                   context->slavelist[slave].SMtype[nSM],
@@ -711,7 +711,7 @@ static void ecx_config_find_mappings(ecx_contextt *context, uint8 group)
       ecx_mapt[thrn].running = 0;
    }
    /* find CoE and SoE mapping of slaves in multiple threads */
-   for (slave = 1; slave <= *(context->slavecount); slave++)
+   for (slave = 1; slave <= context->slavecount; slave++)
    {
       if (!group || (group == context->slavelist[slave].group))
       {
@@ -743,7 +743,7 @@ static void ecx_config_find_mappings(ecx_contextt *context, uint8 group)
       }
    } while (thrc);
    /* find SII mapping of slave and program SM */
-   for (slave = 1; slave <= *(context->slavecount); slave++)
+   for (slave = 1; slave <= context->slavecount; slave++)
    {
       if (!group || (group == context->slavelist[slave].group))
       {
@@ -860,7 +860,7 @@ static void ecx_config_create_input_mappings(ecx_contextt *context, void *pIOmap
          context->slavelist[slave].FMMU[FMMUc].FMMUtype = 1;
          context->slavelist[slave].FMMU[FMMUc].FMMUactive = 1;
          /* program FMMU for input */
-         ecx_FPWR(context->port, configadr, ECT_REG_FMMU0 + (sizeof(ec_fmmut) * FMMUc),
+         ecx_FPWR(&context->port, configadr, ECT_REG_FMMU0 + (sizeof(ec_fmmut) * FMMUc),
                   sizeof(ec_fmmut), &(context->slavelist[slave].FMMU[FMMUc]), EC_TIMEOUTRET3);
       }
       if (!context->slavelist[slave].inputs)
@@ -990,7 +990,7 @@ static void ecx_config_create_output_mappings(ecx_contextt *context, void *pIOma
          context->slavelist[slave].FMMU[FMMUc].FMMUtype = 2;
          context->slavelist[slave].FMMU[FMMUc].FMMUactive = 1;
          /* program FMMU for output */
-         ecx_FPWR(context->port, configadr, ECT_REG_FMMU0 + (sizeof(ec_fmmut) * FMMUc),
+         ecx_FPWR(&context->port, configadr, ECT_REG_FMMU0 + (sizeof(ec_fmmut) * FMMUc),
                   sizeof(ec_fmmut), &(context->slavelist[slave].FMMU[FMMUc]), EC_TIMEOUTRET3);
       }
       if (!context->slavelist[slave].outputs)
@@ -1044,7 +1044,7 @@ static void ecx_config_create_mbxstatus_mappings(ecx_contextt *context, void *pI
       context->slavelist[slave].FMMU[FMMUc].FMMUtype = 1;
       context->slavelist[slave].FMMU[FMMUc].FMMUactive = 1;
       /* program FMMU for input */
-      ecx_FPWR(context->port, configadr, ECT_REG_FMMU0 + (sizeof(ec_fmmut) * FMMUc),
+      ecx_FPWR(&context->port, configadr, ECT_REG_FMMU0 + (sizeof(ec_fmmut) * FMMUc),
                sizeof(ec_fmmut), &(context->slavelist[slave].FMMU[FMMUc]), EC_TIMEOUTRET3);
 
       position = etohl(context->slavelist[slave].FMMU[FMMUc].LogStart);
@@ -1070,7 +1070,7 @@ static int ecx_main_config_map_group(ecx_contextt *context, void *pIOmap, uint8
    uint32 segmentsize = 0;
    uint32 segmentmaxsize = (EC_MAXLRWDATA - EC_FIRSTDCDATAGRAM); /* first segment must account for DC overhead */
 
-   if ((*(context->slavecount) > 0) && (group < context->maxgroup))
+   if ((context->slavecount > 0) && (group < EC_MAXGROUP))
    {
       EC_PRINT("ec_config_map_group IOmap:%p group:%d\n", pIOmap, group);
       LogAddr = context->grouplist[group].logstartaddr;
@@ -1084,7 +1084,7 @@ static int ecx_main_config_map_group(ecx_contextt *context, void *pIOmap, uint8
       ecx_config_find_mappings(context, group);
 
       /* do output mapping of slave and program FMMUs */
-      for (slave = 1; slave <= *(context->slavecount); slave++)
+      for (slave = 1; slave <= context->slavecount; slave++)
       {
          configadr = context->slavelist[slave].configadr;
 
@@ -1154,7 +1154,7 @@ static int ecx_main_config_map_group(ecx_contextt *context, void *pIOmap, uint8
       }
 
       /* do input mapping of slave and program FMMUs */
-      for (slave = 1; slave <= *(context->slavecount); slave++)
+      for (slave = 1; slave <= context->slavecount; slave++)
       {
          configadr = context->slavelist[slave].configadr;
          if (!group || (group == context->slavelist[slave].group))
@@ -1218,7 +1218,7 @@ static int ecx_main_config_map_group(ecx_contextt *context, void *pIOmap, uint8
                                          context->grouplist[group].Obytes;
 
       /* do mbxstatus mapping of slave and program FMMUs */
-      for (slave = 1; slave <= *(context->slavecount); slave++)
+      for (slave = 1; slave <= context->slavecount; slave++)
       {
          configadr = context->slavelist[slave].configadr;
          if (!group || (group == context->slavelist[slave].group))
@@ -1256,7 +1256,7 @@ static int ecx_main_config_map_group(ecx_contextt *context, void *pIOmap, uint8
       }
 
       /* Do post mapping actions */
-      for (slave = 1; slave <= *(context->slavecount); slave++)
+      for (slave = 1; slave <= context->slavecount; slave++)
       {
          configadr = context->slavelist[slave].configadr;
          if (!group || (group == context->slavelist[slave].group))
@@ -1267,7 +1267,7 @@ static int ecx_main_config_map_group(ecx_contextt *context, void *pIOmap, uint8
             if (context->manualstatechange == 0)
             {
                /* request safe_op for slave */
-               ecx_FPWRw(context->port,
+               ecx_FPWRw(&context->port,
                          configadr,
                          ECT_REG_ALCTL,
                          htoes(EC_STATE_SAFE_OP),
@@ -1316,7 +1316,7 @@ static int ecx_config_overlap_map_group(ecx_contextt *context, void *pIOmap, uin
    uint32 segmentsize = 0;
    uint32 segmentmaxsize = (EC_MAXLRWDATA - EC_FIRSTDCDATAGRAM);
 
-   if ((*(context->slavecount) > 0) && (group < context->maxgroup))
+   if ((context->slavecount > 0) && (group < EC_MAXGROUP))
    {
       EC_PRINT("ec_config_map_group IOmap:%p group:%d\n", pIOmap, group);
       mLogAddr = context->grouplist[group].logstartaddr;
@@ -1331,7 +1331,7 @@ static int ecx_config_overlap_map_group(ecx_contextt *context, void *pIOmap, uin
       ecx_config_find_mappings(context, group);
 
       /* do IO mapping of slave and program FMMUs */
-      for (slave = 1; slave <= *(context->slavecount); slave++)
+      for (slave = 1; slave <= context->slavecount; slave++)
       {
          configadr = context->slavelist[slave].configadr;
          siLogAddr = soLogAddr = mLogAddr;
@@ -1408,7 +1408,7 @@ static int ecx_config_overlap_map_group(ecx_contextt *context, void *pIOmap, uin
       context->grouplist[group].mbxstatus = (uint8 *)pIOmap + context->grouplist[group].Obytes + context->grouplist[group].Ibytes;
 
       /* Move calculated inputs with OBytes offset */
-      for (slave = 1; slave <= *(context->slavecount); slave++)
+      for (slave = 1; slave <= context->slavecount; slave++)
       {
          if (!group || (group == context->slavelist[slave].group))
          {
@@ -1420,7 +1420,7 @@ static int ecx_config_overlap_map_group(ecx_contextt *context, void *pIOmap, uin
       }
 
       /* Do mbxstatus mapping of slave and program FMMUs */
-      for (slave = 1; slave <= *(context->slavecount); slave++)
+      for (slave = 1; slave <= context->slavecount; slave++)
       {
          configadr = context->slavelist[slave].configadr;
          if (!group || (group == context->slavelist[slave].group))
@@ -1464,7 +1464,7 @@ static int ecx_config_overlap_map_group(ecx_contextt *context, void *pIOmap, uin
       }
 
       /* Do post mapping actions */
-      for (slave = 1; slave <= *(context->slavecount); slave++)
+      for (slave = 1; slave <= context->slavecount; slave++)
       {
          configadr = context->slavelist[slave].configadr;
          if (!group || (group == context->slavelist[slave].group))
@@ -1475,7 +1475,7 @@ static int ecx_config_overlap_map_group(ecx_contextt *context, void *pIOmap, uin
             if (context->manualstatechange == 0)
             {
                /* request safe_op for slave */
-               ecx_FPWRw(context->port,
+               ecx_FPWRw(&context->port,
                          configadr,
                          ECT_REG_ALCTL,
                          htoes(EC_STATE_SAFE_OP),
@@ -1546,7 +1546,7 @@ int ecx_recover_slave(ecx_contextt *context, uint16 slave, int timeout)
    ADPh = (uint16)(1 - slave);
    /* check if we found another slave than the requested */
    readadr = 0xfffe;
-   wkc = ecx_APRD(context->port, ADPh, ECT_REG_STADR, sizeof(readadr), &readadr, timeout);
+   wkc = ecx_APRD(&context->port, ADPh, ECT_REG_STADR, sizeof(readadr), &readadr, timeout);
    /* correct slave found, finished */
    if (readadr == configadr)
    {
@@ -1556,11 +1556,11 @@ int ecx_recover_slave(ecx_contextt *context, uint16 slave, int timeout)
    if ((wkc > 0) && (readadr == 0))
    {
       /* clear possible slaves at EC_TEMPNODE */
-      ecx_FPWRw(context->port, EC_TEMPNODE, ECT_REG_STADR, htoes(0), 0);
+      ecx_FPWRw(&context->port, EC_TEMPNODE, ECT_REG_STADR, htoes(0), 0);
       /* set temporary node address of slave */
-      if (ecx_APWRw(context->port, ADPh, ECT_REG_STADR, htoes(EC_TEMPNODE), timeout) <= 0)
+      if (ecx_APWRw(&context->port, ADPh, ECT_REG_STADR, htoes(EC_TEMPNODE), timeout) <= 0)
       {
-         ecx_FPWRw(context->port, EC_TEMPNODE, ECT_REG_STADR, htoes(0), 0);
+         ecx_FPWRw(&context->port, EC_TEMPNODE, ECT_REG_STADR, htoes(0), 0);
          return 0; /* slave fails to respond */
       }
 
@@ -1568,7 +1568,7 @@ int ecx_recover_slave(ecx_contextt *context, uint16 slave, int timeout)
       ecx_eeprom2master(context, slave);                 /* set Eeprom control to master */
 
       /* check if slave is the same as configured before */
-      if ((ecx_FPRDw(context->port, EC_TEMPNODE, ECT_REG_ALIAS, timeout) ==
+      if ((ecx_FPRDw(&context->port, EC_TEMPNODE, ECT_REG_ALIAS, timeout) ==
            htoes(context->slavelist[slave].aliasadr)) &&
           (ecx_readeeprom(context, slave, ECT_SII_ID, EC_TIMEOUTEEP) ==
            htoel(context->slavelist[slave].eep_id)) &&
@@ -1577,13 +1577,13 @@ int ecx_recover_slave(ecx_contextt *context, uint16 slave, int timeout)
           (ecx_readeeprom(context, slave, ECT_SII_REV, EC_TIMEOUTEEP) ==
            htoel(context->slavelist[slave].eep_rev)))
       {
-         rval = ecx_FPWRw(context->port, EC_TEMPNODE, ECT_REG_STADR, htoes(configadr), timeout);
+         rval = ecx_FPWRw(&context->port, EC_TEMPNODE, ECT_REG_STADR, htoes(configadr), timeout);
          context->slavelist[slave].configadr = configadr;
       }
       else
       {
          /* slave is not the expected one, remove config address*/
-         ecx_FPWRw(context->port, EC_TEMPNODE, ECT_REG_STADR, htoes(0), timeout);
+         ecx_FPWRw(&context->port, EC_TEMPNODE, ECT_REG_STADR, htoes(0), timeout);
          context->slavelist[slave].configadr = configadr;
       }
    }
@@ -1604,7 +1604,7 @@ int ecx_reconfig_slave(ecx_contextt *context, uint16 slave, int timeout)
    uint16 configadr;
 
    configadr = context->slavelist[slave].configadr;
-   if (ecx_FPWRw(context->port, configadr, ECT_REG_ALCTL, htoes(EC_STATE_INIT), timeout) <= 0)
+   if (ecx_FPWRw(&context->port, configadr, ECT_REG_ALCTL, htoes(EC_STATE_INIT), timeout) <= 0)
    {
       return 0;
    }
@@ -1619,13 +1619,13 @@ int ecx_reconfig_slave(ecx_contextt *context, uint16 slave, int timeout)
       {
          if (context->slavelist[slave].SM[nSM].StartAddr)
          {
-            ecx_FPWR(context->port, configadr, (uint16)(ECT_REG_SM0 + (nSM * sizeof(ec_smt))),
+            ecx_FPWR(&context->port, configadr, (uint16)(ECT_REG_SM0 + (nSM * sizeof(ec_smt))),
                      sizeof(ec_smt), &context->slavelist[slave].SM[nSM], timeout);
          }
       }
       /* small delay to allow slave to process SM changes */
       osal_usleep(5000);
-      ecx_FPWRw(context->port, configadr, ECT_REG_ALCTL, htoes(EC_STATE_PRE_OP), timeout);
+      ecx_FPWRw(&context->port, configadr, ECT_REG_ALCTL, htoes(EC_STATE_PRE_OP), timeout);
       state = ecx_statecheck(context, slave, EC_STATE_PRE_OP, EC_TIMEOUTSTATE); /* check state change pre-op */
       if (state == EC_STATE_PRE_OP)
       {
@@ -1638,12 +1638,12 @@ int ecx_reconfig_slave(ecx_contextt *context, uint16 slave, int timeout)
          {
             context->slavelist[slave].PO2SOconfig(context, slave);
          }
-         ecx_FPWRw(context->port, configadr, ECT_REG_ALCTL, htoes(EC_STATE_SAFE_OP), timeout); /* set safeop status */
-         state = ecx_statecheck(context, slave, EC_STATE_SAFE_OP, EC_TIMEOUTSTATE);            /* check state change safe-op */
+         ecx_FPWRw(&context->port, configadr, ECT_REG_ALCTL, htoes(EC_STATE_SAFE_OP), timeout); /* set safeop status */
+         state = ecx_statecheck(context, slave, EC_STATE_SAFE_OP, EC_TIMEOUTSTATE);             /* check state change safe-op */
          /* program configured FMMU */
          for (FMMUc = 0; FMMUc < context->slavelist[slave].FMMUunused; FMMUc++)
          {
-            ecx_FPWR(context->port, configadr, (uint16)(ECT_REG_FMMU0 + (sizeof(ec_fmmut) * FMMUc)),
+            ecx_FPWR(&context->port, configadr, (uint16)(ECT_REG_FMMU0 + (sizeof(ec_fmmut) * FMMUc)),
                      sizeof(ec_fmmut), &context->slavelist[slave].FMMU[FMMUc], timeout);
          }
       }
index 92f1f562a103c6bfb3ec4916c626c4c4e8405f78..5e98f21eccdbaa5517997eba274705bc4ca9fb38 100644 (file)
@@ -41,15 +41,15 @@ void ecx_dcsync0(ecx_contextt *context, uint16 slave, boolean act, uint32 CyclTi
    RA = 0;
 
    /* stop cyclic operation, ready for next trigger */
-   (void)ecx_FPWR(context->port, slaveh, ECT_REG_DCSYNCACT, sizeof(RA), &RA, EC_TIMEOUTRET);
+   (void)ecx_FPWR(&context->port, slaveh, ECT_REG_DCSYNCACT, sizeof(RA), &RA, EC_TIMEOUTRET);
    if (act)
    {
       RA = 1 + 2; /* act cyclic operation and sync0, sync1 deactivated */
    }
    h = 0;
-   (void)ecx_FPWR(context->port, slaveh, ECT_REG_DCCUC, sizeof(h), &h, EC_TIMEOUTRET); /* write access to ethercat */
+   (void)ecx_FPWR(&context->port, slaveh, ECT_REG_DCCUC, sizeof(h), &h, EC_TIMEOUTRET); /* write access to ethercat */
    t1 = 0;
-   (void)ecx_FPRD(context->port, slaveh, ECT_REG_DCSYSTIME, sizeof(t1), &t1, EC_TIMEOUTRET); /* read local time of slave */
+   (void)ecx_FPRD(&context->port, slaveh, ECT_REG_DCSYSTIME, sizeof(t1), &t1, EC_TIMEOUTRET); /* read local time of slave */
    t1 = etohll(t1);
 
    /* Calculate first trigger time, always a whole multiple of CyclTime rounded up
@@ -66,10 +66,10 @@ void ecx_dcsync0(ecx_contextt *context, uint16 slave, boolean act, uint32 CyclTi
       /* first trigger at T1 + CyclTime + SyncDelay + CyclShift in ns */
    }
    t = htoell(t);
-   (void)ecx_FPWR(context->port, slaveh, ECT_REG_DCSTART0, sizeof(t), &t, EC_TIMEOUTRET); /* SYNC0 start time */
+   (void)ecx_FPWR(&context->port, slaveh, ECT_REG_DCSTART0, sizeof(t), &t, EC_TIMEOUTRET); /* SYNC0 start time */
    tc = htoel(CyclTime);
-   (void)ecx_FPWR(context->port, slaveh, ECT_REG_DCCYCLE0, sizeof(tc), &tc, EC_TIMEOUTRET);  /* SYNC0 cycle time */
-   (void)ecx_FPWR(context->port, slaveh, ECT_REG_DCSYNCACT, sizeof(RA), &RA, EC_TIMEOUTRET); /* activate cyclic operation */
+   (void)ecx_FPWR(&context->port, slaveh, ECT_REG_DCCYCLE0, sizeof(tc), &tc, EC_TIMEOUTRET);  /* SYNC0 cycle time */
+   (void)ecx_FPWR(&context->port, slaveh, ECT_REG_DCSYNCACT, sizeof(RA), &RA, EC_TIMEOUTRET); /* activate cyclic operation */
 
    // update ec_slave state
    context->slavelist[slave].DCactive = (uint8)act;
@@ -104,15 +104,15 @@ void ecx_dcsync01(ecx_contextt *context, uint16 slave, boolean act, uint32 CyclT
    RA = 0;
 
    /* stop cyclic operation, ready for next trigger */
-   (void)ecx_FPWR(context->port, slaveh, ECT_REG_DCSYNCACT, sizeof(RA), &RA, EC_TIMEOUTRET);
+   (void)ecx_FPWR(&context->port, slaveh, ECT_REG_DCSYNCACT, sizeof(RA), &RA, EC_TIMEOUTRET);
    if (act)
    {
       RA = 1 + 2 + 4; /* act cyclic operation and sync0 + sync1 */
    }
    h = 0;
-   (void)ecx_FPWR(context->port, slaveh, ECT_REG_DCCUC, sizeof(h), &h, EC_TIMEOUTRET); /* write access to ethercat */
+   (void)ecx_FPWR(&context->port, slaveh, ECT_REG_DCCUC, sizeof(h), &h, EC_TIMEOUTRET); /* write access to ethercat */
    t1 = 0;
-   (void)ecx_FPRD(context->port, slaveh, ECT_REG_DCSYSTIME, sizeof(t1), &t1, EC_TIMEOUTRET); /* read local time of slave */
+   (void)ecx_FPRD(&context->port, slaveh, ECT_REG_DCSYSTIME, sizeof(t1), &t1, EC_TIMEOUTRET); /* read local time of slave */
    t1 = etohll(t1);
 
    /* Calculate first trigger time, always a whole multiple of TrueCyclTime rounded up
@@ -129,12 +129,12 @@ void ecx_dcsync01(ecx_contextt *context, uint16 slave, boolean act, uint32 CyclT
       /* first trigger at T1 + CyclTime + SyncDelay + CyclShift in ns */
    }
    t = htoell(t);
-   (void)ecx_FPWR(context->port, slaveh, ECT_REG_DCSTART0, sizeof(t), &t, EC_TIMEOUTRET); /* SYNC0 start time */
+   (void)ecx_FPWR(&context->port, slaveh, ECT_REG_DCSTART0, sizeof(t), &t, EC_TIMEOUTRET); /* SYNC0 start time */
    tc = htoel(CyclTime0);
-   (void)ecx_FPWR(context->port, slaveh, ECT_REG_DCCYCLE0, sizeof(tc), &tc, EC_TIMEOUTRET); /* SYNC0 cycle time */
+   (void)ecx_FPWR(&context->port, slaveh, ECT_REG_DCCYCLE0, sizeof(tc), &tc, EC_TIMEOUTRET); /* SYNC0 cycle time */
    tc = htoel(CyclTime1);
-   (void)ecx_FPWR(context->port, slaveh, ECT_REG_DCCYCLE1, sizeof(tc), &tc, EC_TIMEOUTRET);  /* SYNC1 cycle time */
-   (void)ecx_FPWR(context->port, slaveh, ECT_REG_DCSYNCACT, sizeof(RA), &RA, EC_TIMEOUTRET); /* activate cyclic operation */
+   (void)ecx_FPWR(&context->port, slaveh, ECT_REG_DCCYCLE1, sizeof(tc), &tc, EC_TIMEOUTRET);  /* SYNC1 cycle time */
+   (void)ecx_FPWR(&context->port, slaveh, ECT_REG_DCSYNCACT, sizeof(RA), &RA, EC_TIMEOUTRET); /* activate cyclic operation */
 
    // update ec_slave state
    context->slavelist[slave].DCactive = (uint8)act;
@@ -265,11 +265,11 @@ boolean ecx_configdc(ecx_contextt *context)
    context->grouplist[0].hasdc = FALSE;
    ht = 0;
 
-   ecx_BWR(context->port, 0, ECT_REG_DCTIME0, sizeof(ht), &ht, EC_TIMEOUTRET); /* latch DCrecvTimeA of all slaves */
+   ecx_BWR(&context->port, 0, ECT_REG_DCTIME0, sizeof(ht), &ht, EC_TIMEOUTRET); /* latch DCrecvTimeA of all slaves */
    mastertime = osal_current_time();
    mastertime.tv_sec -= 946684800UL; /* EtherCAT uses 2000-01-01 as epoch start instead of 1970-01-01 */
    mastertime64 = ((uint64)mastertime.tv_sec * 1000 * 1000 * 1000) + (uint64)mastertime.tv_nsec;
-   for (i = 1; i <= *(context->slavecount); i++)
+   for (i = 1; i <= context->slavecount; i++)
    {
       context->slavelist[i].consumedports = context->slavelist[i].activeports;
       if (context->slavelist[i].hasdc)
@@ -291,19 +291,19 @@ boolean ecx_configdc(ecx_contextt *context)
          parenthold = 0;
          prevDCslave = i;
          slaveh = context->slavelist[i].configadr;
-         (void)ecx_FPRD(context->port, slaveh, ECT_REG_DCTIME0, sizeof(ht), &ht, EC_TIMEOUTRET);
+         (void)ecx_FPRD(&context->port, slaveh, ECT_REG_DCTIME0, sizeof(ht), &ht, EC_TIMEOUTRET);
          context->slavelist[i].DCrtA = etohl(ht);
          /* 64bit latched DCrecvTimeA of each specific slave */
-         (void)ecx_FPRD(context->port, slaveh, ECT_REG_DCSOF, sizeof(hrt), &hrt, EC_TIMEOUTRET);
+         (void)ecx_FPRD(&context->port, slaveh, ECT_REG_DCSOF, sizeof(hrt), &hrt, EC_TIMEOUTRET);
          /* use it as offset in order to set local time around 0 + mastertime */
          hrt = htoell(-etohll(hrt) + mastertime64);
          /* save it in the offset register */
-         (void)ecx_FPWR(context->port, slaveh, ECT_REG_DCSYSOFFSET, sizeof(hrt), &hrt, EC_TIMEOUTRET);
-         (void)ecx_FPRD(context->port, slaveh, ECT_REG_DCTIME1, sizeof(ht), &ht, EC_TIMEOUTRET);
+         (void)ecx_FPWR(&context->port, slaveh, ECT_REG_DCSYSOFFSET, sizeof(hrt), &hrt, EC_TIMEOUTRET);
+         (void)ecx_FPRD(&context->port, slaveh, ECT_REG_DCTIME1, sizeof(ht), &ht, EC_TIMEOUTRET);
          context->slavelist[i].DCrtB = etohl(ht);
-         (void)ecx_FPRD(context->port, slaveh, ECT_REG_DCTIME2, sizeof(ht), &ht, EC_TIMEOUTRET);
+         (void)ecx_FPRD(&context->port, slaveh, ECT_REG_DCTIME2, sizeof(ht), &ht, EC_TIMEOUTRET);
          context->slavelist[i].DCrtC = etohl(ht);
-         (void)ecx_FPRD(context->port, slaveh, ECT_REG_DCTIME3, sizeof(ht), &ht, EC_TIMEOUTRET);
+         (void)ecx_FPRD(&context->port, slaveh, ECT_REG_DCTIME3, sizeof(ht), &ht, EC_TIMEOUTRET);
          context->slavelist[i].DCrtD = etohl(ht);
 
          /* make list of active ports and their time stamps */
@@ -402,7 +402,7 @@ boolean ecx_configdc(ecx_contextt *context)
                                            context->slavelist[parent].pdelay;
             ht = htoel(context->slavelist[i].pdelay);
             /* write propagation delay*/
-            (void)ecx_FPWR(context->port, slaveh, ECT_REG_DCSYSDELAY, sizeof(ht), &ht, EC_TIMEOUTRET);
+            (void)ecx_FPWR(&context->port, slaveh, ECT_REG_DCSYSDELAY, sizeof(ht), &ht, EC_TIMEOUTRET);
          }
       }
       else
index 1b5371405860e3a581b151f5045447633a111100..b1c2e612c8a5907802e2247181e0506f007a79ce 100644 (file)
@@ -11,9 +11,6 @@
  *
  * Initialisation, state set and read, mailbox primitives, EEPROM primitives,
  * SII reading and processdata exchange.
- *
- * Defines ec_slave[]. All slave information is put in this structure.
- * Needed for most user interaction with slaves.
  */
 
 #include "soem/soem.h"
@@ -86,22 +83,22 @@ void ec_free_adapters(ec_adaptert *adapter)
  */
 void ecx_pusherror(ecx_contextt *context, const ec_errort *Ec)
 {
-   context->elist->Error[context->elist->head] = *Ec;
-   context->elist->Error[context->elist->head].Signal = TRUE;
-   context->elist->head++;
-   if (context->elist->head > EC_MAXELIST)
+   context->elist.Error[context->elist.head] = *Ec;
+   context->elist.Error[context->elist.head].Signal = TRUE;
+   context->elist.head++;
+   if (context->elist.head > EC_MAXELIST)
    {
-      context->elist->head = 0;
+      context->elist.head = 0;
    }
-   if (context->elist->head == context->elist->tail)
+   if (context->elist.head == context->elist.tail)
    {
-      context->elist->tail++;
+      context->elist.tail++;
    }
-   if (context->elist->tail > EC_MAXELIST)
+   if (context->elist.tail > EC_MAXELIST)
    {
-      context->elist->tail = 0;
+      context->elist.tail = 0;
    }
-   *(context->ecaterror) = TRUE;
+   context->ecaterror = TRUE;
 }
 
 /** Pops an error from the list.
@@ -112,21 +109,21 @@ void ecx_pusherror(ecx_contextt *context, const ec_errort *Ec)
  */
 boolean ecx_poperror(ecx_contextt *context, ec_errort *Ec)
 {
-   boolean notEmpty = (context->elist->head != context->elist->tail);
+   boolean notEmpty = (context->elist.head != context->elist.tail);
 
-   *Ec = context->elist->Error[context->elist->tail];
-   context->elist->Error[context->elist->tail].Signal = FALSE;
+   *Ec = context->elist.Error[context->elist.tail];
+   context->elist.Error[context->elist.tail].Signal = FALSE;
    if (notEmpty)
    {
-      context->elist->tail++;
-      if (context->elist->tail > EC_MAXELIST)
+      context->elist.tail++;
+      if (context->elist.tail > EC_MAXELIST)
       {
-         context->elist->tail = 0;
+         context->elist.tail = 0;
       }
    }
    else
    {
-      *(context->ecaterror) = FALSE;
+      context->ecaterror = FALSE;
    }
    return notEmpty;
 }
@@ -138,7 +135,7 @@ boolean ecx_poperror(ecx_contextt *context, ec_errort *Ec)
  */
 boolean ecx_iserror(ecx_contextt *context)
 {
-   return (context->elist->head != context->elist->tail);
+   return (context->elist.head != context->elist.tail);
 }
 
 /** Report packet error
@@ -158,7 +155,7 @@ void ecx_packeterror(ecx_contextt *context, uint16 Slave, uint16 Index, uint8 Su
    Ec.Slave = Slave;
    Ec.Index = Index;
    Ec.SubIdx = SubIdx;
-   *(context->ecaterror) = TRUE;
+   context->ecaterror = TRUE;
    Ec.Etype = EC_ERR_TYPE_PACKET_ERROR;
    Ec.ErrorCode = ErrorCode;
    ecx_pusherror(context, &Ec);
@@ -221,7 +218,7 @@ static void ecx_mbxemergencyerror(ecx_contextt *context, uint16 Slave, uint16 Er
 int ecx_init(ecx_contextt *context, const char *ifname)
 {
    ecx_initmbxpool(context);
-   return ecx_setupnic(context->port, ifname, FALSE);
+   return ecx_setupnic(&context->port, ifname, FALSE);
 }
 
 /** Initialise lib in redundant NIC mode
@@ -237,15 +234,15 @@ int ecx_init_redundant(ecx_contextt *context, ecx_redportt *redport, const char
    ec_etherheadert *ehp;
 
    ecx_initmbxpool(context);
-   context->port->redport = redport;
-   ecx_setupnic(context->port, ifname, FALSE);
-   rval = ecx_setupnic(context->port, if2name, TRUE);
+   context->port.redport = redport;
+   ecx_setupnic(&context->port, ifname, FALSE);
+   rval = ecx_setupnic(&context->port, if2name, TRUE);
    /* prepare "dummy" BRD tx frame for redundant operation */
-   ehp = (ec_etherheadert *)&(context->port->txbuf2);
+   ehp = (ec_etherheadert *)&(context->port.txbuf2);
    ehp->sa1 = oshw_htons(secMAC[0]);
    zbuf = 0;
-   ecx_setupdatagram(context->port, &(context->port->txbuf2), EC_CMD_BRD, 0, 0x0000, 0x0000, 2, &zbuf);
-   context->port->txbuflength2 = ETH_HEADERSIZE + EC_HEADERSIZE + EC_WKCSIZE + 2;
+   ecx_setupdatagram(&context->port, &(context->port.txbuf2), EC_CMD_BRD, 0, 0x0000, 0x0000, 2, &zbuf);
+   context->port.txbuflength2 = ETH_HEADERSIZE + EC_HEADERSIZE + EC_WKCSIZE + 2;
 
    return rval;
 }
@@ -255,8 +252,8 @@ int ecx_init_redundant(ecx_contextt *context, ecx_redportt *redport, const char
  */
 void ecx_close(ecx_contextt *context)
 {
-   osal_mutex_destroy(context->mbxpool->mbxmutex);
-   ecx_closenic(context->port);
+   osal_mutex_destroy(context->mbxpool.mbxmutex);
+   ecx_closenic(&context->port);
 }
 
 /**
@@ -267,7 +264,7 @@ void ecx_close(ecx_contextt *context)
 ec_mbxbuft *ecx_getmbx(ecx_contextt *context)
 {
    ec_mbxbuft *mbx = NULL;
-   ec_mbxpoolt *mbxpool = context->mbxpool;
+   ec_mbxpoolt *mbxpool = &context->mbxpool;
    osal_mutex_lock(mbxpool->mbxmutex);
    if (mbxpool->listcount > 0)
    {
@@ -288,7 +285,7 @@ ec_mbxbuft *ecx_getmbx(ecx_contextt *context)
  */
 int ecx_dropmbx(ecx_contextt *context, ec_mbxbuft *mbx)
 {
-   ec_mbxpoolt *mbxpool = context->mbxpool;
+   ec_mbxpoolt *mbxpool = &context->mbxpool;
    int item = mbx - &(mbxpool->mbx[0]);
    EC_PRINT("dropmbx item:%d mbx:%p\n\r", item, mbx);
    if ((item >= 0) && (item < EC_MBXPOOLSIZE))
@@ -315,7 +312,7 @@ int ecx_dropmbx(ecx_contextt *context, ec_mbxbuft *mbx)
 int ecx_initmbxpool(ecx_contextt *context)
 {
    int retval = 0;
-   ec_mbxpoolt *mbxpool = context->mbxpool;
+   ec_mbxpoolt *mbxpool = &context->mbxpool;
    mbxpool->mbxmutex = (osal_mutext *)osal_mutex_create();
    for (int item = 0; item < EC_MBXPOOLSIZE; item++)
    {
@@ -875,7 +872,7 @@ int ecx_FPRD_multi(ecx_contextt *context, int n, uint16 *configlst, ec_alstatust
    uint16 sldatapos[MAX_FPRD_MULTI];
    int slcnt;
 
-   port = context->port;
+   port = &context->port;
    idx = ecx_getindex(port);
    slcnt = 0;
    ecx_setupdatagram(port, &(port->txbuf[idx]), EC_CMD_FPRD, idx,
@@ -903,7 +900,7 @@ int ecx_FPRD_multi(ecx_contextt *context, int n, uint16 *configlst, ec_alstatust
    return wkc;
 }
 
-/** Read all slave states in ec_slave.
+/** Read all slave states in slavelist.
  * @warning The BOOT state is actually higher than INIT and PRE_OP (see state representation)
  * @param[in] context = context struct
  * @return lowest state found
@@ -920,9 +917,9 @@ int ecx_readstate(ecx_contextt *context)
    /* Try to establish the state of all slaves sending only one broadcast datagram.
     * This way a number of datagrams equal to the number of slaves will be sent only if needed.*/
    rval = 0;
-   wkc = ecx_BRD(context->port, 0, ECT_REG_ALSTAT, sizeof(rval), &rval, EC_TIMEOUTRET);
+   wkc = ecx_BRD(&context->port, 0, ECT_REG_ALSTAT, sizeof(rval), &rval, EC_TIMEOUTRET);
 
-   if (wkc >= *(context->slavecount))
+   if (wkc >= context->slavecount)
    {
       allslavespresent = TRUE;
    }
@@ -961,7 +958,7 @@ int ecx_readstate(ecx_contextt *context)
        * (even if different from 0) should be ignored and
        * the slaves have reached the same state so the internal state
        * can be updated without sending any datagram. */
-      for (slave = 1; slave <= *(context->slavecount); slave++)
+      for (slave = 1; slave <= context->slavecount; slave++)
       {
          context->slavelist[slave].ALstatuscode = 0x0000;
          context->slavelist[slave].state = bitwisestate;
@@ -977,7 +974,7 @@ int ecx_readstate(ecx_contextt *context)
       fslave = 1;
       do
       {
-         lslave = (uint16) * (context->slavecount);
+         lslave = (uint16)context->slavecount;
          if ((lslave - fslave) >= MAX_FPRD_MULTI)
          {
             lslave = fslave + MAX_FPRD_MULTI - 1;
@@ -1004,7 +1001,7 @@ int ecx_readstate(ecx_contextt *context)
             context->slavelist[0].ALstatuscode |= context->slavelist[slave].ALstatuscode;
          }
          fslave = lslave + 1;
-      } while (lslave < *(context->slavecount));
+      } while (lslave < context->slavecount);
       context->slavelist[0].state = lowest;
    }
 
@@ -1025,14 +1022,14 @@ int ecx_writestate(ecx_contextt *context, uint16 slave)
    if (slave == 0)
    {
       slstate = htoes(context->slavelist[slave].state);
-      ret = ecx_BWR(context->port, 0, ECT_REG_ALCTL, sizeof(slstate),
+      ret = ecx_BWR(&context->port, 0, ECT_REG_ALCTL, sizeof(slstate),
                     &slstate, EC_TIMEOUTRET3);
    }
    else
    {
       configadr = context->slavelist[slave].configadr;
 
-      ret = ecx_FPWRw(context->port, configadr, ECT_REG_ALCTL,
+      ret = ecx_FPWRw(&context->port, configadr, ECT_REG_ALCTL,
                       htoes(context->slavelist[slave].state), EC_TIMEOUTRET3);
    }
    return ret;
@@ -1058,7 +1055,7 @@ uint16 ecx_statecheck(ecx_contextt *context, uint16 slave, uint16 reqstate, int
    ec_alstatust slstat;
    osal_timert timer;
 
-   if (slave > *(context->slavecount))
+   if (slave > context->slavecount)
    {
       return 0;
    }
@@ -1069,14 +1066,14 @@ uint16 ecx_statecheck(ecx_contextt *context, uint16 slave, uint16 reqstate, int
       if (slave < 1)
       {
          rval = 0;
-         ecx_BRD(context->port, 0, ECT_REG_ALSTAT, sizeof(rval), &rval, EC_TIMEOUTRET);
+         ecx_BRD(&context->port, 0, ECT_REG_ALSTAT, sizeof(rval), &rval, EC_TIMEOUTRET);
          rval = etohs(rval);
       }
       else
       {
          slstat.alstatus = 0;
          slstat.alstatuscode = 0;
-         ecx_FPRD(context->port, configadr, ECT_REG_ALSTAT, sizeof(slstat), &slstat, EC_TIMEOUTRET);
+         ecx_FPRD(&context->port, configadr, ECT_REG_ALSTAT, sizeof(slstat), &slstat, EC_TIMEOUTRET);
          rval = etohs(slstat.alstatus);
          context->slavelist[slave].ALstatuscode = etohs(slstat.alstatuscode);
       }
@@ -1150,7 +1147,7 @@ int ecx_readmbxstatus(ecx_contextt *context, uint16 slave, uint8 *SMstat)
    else
    {
       uint16 configadr = context->slavelist[slave].configadr;
-      wkc = ecx_FPRD(context->port, configadr, ECT_REG_SM1STAT, sizeof(uint8), SMstat, EC_TIMEOUTRET);
+      wkc = ecx_FPRD(&context->port, configadr, ECT_REG_SM1STAT, sizeof(uint8), SMstat, EC_TIMEOUTRET);
    }
    return wkc;
 }
@@ -1166,7 +1163,7 @@ int ecx_readmbxstatusex(ecx_contextt *context, uint16 slave, uint16 *SMstatex)
 {
    uint16 hu16;
    uint16 configadr = context->slavelist[slave].configadr;
-   int wkc = ecx_FPRD(context->port, configadr, ECT_REG_SM1STAT, sizeof(hu16), &hu16, EC_TIMEOUTRET);
+   int wkc = ecx_FPRD(&context->port, configadr, ECT_REG_SM1STAT, sizeof(hu16), &hu16, EC_TIMEOUTRET);
    *SMstatex = etohs(hu16);
    return wkc;
 }
@@ -1189,7 +1186,7 @@ int ecx_mbxempty(ecx_contextt *context, uint16 slave, int timeout)
    do
    {
       SMstat = 0;
-      wkc = ecx_FPRD(context->port, configadr, ECT_REG_SM0STAT, sizeof(SMstat), &SMstat, EC_TIMEOUTRET);
+      wkc = ecx_FPRD(&context->port, configadr, ECT_REG_SM0STAT, sizeof(SMstat), &SMstat, EC_TIMEOUTRET);
       SMstat = etohs(SMstat);
       if (((SMstat & 0x08) != 0) && (timeout > EC_LOCALDELAY))
       {
@@ -1267,7 +1264,7 @@ int ecx_mbxinhandler(ecx_contextt *context, uint8 group, int limit)
                   break;
                case 2:
                   SMstatex = htoes(slaveitem->mbxinstateex);
-                  if (ecx_FPWR(context->port, configadr, ECT_REG_SM1STAT, sizeof(SMstatex), &(slaveitem->mbxinstateex), EC_TIMEOUTRET) > 0)
+                  if (ecx_FPWR(&context->port, configadr, ECT_REG_SM1STAT, sizeof(SMstatex), &(slaveitem->mbxinstateex), EC_TIMEOUTRET) > 0)
                   {
                      slaveitem->mbxrmpstate++;
                   }
@@ -1275,7 +1272,7 @@ int ecx_mbxinhandler(ecx_contextt *context, uint8 group, int limit)
                case 3:
                   /* wait for repeat ack */
                   SMstatex = htoes(slaveitem->mbxinstateex);
-                  wkc2 = ecx_FPRD(context->port, configadr, ECT_REG_SM1CONTR, sizeof(SMcontr), &SMcontr, EC_TIMEOUTRET);
+                  wkc2 = ecx_FPRD(&context->port, configadr, ECT_REG_SM1CONTR, sizeof(SMcontr), &SMcontr, EC_TIMEOUTRET);
                   if ((wkc2 > 0) && ((SMcontr & 0x02) == (HI_BYTE(SMstatex) & 0x02)))
                   {
                      slaveitem->mbxrmpstate = 0;
@@ -1295,7 +1292,7 @@ int ecx_mbxinhandler(ecx_contextt *context, uint8 group, int limit)
             {
                /* keep track of work limit */
                if (++limitcnt >= limit) maxcnt = 0;
-               wkc = ecx_FPRD(context->port, configadr, mbxro, mbxl, mbx, EC_TIMEOUTRET); /* get mailbox */
+               wkc = ecx_FPRD(&context->port, configadr, mbxro, mbxl, mbx, EC_TIMEOUTRET); /* get mailbox */
                if (wkc > 0)
                {
                   mbxh = (ec_mbxheadert *)mbx;
@@ -1465,7 +1462,7 @@ int ecx_mbxouthandler(ecx_contextt *context, uint8 group, int limit)
          if (context->slavelist[slave].state >= EC_STATE_PRE_OP)
          {
             /* write slave in mailbox 1st try*/
-            wkc = ecx_FPWR(context->port, configadr, mbxwo, mbxl, mbx, EC_TIMEOUTRET);
+            wkc = ecx_FPWR(&context->port, configadr, mbxwo, mbxl, mbx, EC_TIMEOUTRET);
             if (wkc > 0)
             {
                mbxqueue->mbxstate[ticketloc] = EC_MBXQUEUESTATE_DONE; // mbx tx ok
@@ -1569,12 +1566,12 @@ int ecx_mbxsend(ecx_contextt *context, uint16 slave, ec_mbxbuft *mbx, int timeou
    {
       mbxwo = context->slavelist[slave].mbx_wo;
       /* write slave in mailbox 1st try*/
-      wkc = ecx_FPWR(context->port, configadr, mbxwo, mbxl, mbx, EC_TIMEOUTRET3);
+      wkc = ecx_FPWR(&context->port, configadr, mbxwo, mbxl, mbx, EC_TIMEOUTRET3);
       /* if failed wait for empty mailbox */
       if ((wkc <= 0) && ecx_mbxempty(context, slave, timeout))
       {
          /* retry */
-         wkc = ecx_FPWR(context->port, configadr, mbxwo, mbxl, mbx, EC_TIMEOUTRET3);
+         wkc = ecx_FPWR(&context->port, configadr, mbxwo, mbxl, mbx, EC_TIMEOUTRET3);
       }
       if (wkc < 0) wkc = 0;
    }
@@ -1670,8 +1667,8 @@ int ecx_mbxreceive(ecx_contextt *context, uint16 slave, ec_mbxbuft **mbx, int ti
          mbxh = (ec_mbxheadert *)mbxin;
          do
          {
-            wkc = ecx_FPRD(context->port, configadr, mbxro, mbxl, mbxin, EC_TIMEOUTRET); /* get mailbox */
-            if ((wkc > 0) && ((mbxh->mbxtype & 0x0f) == 0x00))                           /* Mailbox error response? */
+            wkc = ecx_FPRD(&context->port, configadr, mbxro, mbxl, mbxin, EC_TIMEOUTRET); /* get mailbox */
+            if ((wkc > 0) && ((mbxh->mbxtype & 0x0f) == 0x00))                            /* Mailbox error response? */
             {
                MBXEp = (ec_mbxerrort *)mbxin;
                ecx_mbxerror(context, slave, etohs(MBXEp->Detail));
@@ -1733,11 +1730,11 @@ int ecx_mbxreceive(ecx_contextt *context, uint16 slave, ec_mbxbuft **mbx, int ti
                   } while ((wkc2 <= 0) && (osal_timer_is_expired(&timer) == FALSE));
                   SMstatex ^= 0x0200; /* toggle repeat request */
                   SMstatex = htoes(SMstatex);
-                  wkc2 = ecx_FPWR(context->port, configadr, ECT_REG_SM1STAT, sizeof(SMstatex), &SMstatex, EC_TIMEOUTRET);
+                  wkc2 = ecx_FPWR(&context->port, configadr, ECT_REG_SM1STAT, sizeof(SMstatex), &SMstatex, EC_TIMEOUTRET);
                   SMstatex = etohs(SMstatex);
                   do /* wait for toggle ack */
                   {
-                     wkc2 = ecx_FPRD(context->port, configadr, ECT_REG_SM1CONTR, sizeof(SMcontr), &SMcontr, EC_TIMEOUTRET);
+                     wkc2 = ecx_FPRD(&context->port, configadr, ECT_REG_SM1CONTR, sizeof(SMcontr), &SMcontr, EC_TIMEOUTRET);
                   } while (((wkc2 <= 0) || ((SMcontr & 0x02) != (HI_BYTE(SMstatex) & 0x02))) && (osal_timer_is_expired(&timer) == FALSE));
                   do /* wait for read mailbox available */
                   {
@@ -1922,13 +1919,13 @@ int ecx_eeprom2master(ecx_contextt *context, uint16 slave)
       eepctl = 2;
       do
       {
-         wkc = ecx_FPWR(context->port, configadr, ECT_REG_EEPCFG, sizeof(eepctl), &eepctl, EC_TIMEOUTRET); /* force Eeprom from PDI */
+         wkc = ecx_FPWR(&context->port, configadr, ECT_REG_EEPCFG, sizeof(eepctl), &eepctl, EC_TIMEOUTRET); /* force Eeprom from PDI */
       } while ((wkc <= 0) && (cnt++ < EC_DEFAULTRETRIES));
       eepctl = 0;
       cnt = 0;
       do
       {
-         wkc = ecx_FPWR(context->port, configadr, ECT_REG_EEPCFG, sizeof(eepctl), &eepctl, EC_TIMEOUTRET); /* set Eeprom to master */
+         wkc = ecx_FPWR(&context->port, configadr, ECT_REG_EEPCFG, sizeof(eepctl), &eepctl, EC_TIMEOUTRET); /* set Eeprom to master */
       } while ((wkc <= 0) && (cnt++ < EC_DEFAULTRETRIES));
       context->slavelist[slave].eep_pdi = 0;
    }
@@ -1953,7 +1950,7 @@ int ecx_eeprom2pdi(ecx_contextt *context, uint16 slave)
       eepctl = 1;
       do
       {
-         wkc = ecx_FPWR(context->port, configadr, ECT_REG_EEPCFG, sizeof(eepctl), &eepctl, EC_TIMEOUTRET); /* set Eeprom to PDI */
+         wkc = ecx_FPWR(&context->port, configadr, ECT_REG_EEPCFG, sizeof(eepctl), &eepctl, EC_TIMEOUTRET); /* set Eeprom to PDI */
       } while ((wkc <= 0) && (cnt++ < EC_DEFAULTRETRIES));
       context->slavelist[slave].eep_pdi = 1;
    }
@@ -1975,7 +1972,7 @@ uint16 ecx_eeprom_waitnotbusyAP(ecx_contextt *context, uint16 aiadr, uint16 *est
          osal_usleep(EC_LOCALDELAY);
       }
       *estat = 0;
-      wkc = ecx_APRD(context->port, aiadr, ECT_REG_EEPSTAT, sizeof(*estat), estat, EC_TIMEOUTRET);
+      wkc = ecx_APRD(&context->port, aiadr, ECT_REG_EEPSTAT, sizeof(*estat), estat, EC_TIMEOUTRET);
       *estat = etohs(*estat);
    } while (((wkc <= 0) || ((*estat & EC_ESTAT_BUSY) > 0)) && (osal_timer_is_expired(&timer) == FALSE)); /* wait for eeprom ready */
    if ((*estat & EC_ESTAT_BUSY) == 0)
@@ -2008,7 +2005,7 @@ uint64 ecx_readeepromAP(ecx_contextt *context, uint16 aiadr, uint16 eeproma, int
       if (estat & EC_ESTAT_EMASK) /* error bits are set */
       {
          estat = htoes(EC_ECMD_NOP); /* clear error bits */
-         wkc = ecx_APWR(context->port, aiadr, ECT_REG_EEPCTL, sizeof(estat), &estat, EC_TIMEOUTRET3);
+         wkc = ecx_APWR(&context->port, aiadr, ECT_REG_EEPCTL, sizeof(estat), &estat, EC_TIMEOUTRET3);
       }
 
       do
@@ -2019,7 +2016,7 @@ uint64 ecx_readeepromAP(ecx_contextt *context, uint16 aiadr, uint16 eeproma, int
          cnt = 0;
          do
          {
-            wkc = ecx_APWR(context->port, aiadr, ECT_REG_EEPCTL, sizeof(ed), &ed, EC_TIMEOUTRET);
+            wkc = ecx_APWR(&context->port, aiadr, ECT_REG_EEPCTL, sizeof(ed), &ed, EC_TIMEOUTRET);
          } while ((wkc <= 0) && (cnt++ < EC_DEFAULTRETRIES));
          if (wkc)
          {
@@ -2040,7 +2037,7 @@ uint64 ecx_readeepromAP(ecx_contextt *context, uint16 aiadr, uint16 eeproma, int
                      cnt = 0;
                      do
                      {
-                        wkc = ecx_APRD(context->port, aiadr, ECT_REG_EEPDAT, sizeof(edat64), &edat64, EC_TIMEOUTRET);
+                        wkc = ecx_APRD(&context->port, aiadr, ECT_REG_EEPDAT, sizeof(edat64), &edat64, EC_TIMEOUTRET);
                      } while ((wkc <= 0) && (cnt++ < EC_DEFAULTRETRIES));
                   }
                   else
@@ -2048,7 +2045,7 @@ uint64 ecx_readeepromAP(ecx_contextt *context, uint16 aiadr, uint16 eeproma, int
                      cnt = 0;
                      do
                      {
-                        wkc = ecx_APRD(context->port, aiadr, ECT_REG_EEPDAT, sizeof(edat32), &edat32, EC_TIMEOUTRET);
+                        wkc = ecx_APRD(&context->port, aiadr, ECT_REG_EEPDAT, sizeof(edat32), &edat32, EC_TIMEOUTRET);
                      } while ((wkc <= 0) && (cnt++ < EC_DEFAULTRETRIES));
                      edat64 = (uint64)edat32;
                   }
@@ -2080,14 +2077,14 @@ int ecx_writeeepromAP(ecx_contextt *context, uint16 aiadr, uint16 eeproma, uint1
       if (estat & EC_ESTAT_EMASK) /* error bits are set */
       {
          estat = htoes(EC_ECMD_NOP); /* clear error bits */
-         wkc = ecx_APWR(context->port, aiadr, ECT_REG_EEPCTL, sizeof(estat), &estat, EC_TIMEOUTRET3);
+         wkc = ecx_APWR(&context->port, aiadr, ECT_REG_EEPCTL, sizeof(estat), &estat, EC_TIMEOUTRET3);
       }
       do
       {
          cnt = 0;
          do
          {
-            wkc = ecx_APWR(context->port, aiadr, ECT_REG_EEPDAT, sizeof(data), &data, EC_TIMEOUTRET);
+            wkc = ecx_APWR(&context->port, aiadr, ECT_REG_EEPDAT, sizeof(data), &data, EC_TIMEOUTRET);
          } while ((wkc <= 0) && (cnt++ < EC_DEFAULTRETRIES));
 
          ed.comm = EC_ECMD_WRITE;
@@ -2096,7 +2093,7 @@ int ecx_writeeepromAP(ecx_contextt *context, uint16 aiadr, uint16 eeproma, uint1
          cnt = 0;
          do
          {
-            wkc = ecx_APWR(context->port, aiadr, ECT_REG_EEPCTL, sizeof(ed), &ed, EC_TIMEOUTRET);
+            wkc = ecx_APWR(&context->port, aiadr, ECT_REG_EEPCTL, sizeof(ed), &ed, EC_TIMEOUTRET);
          } while ((wkc <= 0) && (cnt++ < EC_DEFAULTRETRIES));
          if (wkc)
          {
@@ -2137,7 +2134,7 @@ uint16 ecx_eeprom_waitnotbusyFP(ecx_contextt *context, uint16 configadr, uint16
          osal_usleep(EC_LOCALDELAY);
       }
       *estat = 0;
-      wkc = ecx_FPRD(context->port, configadr, ECT_REG_EEPSTAT, sizeof(*estat), estat, EC_TIMEOUTRET);
+      wkc = ecx_FPRD(&context->port, configadr, ECT_REG_EEPSTAT, sizeof(*estat), estat, EC_TIMEOUTRET);
       *estat = etohs(*estat);
    } while (((wkc <= 0) || ((*estat & EC_ESTAT_BUSY) > 0)) && (osal_timer_is_expired(&timer) == FALSE)); /* wait for eeprom ready */
    if ((*estat & EC_ESTAT_BUSY) == 0)
@@ -2170,7 +2167,7 @@ uint64 ecx_readeepromFP(ecx_contextt *context, uint16 configadr, uint16 eeproma,
       if (estat & EC_ESTAT_EMASK) /* error bits are set */
       {
          estat = htoes(EC_ECMD_NOP); /* clear error bits */
-         wkc = ecx_FPWR(context->port, configadr, ECT_REG_EEPCTL, sizeof(estat), &estat, EC_TIMEOUTRET3);
+         wkc = ecx_FPWR(&context->port, configadr, ECT_REG_EEPCTL, sizeof(estat), &estat, EC_TIMEOUTRET3);
       }
 
       do
@@ -2181,7 +2178,7 @@ uint64 ecx_readeepromFP(ecx_contextt *context, uint16 configadr, uint16 eeproma,
          cnt = 0;
          do
          {
-            wkc = ecx_FPWR(context->port, configadr, ECT_REG_EEPCTL, sizeof(ed), &ed, EC_TIMEOUTRET);
+            wkc = ecx_FPWR(&context->port, configadr, ECT_REG_EEPCTL, sizeof(ed), &ed, EC_TIMEOUTRET);
          } while ((wkc <= 0) && (cnt++ < EC_DEFAULTRETRIES));
          if (wkc)
          {
@@ -2202,7 +2199,7 @@ uint64 ecx_readeepromFP(ecx_contextt *context, uint16 configadr, uint16 eeproma,
                      cnt = 0;
                      do
                      {
-                        wkc = ecx_FPRD(context->port, configadr, ECT_REG_EEPDAT, sizeof(edat64), &edat64, EC_TIMEOUTRET);
+                        wkc = ecx_FPRD(&context->port, configadr, ECT_REG_EEPDAT, sizeof(edat64), &edat64, EC_TIMEOUTRET);
                      } while ((wkc <= 0) && (cnt++ < EC_DEFAULTRETRIES));
                   }
                   else
@@ -2210,7 +2207,7 @@ uint64 ecx_readeepromFP(ecx_contextt *context, uint16 configadr, uint16 eeproma,
                      cnt = 0;
                      do
                      {
-                        wkc = ecx_FPRD(context->port, configadr, ECT_REG_EEPDAT, sizeof(edat32), &edat32, EC_TIMEOUTRET);
+                        wkc = ecx_FPRD(&context->port, configadr, ECT_REG_EEPDAT, sizeof(edat32), &edat32, EC_TIMEOUTRET);
                      } while ((wkc <= 0) && (cnt++ < EC_DEFAULTRETRIES));
                      edat64 = (uint64)edat32;
                   }
@@ -2242,14 +2239,14 @@ int ecx_writeeepromFP(ecx_contextt *context, uint16 configadr, uint16 eeproma, u
       if (estat & EC_ESTAT_EMASK) /* error bits are set */
       {
          estat = htoes(EC_ECMD_NOP); /* clear error bits */
-         wkc = ecx_FPWR(context->port, configadr, ECT_REG_EEPCTL, sizeof(estat), &estat, EC_TIMEOUTRET3);
+         wkc = ecx_FPWR(&context->port, configadr, ECT_REG_EEPCTL, sizeof(estat), &estat, EC_TIMEOUTRET3);
       }
       do
       {
          cnt = 0;
          do
          {
-            wkc = ecx_FPWR(context->port, configadr, ECT_REG_EEPDAT, sizeof(data), &data, EC_TIMEOUTRET);
+            wkc = ecx_FPWR(&context->port, configadr, ECT_REG_EEPDAT, sizeof(data), &data, EC_TIMEOUTRET);
          } while ((wkc <= 0) && (cnt++ < EC_DEFAULTRETRIES));
          ed.comm = EC_ECMD_WRITE;
          ed.addr = eeproma;
@@ -2257,7 +2254,7 @@ int ecx_writeeepromFP(ecx_contextt *context, uint16 configadr, uint16 eeproma, u
          cnt = 0;
          do
          {
-            wkc = ecx_FPWR(context->port, configadr, ECT_REG_EEPCTL, sizeof(ed), &ed, EC_TIMEOUTRET);
+            wkc = ecx_FPWR(&context->port, configadr, ECT_REG_EEPCTL, sizeof(ed), &ed, EC_TIMEOUTRET);
          } while ((wkc <= 0) && (cnt++ < EC_DEFAULTRETRIES));
          if (wkc)
          {
@@ -2302,14 +2299,14 @@ void ecx_readeeprom1(ecx_contextt *context, uint16 slave, uint16 eeproma)
       if (estat & EC_ESTAT_EMASK) /* error bits are set */
       {
          estat = htoes(EC_ECMD_NOP); /* clear error bits */
-         wkc = ecx_FPWR(context->port, configadr, ECT_REG_EEPCTL, sizeof(estat), &estat, EC_TIMEOUTRET3);
+         wkc = ecx_FPWR(&context->port, configadr, ECT_REG_EEPCTL, sizeof(estat), &estat, EC_TIMEOUTRET3);
       }
       ed.comm = htoes(EC_ECMD_READ);
       ed.addr = htoes(eeproma);
       ed.d2 = 0x0000;
       do
       {
-         wkc = ecx_FPWR(context->port, configadr, ECT_REG_EEPCTL, sizeof(ed), &ed, EC_TIMEOUTRET);
+         wkc = ecx_FPWR(&context->port, configadr, ECT_REG_EEPCTL, sizeof(ed), &ed, EC_TIMEOUTRET);
       } while ((wkc <= 0) && (cnt++ < EC_DEFAULTRETRIES));
    }
 }
@@ -2334,7 +2331,7 @@ uint32 ecx_readeeprom2(ecx_contextt *context, uint16 slave, int timeout)
    {
       do
       {
-         wkc = ecx_FPRD(context->port, configadr, ECT_REG_EEPDAT, sizeof(edat), &edat, EC_TIMEOUTRET);
+         wkc = ecx_FPRD(&context->port, configadr, ECT_REG_EEPDAT, sizeof(edat), &edat, EC_TIMEOUTRET);
       } while ((wkc <= 0) && (cnt++ < EC_DEFAULTRETRIES));
    }
 
@@ -2350,13 +2347,13 @@ uint32 ecx_readeeprom2(ecx_contextt *context, uint16 slave, int timeout)
  */
 static void ecx_pushindex(ecx_contextt *context, uint8 idx, void *data, uint16 length, uint16 DCO)
 {
-   if (context->idxstack->pushed < EC_MAXBUF)
+   if (context->idxstack.pushed < EC_MAXBUF)
    {
-      context->idxstack->idx[context->idxstack->pushed] = idx;
-      context->idxstack->data[context->idxstack->pushed] = data;
-      context->idxstack->length[context->idxstack->pushed] = length;
-      context->idxstack->dcoffset[context->idxstack->pushed] = DCO;
-      context->idxstack->pushed++;
+      context->idxstack.idx[context->idxstack.pushed] = idx;
+      context->idxstack.data[context->idxstack.pushed] = data;
+      context->idxstack.length[context->idxstack.pushed] = length;
+      context->idxstack.dcoffset[context->idxstack.pushed] = DCO;
+      context->idxstack.pushed++;
    }
 }
 
@@ -2367,10 +2364,10 @@ static void ecx_pushindex(ecx_contextt *context, uint8 idx, void *data, uint16 l
 static int ecx_pullindex(ecx_contextt *context)
 {
    int rval = -1;
-   if (context->idxstack->pulled < context->idxstack->pushed)
+   if (context->idxstack.pulled < context->idxstack.pushed)
    {
-      rval = context->idxstack->pulled;
-      context->idxstack->pulled++;
+      rval = context->idxstack.pulled;
+      context->idxstack.pulled++;
    }
 
    return rval;
@@ -2384,8 +2381,8 @@ static int ecx_pullindex(ecx_contextt *context)
 static void ecx_clearindex(ecx_contextt *context)
 {
 
-   context->idxstack->pushed = 0;
-   context->idxstack->pulled = 0;
+   context->idxstack.pushed = 0;
+   context->idxstack.pulled = 0;
 }
 
 /** Transmit processdata to slaves.
@@ -2472,21 +2469,21 @@ int ecx_send_processdata_group(ecx_contextt *context, uint8 group)
                   sublength = (uint16)context->grouplist[group].IOsegment[currentsegment++];
                }
                /* get new index */
-               idx = ecx_getindex(context->port);
+               idx = ecx_getindex(&context->port);
                w1 = LO_WORD(LogAdr);
                w2 = HI_WORD(LogAdr);
                DCO = 0;
-               ecx_setupdatagram(context->port, &(context->port->txbuf[idx]), EC_CMD_LRD, idx, w1, w2, sublength, data);
+               ecx_setupdatagram(&context->port, &(context->port.txbuf[idx]), EC_CMD_LRD, idx, w1, w2, sublength, data);
                if (first)
                {
                   /* FPRMW in second datagram */
-                  DCO = ecx_adddatagram(context->port, &(context->port->txbuf[idx]), EC_CMD_FRMW, idx, FALSE,
+                  DCO = ecx_adddatagram(&context->port, &(context->port.txbuf[idx]), EC_CMD_FRMW, idx, FALSE,
                                         context->slavelist[context->grouplist[group].DCnext].configadr,
-                                        ECT_REG_DCSYSTIME, sizeof(int64), context->DCtime);
+                                        ECT_REG_DCSYSTIME, sizeof(int64), &context->DCtime);
                   first = FALSE;
                }
                /* send frame */
-               ecx_outframe_red(context->port, idx);
+               ecx_outframe_red(&context->port, idx);
                /* push index and data pointer on stack */
                ecx_pushindex(context, idx, data, sublength, DCO);
                length -= sublength;
@@ -2510,21 +2507,21 @@ int ecx_send_processdata_group(ecx_contextt *context, uint8 group)
                   sublength = (uint16)length;
                }
                /* get new index */
-               idx = ecx_getindex(context->port);
+               idx = ecx_getindex(&context->port);
                w1 = LO_WORD(LogAdr);
                w2 = HI_WORD(LogAdr);
                DCO = 0;
-               ecx_setupdatagram(context->port, &(context->port->txbuf[idx]), EC_CMD_LWR, idx, w1, w2, sublength, data);
+               ecx_setupdatagram(&context->port, &(context->port.txbuf[idx]), EC_CMD_LWR, idx, w1, w2, sublength, data);
                if (first)
                {
                   /* FPRMW in second datagram */
-                  DCO = ecx_adddatagram(context->port, &(context->port->txbuf[idx]), EC_CMD_FRMW, idx, FALSE,
+                  DCO = ecx_adddatagram(&context->port, &(context->port.txbuf[idx]), EC_CMD_FRMW, idx, FALSE,
                                         context->slavelist[context->grouplist[group].DCnext].configadr,
-                                        ECT_REG_DCSYSTIME, sizeof(int64), context->DCtime);
+                                        ECT_REG_DCSYSTIME, sizeof(int64), &context->DCtime);
                   first = FALSE;
                }
                /* send frame */
-               ecx_outframe_red(context->port, idx);
+               ecx_outframe_red(&context->port, idx);
                /* push index and data pointer on stack */
                ecx_pushindex(context, idx, data, sublength, DCO);
                length -= sublength;
@@ -2551,21 +2548,21 @@ int ecx_send_processdata_group(ecx_contextt *context, uint8 group)
          {
             sublength = (uint16)context->grouplist[group].IOsegment[currentsegment++];
             /* get new index */
-            idx = ecx_getindex(context->port);
+            idx = ecx_getindex(&context->port);
             w1 = LO_WORD(LogAdr);
             w2 = HI_WORD(LogAdr);
             DCO = 0;
-            ecx_setupdatagram(context->port, &(context->port->txbuf[idx]), EC_CMD_LRW, idx, w1, w2, sublength, data);
+            ecx_setupdatagram(&context->port, &(context->port.txbuf[idx]), EC_CMD_LRW, idx, w1, w2, sublength, data);
             if (first)
             {
                /* FPRMW in second datagram */
-               DCO = ecx_adddatagram(context->port, &(context->port->txbuf[idx]), EC_CMD_FRMW, idx, FALSE,
+               DCO = ecx_adddatagram(&context->port, &(context->port.txbuf[idx]), EC_CMD_FRMW, idx, FALSE,
                                      context->slavelist[context->grouplist[group].DCnext].configadr,
-                                     ECT_REG_DCSYSTIME, sizeof(int64), context->DCtime);
+                                     ECT_REG_DCSYSTIME, sizeof(int64), &context->DCtime);
                first = FALSE;
             }
             /* send frame */
-            ecx_outframe_red(context->port, idx);
+            ecx_outframe_red(&context->port, idx);
             /* push index and data pointer on stack.
              * the iomapinputoffset compensate for where the inputs are stored
              * in the IOmap if we use an overlapping IOmap. If a regular IOmap
@@ -2605,15 +2602,15 @@ int ecx_receive_processdata_group(ecx_contextt *context, uint8 group, int timeou
    /* just to prevent compiler warning for unused group */
    wkc2 = group;
 
-   idxstack = context->idxstack;
-   rxbuf = context->port->rxbuf;
+   idxstack = &context->idxstack;
+   rxbuf = context->port.rxbuf;
    /* get first index */
    pos = ecx_pullindex(context);
    /* read the same number of frames as send */
    while (pos >= 0)
    {
       idx = idxstack->idx[pos];
-      wkc2 = ecx_waitinframe(context->port, idx, timeout);
+      wkc2 = ecx_waitinframe(&context->port, idx, timeout);
       /* check if there is input data in frame */
       if (wkc2 > EC_NOFRAME)
       {
@@ -2625,7 +2622,7 @@ int ecx_receive_processdata_group(ecx_contextt *context, uint8 group, int timeou
                memcpy(&le_wkc, &(rxbuf[idx][EC_HEADERSIZE + idxstack->length[pos]]), EC_WKCSIZE);
                wkc = etohs(le_wkc);
                memcpy(&le_DCtime, &(rxbuf[idx][idxstack->dcoffset[pos]]), sizeof(le_DCtime));
-               *(context->DCtime) = etohll(le_DCtime);
+               context->DCtime = etohll(le_DCtime);
             }
             else
             {
@@ -2643,7 +2640,7 @@ int ecx_receive_processdata_group(ecx_contextt *context, uint8 group, int timeou
                /* output WKC counts 2 times when using LRW, emulate the same for LWR */
                wkc = etohs(le_wkc) * 2;
                memcpy(&le_DCtime, &(rxbuf[idx][idxstack->dcoffset[pos]]), sizeof(le_DCtime));
-               *(context->DCtime) = etohll(le_DCtime);
+               context->DCtime = etohll(le_DCtime);
             }
             else
             {
@@ -2654,7 +2651,7 @@ int ecx_receive_processdata_group(ecx_contextt *context, uint8 group, int timeou
          }
       }
       /* release buffer */
-      ecx_setbufstat(context->port, idx, EC_BUF_EMPTY);
+      ecx_setbufstat(&context->port, idx, EC_BUF_EMPTY);
       /* get next index */
       pos = ecx_pullindex(context);
    }
index 2d328a9329973ad8eb7cd2053fb60079963183a0..2a3ec89ac79c6c4fd54efbf62ee91914f4a189d5 100644 (file)
@@ -50,7 +50,7 @@ void ecx_SoEerror(ecx_contextt *context, uint16 Slave, uint16 idn, uint16 Error)
    Ec.Slave = Slave;
    Ec.Index = idn;
    Ec.SubIdx = 0;
-   *(context->ecaterror) = TRUE;
+   context->ecaterror = TRUE;
    Ec.Etype = EC_ERR_TYPE_SOE_ERROR;
    Ec.ErrorCode = Error;
    ecx_pusherror(context, &Ec);