]> Gitweb @ Texas Instruments - Open Source Git Repositories - git.TI.com/gitweb - processor-sdk/cclink.git/commitdiff
Initial Commit: add master and slave code for CCIEF-BASIC
authorHongmei Gou <h-gou@ti.com>
Mon, 24 Jul 2017 15:04:24 +0000 (11:04 -0400)
committerHongmei Gou <h-gou@ti.com>
Mon, 24 Jul 2017 15:04:38 +0000 (11:04 -0400)
34 files changed:
CCIEF-BASIC_Master/Makefile [new file with mode: 0644]
CCIEF-BASIC_Master/MasterParameter.csv [new file with mode: 0644]
CCIEF-BASIC_Master/library/include/SLMP.h [new file with mode: 0644]
CCIEF-BASIC_Master/library/src/SLMP.c [new file with mode: 0644]
CCIEF-BASIC_Master/manual/CC-Link IE Field Network Basic Sample Code User's Manual(Master Station)v1.01.4.pdf [new file with mode: 0644]
CCIEF-BASIC_Master/readme.txt [new file with mode: 0644]
CCIEF-BASIC_Master/sample/include/CCIEF_BASIC_MASTER.h [new file with mode: 0644]
CCIEF-BASIC_Master/sample/include/CCIEF_BASIC_SLAVES.h [new file with mode: 0644]
CCIEF-BASIC_Master/sample/include/SOCKET.h [new file with mode: 0644]
CCIEF-BASIC_Master/sample/include/TIMER.h [new file with mode: 0644]
CCIEF-BASIC_Master/sample/include/USER_SAMPLE.h [new file with mode: 0644]
CCIEF-BASIC_Master/sample/src/CCIEF_BASIC_MASTER.c [new file with mode: 0644]
CCIEF-BASIC_Master/sample/src/CCIEF_BASIC_SLAVES.c [new file with mode: 0644]
CCIEF-BASIC_Master/sample/src/SOCKET.c [new file with mode: 0644]
CCIEF-BASIC_Master/sample/src/TIMER.c [new file with mode: 0644]
CCIEF-BASIC_Master/sample/src/USER_SAMPLE.c [new file with mode: 0644]
CCIEF-BASIC_Master/version.txt [new file with mode: 0644]
CCIEF-BASIC_Slave/Makefile [new file with mode: 0644]
CCIEF-BASIC_Slave/SlaveParameter.csv [new file with mode: 0644]
CCIEF-BASIC_Slave/library/include/SLMP.h [new file with mode: 0644]
CCIEF-BASIC_Slave/library/src/SLMP.c [new file with mode: 0644]
CCIEF-BASIC_Slave/manual/CC-Link IE Field NetworkBasic Sample Code User's Manual(Slave Station)v1.02.4.pdf [new file with mode: 0644]
CCIEF-BASIC_Slave/readme.txt [new file with mode: 0644]
CCIEF-BASIC_Slave/sample/include/CCIEF_BASIC_SLAVE.h [new file with mode: 0644]
CCIEF-BASIC_Slave/sample/include/SLMP_SERVER.h [new file with mode: 0644]
CCIEF-BASIC_Slave/sample/include/SOCKET.h [new file with mode: 0644]
CCIEF-BASIC_Slave/sample/include/TIMER.h [new file with mode: 0644]
CCIEF-BASIC_Slave/sample/include/USER_SAMPLE.h [new file with mode: 0644]
CCIEF-BASIC_Slave/sample/src/CCIEF_BASIC_SLAVE.c [new file with mode: 0644]
CCIEF-BASIC_Slave/sample/src/SLMP_SERVER.c [new file with mode: 0644]
CCIEF-BASIC_Slave/sample/src/SOCKET.c [new file with mode: 0644]
CCIEF-BASIC_Slave/sample/src/TIMER.c [new file with mode: 0644]
CCIEF-BASIC_Slave/sample/src/USER_SAMPLE.c [new file with mode: 0644]
CCIEF-BASIC_Slave/version.txt [new file with mode: 0644]

diff --git a/CCIEF-BASIC_Master/Makefile b/CCIEF-BASIC_Master/Makefile
new file mode 100644 (file)
index 0000000..70dbc03
--- /dev/null
@@ -0,0 +1,17 @@
+Master_sample: SLMP.o SOCKET.o TIMER.o CCIEF_BASIC_SLAVES.o CCIEF_BASIC_MASTER.o USER_SAMPLE.o
+       gcc -o Master_sample SLMP.o SOCKET.o TIMER.o CCIEF_BASIC_SLAVES.o CCIEF_BASIC_MASTER.o USER_SAMPLE.o
+
+SLMP.o: library/src/SLMP.c
+       gcc -I library/include -c library/src/SLMP.c
+SOCKET.o: sample/src/SOCKET.c
+       gcc -I sample/include -c sample/src/SOCKET.c
+TIMER.o: sample/src/TIMER.c
+       gcc -I sample/include -c sample/src/TIMER.c
+CCIEF_BASIC_SLAVES.o: sample/src/CCIEF_BASIC_SLAVES.c
+       gcc -I sample/include -c sample/src/CCIEF_BASIC_SLAVES.c
+CCIEF_BASIC_MASTER.o: sample/src/CCIEF_BASIC_MASTER.c
+       gcc -I sample/include -Ilibrary/include -c sample/src/CCIEF_BASIC_MASTER.c
+USER_SAMPLE.o: sample/src/USER_SAMPLE.c
+       gcc -I sample/include -Ilibrary/include -c sample/src/USER_SAMPLE.c
+clean:
+       rm SLMP.o SOCKET.o TIMER.o CCIEF_BASIC_SLAVES.o CCIEF_BASIC_MASTER.o USER_SAMPLE.o
\ No newline at end of file
diff --git a/CCIEF-BASIC_Master/MasterParameter.csv b/CCIEF-BASIC_Master/MasterParameter.csv
new file mode 100644 (file)
index 0000000..c9d5b76
--- /dev/null
@@ -0,0 +1,17 @@
+,,\r
+CCIEF-BASIC Master Sample Parameter,,\r
+,,\r
+Group,,\r
+ID,DATA,COMMENT\r
+1,1,Total number of group\r
+2,1,Number of group\r
+3,100,Group1 Cyclic transmission timeout\r
+4,2,Group1 Count of cyclic transmission timeout\r
+5,0,Group1 Constant link scan time\r
+,,\r
+Slave,,\r
+ID,DATA,COMMENT\r
+1,1,Total number of slave\r
+2,192.168.3.1,Slave1 IP address\r
+3,1,Slave1 Number of occupied stations\r
+4,1,Slave1 Number of group
\ No newline at end of file
diff --git a/CCIEF-BASIC_Master/library/include/SLMP.h b/CCIEF-BASIC_Master/library/include/SLMP.h
new file mode 100644 (file)
index 0000000..355726f
--- /dev/null
@@ -0,0 +1,280 @@
+/*\r
+ * Copyright (C) 2017 Texas Instruments Incorporated - http://www.ti.com/\r
+ * Copyright (C) 2016 CC-Link Partner Association -http://am.cc-link.org/\r
+ * \r
+ * \r
+ *  Redistribution and use in source and binary forms, with or without \r
+ *  modification, are permitted provided that the following conditions \r
+ *  are met:\r
+ *\r
+ *    Redistributions of source code must retain the above copyright \r
+ *    notice, this list of conditions and the following disclaimer.\r
+ *\r
+ *    Redistributions in binary form must reproduce the above copyright\r
+ *    notice, this list of conditions and the following disclaimer in the \r
+ *    documentation and/or other materials provided with the   \r
+ *    distribution.\r
+ *\r
+ *    Neither the name of Texas Instruments Incorporated nor the names of\r
+ *    its contributors may be used to endorse or promote products derived\r
+ *    from this software without specific prior written permission.\r
+ *\r
+ *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \r
+ *  "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT \r
+ *  LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\r
+ *  A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT \r
+ *  OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, \r
+ *  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT \r
+ *  LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
+ *  DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\r
+ *  THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT \r
+ *  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE \r
+ *  OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
+ *\r
+*/\r
+\r
+#ifndef                __SLMP_H__\r
+#define                __SLMP_H__\r
+\r
+#include <stdint.h>\r
+\r
+/*[ Structure of SLMP Info  ]*/\r
+typedef struct \r
+{\r
+       uint32_t        ulFrameType;                    /* Frame Type */\r
+       uint16_t        usSerialNumber;                 /* Serial Number */\r
+       uint16_t        usNetNumber;                    /* Network Number */\r
+       uint16_t        usNodeNumber;                   /* Node Number */\r
+       uint16_t        usProcNumber;                   /* Processor Number */\r
+       uint16_t        usDataLength;                   /* Data Length */\r
+       uint16_t        usTimer;                                /* Timer Value */\r
+       uint16_t        usCommand;                              /* Command */\r
+       uint16_t        usSubCommand;                   /* Sub Command */\r
+       uint16_t        usEndCode;                              /* End Code */\r
+       uint8_t *       pucData;                                /* Data */\r
+}SLMP_INFO;\r
+\r
+/*[ Definition of Frame Type ]*/\r
+#define        SLMP_FTYPE_BIN_REQ_ST                                                   (0x5000)\r
+#define SLMP_FTYPE_BIN_RES_ST                                                  (0xD000)\r
+#define        SLMP_FTYPE_BIN_REQ_MT                                                   (0x5400)\r
+#define SLMP_FTYPE_BIN_RES_MT                                                  (0xD400)\r
+#define        SLMP_FTYPE_ASCII_REQ_ST                                                 (0x35303030) /* '5000' */\r
+#define        SLMP_FTYPE_ASCII_RES_ST                                                 (0x44303030) /* 'D000' */\r
+#define        SLMP_FTYPE_ASCII_REQ_MT                                                 (0x35343030) /* '5400' */\r
+#define        SLMP_FTYPE_ASCII_RES_MT                                                 (0x44343030) /* 'D400' */\r
+\r
+/*[ Definition of Index per frame type ]*/\r
+#define        SLMP_FTYPE_BIN_REQ_ST_INDEX                                             (0x00)\r
+#define SLMP_FTYPE_BIN_RES_ST_INDEX                                            (0x01)\r
+#define        SLMP_FTYPE_BIN_REQ_MT_INDEX                                             (0x02)\r
+#define SLMP_FTYPE_BIN_RES_MT_INDEX                                            (0x03)\r
+#define        SLMP_FTYPE_ASCII_REQ_ST_INDEX                                   (0x04)\r
+#define        SLMP_FTYPE_ASCII_RES_ST_INDEX                                   (0x05)\r
+#define        SLMP_FTYPE_ASCII_REQ_MT_INDEX                                   (0x06)\r
+#define        SLMP_FTYPE_ASCII_RES_MT_INDEX                                   (0x07)\r
+\r
+/*[ Definition of Data Code ]*/\r
+#define        SLMP_DATA_CODE_BIN                                                              0\r
+#define        SLMP_DATA_CODE_ASCII                                                    1\r
+#define SLMP_DATA_CODE(a)\\r
+       (((a == SLMP_FTYPE_BIN_REQ_ST) | (a == SLMP_FTYPE_BIN_RES_ST) | (a == SLMP_FTYPE_BIN_REQ_MT) | (a == SLMP_FTYPE_BIN_RES_MT)) ? SLMP_DATA_CODE_BIN :\\r
+        ((a == SLMP_FTYPE_ASCII_REQ_ST) | (a == SLMP_FTYPE_ASCII_RES_ST) | (a == SLMP_FTYPE_ASCII_REQ_MT) | (a == SLMP_FTYPE_ASCII_RES_MT)) ? SLMP_DATA_CODE_ASCII : -1)\r
+\r
+/*[ Definition of Response Frame Type ]*/\r
+#define SLMP_RESPONSE_FRAME_TYPE(a)\\r
+       ((a == SLMP_FTYPE_BIN_REQ_ST) ? SLMP_FTYPE_BIN_RES_ST :\\r
+       ((a == SLMP_FTYPE_BIN_REQ_MT) ? SLMP_FTYPE_BIN_RES_MT :\\r
+       ((a == SLMP_FTYPE_ASCII_REQ_ST) ? SLMP_FTYPE_ASCII_RES_ST :\\r
+       ((a == SLMP_FTYPE_ASCII_REQ_MT) ? SLMP_FTYPE_ASCII_RES_MT : -1))))\r
+\r
+/*[ Definition of SLMP Frame Header Size ]*/\r
+#define SLMP_HEADER_SIZE(a)\\r
+       (((a == SLMP_FTYPE_BIN_REQ_ST) | (a == SLMP_FTYPE_BIN_RES_ST)) ? 11 :\\r
+       (((a == SLMP_FTYPE_BIN_REQ_MT) | (a == SLMP_FTYPE_BIN_RES_MT)) ? 15 :\\r
+       (((a == SLMP_FTYPE_ASCII_REQ_ST) | (a == SLMP_FTYPE_ASCII_RES_ST)) ? 22 :\\r
+       (((a == SLMP_FTYPE_ASCII_REQ_MT) | (a == SLMP_FTYPE_ASCII_RES_MT)) ? 30 : 0))))\r
+\r
+/*[ Definition of SLMP Commands ]*/\r
+/* Device */\r
+#define        SLMP_COMMAND_DEVICE_READ                                                        (0x0401)\r
+#define        SLMP_COMMAND_DEVICE_WRITE                                                       (0x1401)\r
+#define        SLMP_COMMAND_DEVICE_READ_RANDOM                                         (0x0403)\r
+#define        SLMP_COMMAND_DEVICE_WRITE_RANDOM                                        (0x1402)\r
+#define        SLMP_COMMAND_DEVICE_ENTRY_MONITOR_DEVICE                        (0x0801)\r
+#define        SLMP_COMMAND_DEVICE_EXECUTE_MONITOR                                     (0x0802)\r
+#define        SLMP_COMMAND_DEVICE_READ_BLOCK                                          (0x0406)\r
+#define SLMP_COMMAND_DEVICE_WRITE_BLOCK                                                (0x1406)\r
+\r
+/* Memory */\r
+#define        SLMP_COMMAND_MEMORY_READ                                                        (0x0613)\r
+#define        SLMP_COMMAND_MEMORY_WRITE                                                       (0x1613)\r
+\r
+/* ExtendUnit */\r
+#define        SLMP_COMMAND_EXTEND_UNIT_READ                                           (0x0601)\r
+#define        SLMP_COMMAND_EXTEND_UNIT_WRITE                                          (0x1601)\r
+\r
+/* RemoteControl */\r
+#define        SLMP_COMMAND_REMOTE_RUN                                                         (0x1001)\r
+#define        SLMP_COMMAND_REMOTE_STOP                                                        (0x1002)\r
+#define        SLMP_COMMAND_REMOTE_PAUSE                                                       (0x1003)\r
+#define        SLMP_COMMAND_REMOTE_LATCH_CLEAR                                         (0x1005)\r
+#define        SLMP_COMMAND_REMOTE_RESET                                                       (0x1006)\r
+#define        SLMP_COMMAND_REMOTE_READ_TYPE_NAME                                      (0x0101)\r
+\r
+/* Drive */\r
+#define        SLMP_COMMAND_DRIVE_READ_DISK_STATE                                      (0x0205)\r
+#define        SLMP_COMMAND_DRIVE_DEFRAG                                                       (0x1207)\r
+\r
+/* FILE */\r
+#define SLMP_COMMAND_FILE_READ_FILE_INFO                                       (0x0201)\r
+#define        SLMP_COMMAND_FILE_READ_FILE_INFO_DETAIL                         (0x0202)\r
+#define        SLMP_COMMAND_FILE_READ_FILE_INFO_FILE_NUMBER_USAGE      (0x0204)\r
+#define        SLMP_COMMAND_FILE_CHANGE_FILE_INFO                                      (0x1204)\r
+#define        SLMP_COMMAND_FILE_SEARCH                                                        (0x0203)\r
+#define        SLMP_COMMAND_FILE_READ_ACCESS_TYPE_A                            (0x0206)\r
+#define        SLMP_COMMAND_FILE_WRITE_ACCESS_TYPE_A                           (0x1203)\r
+#define        SLMP_COMMAND_FILE_LOCK_CONTROL                                          (0x0808)\r
+#define        SLMP_COMMAND_FILE_COPY_ACCESS_TYPE_A                            (0x1206)\r
+#define        SLMP_COMMAND_FILE_COPY_ACCESS_TYPE_B                            (0x1824)\r
+#define        SLMP_COMMAND_FILE_DELETE_ACCESS_TYPE_A                          (0x1205)\r
+#define        SLMP_COMMAND_FILE_DELETE_ACCESS_TYPE_B                          (0x1822)\r
+#define        SLMP_COMMAND_FILE_READ_DEIRECTORY_FILE                          (0x1810)\r
+#define        SLMP_COMMAND_FILE_SEARCH_DIRECTORY_FILE                         (0x1811)\r
+#define        SLMP_COMMAND_FILE_CREATE_NEW_FILE_ACCESS_TYPE_A         (0x1202)\r
+#define        SLMP_COMMAND_FILE_CREATE_NEW_FILE_ACCESS_TYPE_B         (0x1820)\r
+#define        SLMP_COMMAND_FILE_CHANGE_FILE_STATE                                     (0x1825)\r
+#define        SLMP_COMMAND_FILE_CHANGE_FILE_DATE                                      (0x1826)\r
+#define        SLMP_COMMAND_FILE_OPEN_FILE                                                     (0x1827)\r
+#define        SLMP_COMMAND_FILE_READ_ACCESS_TYPE_B                            (0x1828)\r
+#define        SLMP_COMMAND_FILE_WRITE_ACCESS_TYPE_B                           (0x1829)\r
+#define        SLMP_COMMAND_FILE_CLOSE_FILE                                            (0x182A)\r
+\r
+/* TEST */\r
+#define        SLMP_COMMAND_SELF_TEST                                                          (0x0619)\r
+\r
+/* CLEAR ERROR */\r
+#define        SLMP_COMMAND_CLEAR_ERROR_CODE                                           (0x1617)\r
+\r
+/* REMOTE PASSWORD */\r
+#define        SLMP_COMMAND_PASSWORD_LOCK                                                      (0x1630)\r
+#define        SLMP_COMMAND_PASSWORD_UNLOCK                                            (0x1631)\r
+\r
+/* ONDEMAND */\r
+#define        SLMP_COMMAND_ONDEMAND                                                           (0x2101)\r
+\r
+/* NODE CONNECT */\r
+#define        SLMP_COMMAND_NODE_SEARCH                                                        (0x0E30)\r
+#define        SLMP_COMMAND_IP_ADDRESS_SET                                                     (0x0E31)\r
+\r
+/* PARAMETER SETTING */\r
+#define        SLMP_COMMAND_DEVICE_INFO_COMPARE                                        (0x0E32)\r
+#define        SLMP_COMMAND_PARAMETER_GET                                                      (0x0E33)\r
+#define        SLMP_COMMAND_PARAMETER_SET                                                      (0x0E34)\r
+#define        SLMP_COMMAND_PARAMETER_SET_START                                        (0x0E35)\r
+#define        SLMP_COMMAND_PARAMETER_SET_END                                          (0x0E36)\r
+#define        SLMP_COMMAND_PARAMETER_SET_CANCEL                                       (0x0E3A)\r
+\r
+/* NODE MONITORING */\r
+#define        SLMP_COMMAND_STATUS_READ                                                        (0x0E44)\r
+#define        SLMP_COMMAND_COMMUNICATION_SETTING_GET                          (0x0E45)\r
+#define        SLMP_COMMAND_STATUS_READ2                                                       (0x0E53)\r
+\r
+/* CCIEF-BASIC */\r
+#define        SLMP_COMMAND_CYCLIC_DATA                                                        (0x0E70)\r
+\r
+/*[ Definition of Processor Number ]*/\r
+#define        SLMP_CPU_ACTIVE                                                                         (0x03D0)\r
+#define        SLMP_CPU_STANDBY                                                                        (0x03D1)\r
+#define        SLMP_CPU_TYPE_A                                                                         (0x03D2)\r
+#define SLMP_CPU_TYPE_B                                                                                (0x03D3)\r
+#define        SLMP_CPU_1                                                                                      (0x03E0)\r
+#define        SLMP_CPU_2                                                                                      (0x03E1)\r
+#define        SLMP_CPU_3                                                                                      (0x03E2)\r
+#define        SLMP_CPU_4                                                                                      (0x03E3)\r
+#define        SLMP_CPU_DEFAULT                                                                        (0x03FF)\r
+\r
+/*[ Definition of Timer Value ]*/\r
+#define        SLMP_TIMER_WAIT_FOREVER                                                         (0x0000)\r
+\r
+/*[ Definition of SLMP Error Codes ]*/\r
+#define SLMP_ERR_COMMAND_SUBCOMMAND                                                    (0xC059)\r
+#define SLMP_ERR_WRONG_DATA                                                                    (0xC05C)\r
+#define SLMP_ERR_DATA_LENGTH                                                           (0xC061)\r
+#define SLMP_ERR_UNDER_EXECUTION                                                       (0xCEE0)\r
+#define SLMP_ERR_REQ_DATA_SIZE                                                         (0xCEE1)\r
+#define SLMP_ERR_RES_DATA_SIZE                                                         (0xCEE2)\r
+#define SLMP_ERR_NO_EXIST_SERVER_NO                                                    (0xCF10)\r
+#define SLMP_ERR_CAN_NOT_COMMUNICATION_SETTING                         (0xCF20)\r
+#define SLMP_ERR_NO_EXIST_PARAM_ID                                                     (0xCF30)\r
+#define SLMP_ERR_CAN_NOT_PARAMETER_SET                                         (0xCF31)\r
+\r
+/*[ Definition for CCIEF-BASIC End Code ]*/\r
+#define        SLMP_END_DUPLICATE_MASTER                                                       (0xCFE0)\r
+#define        SLMP_END_INVALID_NUMBER_OF_OCCUPIED_STATIONS            (0xCFE1)\r
+#define        SLMP_END_SLAVE                                                                          (0xCFF0)\r
+#define SLMP_END_DISCONNECTED_REQUEST                                          (0xCFFF)\r
+\r
+/*[ Definition of value ]*/\r
+#define SLMP_ERR_OK            0\r
+#define SLMP_ERR_NG            (-1)\r
+#ifndef        NULL\r
+#define NULL                   0\r
+#endif\r
+\r
+/*[ Definition of mask value ]*/\r
+#define MASK_UPPER4BIT         (0xF0)\r
+#define MASK_LOWER4BIT         (0x0F)\r
+\r
+/*[ Definition of bit operation ]*/\r
+#define SHIFT_R24(a)                   ((uint8_t)(((a) >> 24) & 0xFF ))\r
+#define SHIFT_R20(a)                   ((uint8_t)(((a) >> 20) & 0xFF ))\r
+#define SHIFT_R16(a)                   ((uint8_t)(((a) >> 16) & 0xFF ))\r
+#define SHIFT_R12(a)                   ((uint8_t)(((a) >> 12) & 0xFF ))\r
+#define SHIFT_R8(a)                            ((uint8_t)(((a) >>  8) & 0xFF ))\r
+#define SHIFT_R7(a)                            ((uint8_t)(((a) >>  7) & 0xFF ))\r
+#define SHIFT_R6(a)                            ((uint8_t)(((a) >>  6) & 0xFF ))\r
+#define SHIFT_R5(a)                            ((uint8_t)(((a) >>  5) & 0xFF ))\r
+#define SHIFT_R4(a)                            ((uint8_t)(((a) >>  4) & 0xFF ))\r
+#define SHIFT_R3(a)                            ((uint8_t)(((a) >>  3) & 0xFF ))\r
+#define SHIFT_R2(a)                            ((uint8_t)(((a) >>  2) & 0xFF ))\r
+#define SHIFT_R1(a)                            ((uint8_t)(((a) >>  1) & 0xFF ))\r
+#define SHIFT_R0(a)                            ((uint8_t)(((a)      ) & 0xFF ))\r
+\r
+#define SHIFT_L0(a)                            ((uint8_t) (((a)      ) & 0xFF ))\r
+#define SHIFT_L1(a)                            ((uint8_t) (((a) <<  1) & 0xFF ))\r
+#define SHIFT_L2(a)                            ((uint8_t) (((a) <<  2) & 0xFF ))\r
+#define SHIFT_L3(a)                            ((uint8_t) (((a) <<  3) & 0xFF ))\r
+#define SHIFT_L4(a)                            ((uint8_t) (((a) <<  4) & 0xFF ))\r
+#define SHIFT_L5(a)                            ((uint8_t) (((a) <<  5) & 0xFF ))\r
+#define SHIFT_L6(a)                            ((uint8_t) (((a) <<  6) & 0xFF ))\r
+#define SHIFT_L7(a)                            ((uint8_t) (((a) <<  7) & 0xFF ))\r
+#define SHIFT_L8(a)                            ((uint16_t)(((a) <<  8) & 0xFFFF))\r
+#define SHIFT_L16(a)                   ((uint32_t)( (a) << 16))\r
+#define SHIFT_L24(a)                   ((uint32_t)( (a) << 24))\r
+\r
+#define CONCAT_2ASCII(a, b)                            (((uint16_t)(a) <<  4) | (b))\r
+#define CONCAT_4ASCII(a, b, c, d)              (((uint16_t)(a) << 12) | ((uint16_t)(b) <<  8) | ((uint16_t)(c) << 4) | (d))\r
+#define CONCAT_6ASCII(a, b, c, d, e, f)        (((uint16_t)(a) << 20) | ((uint16_t)(b) << 16) | ((uint16_t)(c) << 12) |\\r
+                                                                                ((uint16_t)(d) <<  8) | ((uint16_t)(e) <<  4) | (f))\r
+#define CONCAT_8ASCII(a, b, c, d, e, f, g, h)  (((uint16_t)(a) << 28) | ((uint16_t)(b) << 24) | ((uint16_t)(c) << 20) |\\r
+                                                                                                ((uint16_t)(d) << 16) | ((uint16_t)(e) << 12) | ((uint16_t)(f) << 8) |\\r
+                                                                                                ((uint16_t)(g) << 4) | (h))\r
+#define CONCAT_2BIN(a, b)                      (((uint16_t)(a) <<  8) | (b))\r
+#define CONCAT_3BIN(a, b, c)           (((uint16_t)(a) << 16) | ((uint16_t)(b) << 8) | (c))\r
+#define CONCAT_4BIN(a, b, c, d)                (((uint32_t) (a) << 24) | ((uint32_t)(b) << 16) | ((uint32_t)(c) << 8) | (d))\r
+\r
+#define BIT_GET(a, b)                          (((((uint8_t*)a)[(b)/8]) >> ((b)%8)) & 0x01)\r
+#define BIT_SET(a, b, c)                       ((((c) & 0x01) == 0x01) ? ((((uint8_t*)a)[(b)/8]) |= (0x01 << ((b)%8))) : \\r
+                                                                       ((((uint8_t*)a)[(b)/8]) &= ~(0x01 << ((b)%8))))\r
+\r
+\r
+/*[ Definition of Public API ]*/\r
+int SLMP_MakePacketStream ( uint32_t ulFrameType, const SLMP_INFO *p, uint8_t *pucStream );\r
+int SLMP_GetSlmpInfo ( SLMP_INFO *p, const uint8_t *pucStream );\r
+int SLMP_MakeErrorData ( const SLMP_INFO *p, uint8_t *pucStream, uint16_t *pusDataSize );\r
+uint8_t local_itoa( uint8_t ucInt );\r
+uint8_t local_atoi( uint8_t ucInt );\r
+\r
+#endif\r
+/*EOF*/
\ No newline at end of file
diff --git a/CCIEF-BASIC_Master/library/src/SLMP.c b/CCIEF-BASIC_Master/library/src/SLMP.c
new file mode 100644 (file)
index 0000000..f0de50a
--- /dev/null
@@ -0,0 +1,931 @@
+/*\r
+ * Copyright (C) 2017 Texas Instruments Incorporated - http://www.ti.com/\r
+ * Copyright (C) 2016 CC-Link Partner Association -http://am.cc-link.org/\r
+ * \r
+ * \r
+ *  Redistribution and use in source and binary forms, with or without \r
+ *  modification, are permitted provided that the following conditions \r
+ *  are met:\r
+ *\r
+ *    Redistributions of source code must retain the above copyright \r
+ *    notice, this list of conditions and the following disclaimer.\r
+ *\r
+ *    Redistributions in binary form must reproduce the above copyright\r
+ *    notice, this list of conditions and the following disclaimer in the \r
+ *    documentation and/or other materials provided with the   \r
+ *    distribution.\r
+ *\r
+ *    Neither the name of Texas Instruments Incorporated nor the names of\r
+ *    its contributors may be used to endorse or promote products derived\r
+ *    from this software without specific prior written permission.\r
+ *\r
+ *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \r
+ *  "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT \r
+ *  LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\r
+ *  A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT \r
+ *  OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, \r
+ *  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT \r
+ *  LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
+ *  DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\r
+ *  THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT \r
+ *  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE \r
+ *  OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
+ *\r
+*/\r
+\r
+#include "SLMP.h"\r
+#include <stdint.h>\r
+#include "string.h"\r
+\r
+static unsigned int uiHeaderLength[]           = {  6,  2,  6,  2, 12,  4, 12,  4};\r
+static unsigned int uiDataAddr[]                       = { 15, 11, 19, 15, 30, 22, 38, 30};\r
+\r
+/* A Function for making packet stream from the SLMP_Info structure */\r
+int SLMP_MakePacketStream ( uint32_t ulFrameType, const SLMP_INFO *p, uint8_t *pucStream )\r
+{\r
+       int i = 0;\r
+       int iLength = 0;\r
+       int iIndex = 0;\r
+\r
+       if ( (p == NULL) || (pucStream == NULL) )\r
+       {\r
+               return SLMP_ERR_NG;\r
+       }\r
+\r
+       /*[ Request : Binary Mode, Single Transmission Type ]*/\r
+       if( (uint16_t)ulFrameType == SLMP_FTYPE_BIN_REQ_ST )\r
+       {\r
+               iIndex = SLMP_FTYPE_BIN_REQ_ST_INDEX;\r
+               iLength = (p->usDataLength)-uiHeaderLength[iIndex];\r
+               if ( iLength < 0 )\r
+               {\r
+                       return SLMP_ERR_NG;\r
+               }\r
+               else if ( iLength > 0 )\r
+               {\r
+                       if ( p->pucData == NULL )\r
+                       {\r
+                               return SLMP_ERR_NG;\r
+                       }\r
+               }\r
+\r
+               pucStream[ 0] = SHIFT_R8(SLMP_FTYPE_BIN_REQ_ST);\r
+               pucStream[ 1] = SHIFT_R0(SLMP_FTYPE_BIN_REQ_ST);\r
+               pucStream[ 2] = SHIFT_R0(p->usNetNumber);\r
+               pucStream[ 3] = SHIFT_R0(p->usNodeNumber);\r
+               pucStream[ 4] = SHIFT_R0(p->usProcNumber);\r
+               pucStream[ 5] = SHIFT_R8(p->usProcNumber);\r
+               pucStream[ 6] = 0x00;\r
+               pucStream[ 7] = SHIFT_R0(p->usDataLength);\r
+               pucStream[ 8] = SHIFT_R8(p->usDataLength);\r
+               pucStream[ 9] = SHIFT_R0(p->usTimer);\r
+               pucStream[10] = SHIFT_R8(p->usTimer);\r
+               pucStream[11] = SHIFT_R0(p->usCommand);\r
+               pucStream[12] = SHIFT_R8(p->usCommand);\r
+               pucStream[13] = SHIFT_R0(p->usSubCommand);\r
+               pucStream[14] = SHIFT_R8(p->usSubCommand);\r
+               for( i=0; i<iLength; i++ )\r
+               {\r
+                       pucStream[uiDataAddr[iIndex]+i] = p->pucData[i];\r
+               }\r
+               return SLMP_ERR_OK;\r
+       }\r
+\r
+       /*[ Response : Binary Mode, Single Transmission Type ]*/\r
+       else if( (uint16_t)ulFrameType == SLMP_FTYPE_BIN_RES_ST )\r
+       {\r
+               iIndex = SLMP_FTYPE_BIN_RES_ST_INDEX;\r
+               iLength = (p->usDataLength)-uiHeaderLength[iIndex]+2;\r
+               if ( iLength < 0 )\r
+               {\r
+                       return SLMP_ERR_NG;\r
+               }\r
+               else if ( iLength > 0 )\r
+               {\r
+                       if ( p->pucData == NULL )\r
+                       {\r
+                               return SLMP_ERR_NG;\r
+                       }\r
+               }\r
+\r
+               pucStream[ 0] = SHIFT_R8(SLMP_FTYPE_BIN_RES_ST);\r
+               pucStream[ 1] = SHIFT_R0(SLMP_FTYPE_BIN_RES_ST);\r
+               pucStream[ 2] = SHIFT_R0(p->usNetNumber);\r
+               pucStream[ 3] = SHIFT_R0(p->usNodeNumber);\r
+               pucStream[ 4] = SHIFT_R0(p->usProcNumber);\r
+               pucStream[ 5] = SHIFT_R8(p->usProcNumber);\r
+               pucStream[ 6] = 0x00;\r
+               pucStream[ 7] = SHIFT_R0(p->usDataLength+2);\r
+               pucStream[ 8] = SHIFT_R8(p->usDataLength+2);\r
+               pucStream[ 9] = SHIFT_R0(p->usEndCode);\r
+               pucStream[10] = SHIFT_R8(p->usEndCode);\r
+\r
+               for( i=0; i<iLength+2; i++ )\r
+               {\r
+                       pucStream[uiDataAddr[iIndex]+i] = p->pucData[i];\r
+               }\r
+               return SLMP_ERR_OK;\r
+       }\r
+\r
+       /*[ Request : Binary Mode, Multiple Transmission Type ]*/\r
+       else if( (uint16_t)ulFrameType == SLMP_FTYPE_BIN_REQ_MT )\r
+       {\r
+               iIndex = SLMP_FTYPE_BIN_REQ_MT_INDEX;\r
+               iLength = (p->usDataLength)-uiHeaderLength[iIndex];\r
+               if ( iLength < 0 )\r
+               {\r
+                       return SLMP_ERR_NG;\r
+               }\r
+               else if ( iLength > 0 )\r
+               {\r
+                       if ( p->pucData == NULL )\r
+                       {\r
+                               return SLMP_ERR_NG;\r
+                       }\r
+               }\r
+\r
+               pucStream[ 0] = SHIFT_R8(SLMP_FTYPE_BIN_REQ_MT);\r
+               pucStream[ 1] = SHIFT_R0(SLMP_FTYPE_BIN_REQ_MT);\r
+               pucStream[ 2] = SHIFT_R0(p->usSerialNumber);\r
+               pucStream[ 3] = SHIFT_R8(p->usSerialNumber);\r
+               pucStream[ 4] = 0x00;\r
+               pucStream[ 5] = 0x00;\r
+               pucStream[ 6] = SHIFT_R0(p->usNetNumber);\r
+               pucStream[ 7] = SHIFT_R0(p->usNodeNumber);\r
+               pucStream[ 8] = SHIFT_R0(p->usProcNumber);\r
+               pucStream[ 9] = SHIFT_R8(p->usProcNumber);\r
+               pucStream[10] = 0x00;\r
+               pucStream[11] = SHIFT_R0(p->usDataLength);\r
+               pucStream[12] = SHIFT_R8(p->usDataLength);\r
+               pucStream[13] = SHIFT_R0(p->usTimer);\r
+               pucStream[14] = SHIFT_R8(p->usTimer);\r
+               pucStream[15] = SHIFT_R0(p->usCommand);\r
+               pucStream[16] = SHIFT_R8(p->usCommand);\r
+               pucStream[17] = SHIFT_R0(p->usSubCommand);\r
+               pucStream[18] = SHIFT_R8(p->usSubCommand);\r
+\r
+               for( i=0; i<iLength; i++ )\r
+               {\r
+                       pucStream[uiDataAddr[iIndex]+i] = p->pucData[i];\r
+               }\r
+               return SLMP_ERR_OK;\r
+       }\r
+\r
+       /*[ Response : Binary Mode, Multiple Transmission Type ]*/\r
+       else if( (uint16_t)ulFrameType == SLMP_FTYPE_BIN_RES_MT )\r
+       {\r
+               iIndex = SLMP_FTYPE_BIN_RES_MT_INDEX;\r
+               iLength = (p->usDataLength)-uiHeaderLength[iIndex]+2;\r
+               if ( iLength < 0 )\r
+               {\r
+                       return SLMP_ERR_NG;\r
+               }\r
+               else if ( iLength > 0 )\r
+               {\r
+                       if ( p->pucData == NULL )\r
+                       {\r
+                               return SLMP_ERR_NG;\r
+                       }\r
+               }\r
+\r
+               pucStream[ 0] = SHIFT_R8(SLMP_FTYPE_BIN_RES_MT);\r
+               pucStream[ 1] = SHIFT_R0(SLMP_FTYPE_BIN_RES_MT);\r
+               pucStream[ 2] = SHIFT_R0(p->usSerialNumber);\r
+               pucStream[ 3] = SHIFT_R8(p->usSerialNumber);\r
+               pucStream[ 4] = 0x00;\r
+               pucStream[ 5] = 0x00;\r
+               pucStream[ 6] = SHIFT_R0(p->usNetNumber);\r
+               pucStream[ 7] = SHIFT_R0(p->usNodeNumber);\r
+               pucStream[ 8] = SHIFT_R0(p->usProcNumber);\r
+               pucStream[ 9] = SHIFT_R8(p->usProcNumber);\r
+               pucStream[10] = 0x00;\r
+               pucStream[11] = SHIFT_R0(p->usDataLength+2);\r
+               pucStream[12] = SHIFT_R8(p->usDataLength+2);\r
+               pucStream[13] = SHIFT_R0(p->usEndCode);\r
+               pucStream[14] = SHIFT_R8(p->usEndCode);\r
+\r
+               for( i=0; i<iLength+2; i++ )\r
+               {\r
+                       pucStream[uiDataAddr[iIndex]+i] = p->pucData[i];\r
+               }\r
+               return SLMP_ERR_OK;\r
+       }\r
+\r
+       /*[ Request : ASCII Mode, Single Transmission Type ]*/\r
+       else if( ulFrameType == SLMP_FTYPE_ASCII_REQ_ST )\r
+       {\r
+               iIndex = SLMP_FTYPE_ASCII_REQ_ST_INDEX;\r
+               iLength = (p->usDataLength)-uiHeaderLength[iIndex];\r
+               if ( iLength < 0 )\r
+               {\r
+                       return SLMP_ERR_NG;\r
+               }\r
+               else if ( iLength > 0 )\r
+               {\r
+                       if ( p->pucData == NULL )\r
+                       {\r
+                               return SLMP_ERR_NG;\r
+                       }\r
+               }\r
+\r
+               pucStream[ 0] = SHIFT_R24(SLMP_FTYPE_ASCII_REQ_ST);\r
+               pucStream[ 1] = SHIFT_R16(SLMP_FTYPE_ASCII_REQ_ST);\r
+               pucStream[ 2] = SHIFT_R8 (SLMP_FTYPE_ASCII_REQ_ST);\r
+               pucStream[ 3] = SHIFT_R0 (SLMP_FTYPE_ASCII_REQ_ST);\r
+               pucStream[ 4] = local_itoa(SHIFT_R4(p->usNetNumber) & MASK_LOWER4BIT);\r
+               pucStream[ 5] = local_itoa(SHIFT_R0(p->usNetNumber) & MASK_LOWER4BIT);\r
+               pucStream[ 6] = local_itoa(SHIFT_R4(p->usNodeNumber) & MASK_LOWER4BIT);\r
+               pucStream[ 7] = local_itoa(SHIFT_R0(p->usNodeNumber) & MASK_LOWER4BIT);\r
+               pucStream[ 8] = local_itoa(SHIFT_R12(p->usProcNumber) & MASK_LOWER4BIT);\r
+               pucStream[ 9] = local_itoa(SHIFT_R8 (p->usProcNumber) & MASK_LOWER4BIT);\r
+               pucStream[10] = local_itoa(SHIFT_R4 (p->usProcNumber) & MASK_LOWER4BIT);\r
+               pucStream[11] = local_itoa(SHIFT_R0 (p->usProcNumber) & MASK_LOWER4BIT);\r
+               pucStream[12] = local_itoa(0x00);\r
+               pucStream[13] = local_itoa(0x00);\r
+               pucStream[14] = local_itoa(SHIFT_R12(p->usDataLength) & MASK_LOWER4BIT);\r
+               pucStream[15] = local_itoa(SHIFT_R8 (p->usDataLength) & MASK_LOWER4BIT);\r
+               pucStream[16] = local_itoa(SHIFT_R4 (p->usDataLength) & MASK_LOWER4BIT);\r
+               pucStream[17] = local_itoa(SHIFT_R0 (p->usDataLength) & MASK_LOWER4BIT);\r
+               pucStream[18] = local_itoa(SHIFT_R12(p->usTimer) & MASK_LOWER4BIT);\r
+               pucStream[19] = local_itoa(SHIFT_R8 (p->usTimer) & MASK_LOWER4BIT);\r
+               pucStream[20] = local_itoa(SHIFT_R4 (p->usTimer) & MASK_LOWER4BIT);\r
+               pucStream[21] = local_itoa(SHIFT_R0 (p->usTimer) & MASK_LOWER4BIT);\r
+               pucStream[22] = local_itoa(SHIFT_R12(p->usCommand) & MASK_LOWER4BIT);\r
+               pucStream[23] = local_itoa(SHIFT_R8 (p->usCommand) & MASK_LOWER4BIT);\r
+               pucStream[24] = local_itoa(SHIFT_R4 (p->usCommand) & MASK_LOWER4BIT);\r
+               pucStream[25] = local_itoa(SHIFT_R0 (p->usCommand) & MASK_LOWER4BIT);\r
+               pucStream[26] = local_itoa(SHIFT_R12(p->usSubCommand) & MASK_LOWER4BIT);\r
+               pucStream[27] = local_itoa(SHIFT_R8 (p->usSubCommand) & MASK_LOWER4BIT);\r
+               pucStream[28] = local_itoa(SHIFT_R4 (p->usSubCommand) & MASK_LOWER4BIT);\r
+               pucStream[29] = local_itoa(SHIFT_R0 (p->usSubCommand) & MASK_LOWER4BIT);\r
+\r
+               for( i=0; i<iLength; i++ )\r
+               {\r
+                       pucStream[uiDataAddr[iIndex]+i] = p->pucData[i];\r
+               }\r
+               return SLMP_ERR_OK;\r
+       }\r
+\r
+       /*[ Response : ASCII Mode, Single Transmission Type ]*/\r
+       else if( ulFrameType == SLMP_FTYPE_ASCII_RES_ST )\r
+       {\r
+               iIndex = SLMP_FTYPE_ASCII_RES_ST_INDEX;\r
+               iLength = (p->usDataLength)-uiHeaderLength[iIndex]+4;\r
+               if ( iLength < 0 )\r
+               {\r
+                       return SLMP_ERR_NG;\r
+               }\r
+               else if ( iLength > 0 )\r
+               {\r
+                       if ( p->pucData == NULL )\r
+                       {\r
+                               return SLMP_ERR_NG;\r
+                       }\r
+               }\r
+\r
+               pucStream[ 0] = SHIFT_R24(SLMP_FTYPE_ASCII_RES_ST);\r
+               pucStream[ 1] = SHIFT_R16(SLMP_FTYPE_ASCII_RES_ST);\r
+               pucStream[ 2] = SHIFT_R8 (SLMP_FTYPE_ASCII_RES_ST);\r
+               pucStream[ 3] = SHIFT_R0 (SLMP_FTYPE_ASCII_RES_ST);\r
+               pucStream[ 4] = local_itoa(SHIFT_R4(p->usNetNumber) & MASK_LOWER4BIT);\r
+               pucStream[ 5] = local_itoa(SHIFT_R0(p->usNetNumber) & MASK_LOWER4BIT);\r
+               pucStream[ 6] = local_itoa(SHIFT_R4(p->usNodeNumber) & MASK_LOWER4BIT);\r
+               pucStream[ 7] = local_itoa(SHIFT_R0(p->usNodeNumber) & MASK_LOWER4BIT);\r
+               pucStream[ 8] = local_itoa(SHIFT_R12(p->usProcNumber) & MASK_LOWER4BIT);\r
+               pucStream[ 9] = local_itoa(SHIFT_R8 (p->usProcNumber) & MASK_LOWER4BIT);\r
+               pucStream[10] = local_itoa(SHIFT_R4 (p->usProcNumber) & MASK_LOWER4BIT);\r
+               pucStream[11] = local_itoa(SHIFT_R0 (p->usProcNumber) & MASK_LOWER4BIT);\r
+               pucStream[12] = local_itoa(0x00);\r
+               pucStream[13] = local_itoa(0x00);\r
+               pucStream[14] = local_itoa(SHIFT_R12(p->usDataLength+4) & MASK_LOWER4BIT);\r
+               pucStream[15] = local_itoa(SHIFT_R8 (p->usDataLength+4) & MASK_LOWER4BIT);\r
+               pucStream[16] = local_itoa(SHIFT_R4 (p->usDataLength+4) & MASK_LOWER4BIT);\r
+               pucStream[17] = local_itoa(SHIFT_R0 (p->usDataLength+4) & MASK_LOWER4BIT);\r
+               pucStream[18] = local_itoa(SHIFT_R12(p->usEndCode) & MASK_LOWER4BIT);\r
+               pucStream[19] = local_itoa(SHIFT_R8 (p->usEndCode) & MASK_LOWER4BIT);\r
+               pucStream[20] = local_itoa(SHIFT_R4 (p->usEndCode) & MASK_LOWER4BIT);\r
+               pucStream[21] = local_itoa(SHIFT_R0 (p->usEndCode) & MASK_LOWER4BIT);\r
+\r
+               for( i=0; i<iLength+4; i++ )\r
+               {\r
+                       pucStream[uiDataAddr[iIndex]+i] = p->pucData[i];\r
+               }\r
+               return SLMP_ERR_OK;\r
+       }\r
+\r
+       /*[ Request : ASCII Mode, Multiple Transmission Type ]*/\r
+       else if( ulFrameType == SLMP_FTYPE_ASCII_REQ_MT )\r
+       {\r
+               iIndex = SLMP_FTYPE_ASCII_REQ_MT_INDEX;\r
+               iLength = (p->usDataLength)-uiHeaderLength[iIndex];\r
+               if ( iLength < 0 )\r
+               {\r
+                       return SLMP_ERR_NG;\r
+               }\r
+               else if ( iLength > 0 )\r
+               {\r
+                       if ( p->pucData == NULL )\r
+                       {\r
+                               return SLMP_ERR_NG;\r
+                       }\r
+               }\r
+\r
+               pucStream[ 0] = SHIFT_R24(SLMP_FTYPE_ASCII_REQ_MT);\r
+               pucStream[ 1] = SHIFT_R16(SLMP_FTYPE_ASCII_REQ_MT);\r
+               pucStream[ 2] = SHIFT_R8 (SLMP_FTYPE_ASCII_REQ_MT);\r
+               pucStream[ 3] = SHIFT_R0 (SLMP_FTYPE_ASCII_REQ_MT);\r
+               pucStream[ 4] = local_itoa(SHIFT_R12(p->usSerialNumber) & MASK_LOWER4BIT);\r
+               pucStream[ 5] = local_itoa(SHIFT_R8 (p->usSerialNumber) & MASK_LOWER4BIT);\r
+               pucStream[ 6] = local_itoa(SHIFT_R4 (p->usSerialNumber) & MASK_LOWER4BIT);\r
+               pucStream[ 7] = local_itoa(SHIFT_R0 (p->usSerialNumber) & MASK_LOWER4BIT);\r
+               pucStream[ 8] = local_itoa(0x00);\r
+               pucStream[ 9] = local_itoa(0x00);\r
+               pucStream[10] = local_itoa(0x00);\r
+               pucStream[11] = local_itoa(0x00);\r
+               pucStream[12] = local_itoa(SHIFT_R4(p->usNetNumber) & MASK_LOWER4BIT);\r
+               pucStream[13] = local_itoa(SHIFT_R0(p->usNetNumber) & MASK_LOWER4BIT);\r
+               pucStream[14] = local_itoa(SHIFT_R4(p->usNodeNumber) & MASK_LOWER4BIT);\r
+               pucStream[15] = local_itoa(SHIFT_R0(p->usNodeNumber) & MASK_LOWER4BIT);\r
+               pucStream[16] = local_itoa(SHIFT_R12(p->usProcNumber) & MASK_LOWER4BIT);\r
+               pucStream[17] = local_itoa(SHIFT_R8 (p->usProcNumber) & MASK_LOWER4BIT);\r
+               pucStream[18] = local_itoa(SHIFT_R4 (p->usProcNumber) & MASK_LOWER4BIT);\r
+               pucStream[19] = local_itoa(SHIFT_R0 (p->usProcNumber) & MASK_LOWER4BIT);\r
+               pucStream[20] = local_itoa(0x00);\r
+               pucStream[21] = local_itoa(0x00);\r
+               pucStream[22] = local_itoa(SHIFT_R12(p->usDataLength) & MASK_LOWER4BIT);\r
+               pucStream[23] = local_itoa(SHIFT_R8 (p->usDataLength) & MASK_LOWER4BIT);\r
+               pucStream[24] = local_itoa(SHIFT_R4 (p->usDataLength) & MASK_LOWER4BIT);\r
+               pucStream[25] = local_itoa(SHIFT_R0 (p->usDataLength) & MASK_LOWER4BIT);\r
+               pucStream[26] = local_itoa(SHIFT_R12(p->usTimer) & MASK_LOWER4BIT);\r
+               pucStream[27] = local_itoa(SHIFT_R8 (p->usTimer) & MASK_LOWER4BIT);\r
+               pucStream[28] = local_itoa(SHIFT_R4 (p->usTimer) & MASK_LOWER4BIT);\r
+               pucStream[29] = local_itoa(SHIFT_R0 (p->usTimer) & MASK_LOWER4BIT);\r
+               pucStream[30] = local_itoa(SHIFT_R12(p->usCommand) & MASK_LOWER4BIT);\r
+               pucStream[31] = local_itoa(SHIFT_R8 (p->usCommand) & MASK_LOWER4BIT);\r
+               pucStream[32] = local_itoa(SHIFT_R4 (p->usCommand) & MASK_LOWER4BIT);\r
+               pucStream[33] = local_itoa(SHIFT_R0 (p->usCommand) & MASK_LOWER4BIT);\r
+               pucStream[34] = local_itoa(SHIFT_R12(p->usSubCommand) & MASK_LOWER4BIT);\r
+               pucStream[35] = local_itoa(SHIFT_R8 (p->usSubCommand) & MASK_LOWER4BIT);\r
+               pucStream[36] = local_itoa(SHIFT_R4 (p->usSubCommand) & MASK_LOWER4BIT);\r
+               pucStream[37] = local_itoa(SHIFT_R0 (p->usSubCommand) & MASK_LOWER4BIT);\r
+\r
+               for( i=0; i<iLength; i++ )\r
+               {\r
+                       pucStream[uiDataAddr[iIndex]+i] = p->pucData[i];\r
+               }\r
+               return SLMP_ERR_OK;\r
+       }\r
+\r
+       /*[ Response : ASCII Mode, Multiple Transmission Type ]*/\r
+       else if( ulFrameType == SLMP_FTYPE_ASCII_RES_MT )\r
+       {\r
+               iIndex = SLMP_FTYPE_ASCII_RES_MT_INDEX;\r
+               iLength = (p->usDataLength)-uiHeaderLength[iIndex]+4;\r
+               if ( iLength < 0 )\r
+               {\r
+                       return SLMP_ERR_NG;\r
+               }\r
+               else if ( iLength > 0 )\r
+               {\r
+                       if ( p->pucData == NULL )\r
+                       {\r
+                               return SLMP_ERR_NG;\r
+                       }\r
+               }\r
+\r
+               pucStream[ 0] = SHIFT_R24(SLMP_FTYPE_ASCII_RES_MT);\r
+               pucStream[ 1] = SHIFT_R16(SLMP_FTYPE_ASCII_RES_MT);\r
+               pucStream[ 2] = SHIFT_R8 (SLMP_FTYPE_ASCII_RES_MT);\r
+               pucStream[ 3] = SHIFT_R0 (SLMP_FTYPE_ASCII_RES_MT);\r
+               pucStream[ 4] = local_itoa(SHIFT_R12(p->usSerialNumber) & MASK_LOWER4BIT);\r
+               pucStream[ 5] = local_itoa(SHIFT_R8 (p->usSerialNumber) & MASK_LOWER4BIT);\r
+               pucStream[ 6] = local_itoa(SHIFT_R4 (p->usSerialNumber) & MASK_LOWER4BIT);\r
+               pucStream[ 7] = local_itoa(SHIFT_R0 (p->usSerialNumber) & MASK_LOWER4BIT);\r
+               pucStream[ 8] = local_itoa(0x00);\r
+               pucStream[ 9] = local_itoa(0x00);\r
+               pucStream[10] = local_itoa(0x00);\r
+               pucStream[11] = local_itoa(0x00);\r
+               pucStream[12] = local_itoa(SHIFT_R4(p->usNetNumber) & MASK_LOWER4BIT);\r
+               pucStream[13] = local_itoa(SHIFT_R0(p->usNetNumber) & MASK_LOWER4BIT);\r
+               pucStream[14] = local_itoa(SHIFT_R4(p->usNodeNumber) & MASK_LOWER4BIT);\r
+               pucStream[15] = local_itoa(SHIFT_R0(p->usNodeNumber) & MASK_LOWER4BIT);\r
+               pucStream[16] = local_itoa(SHIFT_R12(p->usProcNumber) & MASK_LOWER4BIT);\r
+               pucStream[17] = local_itoa(SHIFT_R8 (p->usProcNumber) & MASK_LOWER4BIT);\r
+               pucStream[18] = local_itoa(SHIFT_R4 (p->usProcNumber) & MASK_LOWER4BIT);\r
+               pucStream[19] = local_itoa(SHIFT_R0 (p->usProcNumber) & MASK_LOWER4BIT);\r
+               pucStream[20] = local_itoa(0x00);\r
+               pucStream[21] = local_itoa(0x00);\r
+               pucStream[22] = local_itoa(SHIFT_R12(p->usDataLength+4) & MASK_LOWER4BIT);\r
+               pucStream[23] = local_itoa(SHIFT_R8 (p->usDataLength+4) & MASK_LOWER4BIT);\r
+               pucStream[24] = local_itoa(SHIFT_R4 (p->usDataLength+4) & MASK_LOWER4BIT);\r
+               pucStream[25] = local_itoa(SHIFT_R0 (p->usDataLength+4) & MASK_LOWER4BIT);\r
+               pucStream[26] = local_itoa(SHIFT_R12(p->usEndCode) & MASK_LOWER4BIT);\r
+               pucStream[27] = local_itoa(SHIFT_R8 (p->usEndCode) & MASK_LOWER4BIT);\r
+               pucStream[28] = local_itoa(SHIFT_R4 (p->usEndCode) & MASK_LOWER4BIT);\r
+               pucStream[29] = local_itoa(SHIFT_R0 (p->usEndCode) & MASK_LOWER4BIT);\r
+\r
+               for( i=0; i<iLength+4; i++ )\r
+               {\r
+                       pucStream[uiDataAddr[iIndex]+i] = p->pucData[i];\r
+               }\r
+               return SLMP_ERR_OK;\r
+       }\r
+\r
+       return SLMP_ERR_NG;\r
+}\r
+\r
+/* A Function for getting SLMP_Info from packet stream */\r
+int SLMP_GetSlmpInfo ( SLMP_INFO *p, const uint8_t *pucStream )\r
+{\r
+       int i = 0;\r
+       int iIndex = 0;\r
+       int iLength = 0;\r
+       unsigned int uiTempLength = 0;\r
+       unsigned int uiTemp0 = 0, uiTemp1 = 0, uiTemp2 = 0, uiTemp3 = 0;\r
+       uint16_t        usFrameType = 0;\r
+       uint32_t        ulFrameType = 0;\r
+\r
+       if ( (p == NULL) || (pucStream == NULL) )\r
+       {\r
+               return SLMP_ERR_NG;\r
+       }\r
+\r
+       usFrameType = CONCAT_2BIN(pucStream[0], pucStream[1]);\r
+\r
+       (p->ulFrameType) = usFrameType;\r
+\r
+       /*[ Request : Binary Mode, Single Transmission Type ]*/\r
+       if( usFrameType == SLMP_FTYPE_BIN_REQ_ST )\r
+       {\r
+               iIndex = SLMP_FTYPE_BIN_REQ_ST_INDEX;\r
+               uiTempLength = CONCAT_2BIN(pucStream[ 8], pucStream[ 7]);\r
+\r
+               iLength = uiTempLength - uiHeaderLength[iIndex];\r
+               if ( iLength < 0 )\r
+               {\r
+                       return SLMP_ERR_NG;\r
+               }\r
+               else if ( iLength > 0 )\r
+               {\r
+                       if ( p->pucData == NULL )\r
+                       {\r
+                               return SLMP_ERR_NG;\r
+                       }\r
+               }\r
+\r
+               (p->usNetNumber)        = pucStream[2];\r
+               (p->usNodeNumber)       = pucStream[3];\r
+               (p->usProcNumber)       = CONCAT_2BIN(pucStream[ 5], pucStream[ 4]);\r
+               (p->usDataLength)       = (uint16_t)uiTempLength;\r
+               (p->usTimer)            = CONCAT_2BIN(pucStream[10], pucStream[ 9]);\r
+               (p->usCommand)          = CONCAT_2BIN(pucStream[12], pucStream[11]);\r
+               (p->usSubCommand)       = CONCAT_2BIN(pucStream[14], pucStream[13]);\r
+\r
+               for( i=0; i<iLength; i++ )\r
+               {\r
+                       p->pucData[i] = pucStream[uiDataAddr[iIndex]+i];\r
+               }\r
+\r
+               return SLMP_ERR_OK;\r
+       }\r
+\r
+       /*[ Response : Binary Mode, Single Transmission Type ]*/\r
+       else if( usFrameType == SLMP_FTYPE_BIN_RES_ST )\r
+       {\r
+               iIndex = SLMP_FTYPE_BIN_RES_ST_INDEX;\r
+               uiTempLength = CONCAT_2BIN(pucStream[ 8], pucStream[ 7]);\r
+\r
+               iLength = uiTempLength - uiHeaderLength[iIndex];\r
+               if ( iLength < 0 )\r
+               {\r
+                       return SLMP_ERR_NG;\r
+               }\r
+               else if ( iLength > 0 )\r
+               {\r
+                       if ( p->pucData == NULL )\r
+                       {\r
+                               return SLMP_ERR_NG;\r
+                       }\r
+               }\r
+\r
+               (p->usNetNumber)        = pucStream[2];\r
+               (p->usNodeNumber)       = pucStream[3];\r
+               (p->usProcNumber)       = CONCAT_2BIN(pucStream[ 5], pucStream[ 4]);\r
+               (p->usDataLength)       = (uint16_t)uiTempLength;\r
+               (p->usEndCode)          = CONCAT_2BIN(pucStream[10], pucStream[ 9]);\r
+\r
+               for( i=0; i<iLength; i++ )\r
+               {\r
+                       p->pucData[i] = pucStream[uiDataAddr[iIndex]+i];\r
+               }\r
+\r
+               return SLMP_ERR_OK;\r
+       }\r
+\r
+       /*[ Request : Binary Mode, Multiple Transmission Type ]*/\r
+       else if( usFrameType == SLMP_FTYPE_BIN_REQ_MT )\r
+       {\r
+               iIndex = SLMP_FTYPE_BIN_REQ_MT_INDEX;\r
+               uiTempLength = CONCAT_2BIN(pucStream[12], pucStream[11]);\r
+\r
+               iLength = uiTempLength - uiHeaderLength[iIndex];\r
+               if ( iLength < 0 )\r
+               {\r
+                       return SLMP_ERR_NG;\r
+               }\r
+               else if ( iLength > 0 )\r
+               {\r
+                       if ( p->pucData == NULL )\r
+                       {\r
+                               return SLMP_ERR_NG;\r
+                       }\r
+               }\r
+\r
+               (p->usSerialNumber)     = CONCAT_2BIN(pucStream[3], pucStream[2]);\r
+               (p->usNetNumber)        = pucStream[6];\r
+               (p->usNodeNumber)       = pucStream[7];\r
+               (p->usProcNumber)       = CONCAT_2BIN(pucStream[ 9], pucStream[ 8]);\r
+               (p->usDataLength)       = (uint16_t)uiTempLength;\r
+               (p->usTimer)            = CONCAT_2BIN(pucStream[14], pucStream[13]);\r
+               (p->usCommand)          = CONCAT_2BIN(pucStream[16], pucStream[15]);\r
+               (p->usSubCommand)       = CONCAT_2BIN(pucStream[18], pucStream[17]);\r
+\r
+               for( i=0; i<iLength; i++ )\r
+               {\r
+                       p->pucData[i] = pucStream[uiDataAddr[iIndex]+i];\r
+               }\r
+\r
+               return SLMP_ERR_OK;\r
+       }\r
+\r
+       /*[ Response : Binary Mode, Multiple Transmission Type ]*/\r
+       else if( usFrameType == SLMP_FTYPE_BIN_RES_MT )\r
+       {\r
+               iIndex = SLMP_FTYPE_BIN_RES_MT_INDEX;\r
+               uiTempLength = CONCAT_2BIN(pucStream[12], pucStream[11]);\r
+\r
+               iLength = uiTempLength - uiHeaderLength[iIndex];\r
+               if ( iLength < 0 )\r
+               {\r
+                       return SLMP_ERR_NG;\r
+               }\r
+               else if ( iLength > 0 )\r
+               {\r
+                       if ( p->pucData == NULL )\r
+                       {\r
+                               return SLMP_ERR_NG;\r
+                       }\r
+               }\r
+\r
+               (p->usSerialNumber)     = CONCAT_2BIN(pucStream[3], pucStream[2]);\r
+               (p->usNetNumber)        = pucStream[6];\r
+               (p->usNodeNumber)       = pucStream[7];\r
+               (p->usProcNumber)       = CONCAT_2BIN(pucStream[ 9], pucStream[ 8]);\r
+               (p->usDataLength)       = (uint16_t)uiTempLength;\r
+               (p->usEndCode)          = CONCAT_2BIN(pucStream[14], pucStream[13]);\r
+\r
+               for( i=0; i<iLength; i++ )\r
+               {\r
+                       p->pucData[i] = pucStream[uiDataAddr[iIndex]+i];\r
+               }\r
+\r
+               return SLMP_ERR_OK;\r
+       }\r
+\r
+       ulFrameType = CONCAT_4BIN(pucStream[0], pucStream[1], pucStream[2], pucStream[3]);\r
+\r
+       (p->ulFrameType) = ulFrameType;\r
+\r
+       /*[ Request : ASCII Mode, Single Transmission Type ]*/\r
+       if( ulFrameType == SLMP_FTYPE_ASCII_REQ_ST )\r
+       {\r
+               iIndex = SLMP_FTYPE_ASCII_REQ_ST_INDEX;\r
+               uiTemp0 = local_atoi(pucStream[14]);\r
+               uiTemp1 = local_atoi(pucStream[15]);\r
+               uiTemp2 = local_atoi(pucStream[16]);\r
+               uiTemp3 = local_atoi(pucStream[17]);\r
+               uiTempLength = CONCAT_4ASCII(uiTemp0, uiTemp1, uiTemp2, uiTemp3);\r
+\r
+               iLength = uiTempLength - uiHeaderLength[iIndex];\r
+               if ( iLength < 0 )\r
+               {\r
+                       return SLMP_ERR_NG;\r
+               }\r
+               else if ( iLength > 0 )\r
+               {\r
+                       if ( p->pucData == NULL )\r
+                       {\r
+                               return SLMP_ERR_NG;\r
+                       }\r
+               }\r
+\r
+               uiTemp0 = local_atoi(pucStream[ 4]);\r
+               uiTemp1 = local_atoi(pucStream[ 5]);\r
+               (p->usNetNumber)        = (uint16_t)CONCAT_2ASCII(uiTemp0, uiTemp1);\r
+\r
+               uiTemp0 = local_atoi(pucStream[ 6]);\r
+               uiTemp1 = local_atoi(pucStream[ 7]);\r
+               (p->usNodeNumber)       = (uint16_t)CONCAT_2ASCII(uiTemp0, uiTemp1);\r
+\r
+               uiTemp0 = local_atoi(pucStream[ 8]);\r
+               uiTemp1 = local_atoi(pucStream[ 9]);\r
+               uiTemp2 = local_atoi(pucStream[10]);\r
+               uiTemp3 = local_atoi(pucStream[11]);\r
+               (p->usProcNumber)       = (uint16_t)CONCAT_4ASCII(uiTemp0, uiTemp1, uiTemp2, uiTemp3);\r
+\r
+               (p->usDataLength)       = (uint16_t)uiTempLength;\r
+\r
+               uiTemp0 = local_atoi(pucStream[18]);\r
+               uiTemp1 = local_atoi(pucStream[19]);\r
+               uiTemp2 = local_atoi(pucStream[20]);\r
+               uiTemp3 = local_atoi(pucStream[21]);\r
+               (p->usTimer)            = (uint16_t)CONCAT_4ASCII(uiTemp0, uiTemp1, uiTemp2, uiTemp3);\r
+\r
+               uiTemp0 = local_atoi(pucStream[22]);\r
+               uiTemp1 = local_atoi(pucStream[23]);\r
+               uiTemp2 = local_atoi(pucStream[24]);\r
+               uiTemp3 = local_atoi(pucStream[25]);\r
+               (p->usCommand)          = (uint16_t)CONCAT_4ASCII(uiTemp0, uiTemp1, uiTemp2, uiTemp3);\r
+\r
+               uiTemp0 = local_atoi(pucStream[26]);\r
+               uiTemp1 = local_atoi(pucStream[27]);\r
+               uiTemp2 = local_atoi(pucStream[28]);\r
+               uiTemp3 = local_atoi(pucStream[29]);\r
+               (p->usSubCommand)       = (uint16_t)CONCAT_4ASCII(uiTemp0, uiTemp1, uiTemp2, uiTemp3);\r
+\r
+               for( i=0; i<iLength; i++ )\r
+               {\r
+                       p->pucData[i] = pucStream[uiDataAddr[iIndex]+i];\r
+               }\r
+\r
+               return SLMP_ERR_OK;\r
+       }\r
+\r
+       /*[ Response : ASCII Mode, Single Transmission Type ]*/\r
+       else if( ulFrameType == SLMP_FTYPE_ASCII_RES_ST )\r
+       {\r
+               iIndex = SLMP_FTYPE_ASCII_RES_ST_INDEX;\r
+               uiTemp0 = local_atoi(pucStream[14]);\r
+               uiTemp1 = local_atoi(pucStream[15]);\r
+               uiTemp2 = local_atoi(pucStream[16]);\r
+               uiTemp3 = local_atoi(pucStream[17]);\r
+               uiTempLength = CONCAT_4ASCII(uiTemp0, uiTemp1, uiTemp2, uiTemp3);\r
+\r
+               iLength = uiTempLength - uiHeaderLength[iIndex];\r
+               if ( iLength < 0 )\r
+               {\r
+                       return SLMP_ERR_NG;\r
+               }\r
+               else if ( iLength > 0 )\r
+               {\r
+                       if ( p->pucData == NULL )\r
+                       {\r
+                               return SLMP_ERR_NG;\r
+                       }\r
+               }\r
+\r
+               uiTemp0 = local_atoi(pucStream[ 4]);\r
+               uiTemp1 = local_atoi(pucStream[ 5]);\r
+               (p->usNetNumber)        = (uint16_t)CONCAT_2ASCII(uiTemp0, uiTemp1);\r
+\r
+               uiTemp0 = local_atoi(pucStream[ 6]);\r
+               uiTemp1 = local_atoi(pucStream[ 7]);\r
+               (p->usNodeNumber)       = (uint16_t)CONCAT_2ASCII(uiTemp0, uiTemp1);\r
+\r
+               uiTemp0 = local_atoi(pucStream[ 8]);\r
+               uiTemp1 = local_atoi(pucStream[ 9]);\r
+               uiTemp2 = local_atoi(pucStream[10]);\r
+               uiTemp3 = local_atoi(pucStream[11]);\r
+               (p->usProcNumber)       = (uint16_t)CONCAT_4ASCII(uiTemp0, uiTemp1, uiTemp2, uiTemp3);\r
+\r
+               (p->usDataLength)       = (uint16_t)uiTempLength;\r
+\r
+               uiTemp0 = local_atoi(pucStream[18]);\r
+               uiTemp1 = local_atoi(pucStream[19]);\r
+               uiTemp2 = local_atoi(pucStream[20]);\r
+               uiTemp3 = local_atoi(pucStream[21]);\r
+               (p->usEndCode)          = (uint16_t)CONCAT_4ASCII(uiTemp0, uiTemp1, uiTemp2, uiTemp3);\r
+\r
+               for( i=0; i<iLength; i++ )\r
+               {\r
+                       p->pucData[i] = pucStream[uiDataAddr[iIndex]+i];\r
+               }\r
+\r
+               return SLMP_ERR_OK;\r
+       }\r
+\r
+       /*[ Request : ASCII Mode, Multiple Transmission Type ]*/\r
+       else if( ulFrameType == SLMP_FTYPE_ASCII_REQ_MT )\r
+       {\r
+               iIndex = SLMP_FTYPE_ASCII_REQ_MT_INDEX;\r
+               uiTemp0 = local_atoi(pucStream[22]);\r
+               uiTemp1 = local_atoi(pucStream[23]);\r
+               uiTemp2 = local_atoi(pucStream[24]);\r
+               uiTemp3 = local_atoi(pucStream[25]);\r
+               uiTempLength = CONCAT_4ASCII(uiTemp0, uiTemp1, uiTemp2, uiTemp3);\r
+\r
+               iLength = uiTempLength - uiHeaderLength[iIndex];\r
+               if ( iLength < 0 )\r
+               {\r
+                       return SLMP_ERR_NG;\r
+               }\r
+               else if ( iLength > 0 )\r
+               {\r
+                       if ( p->pucData == NULL )\r
+                       {\r
+                               return SLMP_ERR_NG;\r
+                       }\r
+               }\r
+\r
+               uiTemp0 = local_atoi(pucStream[ 4]);\r
+               uiTemp1 = local_atoi(pucStream[ 5]);\r
+               uiTemp2 = local_atoi(pucStream[ 6]);\r
+               uiTemp3 = local_atoi(pucStream[ 7]);\r
+               (p->usSerialNumber)     = (uint16_t)CONCAT_4ASCII(uiTemp0, uiTemp1, uiTemp2, uiTemp3);\r
+\r
+               uiTemp0 = local_atoi(pucStream[12]);\r
+               uiTemp1 = local_atoi(pucStream[13]);\r
+               (p->usNetNumber)        = (uint16_t)CONCAT_2ASCII(uiTemp0, uiTemp1);\r
+\r
+               uiTemp0 = local_atoi(pucStream[14]);\r
+               uiTemp1 = local_atoi(pucStream[15]);\r
+               (p->usNodeNumber)       = (uint16_t)CONCAT_2ASCII(uiTemp0, uiTemp1);\r
+\r
+               uiTemp0 = local_atoi(pucStream[16]);\r
+               uiTemp1 = local_atoi(pucStream[17]);\r
+               uiTemp2 = local_atoi(pucStream[18]);\r
+               uiTemp3 = local_atoi(pucStream[19]);\r
+               (p->usProcNumber)       = (uint16_t)CONCAT_4ASCII(uiTemp0, uiTemp1, uiTemp2, uiTemp3);\r
+\r
+               (p->usDataLength)       = (uint16_t)uiTempLength;\r
+\r
+               uiTemp0 = local_atoi(pucStream[26]);\r
+               uiTemp1 = local_atoi(pucStream[27]);\r
+               uiTemp2 = local_atoi(pucStream[28]);\r
+               uiTemp3 = local_atoi(pucStream[29]);\r
+               (p->usTimer)            = (uint16_t)CONCAT_4ASCII(uiTemp0, uiTemp1, uiTemp2, uiTemp3);\r
+\r
+               uiTemp0 = local_atoi(pucStream[30]);\r
+               uiTemp1 = local_atoi(pucStream[31]);\r
+               uiTemp2 = local_atoi(pucStream[32]);\r
+               uiTemp3 = local_atoi(pucStream[33]);\r
+               (p->usCommand)          = (uint16_t)CONCAT_4ASCII(uiTemp0, uiTemp1, uiTemp2, uiTemp3);\r
+\r
+               uiTemp0 = local_atoi(pucStream[34]);\r
+               uiTemp1 = local_atoi(pucStream[35]);\r
+               uiTemp2 = local_atoi(pucStream[36]);\r
+               uiTemp3 = local_atoi(pucStream[37]);\r
+               (p->usSubCommand)       = (uint16_t)CONCAT_4ASCII(uiTemp0, uiTemp1, uiTemp2, uiTemp3);\r
+\r
+               for( i=0; i<iLength; i++ )\r
+               {\r
+                       p->pucData[i] = pucStream[uiDataAddr[iIndex]+i];\r
+               }\r
+\r
+               return SLMP_ERR_OK;\r
+       }\r
+\r
+       /*[ Response : ASCII Mode, Multiple Transmission Type ]*/\r
+       else if( ulFrameType == SLMP_FTYPE_ASCII_RES_MT )\r
+       {\r
+               iIndex = SLMP_FTYPE_ASCII_RES_MT_INDEX;\r
+               uiTemp0 = local_atoi(pucStream[22]);\r
+               uiTemp1 = local_atoi(pucStream[23]);\r
+               uiTemp2 = local_atoi(pucStream[24]);\r
+               uiTemp3 = local_atoi(pucStream[25]);\r
+               uiTempLength = CONCAT_4ASCII(uiTemp0, uiTemp1, uiTemp2, uiTemp3);\r
+               \r
+               iLength = uiTempLength - uiHeaderLength[iIndex];\r
+               if ( iLength < 0 )\r
+               {\r
+                       return SLMP_ERR_NG;\r
+               }\r
+               else if ( iLength > 0 )\r
+               {\r
+                       if ( p->pucData == NULL )\r
+                       {\r
+                               return SLMP_ERR_NG;\r
+                       }\r
+               }\r
+\r
+               uiTemp0 = local_atoi(pucStream[ 4]);\r
+               uiTemp1 = local_atoi(pucStream[ 5]);\r
+               uiTemp2 = local_atoi(pucStream[ 6]);\r
+               uiTemp3 = local_atoi(pucStream[ 7]);\r
+               (p->usSerialNumber)     = (uint16_t)CONCAT_4ASCII(uiTemp0, uiTemp1, uiTemp2, uiTemp3);\r
+\r
+               uiTemp0 = local_atoi(pucStream[12]);\r
+               uiTemp1 = local_atoi(pucStream[13]);\r
+               (p->usNetNumber)        = (uint16_t)CONCAT_2ASCII(uiTemp0, uiTemp1);\r
+\r
+               uiTemp0 = local_atoi(pucStream[14]);\r
+               uiTemp1 = local_atoi(pucStream[15]);\r
+               (p->usNodeNumber)       = (uint16_t)CONCAT_2ASCII(uiTemp0, uiTemp1);\r
+\r
+               uiTemp0 = local_atoi(pucStream[16]);\r
+               uiTemp1 = local_atoi(pucStream[17]);\r
+               uiTemp2 = local_atoi(pucStream[18]);\r
+               uiTemp3 = local_atoi(pucStream[19]);\r
+               (p->usProcNumber)       = (uint16_t)CONCAT_4ASCII(uiTemp0, uiTemp1, uiTemp2, uiTemp3);\r
+\r
+               (p->usDataLength)       = (uint16_t)uiTempLength;\r
+\r
+               uiTemp0 = local_atoi(pucStream[26]);\r
+               uiTemp1 = local_atoi(pucStream[27]);\r
+               uiTemp2 = local_atoi(pucStream[28]);\r
+               uiTemp3 = local_atoi(pucStream[29]);\r
+               (p->usEndCode)          = (uint16_t)CONCAT_4ASCII(uiTemp0, uiTemp1, uiTemp2, uiTemp3);\r
+\r
+               for( i=0; i<iLength; i++ )\r
+               {\r
+                       p->pucData[i] = pucStream[uiDataAddr[iIndex]+i];\r
+               }\r
+\r
+               return SLMP_ERR_OK;\r
+       }\r
+       return SLMP_ERR_NG;\r
+}\r
+\r
+/*[ translating from integer to ascii ]*/\r
+uint8_t local_itoa( uint8_t ucInt){\r
+       unsigned char ucTable[] = {     '0','1','2','3','4','5','6','7','8','9',\r
+                                               'A','B','C','D','E','F'};\r
+       return ucTable[ucInt];\r
+}\r
+\r
+/*[ translating from ascii to integer ]*/\r
+uint8_t local_atoi( uint8_t ucInt){\r
+       switch(ucInt)\r
+       {\r
+               case 'A' :\r
+                       return 0x0A;\r
+               case 'B' :\r
+                       return 0x0B;\r
+               case 'C' :\r
+                       return 0x0C;\r
+               case 'D' :\r
+                       return 0x0D;\r
+               case 'E' :\r
+                       return 0x0E;\r
+               case 'F' :\r
+                       return 0x0F;\r
+               default :\r
+                       return (ucInt-'0');\r
+       }\r
+}\r
+\r
+/* A Function for making error response data from the SLMP_Info structure */\r
+int SLMP_MakeErrorData ( const SLMP_INFO *p, uint8_t *pucStream, uint16_t *pusDataSize )\r
+{\r
+       if ( (p == NULL) || (pucStream == NULL) )\r
+       {\r
+               return SLMP_ERR_NG;\r
+       }\r
+\r
+       /*[ Binary Mode ]*/\r
+       if ( SLMP_DATA_CODE(p->ulFrameType) == SLMP_DATA_CODE_BIN )\r
+       {\r
+               pucStream[ 0] = SHIFT_R0(p->usNetNumber);\r
+               pucStream[ 1] = SHIFT_R0(p->usNodeNumber);\r
+               pucStream[ 2] = SHIFT_R0(p->usProcNumber);\r
+               pucStream[ 3] = SHIFT_R8(p->usProcNumber);\r
+               pucStream[ 4] = 0x00;\r
+               pucStream[ 5] = SHIFT_R0(p->usCommand);\r
+               pucStream[ 6] = SHIFT_R8(p->usCommand);\r
+               pucStream[ 7] = SHIFT_R0(p->usSubCommand);\r
+               pucStream[ 8] = SHIFT_R8(p->usSubCommand);\r
+               (*pusDataSize) = 0x0009;\r
+       }\r
+\r
+       /*[ ASCII Mode ]*/\r
+       else if ( SLMP_DATA_CODE(p->ulFrameType) == SLMP_DATA_CODE_ASCII )\r
+       {\r
+               pucStream[ 0] = local_itoa(SHIFT_R4(p->usNetNumber) & MASK_LOWER4BIT);\r
+               pucStream[ 1] = local_itoa(SHIFT_R0(p->usNetNumber) & MASK_LOWER4BIT);\r
+               pucStream[ 2] = local_itoa(SHIFT_R4(p->usNodeNumber) & MASK_LOWER4BIT);\r
+               pucStream[ 3] = local_itoa(SHIFT_R0(p->usNodeNumber) & MASK_LOWER4BIT);\r
+               pucStream[ 4] = local_itoa(SHIFT_R12(p->usProcNumber) & MASK_LOWER4BIT);\r
+               pucStream[ 5] = local_itoa(SHIFT_R8 (p->usProcNumber) & MASK_LOWER4BIT);\r
+               pucStream[ 6] = local_itoa(SHIFT_R4 (p->usProcNumber) & MASK_LOWER4BIT);\r
+               pucStream[ 7] = local_itoa(SHIFT_R0 (p->usProcNumber) & MASK_LOWER4BIT);\r
+               pucStream[ 8] = local_itoa(0x00);\r
+               pucStream[ 9] = local_itoa(0x00);\r
+               pucStream[10] = local_itoa(SHIFT_R12(p->usCommand) & MASK_LOWER4BIT);\r
+               pucStream[11] = local_itoa(SHIFT_R8 (p->usCommand) & MASK_LOWER4BIT);\r
+               pucStream[12] = local_itoa(SHIFT_R4 (p->usCommand) & MASK_LOWER4BIT);\r
+               pucStream[13] = local_itoa(SHIFT_R0 (p->usCommand) & MASK_LOWER4BIT);\r
+               pucStream[14] = local_itoa(SHIFT_R12(p->usSubCommand) & MASK_LOWER4BIT);\r
+               pucStream[15] = local_itoa(SHIFT_R8 (p->usSubCommand) & MASK_LOWER4BIT);\r
+               pucStream[16] = local_itoa(SHIFT_R4 (p->usSubCommand) & MASK_LOWER4BIT);\r
+               pucStream[17] = local_itoa(SHIFT_R0 (p->usSubCommand) & MASK_LOWER4BIT);\r
+               (*pusDataSize) = 0x0012;\r
+       }\r
+\r
+       /*[ Data Code Error ]*/\r
+       else\r
+       {\r
+               return SLMP_ERR_NG;\r
+       }\r
+\r
+       return SLMP_ERR_OK;\r
+}\r
diff --git a/CCIEF-BASIC_Master/manual/CC-Link IE Field Network Basic Sample Code User's Manual(Master Station)v1.01.4.pdf b/CCIEF-BASIC_Master/manual/CC-Link IE Field Network Basic Sample Code User's Manual(Master Station)v1.01.4.pdf
new file mode 100644 (file)
index 0000000..282f80f
Binary files /dev/null and b/CCIEF-BASIC_Master/manual/CC-Link IE Field Network Basic Sample Code User's Manual(Master Station)v1.01.4.pdf differ
diff --git a/CCIEF-BASIC_Master/readme.txt b/CCIEF-BASIC_Master/readme.txt
new file mode 100644 (file)
index 0000000..3e75d13
--- /dev/null
@@ -0,0 +1,16 @@
+---------------------------------------------------------------------\r
+CC-Link IE Field Network Basic Master Application sample code\r
+\r
+readme\r
+\r
+---------------------------------------------------------------------\r
+\r
+Contents.\r
+\r
+root  -+-  library  -+-  include  ... SLMP library code header file\r
+       |             +-  src      ... SLMP library code file\r
+       |\r
+       +-  sample   -+-  include  ... user sample program header file\r
+       |             +-  src      ... user sample program code file\r
+       |\r
+       +-  manual   ---  User manual
\ No newline at end of file
diff --git a/CCIEF-BASIC_Master/sample/include/CCIEF_BASIC_MASTER.h b/CCIEF-BASIC_Master/sample/include/CCIEF_BASIC_MASTER.h
new file mode 100644 (file)
index 0000000..da02f9d
--- /dev/null
@@ -0,0 +1,212 @@
+/*\r
+ * Copyright (C) 2017 Texas Instruments Incorporated - http://www.ti.com/\r
+ * Copyright (C) 2016 CC-Link Partner Association -http://am.cc-link.org/\r
+ * \r
+ * \r
+ *  Redistribution and use in source and binary forms, with or without \r
+ *  modification, are permitted provided that the following conditions \r
+ *  are met:\r
+ *\r
+ *    Redistributions of source code must retain the above copyright \r
+ *    notice, this list of conditions and the following disclaimer.\r
+ *\r
+ *    Redistributions in binary form must reproduce the above copyright\r
+ *    notice, this list of conditions and the following disclaimer in the \r
+ *    documentation and/or other materials provided with the   \r
+ *    distribution.\r
+ *\r
+ *    Neither the name of Texas Instruments Incorporated nor the names of\r
+ *    its contributors may be used to endorse or promote products derived\r
+ *    from this software without specific prior written permission.\r
+ *\r
+ *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \r
+ *  "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT \r
+ *  LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\r
+ *  A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT \r
+ *  OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, \r
+ *  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT \r
+ *  LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
+ *  DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\r
+ *  THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT \r
+ *  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE \r
+ *  OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
+ *\r
+*/\r
+\r
+#ifndef                __CCIEF_BASIC_MASTER_H__\r
+#define                __CCIEF_BASIC_MASTER_H__\r
+\r
+#include <stdint.h>\r
+\r
+/*[ Definition for sample code ]*/\r
+#define        CCIEF_BASIC_MASTER_ERR_OK                                                       0\r
+#define        CCIEF_BASIC_MASTER_ERR_NG                                                       (-1)\r
+#define CCIEF_BASIC_MASTER_ERR_DEVICE_RANGE                                    (-100)\r
+#define CCIEF_BASIC_MASTER_ERR_MASTER_DUPLICATION                      (-200)\r
+#define CCIEF_BASIC_MASTER_ERR_SLAVE_DUPLICATION                       (-300)\r
+\r
+/*[ Definition for CCIEF-BASIC environment ]*/\r
+#define        CCIEF_BASIC_PROTCOL_VERSION                                                     1                       /* Protocol Version */\r
+#define        CCIEF_BASIC_PORT_NUMBER_CYCLIC                                          61450           /* Port number of Cyclic */\r
+#define        CCIEF_BASIC_MAX_FRAME_SIZE                                                      6000            /* Size of MAX Packet [byte] */\r
+#define        CCIEF_BASIC_RX_RY_SIZE                                                          8                       /* Size of RX/RY [byte] */\r
+#define        CCIEF_BASIC_RWW_RWR_SIZE                                                        64                      /* Size of RWw/RWr [byte] */\r
+#define        CCIEF_BASIC_MAX_SLAVE_NUMBER                                            64                      /* Number of MAX slaves */\r
+#define        CCIEF_BASIC_MAX_GROUP_NUMBER                                            64                      /* Number of MAX groups */\r
+#define        CCIEF_BASIC_MAX_NUMBER_OF_OCCUPIED_STATIONS_GROUP       16                      /* Number of MAX occupied stations for group */\r
+#define        CCIEF_BASIC_SLMP_COMMAND_CYCLIC_DATA                            0x0E70          /* Cyclic Data(0E70h) of SLMP Command */\r
+#define        CCIEF_BASIC_MASTER_PERSUASION_TIME                                      2500            /* Master persuasion time(2500ms) [ms] */\r
+#define        CCIEF_BASIC_CYCLIC_TRANSMISSION_TIMEOUT                         500                     /* Default cyclic transmission timeout [ms] */\r
+#define        CCIEF_BASIC_CYCLIC_TRANSMISSION_TIMEOUT_COUNT           3                       /* Default count of cyclic transmission timeout */\r
+#define        CCIEF_BASIC_MAX_CONSTANT_LINK_SCAN_TIME                         2000            /* Constant link scan time MAX [ms] */\r
+#define        CCIEF_BASIC_UNIT_INFO_APPLICATION_STOP                          0x0000          /* Stopping application for setting the unit info */\r
+#define        CCIEF_BASIC_UNIT_INFO_APPLICATION_RUNNING                       0x0001          /* Running application for setting the unit info */\r
+\r
+/*[ Definition for CCIEF-BASIC End Code ]*/\r
+#define        CCIEF_BASIC_END_OK                                                                      0x0000          /* Processing success. */\r
+#define        CCIEF_BASIC_END_DUPLICATE_MASTER                                        0xCFE0          /* Duplicate of the master. */\r
+#define        CCIEF_BASIC_END_NUMBER_OF_OCCUPIED_STATIONS                     0xCFE1          /* Invalid number of occupied stations. */\r
+#define        CCIEF_BASIC_END_SLAVE                                                           0xCFF0          /* Error of the slave. */\r
+#define CCIEF_BASIC_END_DISCONNECTED_REQUEST                           0xCFFF          /* Disconnected request from Slave. */\r
+\r
+/*[ Definition for CCIEF-BASIC sample code ]*/\r
+#define        CCIEF_BASIC_BIT_ON                                                                      1                       /* Bit ON */\r
+#define        CCIEF_BASIC_BIT_OFF                                                                     0                       /* Bit OFF */\r
+#define        CCIEF_BASIC_CYCLIC_STATE_OFF                                            0                       /* Cyclic state OFF. */\r
+#define        CCIEF_BASIC_CYCLIC_STATE_ON                                                     1                       /* Cyclic state ON. */\r
+#define        CCIEF_BASIC_CYCLIC_START                                                        1                       /* Start the cyclic of the slave. */\r
+#define        CCIEF_BASIC_CYCLIC_STOP                                                         0                       /* Stop the cyclic of the slave. */\r
+#define        CCIEF_BASIC_SLAVE_ID_OCCUPIED_STATIONS                          0xFFFFFFFF      /* Slave Id of occupied stations. */\r
+#define        CCIEF_BASIC_CONSTANT_LINK_SCAN_NOT_USE                          0                       /* Not using the constant link scan. */\r
+#define        CCIEF_BASIC_CONSTANT_LINK_SCAN_USE                                      1                       /* Using the constant link scan. */\r
+#define        CCIEF_BASIC_DEVICE_TYPE_RX                                                      1                       /* Type of device for RX. */\r
+#define        CCIEF_BASIC_DEVICE_TYPE_RY                                                      2                       /* Type of device for RY. */\r
+#define        CCIEF_BASIC_DEVICE_TYPE_RWW                                                     3                       /* Type of device for RWw. */\r
+#define        CCIEF_BASIC_DEVICE_TYPE_RWR                                                     4                       /* Type of device for RWr. */\r
+#define        CCIEF_BASIC_SLAVE_DUPLICATION_NOT_DETECT                        0                       /* Slave dupsication not detect. */\r
+#define        CCIEF_BASIC_SLAVE_DUPLICATION_DETECT                            1                       /* Slave dupsication detect. */\r
+#define        CCIEF_BASIC_SLAVE_RESPONSE_NOT_RECEIVED                         0                       /* Response not receive. */\r
+#define        CCIEF_BASIC_SLAVE_RESPONSE_RECEIVED                                     1                       /* Response receive. */\r
+\r
+/*[ Definition for CCIEF-BASIC state ]*/\r
+/* Master */\r
+#define        CCIEF_BASIC_STATE_MASTER_INITAL                                         0                       /* Initialization of the master. */\r
+#define        CCIEF_BASIC_STATE_MASTER_WAITING                                        1                       /* Waiting for the cyclic operation. */\r
+#define        CCIEF_BASIC_STATE_MASTER_PERSUASION                                     2                       /* Persuasion of the master. */\r
+#define        CCIEF_BASIC_STATE_MASTER_LINK_SCAN_END                          3                       /* End of the link scan. */\r
+#define        CCIEF_BASIC_STATE_MASTER_LINK_SCAN                                      4                       /* Running the link scan. */\r
+/* Slave */\r
+#define        CCIEF_BASIC_STATE_SLAVE_INITAL                                          0                       /* Initialization of the slave. */\r
+#define        CCIEF_BASIC_STATE_SLAVE_DISCONNECT                                      1                       /* Disconnection of the cyclic network. */\r
+#define        CCIEF_BASIC_STATE_SLAVE_CONNECTING                                      2                       /* Connecting for the cyclic network. */\r
+#define        CCIEF_BASIC_STATE_SLAVE_CYCLIC_STOP                                     3                       /* Stop the cyclic operation. */\r
+#define        CCIEF_BASIC_STATE_SLAVE_CYCLIC_END                                      4                       /* End of the cyclic operation. */\r
+#define        CCIEF_BASIC_STATE_SLAVE_CYCLIC                                          5                       /* Running the cyclic operation. */\r
+\r
+/*[ Definition for CCIEF-BASIC event ]*/\r
+/* Master */\r
+#define        CCIEF_BASIC_EVENT_MASTER_INITAL                                         0                       /* Initialization of the master. */\r
+#define        CCIEF_BASIC_EVENT_MASTER_PARAMETER_GET                          1                       /* Getting the parameter. */\r
+#define        CCIEF_BASIC_EVENT_MASTER_PARAMETER_CHANGE                       2                       /* Changing the parameter. */\r
+#define        CCIEF_BASIC_EVENT_MASTER_PERSUASION_TIMEOUT                     3                       /* Timeout of monitoring the persuasion frame. */\r
+#define        CCIEF_BASIC_EVENT_MASTER_LINK_SCAN_START                        4                       /* Starting the link scan. */\r
+#define        CCIEF_BASIC_EVENT_MASTER_LINK_SCAN_END                          5                       /* End of the link scan. */\r
+#define        CCIEF_BASIC_EVENT_MASTER_CYCLIC_DATA_RECV                       6                       /* Receiving the cyclic data from the master. */\r
+#define        CCIEF_BASIC_EVENT_MASTER_DUPLICATION_ERR_RECV           7                       /* Receiving the error of the duplication master from the slave. */\r
+/* Slave */\r
+#define        CCIEF_BASIC_EVENT_SLAVE_INITAL                                          0                       /* Initialization of the slave. */\r
+#define        CCIEF_BASIC_EVENT_SLAVE_PARAMETER_CHANGE                        1                       /* Changing the parameter. */\r
+#define        CCIEF_BASIC_EVENT_SLAVE_LINK_SCAN_START                         2                       /* Starting the link scan. */\r
+#define        CCIEF_BASIC_EVENT_SLAVE_CYCLIC_DATA_RECV                        3                       /* Receiving the cyclic data from the slave. */\r
+#define        CCIEF_BASIC_EVENT_SLAVE_CYCLIC_DATA_TIMEOUT                     4                       /* Timeout the response of the cyclic data. */\r
+#define        CCIEF_BASIC_EVENT_SLAVE_CYCLIC_END                                      5                       /* The end of the cyclic data of all slaves. */\r
+#define        CCIEF_BASIC_EVENT_SLAVE_DUPLICATION_MASTER_ERR          6                       /* Receiving the error of the duplication master from the slave. */\r
+\r
+/*[ Structure for sample code ]*/\r
+typedef struct \r
+{\r
+       uint8_t         ucGroupNumber;                                          /* Group number */\r
+       uint16_t        usCyclicTransmissionTimeout;            /* Cyclic transmission timeout */\r
+       uint16_t        usCyclicTransmissionTimeoutCount;       /* Count of cyclic transmission timeout */\r
+       uint16_t        usConstantLinkScanTime;                         /* Constant link scan time */\r
+} CCIEF_BASIC_GROUP_PARAMETER;\r
+\r
+typedef struct \r
+{\r
+       uint32_t        ulIpAddress;                            /* Slave ip address */\r
+       uint16_t        usOccupiedStationNumber;        /* Number of occupied stations */\r
+       uint8_t         ucGroupNumber;                          /* Group number */\r
+} CCIEF_BASIC_SLAVE_PARAMETER;\r
+\r
+typedef struct \r
+{\r
+       int                                                     iTotalGroupNumber;                                              /* Total number of the groups */\r
+       CCIEF_BASIC_GROUP_PARAMETER     Group[CCIEF_BASIC_MAX_GROUP_NUMBER];    /* Parameter of the groups */\r
+       int                                                     iTotalSlaveNumber;                                              /* Total number of the slaves */\r
+       CCIEF_BASIC_SLAVE_PARAMETER     Slave[CCIEF_BASIC_MAX_SLAVE_NUMBER];    /* Parameter of the slaves */\r
+} CCIEF_BASIC_MASTER_PARAMETER;\r
+\r
+typedef struct \r
+{\r
+       uint16_t        usVenderCode;           /* Vender code */\r
+       uint16_t        usReserve1;                     /* Reserve */\r
+       uint32_t        ulModelCode;            /* Model code */\r
+       uint16_t        usMachineVersion;       /* Machine version */\r
+       uint16_t        usReserve2;                     /* Reserve */\r
+       uint16_t        usUnitInfo;                     /* Information of the unit */\r
+       uint16_t        usErrCode;                      /* Error code */\r
+       uint32_t        ulUnitData;                     /* Data of the unit */\r
+} CCIEF_BASIC_SLAVE_NOTIFY_INFO;\r
+\r
+typedef struct \r
+{\r
+       uint16_t                                                usProtocolVersion;                      /* Protocol version */\r
+       uint16_t                                                usEndCode;                                      /* Error code of the slave */\r
+       uint32_t                                                ulId;                                           /* Id of the slave */\r
+       uint8_t                                                 ucGroupNumber;                          /* Group number of the slave */\r
+       uint16_t                                                usFrameSequenceNumber;          /* Frame sequence number */\r
+       int                                                             usOccupiedStationNumber;        /* Number of occupied stations */\r
+       int                                                             iState;                                         /* State of the slave */\r
+       CCIEF_BASIC_SLAVE_NOTIFY_INFO   NotifyInfo;                                     /* Notify information from the slave */\r
+       int                                                             iCyclicState;                           /* Cyclic state */\r
+       int                                                             iStationNumber;                         /* Number of stations */\r
+} CCIEF_BASIC_SLAVE_INFO;\r
+\r
+typedef struct \r
+{\r
+       uint16_t        usProtocolVersion;                              /* Protocol version */\r
+       uint32_t        ulId;                                                   /* Id of the master */\r
+       uint8_t         ucGroupNumber;                                  /* Group number of the slave */\r
+       int                     iTotalSlaveNumber;                              /* Total number of the slaves */\r
+       int                     usTotalOccupiedStationNumber;   /* Total number of occupied stations */\r
+       int                     iState;                                                 /* State of Master */\r
+       uint16_t        usUnitInfo;                                             /* Information of the unit */\r
+       uint16_t        usFrameSequenceNumber;                  /* Frame sequence number */\r
+       uint16_t        usParameterId;                                  /* Parameter id */\r
+       int64_t         llTimeData;                                             /* Data of time */\r
+       int64_t         llLinkScanTimeCurrent;                  /* Current link scan time[us] */\r
+       int64_t         llLinkScanTimeMinimum;                  /* Minimum link scan time[us] */\r
+       int64_t         llLinkScanTimeMaximum;                  /* Maximum link scan time[us] */\r
+} CCIEF_BASIC_GROUP_INFO;\r
+\r
+/*[ Definition of callback function ]*/\r
+typedef void(*CCIEF_BASIC_MASTER_CALLBACK_CYCLIC_LINK_SCAN_END)( uint8_t ucGroupNumber );\r
+\r
+/* Definition of function of sample program */\r
+extern int ccief_basic_master_initialize( uint32_t ulIpAddress, uint32_t ulSubnetMask, CCIEF_BASIC_MASTER_PARAMETER *pParameter,\r
+                                                                               CCIEF_BASIC_MASTER_CALLBACK_CYCLIC_LINK_SCAN_END pCyclicLinkScanEndFunc );\r
+extern void ccief_basic_master_terminate( void );\r
+extern int ccief_basic_master_main( void );\r
+extern int ccief_basic_master_start_cyclic( int iSlaveNumber );\r
+extern int ccief_basic_master_stop_cyclic( int iSlaveNumber );\r
+extern int ccief_basic_master_get_rx( int iNumber, int *piValue );\r
+extern int ccief_basic_master_set_ry( int iNumber, int iValue );\r
+extern int ccief_basic_master_set_rww( int iNumber, uint16_t usValue );\r
+extern int ccief_basic_master_get_rwr( int iNumber, uint16_t *pusValue );\r
+extern uint16_t *ccief_basic_master_get_pointer( int iDeviceType );\r
+extern void ccief_basic_master_set_unit_info( uint16_t usUnitInfo );\r
+extern int ccief_basic_master_get_slave_info( int iSlaveNumber, CCIEF_BASIC_SLAVE_INFO *pSlaveInfo );\r
+extern int ccief_basic_master_get_group_info( int iGroupNumber, CCIEF_BASIC_GROUP_INFO *pGroupInfo );\r
+\r
+#endif\r
+/*EOF*/
\ No newline at end of file
diff --git a/CCIEF-BASIC_Master/sample/include/CCIEF_BASIC_SLAVES.h b/CCIEF-BASIC_Master/sample/include/CCIEF_BASIC_SLAVES.h
new file mode 100644 (file)
index 0000000..eb16578
--- /dev/null
@@ -0,0 +1,81 @@
+/*\r
+ * Copyright (C) 2017 Texas Instruments Incorporated - http://www.ti.com/\r
+ * Copyright (C) 2016 CC-Link Partner Association -http://am.cc-link.org/\r
+ * \r
+ * \r
+ *  Redistribution and use in source and binary forms, with or without \r
+ *  modification, are permitted provided that the following conditions \r
+ *  are met:\r
+ *\r
+ *    Redistributions of source code must retain the above copyright \r
+ *    notice, this list of conditions and the following disclaimer.\r
+ *\r
+ *    Redistributions in binary form must reproduce the above copyright\r
+ *    notice, this list of conditions and the following disclaimer in the \r
+ *    documentation and/or other materials provided with the   \r
+ *    distribution.\r
+ *\r
+ *    Neither the name of Texas Instruments Incorporated nor the names of\r
+ *    its contributors may be used to endorse or promote products derived\r
+ *    from this software without specific prior written permission.\r
+ *\r
+ *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \r
+ *  "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT \r
+ *  LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\r
+ *  A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT \r
+ *  OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, \r
+ *  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT \r
+ *  LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
+ *  DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\r
+ *  THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT \r
+ *  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE \r
+ *  OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
+ *\r
+*/\r
+\r
+#ifndef                __CCIEF_BASIC_SLAVES_H__\r
+#define                __CCIEF_BASIC_SLAVES_H__\r
+\r
+#include <stdint.h>\r
+#include "CCIEF_BASIC_MASTER.h"\r
+\r
+/*[ Definition for CCIEF-BASIC Slaves ]*/\r
+#define        CCIEF_BASIC_CYCLIC_STATE_SET_CYCLIC_STOP                0                       /* Setting the cyclic state of stop cyclic. */\r
+#define        CCIEF_BASIC_CYCLIC_STATE_SET_CONNECTING                 1                       /* Setting the cyclic state of connecting. */\r
+#define        CCIEF_BASIC_CYCLIC_STATE_SET_CYCLIC                             2                       /* Setting the cyclic state of cyclic. */\r
+\r
+/*[ Structure for CCIEF-BASIC Slaves ]*/\r
+typedef struct\r
+{\r
+       CCIEF_BASIC_SLAVE_PARAMETER             *pParameter;                                            /* Parameter */\r
+       int                                                             iNumber;                                                        /* Slave Number */\r
+       uint32_t                                                ulId;                                                           /* Id number */\r
+       int                                                             iStationNumber;                                         /* Number of stations */\r
+       int                                                             iGroupStationNumber;                            /* Number of stations for the group */\r
+       int                                                             iCyclicStart;                                           /* Start cyclic of the user operation */\r
+       int                                                             iState;                                                         /* State of Slave */\r
+       int                                                             iCyclicState;                                           /* Cyclic state */\r
+       int                                                             iCyclicStateSet;                                        /* Setting of the cyclic state */\r
+       int                                                             iReceiveComplete;                                       /* State of response receive */\r
+       int                                                             iDuplicateState;                                        /* State of slave duplication */\r
+       uint16_t                                                *pusFrameSequenceNumber;                        /* Frame sequence number of the master */\r
+       uint16_t                                                usProtocolVersion;                                      /* Protocol version of the slave */\r
+       uint16_t                                                usEndCode;                                                      /* End code of the slave */\r
+       uint16_t                                                usFrameSequenceNumber;                          /* Frame sequence number of the slave */\r
+       CCIEF_BASIC_SLAVE_NOTIFY_INFO   NotifyInfo;                                                     /* Notification information of the slave */\r
+       uint16_t                                                usCyclicTransmissionTimeoutCount;       /* Count of cyclic transmission timeout */\r
+       uint16_t                                                usTimeoutCount;                                         /* Counter of timeout for the cyclic transmission timeout */\r
+       uint16_t                                                *pusRWw;                                                        /* Pointer of RWw for the packet */\r
+       uint16_t                                                *pusRY;                                                         /* Pointer of RY for the packet */\r
+       uint16_t                                                *pusRWr;                                                        /* Pointer of RWr for the packet */\r
+       uint16_t                                                *pusRX;                                                         /* Pointer of RX for the packet */\r
+       uint16_t                                                *pusSlaveRWr;                                           /* Pointer of RWr for the slave */\r
+       uint16_t                                                *pusSlaveRX;                                            /* Pointer of RX for the slave */\r
+} CCIEF_BASIC_SLAVES_CYCLIC_DATA_INFO;\r
+\r
+/* Definition of function of sample program */\r
+extern void ccief_basic_slaves_initialize( CCIEF_BASIC_SLAVES_CYCLIC_DATA_INFO *pSlave );\r
+extern void ccief_basic_slaves_execute_state( CCIEF_BASIC_SLAVES_CYCLIC_DATA_INFO *pSlave, int iEvent );\r
+\r
+#endif\r
+/*EOF*/
\ No newline at end of file
diff --git a/CCIEF-BASIC_Master/sample/include/SOCKET.h b/CCIEF-BASIC_Master/sample/include/SOCKET.h
new file mode 100644 (file)
index 0000000..6966ebb
--- /dev/null
@@ -0,0 +1,67 @@
+/*\r
+ * Copyright (C) 2017 Texas Instruments Incorporated - http://www.ti.com/\r
+ * Copyright (C) 2016 CC-Link Partner Association -http://am.cc-link.org/\r
+ * \r
+ * \r
+ *  Redistribution and use in source and binary forms, with or without \r
+ *  modification, are permitted provided that the following conditions \r
+ *  are met:\r
+ *\r
+ *    Redistributions of source code must retain the above copyright \r
+ *    notice, this list of conditions and the following disclaimer.\r
+ *\r
+ *    Redistributions in binary form must reproduce the above copyright\r
+ *    notice, this list of conditions and the following disclaimer in the \r
+ *    documentation and/or other materials provided with the   \r
+ *    distribution.\r
+ *\r
+ *    Neither the name of Texas Instruments Incorporated nor the names of\r
+ *    its contributors may be used to endorse or promote products derived\r
+ *    from this software without specific prior written permission.\r
+ *\r
+ *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \r
+ *  "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT \r
+ *  LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\r
+ *  A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT \r
+ *  OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, \r
+ *  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT \r
+ *  LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
+ *  DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\r
+ *  THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT \r
+ *  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE \r
+ *  OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
+ *\r
+*/\r
+\r
+#ifndef                __SOCKET_H__\r
+#define                __SOCKET_H__\r
+\r
+#include <stdint.h>\r
+#ifdef _WIN32\r
+#include <winsock2.h>\r
+#elif __linux__\r
+#include <sys/socket.h>\r
+#endif\r
+\r
+/*[ Definition for sample code ]*/\r
+#define        SOCKET_ERR_OK                                                   0\r
+#define        SOCKET_ERR_SOCKET                                               (-100)\r
+#define        SOCKET_ERR_RECV                                                 (-103)\r
+#define        SOCKET_ERR_SEND                                                 (-104)\r
+#define        SOCKET_ERR_NO_RECEIVABLE                                (-200)\r
+\r
+/* Definition of function of sample code */\r
+#ifdef _WIN32\r
+extern int socket_initialize( SOCKET *sock, uint32_t ulIpAddress, uint16_t usPortNumber );\r
+extern void socket_terminate( SOCKET sock );\r
+extern int socket_recv( SOCKET sock, uint8_t *pucStream, int iLength, uint32_t *pulRecvAddr, uint16_t *pusRecvPortNumber );\r
+extern int socket_send( SOCKET sock, uint8_t *pucStream, int iLength, uint32_t ulSendAddr, uint16_t usSendPortNumber );\r
+#elif __linux__\r
+extern int socket_initialize( int *sock, uint32_t ulIpAddress, uint16_t usPortNumber );\r
+extern void socket_terminate( int sock );\r
+extern int socket_recv( int sock, uint8_t *pucStream, int iLength, uint32_t *pulRecvAddr, uint16_t *pusRecvPortNumber );\r
+extern int socket_send( int sock, uint8_t *pucStream, int iLength, uint32_t ulSendAddr, uint16_t usSendPortNumber );\r
+#endif\r
+\r
+#endif\r
+/*EOF*/\r
diff --git a/CCIEF-BASIC_Master/sample/include/TIMER.h b/CCIEF-BASIC_Master/sample/include/TIMER.h
new file mode 100644 (file)
index 0000000..93a2b58
--- /dev/null
@@ -0,0 +1,72 @@
+/*\r
+ * Copyright (C) 2017 Texas Instruments Incorporated - http://www.ti.com/\r
+ * Copyright (C) 2016 CC-Link Partner Association -http://am.cc-link.org/\r
+ * \r
+ * \r
+ *  Redistribution and use in source and binary forms, with or without \r
+ *  modification, are permitted provided that the following conditions \r
+ *  are met:\r
+ *\r
+ *    Redistributions of source code must retain the above copyright \r
+ *    notice, this list of conditions and the following disclaimer.\r
+ *\r
+ *    Redistributions in binary form must reproduce the above copyright\r
+ *    notice, this list of conditions and the following disclaimer in the \r
+ *    documentation and/or other materials provided with the   \r
+ *    distribution.\r
+ *\r
+ *    Neither the name of Texas Instruments Incorporated nor the names of\r
+ *    its contributors may be used to endorse or promote products derived\r
+ *    from this software without specific prior written permission.\r
+ *\r
+ *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \r
+ *  "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT \r
+ *  LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\r
+ *  A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT \r
+ *  OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, \r
+ *  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT \r
+ *  LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
+ *  DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\r
+ *  THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT \r
+ *  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE \r
+ *  OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
+ *\r
+*/\r
+\r
+#ifndef                __TIMER_H__\r
+#define                __TIMER_H__\r
+\r
+#include <stdint.h>\r
+\r
+/*[ Definition for timer ]*/\r
+#define        TIMER_OK                                0\r
+#define        TIMER_RESOURCE_NONE             (-1)\r
+#define        TIMER_MAX                               100             /* Number of timer MAX */\r
+\r
+/*[ Structure for sample code ]*/\r
+typedef struct \r
+{\r
+       uint16_t        usYear;                         /* Year */\r
+       uint16_t        usMonth;                        /* Month */\r
+       uint16_t        usDay;                          /* Day */\r
+       uint16_t        usHour;                         /* Hour */\r
+       uint16_t        usMinute;                       /* Minute */\r
+       uint16_t        usSecond;                       /* Second */\r
+       uint16_t        usMilliseconds;         /* Milliseconds */\r
+} TIMER_TIME_DATA;\r
+\r
+/*[ Definition of callback function ]*/\r
+typedef void (*TIMER_CALLBACK)( int iId, void *pCallbackArg );\r
+\r
+/* Definition of function of the timer */\r
+extern void timer_initialize( void );\r
+extern void timer_terminate( void );\r
+extern void timer_main( void );\r
+extern int timer_start( long lTime, int *piId, TIMER_CALLBACK pCallbackFunc, void *pCallbackArg );\r
+extern void timer_stop( int iId );\r
+extern int64_t timer_get_time( void );\r
+extern int64_t timer_calculate_time_data( void );\r
+extern void timer_analyze_time_data( int64_t ullTime, TIMER_TIME_DATA *pTimeData );\r
+\r
+#endif\r
+/*EOF*/
\ No newline at end of file
diff --git a/CCIEF-BASIC_Master/sample/include/USER_SAMPLE.h b/CCIEF-BASIC_Master/sample/include/USER_SAMPLE.h
new file mode 100644 (file)
index 0000000..fa5f30d
--- /dev/null
@@ -0,0 +1,65 @@
+/*\r
+ * Copyright (C) 2017 Texas Instruments Incorporated - http://www.ti.com/\r
+ * Copyright (C) 2016 CC-Link Partner Association -http://am.cc-link.org/\r
+ * \r
+ * \r
+ *  Redistribution and use in source and binary forms, with or without \r
+ *  modification, are permitted provided that the following conditions \r
+ *  are met:\r
+ *\r
+ *    Redistributions of source code must retain the above copyright \r
+ *    notice, this list of conditions and the following disclaimer.\r
+ *\r
+ *    Redistributions in binary form must reproduce the above copyright\r
+ *    notice, this list of conditions and the following disclaimer in the \r
+ *    documentation and/or other materials provided with the   \r
+ *    distribution.\r
+ *\r
+ *    Neither the name of Texas Instruments Incorporated nor the names of\r
+ *    its contributors may be used to endorse or promote products derived\r
+ *    from this software without specific prior written permission.\r
+ *\r
+ *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \r
+ *  "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT \r
+ *  LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\r
+ *  A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT \r
+ *  OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, \r
+ *  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT \r
+ *  LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
+ *  DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\r
+ *  THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT \r
+ *  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE \r
+ *  OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
+ *\r
+*/\r
+\r
+#ifndef                __USER_SAMPLE_H__\r
+#define                __USER_SAMPLE_H__\r
+\r
+#include <stdint.h>\r
+\r
+/*[ Definition of profile of the CCIEF-BASIC Slave (Please rewrite for user environment) ]*/\r
+#define        USER_PROFILE_VENDOR_CODE                                        0x1234\r
+#define        USER_PROFILE_MODEL_CODE                                         0x00000001\r
+#define        USER_PROFILE_MACHINE_VERSION                            0x0001\r
+\r
+/*[ Definition for user environment ]*/\r
+#define        USER_ERR_OK                                                             0\r
+#define        USER_ERR_NG                                                             (-1)\r
+#define        USER_EXIT                                                               1\r
+\r
+/*[ Definition of prameter for sample code (Please rewrite for user environment) ]*/\r
+/* Group */\r
+#define        USER_PARAMETER_GROUP_ID_TOTAL_NUMBER                                            1\r
+#define        USER_PARAMETER_GROUP_ID_GROUP_NUMBER                                            2\r
+#define        USER_PARAMETER_GROUP_ID_DISCONNECTION_DETECT_TIME                       3\r
+#define        USER_PARAMETER_GROUP_ID_DISCONNECTION_DETECT_TIME_COUNT         4\r
+#define        USER_PARAMETER_GROUP_ID_CONSTANT_LINK_SCAN_TIME                         5\r
+/* Parameter */\r
+#define        USER_PARAMETER_SLAVE_ID_TOTAL_NUMBER                                            1\r
+#define        USER_PARAMETER_SLAVE_ID_IP_ADDRESS                                                      2\r
+#define        USER_PARAMETER_SLAVE_ID_OCCUPIED_STATION_NUMBER                         3\r
+#define        USER_PARAMETER_SLAVE_ID_GROUP_NUMBER                                            4\r
+\r
+#endif\r
+/*EOF*/
\ No newline at end of file
diff --git a/CCIEF-BASIC_Master/sample/src/CCIEF_BASIC_MASTER.c b/CCIEF-BASIC_Master/sample/src/CCIEF_BASIC_MASTER.c
new file mode 100644 (file)
index 0000000..df78cfb
--- /dev/null
@@ -0,0 +1,1448 @@
+/*\r
+ * Copyright (C) 2017 Texas Instruments Incorporated - http://www.ti.com/\r
+ * Copyright (C) 2016 CC-Link Partner Association -http://am.cc-link.org/\r
+ * \r
+ * \r
+ *  Redistribution and use in source and binary forms, with or without \r
+ *  modification, are permitted provided that the following conditions \r
+ *  are met:\r
+ *\r
+ *    Redistributions of source code must retain the above copyright \r
+ *    notice, this list of conditions and the following disclaimer.\r
+ *\r
+ *    Redistributions in binary form must reproduce the above copyright\r
+ *    notice, this list of conditions and the following disclaimer in the \r
+ *    documentation and/or other materials provided with the   \r
+ *    distribution.\r
+ *\r
+ *    Neither the name of Texas Instruments Incorporated nor the names of\r
+ *    its contributors may be used to endorse or promote products derived\r
+ *    from this software without specific prior written permission.\r
+ *\r
+ *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \r
+ *  "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT \r
+ *  LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\r
+ *  A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT \r
+ *  OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, \r
+ *  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT \r
+ *  LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
+ *  DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\r
+ *  THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT \r
+ *  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE \r
+ *  OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
+ *\r
+*/\r
+\r
+#include "SLMP.h"\r
+#include "CCIEF_BASIC_MASTER.h"\r
+#include "CCIEF_BASIC_SLAVES.h"\r
+#include "SOCKET.h"\r
+#include "TIMER.h"\r
+\r
+/************************************************************************************/\r
+/* The following is an user defined main program. This main program is one of a                */\r
+/* sample in the Windows OS and Intel x86 CPU. Please rewrite if necessary.                    */\r
+/* This main program is one of a sample in the Linux. Please rewrite if necessary.     */\r
+/*                                                                                                                                                                     */\r
+/* This sample program for CCIEF-BASIC Slave Application.                                                      */\r
+/*                                                                                                                                                                     */\r
+/************************************************************************************/\r
+\r
+#ifdef _WIN32\r
+#include <WinSock2.h>\r
+#include <Ws2tcpip.h>\r
+#include <windows.h>\r
+#elif __linux__\r
+#include <sys/socket.h>\r
+#include <netinet/in.h>\r
+#include <string.h>\r
+#endif\r
+#include <stdio.h>\r
+#include <time.h>\r
+\r
+#ifdef _WIN32\r
+#elif __linux__\r
+#define INVALID_SOCKET         -1\r
+#endif\r
+\r
+/*[ Structure for Information of the CCIEF-BASIC Master ]*/\r
+typedef struct \r
+{\r
+       uint8_t                                                         ucGroupNumber;                                                          /* Group number */\r
+       int                                                                     iTotalSlaveNumber;                                                      /* Total number of the slaves */\r
+       int                                                                     iOccupiedStationNumberTotal;                            /* Total number of the occupied station number */\r
+       int                                                                     iState;                                                                         /* State of Master */\r
+       CCIEF_BASIC_GROUP_PARAMETER                     *pGroupParameter;                                                       /* Pointer of the group parameter */\r
+       CCIEF_BASIC_SLAVES_CYCLIC_DATA_INFO     *pSlave[CCIEF_BASIC_MAX_SLAVE_NUMBER];          /* Pointer of information of the slaves */\r
+       uint16_t                                                        usFrameSequenceNumber;                                          /* Frame sequence number */\r
+       int                                                                     iPersuasionTimerId;                                                     /* Timer id for persuasion */\r
+       int                                                                     iCyclicTimerId;                                                         /* Timer id for cyclic time */\r
+       uint8_t                                                         aucCyclicData[CCIEF_BASIC_MAX_FRAME_SIZE];      /* Data for sending cyclic data */\r
+       int                                                                     iCyclicDataSize;                                                        /* Size of data for sending cyclic data */\r
+       int                                                                     iConstantLinkScanUse;                                           /* Using the constant link scan */\r
+       uint32_t                                                        ulResponseWaitTime;                                                     /* Time of waiting response[ms] */\r
+       int64_t                                                         llTimeData;                                                                     /* Time data of the sending latest cyclic data */\r
+       int64_t                                                         llLinkScanTimeStart;                                            /* Start time of link scan[us] */\r
+       int64_t                                                         llLinkScanTimeCurrent;                                          /* Current the link scan time[us] */\r
+       int64_t                                                         llLinkScanTimeMinimum;                                          /* Minimum the link scan time[us] */\r
+       int64_t                                                         llLinkScanTimeMaximum;                                          /* Maximum the link scan time[us] */\r
+} CCIEF_BASIC_MASTER_GROUP_INFO;\r
+\r
+#ifdef _WIN32\r
+typedef struct \r
+{\r
+       uint32_t                                                ulIpAddress;                                                    /* Ip address */\r
+       CCIEF_BASIC_MASTER_PARAMETER    Parameter;                                                              /* Parameter */\r
+       int                                                             iGroupTotalNumber;                                              /* Total number of the groups */\r
+       CCIEF_BASIC_MASTER_GROUP_INFO   *pGroup[CCIEF_BASIC_MAX_GROUP_NUMBER];  /* Pointer of information of the groups */\r
+       uint32_t                                                ulId;                                                                   /* Id number */\r
+       uint32_t                                                ulDirectedIpAddress;                                    /* Directed broadcast ip address */\r
+       int                                                             iOccupiedStationNumberTotal;                    /* Total number of the occupied station number */\r
+       uint16_t                                                usParameterId;                                                  /* Parameter id */\r
+       uint16_t                                                usUnitInfo;                                                             /* Information of the unit */\r
+       int                                                             iErrCode;                                                               /* Error code of the master */\r
+} CCIEF_BASIC_MASTER_CYCLIC_DATA_INFO;\r
+#elif __linux__\r
+typedef struct \r
+{\r
+       uint32_t                                                ulIpAddress;                                                    /* Ip address */\r
+       uint32_t                                                ulSubnetMask;                                                   /* Slave subnet mask */\r
+       CCIEF_BASIC_MASTER_PARAMETER    Parameter;                                                              /* Parameter */\r
+       int                                                             iGroupTotalNumber;                                              /* Total number of the groups */\r
+       CCIEF_BASIC_MASTER_GROUP_INFO   *pGroup[CCIEF_BASIC_MAX_GROUP_NUMBER];  /* Pointer of information of the groups */\r
+       uint32_t                                                ulId;                                                                   /* Id number */\r
+       uint32_t                                                ulDirectedIpAddress;                                    /* Directed broadcast ip address */\r
+       int                                                             iOccupiedStationNumberTotal;                    /* Total number of the occupied station number */\r
+       uint16_t                                                usParameterId;                                                  /* Parameter id */\r
+       uint16_t                                                usUnitInfo;                                                             /* Information of the unit */\r
+       int                                                             iErrCode;                                                               /* Error code of the master */\r
+} CCIEF_BASIC_MASTER_CYCLIC_DATA_INFO;\r
+#endif\r
+\r
+/* Definition of external variable of sample program */\r
+#ifdef _WIN32\r
+static SOCKET sock;            /* sokect of CCIEF-BASIC Master */\r
+#elif __linux__\r
+static int sock;               /* sokect of CCIEF-BASIC Master */\r
+#endif\r
+\r
+static unsigned char   aucSendData[CCIEF_BASIC_MAX_FRAME_SIZE];        /* Data for sending packet */\r
+static unsigned char   aucRecvData[CCIEF_BASIC_MAX_FRAME_SIZE];        /* Data for receiving packet */\r
+static unsigned char   aucSendPacket[CCIEF_BASIC_MAX_FRAME_SIZE];      /* Buffer for sending packet */\r
+static unsigned char   aucRecvPacket[CCIEF_BASIC_MAX_FRAME_SIZE];      /* Buffer for receiving packet */\r
+\r
+static unsigned short  ausRX[(CCIEF_BASIC_RX_RY_SIZE / sizeof( uint16_t )) * CCIEF_BASIC_MAX_SLAVE_NUMBER];    /* RX for the master */\r
+static unsigned short  ausRY[(CCIEF_BASIC_RX_RY_SIZE / sizeof( uint16_t )) * CCIEF_BASIC_MAX_SLAVE_NUMBER];    /* RY for the master */\r
+static unsigned short  ausRWw[(CCIEF_BASIC_RWW_RWR_SIZE / sizeof( uint16_t )) * CCIEF_BASIC_MAX_SLAVE_NUMBER]; /* RWw for the master */\r
+static unsigned short  ausRWr[(CCIEF_BASIC_RWW_RWR_SIZE / sizeof( uint16_t )) * CCIEF_BASIC_MAX_SLAVE_NUMBER]; /* RWr for the master */\r
+\r
+static CCIEF_BASIC_MASTER_CALLBACK_CYCLIC_LINK_SCAN_END        pUserLinkScanEndFunc = NULL;    /* Callback function for end of the link scan */\r
+\r
+static CCIEF_BASIC_MASTER_CYCLIC_DATA_INFO     Master;                                                                 /* Information of the master */\r
+static CCIEF_BASIC_MASTER_GROUP_INFO           Group[CCIEF_BASIC_MAX_GROUP_NUMBER];    /* Information of the groups */\r
+static CCIEF_BASIC_SLAVES_CYCLIC_DATA_INFO     Slave[CCIEF_BASIC_MAX_SLAVE_NUMBER];    /* Information of the slaves cyclic data */\r
+\r
+/* Definition of function of sample program */\r
+static int ccief_basic_master_check_parameter( CCIEF_BASIC_MASTER_PARAMETER *pParameter );\r
+static int ccief_basic_master_recv( void );\r
+static int ccief_basic_master_polling( CCIEF_BASIC_MASTER_GROUP_INFO *pGroup );\r
+static void ccief_basic_master_execute_state( CCIEF_BASIC_MASTER_GROUP_INFO *pGroup, int iEvent );\r
+static void ccief_basic_master_execute_state_wait_cyclic( CCIEF_BASIC_MASTER_GROUP_INFO *pGroup, int iEvent );\r
+static void ccief_basic_master_execute_state_persuasion( CCIEF_BASIC_MASTER_GROUP_INFO *pGroup, int iEvent );\r
+static void ccief_basic_master_execute_state_linkscan_end( CCIEF_BASIC_MASTER_GROUP_INFO *pGroup, int iEvent );\r
+static void ccief_basic_master_execute_state_linkscan( CCIEF_BASIC_MASTER_GROUP_INFO *pGroup, int iEvent );\r
+static void ccief_basic_master_persuasion_timer_timeout( int iId, void *pCallbackArg );\r
+static void ccief_basic_master_cyclic_timer_timeout( int iId, void *pCallbackArg );\r
+static int ccief_basic_master_make_cyclic_data( CCIEF_BASIC_MASTER_GROUP_INFO *pGroup );\r
+static int ccief_basic_master_send_cyclic_data( uint32_t ulIpAddress, uint8_t *pucData, int iDataSize );\r
+static void ccief_basic_master_recv_cyclic_data_response( uint8_t *pucData );\r
+\r
+/************************************************************************************/\r
+/* This is an user defined function for initialization of CCIEF-BASIC Master.                  */\r
+/************************************************************************************/\r
+int ccief_basic_master_initialize( uint32_t ulIpAddress, uint32_t ulSubnetMask, CCIEF_BASIC_MASTER_PARAMETER *pParameter,\r
+                                                                CCIEF_BASIC_MASTER_CALLBACK_CYCLIC_LINK_SCAN_END pCyclicLinkScanEndFunc )\r
+{\r
+       CCIEF_BASIC_MASTER_GROUP_INFO           *pGroup;\r
+       CCIEF_BASIC_SLAVES_CYCLIC_DATA_INFO *pSlave;\r
+       uint8_t ucGroupNumber;\r
+       int i, j, iGroupCheck;\r
+       int iErrCode;\r
+\r
+       /* Initialize of the master */\r
+       memset( &Master, 0, sizeof( Master ) );\r
+       memset( &Group, 0, sizeof( Group ) );\r
+       pGroup = (CCIEF_BASIC_MASTER_GROUP_INFO*)NULL;\r
+\r
+       /* Getting the parameter */\r
+       memcpy( &Master.Parameter, pParameter, sizeof( Master.Parameter ) );\r
+\r
+       /* User callback function */\r
+       pUserLinkScanEndFunc = pCyclicLinkScanEndFunc;\r
+\r
+       /* Setting the master information */\r
+       Master.ulIpAddress = ulIpAddress;\r
+       Master.ulId = ulIpAddress;\r
+#ifdef _WIN32\r
+#elif __linux__\r
+       Master.ulSubnetMask = ulSubnetMask;\r
+#endif\r
+       Master.ulDirectedIpAddress = ((ulIpAddress & ulSubnetMask) | ~ulSubnetMask);\r
+\r
+       /* Check the Parameter */\r
+       iErrCode = ccief_basic_master_check_parameter( pParameter );\r
+       if ( iErrCode != CCIEF_BASIC_MASTER_ERR_OK )\r
+       {\r
+               return iErrCode;\r
+       }\r
+\r
+       for ( i = 0; i < pParameter->iTotalSlaveNumber; i ++ )\r
+       {\r
+               ucGroupNumber = pParameter->Slave[i].ucGroupNumber;\r
+               iGroupCheck = CCIEF_BASIC_MASTER_ERR_NG;\r
+               for ( j = 0; j < Master.iGroupTotalNumber; j ++ )\r
+               {\r
+                       if ( ucGroupNumber == Master.pGroup[j]->ucGroupNumber )\r
+                       {\r
+                               pGroup = Master.pGroup[j];\r
+                               iGroupCheck = CCIEF_BASIC_MASTER_ERR_OK;\r
+                               break;\r
+                       }\r
+               }\r
+               if ( iGroupCheck == CCIEF_BASIC_MASTER_ERR_NG )\r
+               {\r
+                       pGroup = &Group[Master.iGroupTotalNumber];\r
+                       pGroup->ucGroupNumber = ucGroupNumber;\r
+                       for ( j = 0; j < pParameter->iTotalGroupNumber; j ++ )\r
+                       {\r
+                               if ( ucGroupNumber == pParameter->Group[j].ucGroupNumber )\r
+                               {\r
+                                       break;\r
+                               }\r
+                       }\r
+                       pGroup->pGroupParameter = &pParameter->Group[j];\r
+                       Master.pGroup[Master.iGroupTotalNumber] = pGroup;\r
+                       Master.iGroupTotalNumber ++;\r
+               }\r
+               pSlave = &Slave[i];\r
+               pSlave->iNumber = i;\r
+               pSlave->pParameter = &Master.Parameter.Slave[i];\r
+               pSlave->ulId = pParameter->Slave[i].ulIpAddress;\r
+               if ( pGroup->pGroupParameter->usCyclicTransmissionTimeoutCount == 0 )\r
+               {\r
+                       pSlave->usCyclicTransmissionTimeoutCount = CCIEF_BASIC_CYCLIC_TRANSMISSION_TIMEOUT_COUNT;\r
+               }\r
+               else\r
+               {\r
+                       pSlave->usCyclicTransmissionTimeoutCount = pGroup->pGroupParameter->usCyclicTransmissionTimeoutCount;\r
+               }\r
+               pSlave->iStationNumber = Master.iOccupiedStationNumberTotal;\r
+               pSlave->iGroupStationNumber = pGroup->iOccupiedStationNumberTotal;\r
+               pSlave->iReceiveComplete = CCIEF_BASIC_SLAVE_RESPONSE_NOT_RECEIVED;\r
+               pSlave->iDuplicateState = CCIEF_BASIC_SLAVE_DUPLICATION_NOT_DETECT;\r
+               pSlave->pusRWw = &ausRWw[pSlave->iStationNumber * ( CCIEF_BASIC_RWW_RWR_SIZE / sizeof( uint16_t ) )];\r
+               pSlave->pusRY = &ausRY[pSlave->iStationNumber * ( CCIEF_BASIC_RX_RY_SIZE / sizeof( uint16_t ) )];\r
+               pSlave->pusRWr = &ausRWr[pSlave->iStationNumber * ( CCIEF_BASIC_RWW_RWR_SIZE / sizeof( uint16_t ) )];\r
+               pSlave->pusRX = &ausRX[pSlave->iStationNumber * ( CCIEF_BASIC_RX_RY_SIZE / sizeof( uint16_t ) )];\r
+               pSlave->pusFrameSequenceNumber = &pGroup->usFrameSequenceNumber;\r
+               pGroup->pSlave[pGroup->iTotalSlaveNumber] = pSlave;\r
+               pGroup->iTotalSlaveNumber ++;\r
+               pGroup->iOccupiedStationNumberTotal += pParameter->Slave[i].usOccupiedStationNumber;\r
+               Master.iOccupiedStationNumberTotal += pParameter->Slave[i].usOccupiedStationNumber;\r
+       }\r
+\r
+       /* Calucurate of the parameter id */\r
+       srand( (unsigned)time( NULL ) );\r
+       Master.usParameterId = (uint16_t)rand();\r
+\r
+       /* Initialize a socket */\r
+       sock = INVALID_SOCKET;\r
+\r
+       /* Initialize of the slaves */\r
+       for ( i = 0; i < Master.Parameter.iTotalSlaveNumber; i ++ )\r
+       {\r
+               ccief_basic_slaves_initialize( &Slave[i] );\r
+       }\r
+\r
+       for ( i = 0; i < Master.iGroupTotalNumber; i ++ )\r
+       {\r
+               /* Set the master state */\r
+               Master.pGroup[i]->iState = CCIEF_BASIC_STATE_MASTER_WAITING;\r
+\r
+               /* Execute the state of the master */\r
+               ccief_basic_master_execute_state( Master.pGroup[i], CCIEF_BASIC_EVENT_MASTER_PARAMETER_GET );\r
+       }\r
+\r
+       return CCIEF_BASIC_MASTER_ERR_OK;\r
+}\r
+\r
+/************************************************************************************/\r
+/* This is an user defined function for termination of CCIEF-BASIC Master.                     */\r
+/************************************************************************************/\r
+void ccief_basic_master_terminate( void )\r
+{\r
+       /* Termination of socket */\r
+       socket_terminate( sock );\r
+\r
+       return;\r
+}\r
+\r
+/************************************************************************************/\r
+/* This is an user defined function for main function of CCIEF-BASIC Master.                   */\r
+/************************************************************************************/\r
+int ccief_basic_master_main( void )\r
+{\r
+       int i, iErrCode = 0;\r
+\r
+       /* Receive data */\r
+       iErrCode = ccief_basic_master_recv();\r
+       if ( iErrCode != CCIEF_BASIC_MASTER_ERR_OK )\r
+       {\r
+               return iErrCode;\r
+       }\r
+\r
+       /* Execute the state of the master */\r
+       for ( i = 0; i < Master.iGroupTotalNumber; i ++ )\r
+       {\r
+               (void)ccief_basic_master_polling( Master.pGroup[i] );\r
+       }\r
+\r
+       return CCIEF_BASIC_MASTER_ERR_OK;\r
+}\r
+\r
+/************************************************************************************/\r
+/* This is an user defined function for set of the start cyclic of the slave.          */\r
+/************************************************************************************/\r
+int ccief_basic_master_start_cyclic( int iSlaveNumber )\r
+{\r
+       if (( iSlaveNumber < 0 ) || ( Master.Parameter.iTotalSlaveNumber <= iSlaveNumber ))\r
+       {\r
+               return CCIEF_BASIC_MASTER_ERR_NG;\r
+       }\r
+\r
+       /* Start cyclic from user operation. */\r
+       Slave[iSlaveNumber].iCyclicStart = CCIEF_BASIC_CYCLIC_START;\r
+\r
+       return CCIEF_BASIC_MASTER_ERR_OK;\r
+}\r
+\r
+/************************************************************************************/\r
+/* This is an user defined function for set of the stop cyclic of the slave.           */\r
+/************************************************************************************/\r
+int ccief_basic_master_stop_cyclic( int iSlaveNumber )\r
+{\r
+       if (( iSlaveNumber < 0 ) || ( Master.Parameter.iTotalSlaveNumber <= iSlaveNumber ))\r
+       {\r
+               return CCIEF_BASIC_MASTER_ERR_NG;\r
+       }\r
+\r
+       /* Stop cyclic from user operation. */\r
+       Slave[iSlaveNumber].iCyclicStart = CCIEF_BASIC_CYCLIC_STOP;\r
+\r
+       return CCIEF_BASIC_MASTER_ERR_OK;\r
+}\r
+\r
+/************************************************************************************/\r
+/* This is an user defined function for getting the RX.                                                                */\r
+/************************************************************************************/\r
+int ccief_basic_master_get_rx( int iNumber, int *piValue )\r
+{\r
+       unsigned short usTemp;\r
+\r
+       /* Check the number of device */\r
+       if (( iNumber < 0 ) || ( sizeof( ausRX ) * 8 ) <= iNumber )\r
+       {\r
+               return CCIEF_BASIC_MASTER_ERR_DEVICE_RANGE;\r
+       }\r
+\r
+       usTemp = ausRX[iNumber / 16];\r
+       if (( usTemp & ( 1 << ( iNumber % 16 ))) == CCIEF_BASIC_BIT_OFF )\r
+       {\r
+               *piValue = CCIEF_BASIC_BIT_OFF;\r
+       }\r
+       else\r
+       {\r
+               *piValue = CCIEF_BASIC_BIT_ON;\r
+       }\r
+       \r
+       return CCIEF_BASIC_MASTER_ERR_OK;\r
+}\r
+\r
+/************************************************************************************/\r
+/* This is an user defined function for setting the RY.                                                                */\r
+/************************************************************************************/\r
+int ccief_basic_master_set_ry( int iNumber, int iValue )\r
+{\r
+       unsigned short usTemp;\r
+\r
+       /* Check the number of device */\r
+       if (( iNumber < 0 ) || ( sizeof( ausRY ) * 8 ) <= iNumber )\r
+       {\r
+               return CCIEF_BASIC_MASTER_ERR_DEVICE_RANGE;\r
+       }\r
+\r
+       /* Check the value */\r
+       if (( iValue == CCIEF_BASIC_BIT_OFF ) || ( iValue == CCIEF_BASIC_BIT_ON ))\r
+       {\r
+               usTemp = ausRY[( iNumber / 16 )];\r
+               usTemp = (uint16_t)(( usTemp & ~( 1 << ( iNumber % 16 ))) | ( iValue << ( iNumber % 16 )));\r
+               ausRY[( iNumber / 16 )] = usTemp;\r
+       }\r
+       else\r
+       {\r
+               return CCIEF_BASIC_MASTER_ERR_NG;\r
+       }\r
+\r
+       return CCIEF_BASIC_MASTER_ERR_OK;\r
+}\r
+\r
+/************************************************************************************/\r
+/* This is an user defined function for setting the RWw.                                                       */\r
+/************************************************************************************/\r
+int ccief_basic_master_set_rww( int iNumber, uint16_t usValue )\r
+{\r
+       int iMaxNumber;\r
+\r
+       /* Check the number of device */\r
+       iMaxNumber = sizeof( ausRWw ) / sizeof( uint16_t );\r
+       if (( iNumber < 0 ) || (iMaxNumber <= iNumber ))\r
+       {\r
+               return CCIEF_BASIC_MASTER_ERR_DEVICE_RANGE;\r
+       }\r
+\r
+       ausRWw[iNumber] = usValue;\r
+       \r
+       return CCIEF_BASIC_MASTER_ERR_OK;\r
+}\r
+\r
+/************************************************************************************/\r
+/* This is an user defined function for getting the RWr.                                                       */\r
+/************************************************************************************/\r
+int ccief_basic_master_get_rwr( int iNumber, uint16_t *pusValue )\r
+{\r
+       int iMaxNumber;\r
+\r
+       /* Check the number of device */\r
+       iMaxNumber = sizeof( ausRWr ) / sizeof( uint16_t );\r
+       if (( iNumber < 0 ) || (iMaxNumber <= iNumber ))\r
+       {\r
+               return CCIEF_BASIC_MASTER_ERR_DEVICE_RANGE;\r
+       }\r
+\r
+       *pusValue = ausRWr[iNumber];\r
+       \r
+       return CCIEF_BASIC_MASTER_ERR_OK;\r
+}\r
+\r
+/************************************************************************************/\r
+/* This is an user defined function for getting the device start pointer.                      */\r
+/************************************************************************************/\r
+uint16_t *ccief_basic_master_get_pointer( int iDeviceType )\r
+{\r
+       uint16_t *pusStartPointer;\r
+\r
+       /* Getting the device start pointer */\r
+\r
+       /* Check the device type */\r
+       switch ( iDeviceType )\r
+       {\r
+               /* RX */\r
+               case CCIEF_BASIC_DEVICE_TYPE_RX:\r
+                       pusStartPointer = ausRX;\r
+                       break;\r
+               /* RY */\r
+               case CCIEF_BASIC_DEVICE_TYPE_RY:\r
+                       pusStartPointer = ausRY;\r
+                       break;\r
+               /* RWw */\r
+               case CCIEF_BASIC_DEVICE_TYPE_RWW:\r
+                       pusStartPointer = ausRWw;\r
+                       break;\r
+               /* RWr */\r
+               case CCIEF_BASIC_DEVICE_TYPE_RWR:\r
+                       pusStartPointer = ausRWr;\r
+                       break;\r
+               /* Error of argument */\r
+               default:\r
+                       pusStartPointer = NULL;\r
+                       break;\r
+       }\r
+       \r
+       return pusStartPointer;\r
+}\r
+\r
+/************************************************************************************/\r
+/* This is an user defined function for setting the unit info.                                         */\r
+/************************************************************************************/\r
+void ccief_basic_master_set_unit_info( uint16_t usUnitInfo )\r
+{\r
+       Master.usUnitInfo = usUnitInfo;\r
+\r
+       return;\r
+}\r
+\r
+/************************************************************************************/\r
+/* This is an user defined function for getting information of the slave.                      */\r
+/************************************************************************************/\r
+int ccief_basic_master_get_slave_info( int iSlaveNumber, CCIEF_BASIC_SLAVE_INFO *pSlaveInfo )\r
+{\r
+\r
+       if (( iSlaveNumber < 0 ) || ( Master.Parameter.iTotalSlaveNumber <= iSlaveNumber ))\r
+       {\r
+               return CCIEF_BASIC_MASTER_ERR_NG;\r
+       }\r
+\r
+       if ( pSlaveInfo == NULL )\r
+       {\r
+               return CCIEF_BASIC_MASTER_ERR_NG;\r
+       }\r
+\r
+       /* Getting information of the slave */\r
+       pSlaveInfo->usProtocolVersion = Slave[iSlaveNumber].usProtocolVersion;\r
+       pSlaveInfo->usEndCode = Slave[iSlaveNumber].usEndCode;\r
+       pSlaveInfo->ucGroupNumber = Slave[iSlaveNumber].pParameter->ucGroupNumber;\r
+       pSlaveInfo->ulId = Slave[iSlaveNumber].ulId;\r
+       pSlaveInfo->usFrameSequenceNumber = Slave[iSlaveNumber].usFrameSequenceNumber;\r
+       pSlaveInfo->usOccupiedStationNumber = Slave[iSlaveNumber].pParameter->usOccupiedStationNumber;\r
+       pSlaveInfo->iState = Slave[iSlaveNumber].iState;\r
+       memcpy( &pSlaveInfo->NotifyInfo, &Slave[iSlaveNumber].NotifyInfo, sizeof( pSlaveInfo->NotifyInfo ) );\r
+       pSlaveInfo->iCyclicState = Slave[iSlaveNumber].iCyclicState;\r
+       pSlaveInfo->iStationNumber = Slave[iSlaveNumber].iStationNumber;\r
+\r
+       return CCIEF_BASIC_MASTER_ERR_OK;\r
+}\r
+\r
+/************************************************************************************/\r
+/* This is an user defined function for getting information of the master.                     */\r
+/************************************************************************************/\r
+int ccief_basic_master_get_group_info( int iGroupNumber, CCIEF_BASIC_GROUP_INFO *pGroupInfo )\r
+{\r
+\r
+       if ( pGroupInfo == NULL )\r
+       {\r
+               return CCIEF_BASIC_MASTER_ERR_NG;\r
+       }\r
+\r
+       /* Getting information of the master */\r
+       pGroupInfo->usProtocolVersion = CCIEF_BASIC_PROTCOL_VERSION;\r
+       pGroupInfo->ulId = Master.ulId;\r
+       pGroupInfo->ucGroupNumber = Group[iGroupNumber].ucGroupNumber;\r
+       pGroupInfo->iTotalSlaveNumber = Group[iGroupNumber].iTotalSlaveNumber;\r
+       pGroupInfo->usTotalOccupiedStationNumber = Group[iGroupNumber].iOccupiedStationNumberTotal;\r
+       pGroupInfo->iState = Group[iGroupNumber].iState;\r
+       pGroupInfo->usUnitInfo = Master.usUnitInfo;\r
+       pGroupInfo->usFrameSequenceNumber = Group[iGroupNumber].usFrameSequenceNumber;\r
+       pGroupInfo->usParameterId = Master.usParameterId;\r
+       pGroupInfo->llTimeData = Group[iGroupNumber].llTimeData;\r
+       pGroupInfo->llLinkScanTimeCurrent = Group[iGroupNumber].llLinkScanTimeCurrent;\r
+       pGroupInfo->llLinkScanTimeMinimum = Group[iGroupNumber].llLinkScanTimeMinimum;\r
+       pGroupInfo->llLinkScanTimeMaximum = Group[iGroupNumber].llLinkScanTimeMaximum;\r
+\r
+       return CCIEF_BASIC_MASTER_ERR_OK;\r
+}\r
+\r
+/************************************************************************************/\r
+/* This is an user defined function for check the parameter of CCIEF-BASIC Master.     */\r
+/************************************************************************************/\r
+int ccief_basic_master_check_parameter( CCIEF_BASIC_MASTER_PARAMETER *pParameter )\r
+{\r
+       int     i, j, iOccupiedStationNumberTotal;\r
+       struct in_addr addr;\r
+       char Ipaddr[16];\r
+\r
+       /* Check the master ip address */\r
+       for ( i = 0; i < pParameter->iTotalSlaveNumber; i ++ )\r
+       {\r
+               if ( Master.ulIpAddress == pParameter->Slave[i].ulIpAddress )\r
+               {\r
+                       printf( "Parameter Error: Duplicate master ip address in slaves!\n" );\r
+                       return CCIEF_BASIC_MASTER_ERR_NG;\r
+               }\r
+       }\r
+\r
+       /* Check the total number of the slaves */\r
+       if (( pParameter->iTotalSlaveNumber == 0 ) || ( CCIEF_BASIC_MAX_SLAVE_NUMBER < pParameter->iTotalSlaveNumber )) {\r
+               printf( "Parameter Error: Out of range of total slave number! %d (range: 1-64)\n", pParameter->iTotalSlaveNumber );\r
+               return CCIEF_BASIC_MASTER_ERR_NG;\r
+       }\r
+       \r
+       /* Check the total number of occupied stations */\r
+       iOccupiedStationNumberTotal = 0;\r
+       for ( i = 0; i < pParameter->iTotalSlaveNumber; i ++ )\r
+       {\r
+               if (( pParameter->Slave[i].usOccupiedStationNumber < 1 ) || ( CCIEF_BASIC_MAX_NUMBER_OF_OCCUPIED_STATIONS_GROUP < pParameter->Slave[i].usOccupiedStationNumber )) {\r
+                       printf( "Parameter Error: Invalid number of occupied stations! %d(No.%d) (range: 1-16)\n", pParameter->Slave[i].usOccupiedStationNumber, i+1 );\r
+                       return CCIEF_BASIC_MASTER_ERR_NG;\r
+               }\r
+               iOccupiedStationNumberTotal += pParameter->Slave[i].usOccupiedStationNumber;\r
+\r
+       }\r
+       if ( CCIEF_BASIC_MAX_SLAVE_NUMBER < iOccupiedStationNumberTotal )\r
+       {\r
+               printf( "Parameter Error: Invalid total number of occupied stations! %d (range: 1-64)\n", iOccupiedStationNumberTotal );\r
+               return CCIEF_BASIC_MASTER_ERR_NG;\r
+       }\r
+\r
+       /* Check the total number of occupied stations(for group) */\r
+       for ( i = 0; i < CCIEF_BASIC_MAX_GROUP_NUMBER; i ++ )\r
+       {\r
+               iOccupiedStationNumberTotal = 0;\r
+               for ( j = 0; j < pParameter->iTotalSlaveNumber; j ++ )\r
+               {\r
+                       if (( i + 1 ) == pParameter->Slave[j].ucGroupNumber )\r
+                       {\r
+                               iOccupiedStationNumberTotal += pParameter->Slave[j].usOccupiedStationNumber;\r
+                       }\r
+               }\r
+               if ( CCIEF_BASIC_MAX_NUMBER_OF_OCCUPIED_STATIONS_GROUP < iOccupiedStationNumberTotal )\r
+               {\r
+                       printf( "Parameter Error: Invalid total number of occupied stations! (Group Number %d)\n", ( i + 1 ));\r
+                       return CCIEF_BASIC_MASTER_ERR_NG;\r
+               }\r
+       }\r
+\r
+       /* Check the slave ip address */\r
+       for ( i = 0; i < pParameter->iTotalSlaveNumber; i ++ )\r
+       {\r
+               for ( j = 0; j < pParameter->iTotalSlaveNumber; j ++ )\r
+               {\r
+                       if (( i != j ) && ( pParameter->Slave[i].ulIpAddress == pParameter->Slave[j].ulIpAddress ))\r
+                       {\r
+#ifdef _WIN32\r
+                               addr.S_un.S_addr = htonl(pParameter->Slave[j].ulIpAddress);\r
+#elif __linux__\r
+                               addr.s_addr = htonl(pParameter->Slave[j].ulIpAddress);  \r
+#endif\r
+                               inet_ntop(AF_INET, &addr, Ipaddr, sizeof(Ipaddr) );\r
+                               printf( "Parameter Error: Duplicate slaves ip address %s!\n", Ipaddr );\r
+                               return CCIEF_BASIC_MASTER_ERR_NG;\r
+                       }\r
+               }\r
+       }\r
+\r
+       /* Check the total number of the group */\r
+       if (( pParameter->iTotalGroupNumber == 0 ) || ( CCIEF_BASIC_MAX_GROUP_NUMBER < pParameter->iTotalGroupNumber )) {\r
+               printf( "Parameter Error: Out of range of total group number! %d (range: 1-64)\n", pParameter->iTotalGroupNumber );\r
+               return CCIEF_BASIC_MASTER_ERR_NG;\r
+       }\r
+\r
+       /* Check the group number */\r
+       for ( i = 0; i < pParameter->iTotalSlaveNumber; i ++ )\r
+       {\r
+               if (( pParameter->Slave[i].ucGroupNumber == 0) || ( CCIEF_BASIC_MAX_GROUP_NUMBER < pParameter->Slave[i].ucGroupNumber ))\r
+               {\r
+                       printf( "Parameter Error: Invalid group number at the slave No.%d! (range: 1-64)\n", ( i + 1 ));\r
+                       return CCIEF_BASIC_MASTER_ERR_NG;\r
+               }\r
+       }\r
+       for ( i = 0; i < pParameter->iTotalSlaveNumber; i ++ )\r
+       {\r
+               for ( j = 0; j < pParameter->iTotalGroupNumber; j ++ )\r
+               {\r
+                       if ( pParameter->Slave[i].ucGroupNumber == pParameter->Group[j].ucGroupNumber )\r
+                       {\r
+                               break;\r
+                       }\r
+               }\r
+               if ( j == pParameter->iTotalGroupNumber )\r
+               {\r
+                       printf( "Parameter Error: Not found the parameter of group number %d!\n", pParameter->Slave[i].ucGroupNumber );\r
+                       return CCIEF_BASIC_MASTER_ERR_NG;\r
+               }\r
+       }\r
+\r
+       /* Check the constant link scan time */\r
+       for ( i = 0; i < pParameter->iTotalGroupNumber; i ++ )\r
+       {\r
+               if ( CCIEF_BASIC_MAX_CONSTANT_LINK_SCAN_TIME < pParameter->Group[i].usConstantLinkScanTime )\r
+               {\r
+                       printf( "Parameter Error: Invalid constant link scan time! %d (range: 0-2000)\n", pParameter->Group[i].usConstantLinkScanTime );\r
+                       printf( "(0:no use)\n" );\r
+                       return CCIEF_BASIC_MASTER_ERR_NG;\r
+               }\r
+       }\r
+\r
+       return CCIEF_BASIC_MASTER_ERR_OK;\r
+}\r
+\r
+/************************************************************************************/\r
+/* This is an user defined function for receiving packet. The following is one of a    */\r
+/* sample in the Windows OS. Please rewrite if necessary.                                                      */\r
+/* The following is one of a sample in the Linux. Please rewrite if necessary.         */\r
+/************************************************************************************/\r
+int ccief_basic_master_recv( void )\r
+{\r
+       uint32_t                ulRecvAddr;\r
+       uint16_t                usRecvPortNumber;\r
+       struct in_addr  addr;\r
+       SLMP_INFO               source = { 0 }; /* SLMP Infomation for received packet */\r
+       int                             iErrCode = 0;\r
+       int                             i;\r
+       char                    Ipaddr[16];\r
+#ifdef _WIN32\r
+#elif __linux__\r
+       uint32_t                ulMyNetAddress;\r
+       uint32_t                ulOtherNetAddress;\r
+#endif\r
+\r
+       /* Check the socket */\r
+       if ( sock == INVALID_SOCKET ) {\r
+               return CCIEF_BASIC_MASTER_ERR_OK;\r
+       }\r
+\r
+       /* Packet receiving */\r
+       iErrCode = socket_recv( sock, aucRecvPacket, sizeof( aucRecvPacket ), &ulRecvAddr, &usRecvPortNumber );\r
+       if ( iErrCode != SOCKET_ERR_OK )\r
+       {\r
+               if ( iErrCode == SOCKET_ERR_NO_RECEIVABLE )\r
+               {\r
+                       return CCIEF_BASIC_MASTER_ERR_OK;\r
+               }\r
+               else\r
+               {\r
+                       return iErrCode;\r
+               }\r
+       }\r
+\r
+#ifdef _WIN32\r
+#elif __linux__\r
+       ulMyNetAddress = ( Master.ulIpAddress & Master.ulSubnetMask );\r
+       ulOtherNetAddress = ( ulRecvAddr & Master.ulSubnetMask );\r
+\r
+       /* Other network broadcast break*/\r
+       if( ulMyNetAddress != ulOtherNetAddress )\r
+       {\r
+               return CCIEF_BASIC_MASTER_ERR_OK;\r
+       }\r
+#endif\r
+\r
+\r
+       /* Sets the SLMP Information for receiving. */\r
+       source.pucData = aucRecvData;\r
+\r
+       /* Get the SLMP Information from the request packet using the SLMP library. */\r
+       iErrCode = SLMP_GetSlmpInfo( &source, aucRecvPacket );\r
+       if ( iErrCode != SLMP_ERR_OK )\r
+       {\r
+               /* Invalid SLMP Frame. */\r
+               printf( "ERR : Invalid SLMP frame received!\n" );\r
+               return CCIEF_BASIC_MASTER_ERR_OK;\r
+       }\r
+\r
+       /* Check the SLMP frame. */\r
+       if ( source.ulFrameType == SLMP_FTYPE_BIN_RES_ST )\r
+       {\r
+               /* Response of the SLMP frame */\r
+               if ( source.usEndCode == SLMP_ERR_OK )\r
+               {\r
+                       /* Receiving response of the cyclic data. */\r
+                       ccief_basic_master_recv_cyclic_data_response( source.pucData );\r
+               }\r
+               else\r
+               {\r
+#ifdef _WIN32\r
+                       addr.S_un.S_addr = htonl(ulRecvAddr);\r
+#elif __linux__\r
+                       addr.s_addr = htonl(ulRecvAddr);        \r
+#endif\r
+                       inet_ntop(AF_INET, &addr, Ipaddr, sizeof(Ipaddr) );\r
+                       printf( "ERR : EndCode %04X from %s!\n", source.usEndCode, Ipaddr );\r
+               }\r
+       }\r
+       else\r
+       {\r
+               /* Request of the SLMP frame */\r
+               if ( source.usCommand == SLMP_COMMAND_CYCLIC_DATA )\r
+               {\r
+                       /* Cyclic Data(0E70h) */\r
+                       for ( i = 0; i < Master.iGroupTotalNumber; i ++ )\r
+                       {\r
+                               /* Execute the state of the master */\r
+                               ccief_basic_master_execute_state( Master.pGroup[i], CCIEF_BASIC_EVENT_MASTER_CYCLIC_DATA_RECV );\r
+                       }\r
+               }\r
+       }\r
+\r
+       /* Check the error code of the master duplication */\r
+       if ( Master.iErrCode == CCIEF_BASIC_MASTER_ERR_MASTER_DUPLICATION )\r
+       {\r
+               return CCIEF_BASIC_MASTER_ERR_MASTER_DUPLICATION;\r
+       }\r
+       \r
+       /* Check the error code of the slave duplication */\r
+       if ( Master.iErrCode == CCIEF_BASIC_MASTER_ERR_SLAVE_DUPLICATION )\r
+       {\r
+               return CCIEF_BASIC_MASTER_ERR_SLAVE_DUPLICATION;\r
+       }\r
+\r
+       return CCIEF_BASIC_MASTER_ERR_OK;\r
+}\r
+\r
+/************************************************************************************/\r
+/* This is an user defined function for polling operation.                                                     */\r
+/************************************************************************************/\r
+int ccief_basic_master_polling( CCIEF_BASIC_MASTER_GROUP_INFO *pGroup )\r
+{\r
+       int     i;\r
+       int iSlaveCyclicStateOffNumber, iSlaveCyclicStateOffCyclicEndNumber;\r
+       int iSlaveCyclicStateOnNumber, iSlaveCyclicStateOnCyclicEndNumber;\r
+       int iErrCode = CCIEF_BASIC_MASTER_ERR_OK;\r
+\r
+       /* Check the state of the master */\r
+       if ( pGroup->iState == CCIEF_BASIC_STATE_MASTER_LINK_SCAN )\r
+       {\r
+               /* Check using the constant link scan */\r
+               if ( pGroup->iConstantLinkScanUse == CCIEF_BASIC_CONSTANT_LINK_SCAN_NOT_USE )\r
+               {\r
+                       /* Check the cyclic end of the slave */\r
+                       iSlaveCyclicStateOffNumber = 0;\r
+                       iSlaveCyclicStateOffCyclicEndNumber = 0;\r
+                       iSlaveCyclicStateOnNumber = 0;\r
+                       iSlaveCyclicStateOnCyclicEndNumber = 0;\r
+                       for ( i = 0; i < pGroup->iTotalSlaveNumber; i ++ )\r
+                       {\r
+                               if ( pGroup->pSlave[i]->iCyclicState == CCIEF_BASIC_CYCLIC_STATE_OFF )\r
+                               {\r
+                                       /* OFF the slave cyclic state */\r
+                                       iSlaveCyclicStateOffNumber ++;\r
+                                       if ( pGroup->pSlave[i]->iState == CCIEF_BASIC_STATE_SLAVE_CYCLIC_END )\r
+                                       {\r
+                                               iSlaveCyclicStateOffCyclicEndNumber ++;\r
+                                       }\r
+                               }\r
+                               else\r
+                               {\r
+                                       /* ON the slave cyclic state */\r
+                                       iSlaveCyclicStateOnNumber ++;\r
+                                       if ( pGroup->pSlave[i]->iState == CCIEF_BASIC_STATE_SLAVE_CYCLIC_END )\r
+                                       {\r
+                                               iSlaveCyclicStateOnCyclicEndNumber ++;\r
+                                       }\r
+                               }\r
+                       }\r
+                       if ((( 0 < iSlaveCyclicStateOnNumber ) && ( iSlaveCyclicStateOnNumber == iSlaveCyclicStateOnCyclicEndNumber ))\r
+                        || (( 0 == iSlaveCyclicStateOnNumber ) && ( iSlaveCyclicStateOffNumber == iSlaveCyclicStateOffCyclicEndNumber )))\r
+                       {\r
+                               /* End of the cyclic */\r
+                               /* Execute the state of the slave */\r
+                               for ( i = 0; i < pGroup->iTotalSlaveNumber; i ++ )\r
+                               {\r
+                                       ccief_basic_slaves_execute_state( pGroup->pSlave[i], CCIEF_BASIC_EVENT_SLAVE_CYCLIC_END );\r
+                               }\r
+                               /* Execute the state of the master */\r
+                               ccief_basic_master_execute_state( pGroup, CCIEF_BASIC_EVENT_MASTER_LINK_SCAN_END );\r
+                       }\r
+               }\r
+       }\r
+\r
+       return iErrCode;\r
+}\r
+\r
+/************************************************************************************/\r
+/* This is an user defined function for executed according to the state                                */\r
+/* of the master.                                                                                                                                      */\r
+/************************************************************************************/\r
+void ccief_basic_master_execute_state( CCIEF_BASIC_MASTER_GROUP_INFO *pGroup, int iEvent )\r
+{\r
+       /* Execute the state of the master */\r
+       switch ( pGroup->iState )\r
+       {\r
+               /* Waiting for the cyclic operation. */\r
+               case CCIEF_BASIC_STATE_MASTER_WAITING:\r
+                       ccief_basic_master_execute_state_wait_cyclic( pGroup, iEvent );\r
+                       break;\r
+               /* Persuasion of the master. */\r
+               case CCIEF_BASIC_STATE_MASTER_PERSUASION:\r
+                       ccief_basic_master_execute_state_persuasion( pGroup, iEvent );\r
+                       break;\r
+               /* End of the link scan. */\r
+               case CCIEF_BASIC_STATE_MASTER_LINK_SCAN_END:\r
+                       ccief_basic_master_execute_state_linkscan_end( pGroup, iEvent );\r
+                       break;\r
+               /* Running the link scan. */\r
+               case CCIEF_BASIC_STATE_MASTER_LINK_SCAN:\r
+                       ccief_basic_master_execute_state_linkscan( pGroup, iEvent );\r
+                       break;\r
+               default:\r
+                       break;\r
+       }\r
+\r
+       return;\r
+}\r
+\r
+/************************************************************************************/\r
+/* This is an user defined function for state of waiting of the cyclic operation.      */\r
+/************************************************************************************/\r
+void ccief_basic_master_execute_state_wait_cyclic( CCIEF_BASIC_MASTER_GROUP_INFO *pGroup, int iEvent )\r
+{\r
+       /* Check the event */\r
+       switch ( iEvent )\r
+       {\r
+               /* Getting the parameter */\r
+               case CCIEF_BASIC_EVENT_MASTER_PARAMETER_GET:\r
+                       /* Initialization of the socket */\r
+                       if ( sock == INVALID_SOCKET )\r
+                       {\r
+                               Master.iErrCode = socket_initialize( &sock, Master.ulIpAddress, CCIEF_BASIC_PORT_NUMBER_CYCLIC );\r
+                               if( Master.iErrCode != CCIEF_BASIC_MASTER_ERR_OK )\r
+                               {\r
+                                       return;\r
+                               }\r
+                       }\r
+                       /* Check constant link scan */\r
+                       pGroup->iConstantLinkScanUse = CCIEF_BASIC_CONSTANT_LINK_SCAN_NOT_USE;\r
+                       if ( pGroup->pGroupParameter->usConstantLinkScanTime != 0 )\r
+                       {\r
+                               /* Set waiting of the end of constant link scan */\r
+                               pGroup->iConstantLinkScanUse = CCIEF_BASIC_CONSTANT_LINK_SCAN_USE;\r
+                       }\r
+                       /* Start the master persuasion timer*/\r
+                       timer_start( CCIEF_BASIC_MASTER_PERSUASION_TIME, &pGroup->iPersuasionTimerId,\r
+                                                &ccief_basic_master_persuasion_timer_timeout, (void *)pGroup );\r
+                       /* Set the master state */\r
+                       pGroup->iState = CCIEF_BASIC_STATE_MASTER_PERSUASION;\r
+                       break;\r
+               /* Changing the parameter */\r
+               case CCIEF_BASIC_EVENT_MASTER_PARAMETER_CHANGE:\r
+                       /* Nothing */\r
+                       break;\r
+               default:\r
+                       break;\r
+       }\r
+\r
+       return;\r
+}\r
+\r
+/************************************************************************************/\r
+/* This is an user defined function for state of persuasion of the master.                     */\r
+/************************************************************************************/\r
+void ccief_basic_master_execute_state_persuasion( CCIEF_BASIC_MASTER_GROUP_INFO *pGroup, int iEvent )\r
+{\r
+       int     i;\r
+\r
+       /* Check the event */\r
+       switch ( iEvent )\r
+       {\r
+               /* Changing the parameter */\r
+               case CCIEF_BASIC_EVENT_MASTER_PARAMETER_CHANGE:\r
+                       /* Execute the state of the slave */\r
+                       for ( i = 0; i < pGroup->iTotalSlaveNumber; i ++ )\r
+                       {\r
+                               ccief_basic_slaves_execute_state( pGroup->pSlave[i], CCIEF_BASIC_EVENT_SLAVE_PARAMETER_CHANGE );\r
+                       }\r
+                       /* Stop the master persuasion timer*/\r
+                       timer_stop( pGroup->iPersuasionTimerId );\r
+                       /* Termination of socket */\r
+                       socket_terminate( sock );\r
+                       /* Set the master state */\r
+                       pGroup->iState = CCIEF_BASIC_STATE_MASTER_WAITING;\r
+                       break;\r
+               /* Timeout of monitoring the persuasion frame */\r
+               case CCIEF_BASIC_EVENT_MASTER_PERSUASION_TIMEOUT:\r
+                       /* Check the constant link scan time */\r
+                       if ( pGroup->pGroupParameter->usConstantLinkScanTime != 0 )\r
+                       {\r
+                               /* Set the constant link scan time */\r
+                               pGroup->ulResponseWaitTime = pGroup->pGroupParameter->usConstantLinkScanTime;\r
+                       }\r
+                       else\r
+                       {\r
+                               /* Set the cyclic transmission timeout */\r
+                               pGroup->ulResponseWaitTime = pGroup->pGroupParameter->usCyclicTransmissionTimeout;\r
+                       }\r
+                       if ( pGroup->ulResponseWaitTime == 0 )\r
+                       {\r
+                               pGroup->ulResponseWaitTime = CCIEF_BASIC_CYCLIC_TRANSMISSION_TIMEOUT;\r
+                       }\r
+                       /* Set the master state */\r
+                       pGroup->iState = CCIEF_BASIC_STATE_MASTER_LINK_SCAN_END;\r
+                       /* Initialization of the frame sequence number */\r
+                       pGroup->usFrameSequenceNumber = 0;\r
+                       /* Execute the state of the master */\r
+                       ccief_basic_master_execute_state( pGroup, CCIEF_BASIC_EVENT_MASTER_LINK_SCAN_START );\r
+                       break;\r
+               /* Receiving the cyclic data from the master */\r
+               case CCIEF_BASIC_EVENT_MASTER_CYCLIC_DATA_RECV:\r
+                       /* Stop the master persuasion timer*/\r
+                       timer_stop( pGroup->iPersuasionTimerId );\r
+                       /* Termination of socket */\r
+                       socket_terminate( sock );\r
+                       /* Set the master state */\r
+                       pGroup->iState = CCIEF_BASIC_STATE_MASTER_WAITING;\r
+                       /* Set the error code of the master duplication */\r
+                       Master.iErrCode = CCIEF_BASIC_MASTER_ERR_MASTER_DUPLICATION;\r
+                       return;\r
+               default:\r
+                       break;\r
+       }\r
+\r
+       return;\r
+}\r
+\r
+/************************************************************************************/\r
+/* This is an user defined function for state of end of the link scan.                         */\r
+/************************************************************************************/\r
+void ccief_basic_master_execute_state_linkscan_end( CCIEF_BASIC_MASTER_GROUP_INFO *pGroup, int iEvent )\r
+{\r
+       int     i;\r
+\r
+       /* Check the event */\r
+       switch ( iEvent )\r
+       {\r
+               /* Changing the parameter */\r
+               case CCIEF_BASIC_EVENT_MASTER_PARAMETER_CHANGE:\r
+                       /* Execute the state of the slave */\r
+                       for ( i = 0; i < pGroup->iTotalSlaveNumber; i ++ )\r
+                       {\r
+                               ccief_basic_slaves_execute_state( pGroup->pSlave[i], CCIEF_BASIC_EVENT_SLAVE_PARAMETER_CHANGE );\r
+                       }\r
+                       /* Termination of socket */\r
+                       socket_terminate( sock );\r
+                       /* Set the master state */\r
+                       pGroup->iState = CCIEF_BASIC_STATE_MASTER_WAITING;\r
+                       break;\r
+               /* Starting the link scan */\r
+               case CCIEF_BASIC_EVENT_MASTER_LINK_SCAN_START:\r
+                       /* Execute the state of the slave */\r
+                       for ( i = 0; i < pGroup->iTotalSlaveNumber; i ++ )\r
+                       {\r
+                               /* Reset the receive complete flag */\r
+                               pGroup->pSlave[i]->iReceiveComplete = CCIEF_BASIC_SLAVE_RESPONSE_NOT_RECEIVED;\r
+                               \r
+                               ccief_basic_slaves_execute_state( pGroup->pSlave[i], CCIEF_BASIC_EVENT_SLAVE_LINK_SCAN_START );\r
+                       }\r
+                       /* Callback function for notification of end of the link scan to user operation */\r
+                       if ( pUserLinkScanEndFunc != NULL )\r
+                       {\r
+                               pUserLinkScanEndFunc( pGroup->ucGroupNumber );\r
+                       }\r
+                       /* Make the request data of Cyclic Data */\r
+                       pGroup->iCyclicDataSize = ccief_basic_master_make_cyclic_data( pGroup );\r
+                       /* Start the link scan time */\r
+                       pGroup->llLinkScanTimeStart = timer_get_time();\r
+                       /* Sending Cyclic Data */\r
+                       ccief_basic_master_send_cyclic_data( Master.ulDirectedIpAddress, pGroup->aucCyclicData, pGroup->iCyclicDataSize );\r
+                       /* Start the timer for cyclic time */\r
+                       timer_start( pGroup->ulResponseWaitTime, &pGroup->iCyclicTimerId, &ccief_basic_master_cyclic_timer_timeout, (void *)pGroup );\r
+                       /* Set the master state */\r
+                       pGroup->iState = CCIEF_BASIC_STATE_MASTER_LINK_SCAN;\r
+                       break;\r
+               /* Receiving the cyclic data from the master */\r
+               case CCIEF_BASIC_EVENT_MASTER_CYCLIC_DATA_RECV:\r
+                       /* Nothing */\r
+                       break;\r
+               /* Receiving the error of the duplication master from the slave */\r
+               case CCIEF_BASIC_EVENT_MASTER_DUPLICATION_ERR_RECV:\r
+                       /* Execute the state of the slave */\r
+                       for ( i = 0; i < pGroup->iTotalSlaveNumber; i ++ )\r
+                       {\r
+                               ccief_basic_slaves_execute_state( pGroup->pSlave[i], CCIEF_BASIC_EVENT_SLAVE_DUPLICATION_MASTER_ERR );\r
+                       }\r
+                       /* Termination of socket */\r
+                       socket_terminate( sock );\r
+                       /* Set the master state */\r
+                       pGroup->iState = CCIEF_BASIC_STATE_MASTER_WAITING;\r
+                       /* Set the error code of the master duplication */\r
+                       Master.iErrCode = CCIEF_BASIC_MASTER_ERR_MASTER_DUPLICATION;\r
+                       return;\r
+               default:\r
+                       break;\r
+       }\r
+\r
+       return;\r
+}\r
+\r
+/************************************************************************************/\r
+/* This is an user defined function for state of running the link scan.                                */\r
+/************************************************************************************/\r
+void ccief_basic_master_execute_state_linkscan( CCIEF_BASIC_MASTER_GROUP_INFO *pGroup, int iEvent )\r
+{\r
+       int     i;\r
+       int64_t llLinkScanTimeEnd;\r
+\r
+       /* Check the event */\r
+       switch ( iEvent )\r
+       {\r
+               /* Changing the parameter */\r
+               case CCIEF_BASIC_EVENT_MASTER_PARAMETER_CHANGE:\r
+                       /* Execute the state of the slave */\r
+                       for ( i = 0; i < pGroup->iTotalSlaveNumber; i ++ )\r
+                       {\r
+                               ccief_basic_slaves_execute_state( pGroup->pSlave[i], CCIEF_BASIC_EVENT_SLAVE_PARAMETER_CHANGE );\r
+                       }\r
+                       /* Stop the cyclic timer*/\r
+                       timer_stop( pGroup->iCyclicTimerId );\r
+                       /* Termination of socket */\r
+                       socket_terminate( sock );\r
+                       /* Set the master state */\r
+                       pGroup->iState = CCIEF_BASIC_STATE_MASTER_WAITING;\r
+                       break;\r
+               /* End of the link scan */\r
+               case CCIEF_BASIC_EVENT_MASTER_LINK_SCAN_END:\r
+                       /* Stop the cyclic timer*/\r
+                       timer_stop( pGroup->iCyclicTimerId );\r
+                       /* Stop the link scan time */\r
+                       llLinkScanTimeEnd = timer_get_time();\r
+                       pGroup->llLinkScanTimeCurrent = llLinkScanTimeEnd - pGroup->llLinkScanTimeStart;\r
+                       if (( pGroup->llLinkScanTimeMinimum == 0 ) || ( pGroup->llLinkScanTimeCurrent < pGroup->llLinkScanTimeMinimum ))\r
+                       {\r
+                               pGroup->llLinkScanTimeMinimum = pGroup->llLinkScanTimeCurrent;\r
+                       }\r
+                       if ( pGroup->llLinkScanTimeMaximum < pGroup->llLinkScanTimeCurrent )\r
+                       {\r
+                               pGroup->llLinkScanTimeMaximum = pGroup->llLinkScanTimeCurrent;\r
+                       }\r
+                       pGroup->llLinkScanTimeStart = llLinkScanTimeEnd;\r
+                       /* Set the master state */\r
+                       pGroup->iState = CCIEF_BASIC_STATE_MASTER_LINK_SCAN_END;\r
+                       /* Increasing of th frame sequence number */\r
+                       pGroup->usFrameSequenceNumber ++;\r
+                       if ( pGroup->usFrameSequenceNumber == 0 )\r
+                       {\r
+                               pGroup->usFrameSequenceNumber = 1;\r
+                       }\r
+                       /* Execute the state of the master */\r
+                       ccief_basic_master_execute_state( pGroup, CCIEF_BASIC_EVENT_MASTER_LINK_SCAN_START );\r
+                       break;\r
+               /* Receiving the cyclic data from the master */\r
+               case CCIEF_BASIC_EVENT_MASTER_CYCLIC_DATA_RECV:\r
+                       /* Nothing */\r
+                       break;\r
+               /* Receiving the error of the duplication master from the slave */\r
+               case CCIEF_BASIC_EVENT_MASTER_DUPLICATION_ERR_RECV:\r
+                       /* Execute the state of the slave */\r
+                       for ( i = 0; i < pGroup->iTotalSlaveNumber; i ++ )\r
+                       {\r
+                               ccief_basic_slaves_execute_state( pGroup->pSlave[i], CCIEF_BASIC_EVENT_SLAVE_DUPLICATION_MASTER_ERR );\r
+                       }\r
+                       /* Stop the cyclic timer*/\r
+                       timer_stop( pGroup->iCyclicTimerId );\r
+                       /* Termination of socket */\r
+                       socket_terminate( sock );\r
+                       /* Set the master state */\r
+                       pGroup->iState = CCIEF_BASIC_STATE_MASTER_WAITING;\r
+                       /* Set the error code of the master duplication */\r
+                       Master.iErrCode = CCIEF_BASIC_MASTER_ERR_MASTER_DUPLICATION;\r
+                       return;\r
+               default:\r
+                       break;\r
+       }\r
+\r
+       return;\r
+}\r
+\r
+/************************************************************************************/\r
+/* This is an user defined function for timeout of the persuasion timer.                       */\r
+/************************************************************************************/\r
+void ccief_basic_master_persuasion_timer_timeout( int iId, void *pCallbackArg )\r
+{\r
+       \r
+       /* Execute the state of the master */\r
+       ccief_basic_master_execute_state( (CCIEF_BASIC_MASTER_GROUP_INFO *)pCallbackArg, CCIEF_BASIC_EVENT_MASTER_PERSUASION_TIMEOUT );\r
+\r
+       return;\r
+}\r
+\r
+/************************************************************************************/\r
+/* This is an user defined function for timeout of the cyclic transmission timeout.    */\r
+/************************************************************************************/\r
+void ccief_basic_master_cyclic_timer_timeout( int iId, void *pCallbackArg )\r
+{\r
+       int i;\r
+       CCIEF_BASIC_MASTER_GROUP_INFO *pGroup;\r
+       \r
+       pGroup = (CCIEF_BASIC_MASTER_GROUP_INFO *)pCallbackArg;\r
+\r
+       /* Execute the state of the slave */\r
+       for ( i = 0; i < pGroup->iTotalSlaveNumber; i ++ )\r
+       {\r
+               ccief_basic_slaves_execute_state( pGroup->pSlave[i], CCIEF_BASIC_EVENT_SLAVE_CYCLIC_DATA_TIMEOUT );\r
+       }\r
+\r
+       /* Execute the state of the master */\r
+       ccief_basic_master_execute_state( pGroup, CCIEF_BASIC_EVENT_MASTER_LINK_SCAN_END );\r
+\r
+       return;\r
+}\r
+\r
+/************************************************************************************/\r
+/* This is an user defined function for make the request data of Cyclic Data.          */\r
+/************************************************************************************/\r
+#define REQUEST_OFFSET_ADDRESS_CYCLIC_INFO     0x0024\r
+\r
+int ccief_basic_master_make_cyclic_data( CCIEF_BASIC_MASTER_GROUP_INFO *pGroup )\r
+{\r
+       uint8_t *pucData;\r
+       int iIndex, iIndexCyclicState, iIndexRWw, iIndexRY;\r
+       int i, j, iDataSize;\r
+       static uint8_t aucCyclicStateBits[2];\r
+       int64_t llTimeData;\r
+       uint16_t usOccupiedStationNumber;\r
+\r
+       pucData = pGroup->aucCyclicData;\r
+\r
+       /* Make the request data of Cyclic Data. */\r
+       iIndex = 0;\r
+       /* Protocol Version */\r
+       pucData[iIndex    ] = SHIFT_R0(CCIEF_BASIC_PROTCOL_VERSION);\r
+       pucData[iIndex + 1] = SHIFT_R8(CCIEF_BASIC_PROTCOL_VERSION);\r
+       iIndex += 2;\r
+       /* Reserve */\r
+       pucData[iIndex    ] = SHIFT_R0(0);\r
+       pucData[iIndex + 1] = SHIFT_R8(0);\r
+       iIndex += 2;\r
+       /* Offset address (Cyclic information) */\r
+       pucData[iIndex    ] = SHIFT_R0(REQUEST_OFFSET_ADDRESS_CYCLIC_INFO);\r
+       pucData[iIndex + 1] = SHIFT_R8(REQUEST_OFFSET_ADDRESS_CYCLIC_INFO);\r
+       iIndex += 2;\r
+       /* Offset address (Reserved) */\r
+       memset( &pucData[iIndex], 0, 14 );\r
+       iIndex += 14;\r
+\r
+       /* Master information data */\r
+       /* Unit info */\r
+       pucData[iIndex    ] = SHIFT_R0(Master.usUnitInfo);\r
+       pucData[iIndex + 1] = SHIFT_R8(Master.usUnitInfo);\r
+       iIndex += 2;\r
+       /* Reserve */\r
+       pucData[iIndex    ] = 0;\r
+       pucData[iIndex + 1] = 0;\r
+       iIndex += 2;\r
+       /* Time data */\r
+       llTimeData = timer_calculate_time_data();\r
+       memcpy( &pucData[iIndex], &llTimeData, sizeof( llTimeData ) );\r
+       pGroup->llTimeData = llTimeData;\r
+       iIndex += 8;\r
+\r
+       /* Cyclic information */\r
+       /* Master id */\r
+       memcpy( &pucData[iIndex], &Master.ulId, sizeof( Master.ulId ) );\r
+       iIndex += 4;\r
+       /* Group number */\r
+       pucData[iIndex    ] = pGroup->ucGroupNumber;\r
+       iIndex += 1;\r
+       /* Reserve */\r
+       pucData[iIndex    ] = 0;\r
+       iIndex += 1;\r
+       /* Frame sequence number */\r
+       pucData[iIndex    ] = SHIFT_R0(pGroup->usFrameSequenceNumber);\r
+       pucData[iIndex + 1] = SHIFT_R8(pGroup->usFrameSequenceNumber);\r
+       iIndex += 2;\r
+       /* Cyclic Transmission Timeout */\r
+       /* Check the constant link scan time */\r
+       if ( pGroup->pGroupParameter->usConstantLinkScanTime != 0 )\r
+       {\r
+               /* Set the constant link scan time */\r
+               pucData[iIndex    ] = SHIFT_R0(pGroup->pGroupParameter->usConstantLinkScanTime);\r
+               pucData[iIndex + 1] = SHIFT_R8(pGroup->pGroupParameter->usConstantLinkScanTime);\r
+       }\r
+       else\r
+       {\r
+               /* Set the cyclic transmission timeout */\r
+               pucData[iIndex    ] = SHIFT_R0(pGroup->pGroupParameter->usCyclicTransmissionTimeout);\r
+               pucData[iIndex + 1] = SHIFT_R8(pGroup->pGroupParameter->usCyclicTransmissionTimeout);\r
+       }\r
+       iIndex += 2;\r
+       /* Count of cyclic transmission timeout */\r
+       pucData[iIndex    ] = SHIFT_R0(pGroup->pGroupParameter->usCyclicTransmissionTimeoutCount);\r
+       pucData[iIndex + 1] = SHIFT_R8(pGroup->pGroupParameter->usCyclicTransmissionTimeoutCount);\r
+       iIndex += 2;\r
+       /* Parameter id */\r
+       pucData[iIndex    ] = SHIFT_R0(Master.usParameterId);\r
+       pucData[iIndex + 1] = SHIFT_R8(Master.usParameterId);\r
+       iIndex += 2;\r
+       /* Total occupied station number of the slaves */\r
+       pucData[iIndex    ] = SHIFT_R0(pGroup->iOccupiedStationNumberTotal);\r
+       pucData[iIndex + 1] = SHIFT_R8(pGroup->iOccupiedStationNumberTotal);\r
+       iIndex += 2;\r
+       /* State of the cyclic and Slave id */\r
+       iIndexCyclicState = iIndex;\r
+       memset( &aucCyclicStateBits, 0, sizeof( aucCyclicStateBits ) );\r
+       iIndex += 2;\r
+       /* Reserve */\r
+       pucData[iIndex    ] = 0;\r
+       pucData[iIndex + 1] = 0;\r
+       iIndex += 2;\r
+       for ( i = 0; i < pGroup->iTotalSlaveNumber; i ++ )\r
+       {\r
+               /* Make the cyclic insication bits */\r
+               if ( pGroup->pSlave[i]->iCyclicState == CCIEF_BASIC_CYCLIC_STATE_ON )\r
+               {\r
+                       aucCyclicStateBits[( pGroup->pSlave[i]->iGroupStationNumber ) / 8] |= ( 1 << ( ( pGroup->pSlave[i]->iGroupStationNumber ) % 8 ));\r
+               }\r
+               /* Check the current start cyclic of user operation */\r
+               if (( pGroup->pSlave[i]->iCyclicStateSet == CCIEF_BASIC_CYCLIC_STATE_SET_CONNECTING )\r
+                || ( pGroup->pSlave[i]->iCyclicStateSet == CCIEF_BASIC_CYCLIC_STATE_SET_CYCLIC ))\r
+               {\r
+                       memcpy( &pucData[iIndex], &(pGroup->pSlave[i]->ulId), sizeof( pGroup->pSlave[i]->ulId ) );\r
+               }\r
+               else\r
+               {\r
+                       memset( &pucData[iIndex], 0, sizeof( uint32_t ) );\r
+               }\r
+               iIndex += 4;\r
+               /* Occupied station number */\r
+               usOccupiedStationNumber = pGroup->pSlave[i]->pParameter->usOccupiedStationNumber;\r
+               if ( 1 < usOccupiedStationNumber )\r
+               {\r
+                       for ( j = 1; j < usOccupiedStationNumber; j ++ )\r
+                       {\r
+                               memset( &pucData[iIndex], 0xFF, sizeof( uint32_t ) );\r
+                               iIndex += 4;\r
+                       }\r
+               }\r
+       }\r
+       memcpy( &pucData[iIndexCyclicState], aucCyclicStateBits, sizeof( aucCyclicStateBits ) );\r
+       /* Send data */\r
+       iIndexRWw = iIndex;\r
+       iIndexRY = iIndex + ( CCIEF_BASIC_RWW_RWR_SIZE * pGroup->iOccupiedStationNumberTotal );\r
+       for ( i = 0; i < pGroup->iTotalSlaveNumber; i ++ )\r
+       {\r
+               /* Get the cyclic insication of the slave */\r
+               usOccupiedStationNumber = pGroup->pSlave[i]->pParameter->usOccupiedStationNumber;\r
+               /* Set data */\r
+               if ( pGroup->pSlave[i]->iCyclicStateSet == CCIEF_BASIC_CYCLIC_STATE_SET_CYCLIC )\r
+               {\r
+                       /* Valid the cyclic data */\r
+                       memcpy( &pucData[iIndexRWw], pGroup->pSlave[i]->pusRWw,\r
+                                       CCIEF_BASIC_RWW_RWR_SIZE * usOccupiedStationNumber );\r
+                       memcpy( &pucData[iIndexRY], pGroup->pSlave[i]->pusRY,\r
+                                       CCIEF_BASIC_RX_RY_SIZE * usOccupiedStationNumber );\r
+               }\r
+               else\r
+               {\r
+                       /* Invalid the cyclic data */\r
+                       memset( &pucData[iIndexRWw], 0, CCIEF_BASIC_RWW_RWR_SIZE * usOccupiedStationNumber );\r
+                       memset( &pucData[iIndexRY], 0, CCIEF_BASIC_RX_RY_SIZE * usOccupiedStationNumber );\r
+               }\r
+               iIndexRWw += CCIEF_BASIC_RWW_RWR_SIZE * usOccupiedStationNumber;\r
+               iIndexRY += CCIEF_BASIC_RX_RY_SIZE * usOccupiedStationNumber;\r
+       }\r
+\r
+       /* Total length of the making data */\r
+       iDataSize = iIndexRY;\r
+\r
+       return iDataSize;\r
+}\r
+\r
+/************************************************************************************/\r
+/* This is an user defined function for send packet.                                                           */\r
+/************************************************************************************/\r
+int ccief_basic_master_send_cyclic_data( uint32_t ulIpAddress, uint8_t *pucData, int iDataSize )\r
+{\r
+       SLMP_INFO target;       /* SLMP Infomation for sending packet*/\r
+       int iSendPacketSize;\r
+       int iErrCode = 0;\r
+\r
+       /* Sets the SLMP Information for sending. */\r
+       target.usNetNumber      = 0;                                            /* Network number */\r
+       target.usNodeNumber     = 0xFF;                                         /* Node number  */\r
+       target.usProcNumber = SLMP_CPU_DEFAULT;                 /* Processor number */\r
+       target.usDataLength = (uint16_t)(6 + iDataSize);/* Data length */\r
+                                                                                                       /* timer(2)+command(2)+subcommand(2)+Data */\r
+       target.usTimer = SLMP_TIMER_WAIT_FOREVER;               /* Timer value */\r
+       target.usCommand = SLMP_COMMAND_CYCLIC_DATA;    /* Command = NodeSearch */\r
+       target.usSubCommand = 0x0000;                                   /* Sub command */\r
+       target.pucData = pucData;                                               /* Pointer for sending data */\r
+\r
+       /* Make a packet stream using the SLMP library. */\r
+       iErrCode = SLMP_MakePacketStream( SLMP_FTYPE_BIN_REQ_ST, &target, aucSendPacket );\r
+       if( iErrCode != CCIEF_BASIC_MASTER_ERR_OK )\r
+       {\r
+               /* Could not be created. */\r
+               return iErrCode;\r
+       }\r
+\r
+       /* Send the packet for cyclic request. */\r
+       iSendPacketSize = 15+iDataSize; /* subheader(2)+network number(1)+node number(1)+processor number(2)+ */\r
+                                                                       /* multidrop node number(1)+data length(2)+fixed value(2)+command(2)+subcommand(2)+data */\r
+       iErrCode = socket_send( sock, aucSendPacket, iSendPacketSize, ulIpAddress, CCIEF_BASIC_PORT_NUMBER_CYCLIC );\r
+       if ( iErrCode != CCIEF_BASIC_MASTER_ERR_OK )\r
+       {\r
+               return iErrCode;\r
+       }\r
+\r
+       return CCIEF_BASIC_MASTER_ERR_OK;\r
+}\r
+\r
+/************************************************************************************/\r
+/* This is an user defined function for receiving the response data of Cyclic Data.    */\r
+/************************************************************************************/\r
+#define RESPONSE_OFFSET_ADDRESS_SLAVE_INFO             0x0014\r
+\r
+void ccief_basic_master_recv_cyclic_data_response( uint8_t *pucData )\r
+{\r
+       CCIEF_BASIC_MASTER_GROUP_INFO   *pGroup;\r
+       uint32_t ulSlaveId;\r
+       uint8_t ucGroupNumber;\r
+       uint16_t usProtocolVersion;\r
+       int i, j, iIndex;\r
+       uint16_t usEndCode;\r
+\r
+       /* Get the protocol version and the group number and the slave id from received data */\r
+       usProtocolVersion = SHIFT_L8( pucData[1] ) + SHIFT_L0( pucData[0] );\r
+       usEndCode = SHIFT_L8( pucData[3] ) + SHIFT_L0( pucData[2] );\r
+       /* Check the end code */\r
+       if ( usEndCode == SLMP_END_DUPLICATE_MASTER )\r
+       {\r
+               for ( i = 0; i < Master.iGroupTotalNumber; i ++ )\r
+               {\r
+                       /* Execute the state of the master */\r
+                       ccief_basic_master_execute_state( Master.pGroup[i], CCIEF_BASIC_EVENT_MASTER_DUPLICATION_ERR_RECV );\r
+               }\r
+\r
+               return;\r
+       }\r
+       iIndex = SHIFT_L8( pucData[5] ) + SHIFT_L0( pucData[4]);\r
+       memcpy( &ulSlaveId, &pucData[iIndex], sizeof(uint32_t) );\r
+       iIndex += 4;\r
+       ucGroupNumber = pucData[iIndex];\r
+\r
+       for ( i = 0; i < Master.iGroupTotalNumber; i ++ )\r
+       {\r
+               /* Check the group number */\r
+               if ( Master.pGroup[i]->ucGroupNumber == ucGroupNumber )\r
+               {\r
+                       pGroup = Master.pGroup[i];\r
+\r
+                       for ( j = 0; j < pGroup->iTotalSlaveNumber; j ++ )\r
+                       {\r
+                               /* Check the slave id */\r
+                               if ( pGroup->pSlave[j]->ulId == ulSlaveId )\r
+                               {\r
+                                       /* Get the information from received data */\r
+                                       /* Check the cyclic start of the slave */\r
+                                       if ( pGroup->pSlave[j]->iCyclicStart == CCIEF_BASIC_CYCLIC_START )\r
+                                       {\r
+                                               /* Get the information from received data */\r
+                                               /* Slave information data */\r
+                                               memcpy( &pGroup->pSlave[j]->NotifyInfo, &pucData[RESPONSE_OFFSET_ADDRESS_SLAVE_INFO],\r
+                                                               sizeof( pGroup->pSlave[j]->NotifyInfo ) );\r
+\r
+                                               /* Protocol version */\r
+                                               pGroup->pSlave[j]->usProtocolVersion = usProtocolVersion;\r
+                                               /* End code */\r
+                                               pGroup->pSlave[j]->usEndCode = usEndCode;\r
+                                               /* Frame sequence number */\r
+                                               pGroup->pSlave[j]->usFrameSequenceNumber = SHIFT_L8( pucData[iIndex + 3] ) + SHIFT_L0( pucData[iIndex + 2] );\r
+                                               /* Pointer of RWr */\r
+                                               pGroup->pSlave[j]->pusSlaveRWr = (uint16_t*)&pucData[iIndex + 4];\r
+                                               /* Pointer of RX */\r
+                                               pGroup->pSlave[j]->pusSlaveRX = (uint16_t*)&pucData[iIndex + 4\r
+                                                                                                         + ( Master.Parameter.Slave[j].usOccupiedStationNumber * CCIEF_BASIC_RWW_RWR_SIZE )];\r
+                                               /* Execute the state of the slave */\r
+                                               ccief_basic_slaves_execute_state( pGroup->pSlave[j], CCIEF_BASIC_EVENT_SLAVE_CYCLIC_DATA_RECV );\r
+                                               \r
+                                               /* Check the state of slave duplication */\r
+                                               if( pGroup->pSlave[j]->iDuplicateState == CCIEF_BASIC_SLAVE_DUPLICATION_DETECT )\r
+                                               {\r
+                                                       Master.iErrCode = CCIEF_BASIC_MASTER_ERR_SLAVE_DUPLICATION;\r
+                                               }\r
+                                       }\r
+                               }\r
+                       }\r
+               }\r
+       }\r
+\r
+       return;\r
+}\r
diff --git a/CCIEF-BASIC_Master/sample/src/CCIEF_BASIC_SLAVES.c b/CCIEF-BASIC_Master/sample/src/CCIEF_BASIC_SLAVES.c
new file mode 100644 (file)
index 0000000..a45a595
--- /dev/null
@@ -0,0 +1,354 @@
+/*\r
+ * Copyright (C) 2017 Texas Instruments Incorporated - http://www.ti.com/\r
+ * Copyright (C) 2016 CC-Link Partner Association -http://am.cc-link.org/\r
+ * \r
+ * \r
+ *  Redistribution and use in source and binary forms, with or without \r
+ *  modification, are permitted provided that the following conditions \r
+ *  are met:\r
+ *\r
+ *    Redistributions of source code must retain the above copyright \r
+ *    notice, this list of conditions and the following disclaimer.\r
+ *\r
+ *    Redistributions in binary form must reproduce the above copyright\r
+ *    notice, this list of conditions and the following disclaimer in the \r
+ *    documentation and/or other materials provided with the   \r
+ *    distribution.\r
+ *\r
+ *    Neither the name of Texas Instruments Incorporated nor the names of\r
+ *    its contributors may be used to endorse or promote products derived\r
+ *    from this software without specific prior written permission.\r
+ *\r
+ *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \r
+ *  "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT \r
+ *  LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\r
+ *  A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT \r
+ *  OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, \r
+ *  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT \r
+ *  LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
+ *  DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\r
+ *  THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT \r
+ *  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE \r
+ *  OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
+ *\r
+*/\r
+\r
+#include "CCIEF_BASIC_SLAVES.h"\r
+#include <string.h>\r
+\r
+/* Definition of function of sample program */\r
+static void ccief_basic_slaves_execute_state_disconnect( CCIEF_BASIC_SLAVES_CYCLIC_DATA_INFO *pSlave, int iEvent );\r
+static void ccief_basic_slaves_execute_state_connecting( CCIEF_BASIC_SLAVES_CYCLIC_DATA_INFO *pSlave, int iEvent );\r
+static void ccief_basic_slaves_execute_state_cyclic_stop( CCIEF_BASIC_SLAVES_CYCLIC_DATA_INFO *pSlave, int iEvent );\r
+static void ccief_basic_slaves_execute_state_cyclic_end( CCIEF_BASIC_SLAVES_CYCLIC_DATA_INFO *pSlave, int iEvent );\r
+static void ccief_basic_slaves_execute_state_cyclic( CCIEF_BASIC_SLAVES_CYCLIC_DATA_INFO *pSlave, int iEvent );\r
+\r
+/************************************************************************************/\r
+/* This is an user defined function for initialization of the slave.                           */\r
+/************************************************************************************/\r
+void ccief_basic_slaves_initialize( CCIEF_BASIC_SLAVES_CYCLIC_DATA_INFO *pSlave )\r
+{\r
+       /* Set the slave state */\r
+       pSlave->iState = CCIEF_BASIC_STATE_SLAVE_DISCONNECT;\r
+\r
+       return;\r
+}\r
+\r
+/************************************************************************************/\r
+/* This is an user defined function for executed according to the state                                */\r
+/* of the slave.                                                                                                                                       */\r
+/************************************************************************************/\r
+void ccief_basic_slaves_execute_state( CCIEF_BASIC_SLAVES_CYCLIC_DATA_INFO *pSlave, int iEvent )\r
+{\r
+       /* Execute the state of the slave */\r
+       switch ( pSlave->iState )\r
+       {\r
+               /* Disconnection of the cyclic network. */\r
+               case CCIEF_BASIC_STATE_SLAVE_DISCONNECT:\r
+                       ccief_basic_slaves_execute_state_disconnect( pSlave, iEvent );\r
+                       break;\r
+               /* Connecting for the cyclic network. */\r
+               case CCIEF_BASIC_STATE_SLAVE_CONNECTING:\r
+                       ccief_basic_slaves_execute_state_connecting( pSlave, iEvent );\r
+                       break;\r
+               /* Stop the cyclic operation. */\r
+               case CCIEF_BASIC_STATE_SLAVE_CYCLIC_STOP:\r
+                       ccief_basic_slaves_execute_state_cyclic_stop( pSlave, iEvent );\r
+                       break;\r
+               /* End of the cyclic operation. */\r
+               case CCIEF_BASIC_STATE_SLAVE_CYCLIC_END:\r
+                       ccief_basic_slaves_execute_state_cyclic_end( pSlave, iEvent );\r
+                       break;\r
+               /* Running the cyclic operation. */\r
+               case CCIEF_BASIC_STATE_SLAVE_CYCLIC:\r
+                       ccief_basic_slaves_execute_state_cyclic( pSlave, iEvent );\r
+                       break;\r
+\r
+               default:\r
+                       break;\r
+       }\r
+\r
+       return;\r
+}\r
+\r
+/************************************************************************************/\r
+/* This is an user defined function for state of disconnect of the cyclic network.     */\r
+/************************************************************************************/\r
+void ccief_basic_slaves_execute_state_disconnect( CCIEF_BASIC_SLAVES_CYCLIC_DATA_INFO *pSlave, int iEvent )\r
+{\r
+       /* Check the event */\r
+       switch ( iEvent )\r
+       {\r
+               /* Changing the parameter */\r
+               case CCIEF_BASIC_EVENT_SLAVE_PARAMETER_CHANGE:\r
+                       /* Nothing */\r
+                       break;\r
+               /* Make the cyclic data */\r
+               case CCIEF_BASIC_EVENT_SLAVE_LINK_SCAN_START:\r
+                       /* Set the cyclic state */\r
+                       pSlave->iCyclicState = CCIEF_BASIC_CYCLIC_STATE_OFF;\r
+                       /* Check the start cyclic of user operation */\r
+                       if ( pSlave->iCyclicStart == CCIEF_BASIC_CYCLIC_START )\r
+                       {\r
+                               /* Set the cyclic state to connecting */\r
+                               pSlave->iCyclicStateSet = CCIEF_BASIC_CYCLIC_STATE_SET_CONNECTING;\r
+                               /* Initialize of the timeout count */\r
+                               pSlave->usTimeoutCount = 0;\r
+                               /* Set the slave state */\r
+                               pSlave->iState = CCIEF_BASIC_STATE_SLAVE_CONNECTING;\r
+                       }\r
+                       else\r
+                       {\r
+                               /* Set the cyclic state to stop cyclic */\r
+                               pSlave->iCyclicStateSet = CCIEF_BASIC_CYCLIC_STATE_SET_CYCLIC_STOP;\r
+                               /* Set the slave state */\r
+                               pSlave->iState = CCIEF_BASIC_STATE_SLAVE_CYCLIC_STOP;\r
+                       }\r
+                       break;\r
+               /* Receiving the error of the duplication master from the slave */\r
+               case CCIEF_BASIC_EVENT_SLAVE_DUPLICATION_MASTER_ERR:\r
+                       /* Nothing */\r
+                       break;\r
+\r
+               default:\r
+                       break;\r
+       }\r
+\r
+       return;\r
+}\r
+\r
+/************************************************************************************/\r
+/* This is an user defined function for state of connecting for the cyclic network.    */\r
+/************************************************************************************/\r
+void ccief_basic_slaves_execute_state_connecting( CCIEF_BASIC_SLAVES_CYCLIC_DATA_INFO *pSlave, int iEvent )\r
+{\r
+       /* Check the event */\r
+       switch ( iEvent )\r
+       {\r
+               /* Changing the parameter */\r
+               case CCIEF_BASIC_EVENT_SLAVE_PARAMETER_CHANGE:\r
+                       /* Set the slave state */\r
+                       pSlave->iState = CCIEF_BASIC_STATE_SLAVE_DISCONNECT;\r
+                       break;\r
+               /* Receiving the cyclic data from the slave */\r
+               case CCIEF_BASIC_EVENT_SLAVE_CYCLIC_DATA_RECV:\r
+                       /* Check the End code of the slave */\r
+                       if ( pSlave->usEndCode == CCIEF_BASIC_END_OK )\r
+                       {\r
+                               /* Set the slave state */\r
+                               pSlave->iState = CCIEF_BASIC_STATE_SLAVE_CYCLIC_END;\r
+                       }\r
+                       else\r
+                       {\r
+                               /* Set the slave state */\r
+                               pSlave->iState = CCIEF_BASIC_STATE_SLAVE_DISCONNECT;\r
+                       }\r
+                       break;\r
+               /* Timeout the response of the cyclic data */\r
+               case CCIEF_BASIC_EVENT_SLAVE_CYCLIC_DATA_TIMEOUT:\r
+                       /* Set the slave state */\r
+                       pSlave->iState = CCIEF_BASIC_STATE_SLAVE_DISCONNECT;\r
+                       break;\r
+               /* The end of the cyclic data of all slaves */\r
+               case CCIEF_BASIC_EVENT_SLAVE_CYCLIC_END:\r
+                       /* Set the slave state */\r
+                       pSlave->iState = CCIEF_BASIC_STATE_SLAVE_DISCONNECT;\r
+                       break;\r
+               /* Receiving the error of the duplication master from the slave */\r
+               case CCIEF_BASIC_EVENT_SLAVE_DUPLICATION_MASTER_ERR:\r
+                       /* Set the slave state */\r
+                       pSlave->iState = CCIEF_BASIC_STATE_SLAVE_DISCONNECT;\r
+                       break;\r
+\r
+               default:\r
+                       break;\r
+       }\r
+\r
+       return;\r
+}\r
+\r
+/************************************************************************************/\r
+/* This is an user defined function for state of stop the cyclic operation.                    */\r
+/************************************************************************************/\r
+void ccief_basic_slaves_execute_state_cyclic_stop( CCIEF_BASIC_SLAVES_CYCLIC_DATA_INFO *pSlave, int iEvent )\r
+{\r
+       /* Check the event */\r
+       switch ( iEvent )\r
+       {\r
+               /* Changing the parameter */\r
+               case CCIEF_BASIC_EVENT_SLAVE_PARAMETER_CHANGE:\r
+                       /* Set the slave state */\r
+                       pSlave->iState = CCIEF_BASIC_STATE_SLAVE_DISCONNECT;\r
+                       break;\r
+               /* Timeout the response of the cyclic data */\r
+               case CCIEF_BASIC_EVENT_SLAVE_CYCLIC_DATA_TIMEOUT:\r
+                       /* Set the slave state */\r
+                       pSlave->iState = CCIEF_BASIC_STATE_SLAVE_DISCONNECT;\r
+                       break;\r
+               /* The end of the cyclic data of all slaves */\r
+               case CCIEF_BASIC_EVENT_SLAVE_CYCLIC_END:\r
+                       /* Set the slave state */\r
+                       pSlave->iState = CCIEF_BASIC_STATE_SLAVE_DISCONNECT;\r
+                       break;\r
+               /* Receiving the error of the duplication master from the slave */\r
+               case CCIEF_BASIC_EVENT_SLAVE_DUPLICATION_MASTER_ERR:\r
+                       /* Set the slave state */\r
+                       pSlave->iState = CCIEF_BASIC_STATE_SLAVE_DISCONNECT;\r
+                       break;\r
+\r
+               default:\r
+                       break;\r
+       }\r
+\r
+       return;\r
+}\r
+\r
+/************************************************************************************/\r
+/* This is an user defined function for state of end of the cyclic operation.          */\r
+/************************************************************************************/\r
+void ccief_basic_slaves_execute_state_cyclic_end( CCIEF_BASIC_SLAVES_CYCLIC_DATA_INFO *pSlave, int iEvent )\r
+{\r
+       /* Check the event */\r
+       switch ( iEvent )\r
+       {\r
+               /* Changing the parameter */\r
+               case CCIEF_BASIC_EVENT_SLAVE_PARAMETER_CHANGE:\r
+                       /* Set the slave state */\r
+                       pSlave->iState = CCIEF_BASIC_STATE_SLAVE_DISCONNECT;\r
+                       break;\r
+               /* Make the cyclic data */\r
+               case CCIEF_BASIC_EVENT_SLAVE_LINK_SCAN_START:\r
+                       /* Check the start cyclic of user operation */\r
+                       if ( pSlave->iCyclicStart == CCIEF_BASIC_CYCLIC_START )\r
+                       {\r
+                               /* Set the cyclic state */\r
+                               pSlave->iCyclicState = CCIEF_BASIC_CYCLIC_STATE_ON;\r
+                               /* Set the cyclic state to cyclic */\r
+                               pSlave->iCyclicStateSet = CCIEF_BASIC_CYCLIC_STATE_SET_CYCLIC;\r
+                               /* Set the slave state */\r
+                               pSlave->iState = CCIEF_BASIC_STATE_SLAVE_CYCLIC;\r
+                       }\r
+                       else\r
+                       {\r
+                               /* Set the cyclic state to stop cyclic */\r
+                               pSlave->iCyclicStateSet = CCIEF_BASIC_CYCLIC_STATE_SET_CYCLIC_STOP;\r
+                               /* Set the slave state */\r
+                               pSlave->iState = CCIEF_BASIC_STATE_SLAVE_CYCLIC_STOP;\r
+                       }\r
+                       break;\r
+               /* Receiving the error of the duplication master from the slave */\r
+               case CCIEF_BASIC_EVENT_SLAVE_DUPLICATION_MASTER_ERR:\r
+                       /* Set the slave state */\r
+                       pSlave->iState = CCIEF_BASIC_STATE_SLAVE_DISCONNECT;\r
+                       break;\r
+               /* Receiving the cyclic data from the slave */\r
+               case CCIEF_BASIC_EVENT_SLAVE_CYCLIC_DATA_RECV:\r
+                       /* Check the response received */\r
+                       if( pSlave->iReceiveComplete == CCIEF_BASIC_SLAVE_RESPONSE_RECEIVED )\r
+                       {\r
+                               /* Already receved response */\r
+                               /* Set the error code of the slave duplication */\r
+                               pSlave->iDuplicateState = CCIEF_BASIC_SLAVE_DUPLICATION_DETECT;\r
+                       }\r
+                       break;\r
+               default:\r
+                       break;\r
+       }\r
+\r
+       return;\r
+}\r
+\r
+/************************************************************************************/\r
+/* This is an user defined function for state of running the cyclic operation.         */\r
+/************************************************************************************/\r
+void ccief_basic_slaves_execute_state_cyclic( CCIEF_BASIC_SLAVES_CYCLIC_DATA_INFO *pSlave, int iEvent )\r
+{\r
+       /* Check the event */\r
+       switch ( iEvent )\r
+       {\r
+               /* Changing the parameter */\r
+               case CCIEF_BASIC_EVENT_SLAVE_PARAMETER_CHANGE:\r
+                       /* Set the slave state */\r
+                       pSlave->iState = CCIEF_BASIC_STATE_SLAVE_DISCONNECT;\r
+                       break;\r
+               /* Receiving the cyclic data from the slave */\r
+               case CCIEF_BASIC_EVENT_SLAVE_CYCLIC_DATA_RECV:\r
+                       /* Get the current number of frame sequence */\r
+                       /* Check the end code of the slave */\r
+                       if ( pSlave->usEndCode == CCIEF_BASIC_END_OK )\r
+                       {\r
+                               /* Check the number of frame sequence */\r
+                               if ( *pSlave->pusFrameSequenceNumber == pSlave->usFrameSequenceNumber )\r
+                               {\r
+                                       /* Receive the response data from the slave */\r
+                                       /* RWr */\r
+                                       memcpy( pSlave->pusRWr, pSlave->pusSlaveRWr, pSlave->pParameter->usOccupiedStationNumber * CCIEF_BASIC_RWW_RWR_SIZE );\r
+                                       /* RX */\r
+                                       memcpy( pSlave->pusRX, pSlave->pusSlaveRX, pSlave->pParameter->usOccupiedStationNumber * CCIEF_BASIC_RX_RY_SIZE );\r
+                                       /* Initialize of the timeout count */\r
+                                       pSlave->usTimeoutCount = 0;\r
+                                       /* Set the slave state */\r
+                                       pSlave->iState = CCIEF_BASIC_STATE_SLAVE_CYCLIC_END;\r
+                                       \r
+                                       /* Set the receive complete flag  */\r
+                                       pSlave->iReceiveComplete = CCIEF_BASIC_SLAVE_RESPONSE_RECEIVED;\r
+                               }\r
+                               else\r
+                               {\r
+                                       /* Nothing */\r
+                               }\r
+                       }\r
+                       else\r
+                       {\r
+                               /* Set the slave state */\r
+                               pSlave->iState = CCIEF_BASIC_STATE_SLAVE_DISCONNECT;\r
+                       }\r
+                       break;\r
+               /* Timeout the response of the cyclic data */\r
+               case CCIEF_BASIC_EVENT_SLAVE_CYCLIC_DATA_TIMEOUT:\r
+                       /* Increase of the timeout count */\r
+                       pSlave->usTimeoutCount ++;\r
+                       /* Check of the timeout count */\r
+                       if ( pSlave->usTimeoutCount < pSlave->usCyclicTransmissionTimeoutCount )\r
+                       {\r
+                               /* Set the slave state */\r
+                               pSlave->iState = CCIEF_BASIC_STATE_SLAVE_CYCLIC_END;\r
+                       }\r
+                       else\r
+                       {\r
+                               /* Set the slave state */\r
+                               pSlave->iState = CCIEF_BASIC_STATE_SLAVE_DISCONNECT;\r
+                       }\r
+                       break;\r
+               /* Receiving the error of the duplication master from the slave */\r
+               case CCIEF_BASIC_EVENT_SLAVE_DUPLICATION_MASTER_ERR:\r
+                       /* Set the slave state */\r
+                       pSlave->iState = CCIEF_BASIC_STATE_SLAVE_DISCONNECT;\r
+                       break;\r
+\r
+               default:\r
+                       break;\r
+       }\r
+\r
+       return;\r
+}\r
diff --git a/CCIEF-BASIC_Master/sample/src/SOCKET.c b/CCIEF-BASIC_Master/sample/src/SOCKET.c
new file mode 100644 (file)
index 0000000..8791dee
--- /dev/null
@@ -0,0 +1,291 @@
+/*\r
+ * Copyright (C) 2017 Texas Instruments Incorporated - http://www.ti.com/\r
+ * Copyright (C) 2016 CC-Link Partner Association -http://am.cc-link.org/\r
+ * \r
+ * \r
+ *  Redistribution and use in source and binary forms, with or without \r
+ *  modification, are permitted provided that the following conditions \r
+ *  are met:\r
+ *\r
+ *    Redistributions of source code must retain the above copyright \r
+ *    notice, this list of conditions and the following disclaimer.\r
+ *\r
+ *    Redistributions in binary form must reproduce the above copyright\r
+ *    notice, this list of conditions and the following disclaimer in the \r
+ *    documentation and/or other materials provided with the   \r
+ *    distribution.\r
+ *\r
+ *    Neither the name of Texas Instruments Incorporated nor the names of\r
+ *    its contributors may be used to endorse or promote products derived\r
+ *    from this software without specific prior written permission.\r
+ *\r
+ *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \r
+ *  "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT \r
+ *  LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\r
+ *  A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT \r
+ *  OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, \r
+ *  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT \r
+ *  LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
+ *  DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\r
+ *  THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT \r
+ *  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE \r
+ *  OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
+ *\r
+*/\r
+\r
+#include "SOCKET.h"\r
+\r
+/************************************************************************************/\r
+/* The following is an user defined main program. This main program is one of a                */\r
+/* sample in the Windows OS and Intel x86 CPU. Please rewrite if necessary.                    */\r
+/* This main program is one of a sample in the Linux. Please rewrite if necessary.     */\r
+/*                                                                                                                                                                     */\r
+/* This sample program for CCIEF-BASIC Slave Application.                                                      */\r
+/*                                                                                                                                                                     */\r
+/************************************************************************************/\r
+\r
+#include <stdio.h>\r
+#ifdef _WIN32\r
+#include <stdint.h>\r
+#include <winsock2.h>\r
+#elif __linux__\r
+#include <sys/socket.h>\r
+#include <netinet/in.h>\r
+#include <sys/ioctl.h>\r
+#include <sys/types.h>\r
+#include <errno.h>\r
+\r
+#define SOCKET_ERROR   -1\r
+#define SOCKET_NOT_OPEN        0\r
+#define TRUE                   1\r
+#endif\r
+\r
+/************************************************************************************/\r
+/* This is an user defined function for initialization of the socket.                          */\r
+/* The following is one of a sample in the Windows OS. Please rewrite if necessary.    */\r
+/* The following is one of a sample in the Linux. Please rewrite if necessary.         */\r
+/************************************************************************************/\r
+#ifdef _WIN32 \r
+int socket_initialize( SOCKET *sock, uint32_t ulIpAddress, uint16_t usPortNumber )\r
+#elif __linux__\r
+int socket_initialize( int *sock, uint32_t ulIpAddress, uint16_t usPortNumber )\r
+#endif\r
+{\r
+#ifdef _WIN32\r
+       SOCKET          sock_tmp;\r
+       SOCKADDR_IN     addr;\r
+       int                     addr_len = 0;\r
+       BOOL            opt_val = FALSE;\r
+       int                     opt_len = sizeof( BOOL );\r
+#elif __linux__\r
+       struct sockaddr_in      addr;\r
+       int                                     sock_tmp;\r
+       int                                     addr_len = 0;\r
+       int                                     opt_val = 0;\r
+       int                                     opt_len = sizeof( int );\r
+#endif\r
+       u_long          val = 0;\r
+       int                     iResult;\r
+\r
+       /* Create a socket */\r
+       sock_tmp = socket( AF_INET, SOCK_DGRAM, 0 );\r
+#ifdef _WIN32\r
+       if ( sock_tmp == INVALID_SOCKET )\r
+#elif __linux__\r
+       if ( sock_tmp < SOCKET_NOT_OPEN )\r
+#endif\r
+       {\r
+#ifdef _WIN32\r
+               printf( "socket failed with error: %ld\n", WSAGetLastError() );\r
+#elif __linux__\r
+               perror( "socket failed with error" );\r
+#endif\r
+               return SOCKET_ERR_SOCKET;\r
+       }\r
+\r
+       /* Setup the UDP socket */\r
+       addr.sin_family = AF_INET;                                      /* Address Famiry : Internet */\r
+       addr.sin_port   = htons(usPortNumber);          /* Port number */\r
+#ifdef _WIN32 \r
+       addr.sin_addr.s_addr = htonl(ulIpAddress);      /* IP address */\r
+#elif __linux__\r
+       addr.sin_addr.s_addr = INADDR_ANY;                      /* It can be bound to all of the local interface */\r
+#endif\r
+       addr_len = sizeof( addr );\r
+\r
+#ifdef _WIN32\r
+       iResult = bind( sock_tmp, (SOCKADDR *)&addr, (int)addr_len );\r
+#elif __linux__\r
+       iResult = bind( sock_tmp, (struct sockaddr *)&addr, (unsigned int )addr_len );\r
+#endif\r
+       if ( iResult == SOCKET_ERROR )\r
+       {\r
+#ifdef _WIN32\r
+               printf( "bind failed with error: %d\n", WSAGetLastError() );\r
+               closesocket( sock_tmp );\r
+#elif __linux__\r
+               perror( "bind failed with error" );\r
+               close( sock_tmp );\r
+#endif\r
+               return SOCKET_ERR_SOCKET;\r
+       }\r
+\r
+       /* Sets the socket option for broadcast packet. */\r
+       opt_val = TRUE;\r
+\r
+#ifdef _WIN32\r
+       iResult = setsockopt( sock_tmp, SOL_SOCKET, SO_BROADCAST, (char *) &opt_val, opt_len );\r
+#elif __linux__\r
+       iResult = setsockopt( sock_tmp, SOL_SOCKET, SO_BROADCAST, (char *) &opt_val, (unsigned int )opt_len );\r
+#endif\r
+       if (iResult == SOCKET_ERROR)\r
+       {\r
+#ifdef _WIN32\r
+               printf("ERR : setsockopt : SO_BROADCAST\n");\r
+               closesocket( sock_tmp );\r
+#elif __linux__\r
+               perror( "ERR : setsockopt : SO_BROADCAST" );\r
+               close( sock_tmp );\r
+#endif\r
+               return SOCKET_ERR_SOCKET;\r
+       }\r
+\r
+       /* for Non-blocking operation */\r
+       val = 1;\r
+#ifdef _WIN32\r
+       ioctlsocket( sock_tmp, FIONBIO, &val );\r
+#elif __linux__\r
+       ioctl( sock_tmp, FIONBIO, &val );\r
+#endif\r
+\r
+       *sock = sock_tmp;\r
+\r
+       return SOCKET_ERR_OK;\r
+}\r
+\r
+/************************************************************************************/\r
+/* This is an user defined function for termination of the socket.                                     */\r
+/* The following is one of a sample in the Windows OS. Please rewrite if necessary.    */\r
+/* The following is one of a sample in the Linux. Please rewrite if necessary.         */\r
+/************************************************************************************/\r
+#ifdef _WIN32\r
+void socket_terminate( SOCKET sock )\r
+#elif __linux__\r
+void socket_terminate( int sock )\r
+#endif\r
+{\r
+       /* Close a socket */\r
+#ifdef _WIN32\r
+       closesocket( sock );\r
+#elif __linux__\r
+       close( sock );\r
+#endif\r
+\r
+       return;\r
+}\r
+\r
+/************************************************************************************/\r
+/* This is an user defined function for receiving packet. The following is one of a    */\r
+/* sample in the Windows OS. Please rewrite if necessary.                                                      */\r
+/*The following is one of a    sample in the Linux. Please rewrite if necessary.               */\r
+/************************************************************************************/\r
+#ifdef _WIN32\r
+int socket_recv( SOCKET sock, uint8_t *pucStream, int iLength, uint32_t *pulRecvAddr, uint16_t *pusRecvPortNumber )\r
+#elif __linux__\r
+int socket_recv( int sock, uint8_t *pucStream, int iLength, uint32_t *pulRecvAddr, uint16_t *pusRecvPortNumber )\r
+#endif\r
+{\r
+       int                             iErrCode = 0;\r
+       int                             iAddrSize = 0;\r
+#ifdef _WIN32\r
+       SOCKADDR_IN             addrSender;\r
+\r
+       iAddrSize = sizeof( SOCKADDR_IN );\r
+#elif __linux__\r
+       struct sockaddr_in              addrSender;\r
+       iAddrSize = sizeof( addrSender );\r
+#endif\r
+\r
+       /* Packet receiving */\r
+#ifdef _WIN32\r
+       iErrCode = recvfrom( sock, (char *)pucStream, iLength, 0, (SOCKADDR *)&addrSender, &iAddrSize );\r
+#elif __linux__\r
+       iErrCode = recvfrom( sock, (char *)pucStream, iLength, 0, (struct sockaddr *)&addrSender, &iAddrSize );\r
+#endif\r
+\r
+       if( iErrCode == SOCKET_ERROR )\r
+       {\r
+               /*No received data*/\r
+#ifdef _WIN32\r
+               errno = WSAGetLastError();\r
+               if ( errno == WSAEWOULDBLOCK )\r
+#elif __linux__\r
+               if( errno == EAGAIN )\r
+#endif\r
+               {\r
+                       return SOCKET_ERR_NO_RECEIVABLE;\r
+               }\r
+               else\r
+               {\r
+#ifdef _WIN32\r
+                       printf( "ERR : recvfrom failed with error: %ld\n", errno );\r
+#elif __linux__\r
+                       perror("recvfrom failed with error");\r
+#endif\r
+                       return SOCKET_ERR_RECV;\r
+               }\r
+       }\r
+       else if ( iErrCode == 0 )\r
+       {\r
+               printf( "ERR : recvfrom failed with error: disconnected\n" );\r
+               return SOCKET_ERR_RECV;\r
+       }\r
+\r
+       (*pulRecvAddr) = ntohl(addrSender.sin_addr.s_addr);\r
+       (*pusRecvPortNumber) = ntohs(addrSender.sin_port);\r
+\r
+       return SOCKET_ERR_OK;\r
+}\r
+\r
+/************************************************************************************/\r
+/* This is an user defined function for sending packet. The following is one of a      */\r
+/* sample in the Windows OS. Please rewrite if necessary.                                                      */\r
+/* The following is one of a sample in the Linux. Please rewrite if necessary.         */\r
+/************************************************************************************/\r
+#ifdef _WIN32\r
+int socket_send( SOCKET sock, uint8_t *pucStream, int iLength, uint32_t ulSendAddr, uint16_t usSendPortNumber )\r
+#elif __linux__\r
+int socket_send( int sock, uint8_t *pucStream, int iLength, uint32_t ulSendAddr, uint16_t usSendPortNumber )\r
+#endif\r
+{\r
+       int                             iErrCode = 0;\r
+       int                             iAddrSize = 0;\r
+#ifdef _WIN32\r
+       SOCKADDR_IN             addrServer;\r
+#elif __linux__\r
+       struct sockaddr_in      addrServer;\r
+#endif\r
+\r
+       addrServer.sin_family = AF_INET;                                /* Address Famiry       : Internet */\r
+       addrServer.sin_port     = htons(usSendPortNumber);      /* Port Number */\r
+       addrServer.sin_addr.s_addr = htonl(ulSendAddr);\r
+       iAddrSize = sizeof( addrServer );\r
+\r
+       /* Packet Sending */\r
+#ifdef _WIN32\r
+       iErrCode = sendto( sock, (char *)pucStream, iLength, 0, (LPSOCKADDR)&addrServer, iAddrSize );\r
+#elif __linux__\r
+       iErrCode = sendto( sock, (char *)pucStream, iLength, 0, (struct sockaddr *)&addrServer, iAddrSize );\r
+#endif\r
+       if( iErrCode == SOCKET_ERROR )\r
+       {\r
+#ifdef _WIN32\r
+               printf( "sendto failed with error: %ld\n", WSAGetLastError() );\r
+#elif __linux__\r
+               perror("send to failed with error");\r
+#endif\r
+               return SOCKET_ERR_SEND;\r
+       }\r
+\r
+       return SOCKET_ERR_OK;\r
+}\r
diff --git a/CCIEF-BASIC_Master/sample/src/TIMER.c b/CCIEF-BASIC_Master/sample/src/TIMER.c
new file mode 100644 (file)
index 0000000..47b14cb
--- /dev/null
@@ -0,0 +1,445 @@
+/*\r
+ * Copyright (C) 2017 Texas Instruments Incorporated - http://www.ti.com/\r
+ * Copyright (C) 2016 CC-Link Partner Association -http://am.cc-link.org/\r
+ * \r
+ * \r
+ *  Redistribution and use in source and binary forms, with or without \r
+ *  modification, are permitted provided that the following conditions \r
+ *  are met:\r
+ *\r
+ *    Redistributions of source code must retain the above copyright \r
+ *    notice, this list of conditions and the following disclaimer.\r
+ *\r
+ *    Redistributions in binary form must reproduce the above copyright\r
+ *    notice, this list of conditions and the following disclaimer in the \r
+ *    documentation and/or other materials provided with the   \r
+ *    distribution.\r
+ *\r
+ *    Neither the name of Texas Instruments Incorporated nor the names of\r
+ *    its contributors may be used to endorse or promote products derived\r
+ *    from this software without specific prior written permission.\r
+ *\r
+ *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \r
+ *  "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT \r
+ *  LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\r
+ *  A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT \r
+ *  OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, \r
+ *  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT \r
+ *  LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
+ *  DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\r
+ *  THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT \r
+ *  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE \r
+ *  OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
+ *\r
+*/\r
+\r
+#include "TIMER.h"\r
+\r
+/************************************************************************************/\r
+/* The following is an user defined main program. This main program is one of a                */\r
+/* sample in the Windows OS and Intel x86 CPU. Please rewrite if necessary.                    */\r
+/* This main program is one of a sample in the Linux. Please rewrite if necessary.     */\r
+/************************************************************************************/\r
+\r
+#ifdef _WIN32\r
+#include <stdint.h>\r
+\r
+#if defined(_MSC_VER) && (_MSC_VER >= 1020)\r
+#define MS_WINDOWS\r
+#endif\r
+\r
+#ifdef MS_WINDOWS\r
+#include <windows.h>\r
+#include <time.h>\r
+#include <mmsystem.h>\r
+#pragma comment( lib, "winmm.lib" )\r
+#else\r
+#include <sys/time.h>\r
+#endif\r
+#elif __linux__\r
+#include <time.h>\r
+#include <string.h>\r
+#include <sys/time.h>\r
+#endif\r
+/*[ Structure for the timer ]*/\r
+typedef struct \r
+{\r
+       int                             iId;                    /* Timer id */\r
+       int64_t                 llTime;                 /* Period of time [us] */\r
+       int64_t                 llStart;                /* Start of time [us] */\r
+       TIMER_CALLBACK  pCallbackFunc;  /* Callback function */\r
+       void                    *pCallbackArg;  /* Callback argument */\r
+} TIMER;\r
+\r
+#ifdef _WIN32\r
+struct timezone {\r
+       int             tz_minuteswest;\r
+       int             tz_dsttime;    \r
+};\r
+#elif __linux__\r
+#endif\r
+\r
+static TIMER Timer[TIMER_MAX];\r
+static int iTimerId = 0;\r
+\r
+/* Definition of function of the timer */\r
+int    timer_gettimeofday( struct timeval *tv, struct timezone *tz );\r
+\r
+/************************************************************************************/\r
+/* This is an user defined function for initialize the timer.                                          */\r
+/************************************************************************************/\r
+void timer_initialize( void )\r
+{\r
+       /* Initialize the timer environment */\r
+       memset( &Timer, 0, sizeof( Timer ) );\r
+\r
+       return;\r
+}\r
+\r
+/************************************************************************************/\r
+/* This is an user defined function for terminate the timer.                                           */\r
+/************************************************************************************/\r
+void timer_terminate( void )\r
+{\r
+       /* Terminate the timer environment */\r
+       /* if needed */\r
+\r
+       return;\r
+}\r
+\r
+/************************************************************************************/\r
+/* This is an user defined function for main the timer.                                                                */\r
+/************************************************************************************/\r
+void timer_main( void )\r
+{\r
+       int i, iStopId;\r
+       int64_t llCurrent;\r
+\r
+       /* main loop for the timer */\r
+       for( i = 0; i < TIMER_MAX; i++ )\r
+       {\r
+               if ( Timer[i].iId != 0 )\r
+               {\r
+                       /* Get the difference time */\r
+                       llCurrent = timer_get_time();\r
+                       /* Timeout the timer */\r
+                       if ( Timer[i].llTime <= ( llCurrent - Timer[i].llStart ) )\r
+                       {\r
+                               iStopId = Timer[i].iId;\r
+                               if ( Timer[i].pCallbackFunc != NULL )\r
+                               {\r
+                                       /* Execute of the callback function */\r
+                                       Timer[i].pCallbackFunc( Timer[i].iId, Timer[i].pCallbackArg );\r
+                               }\r
+                               /* Initialize of the timer */\r
+                               if ( iStopId == Timer[i].iId )\r
+                               {\r
+                                       Timer[i].iId = 0;\r
+                               }\r
+                       }\r
+               }\r
+       }\r
+\r
+       return;\r
+}\r
+\r
+/************************************************************************************/\r
+/* This is an user defined function for starting the timer.[ms]                                                */\r
+/************************************************************************************/\r
+int timer_start( long lTime, int *piId, TIMER_CALLBACK pCallbackFunc, void *pCallbackArg )\r
+{\r
+       int i;\r
+       struct  timeval tv;\r
+\r
+       /* Check the unusing timer */\r
+       for( i = 0; i < TIMER_MAX; i++ )\r
+       {\r
+               if ( Timer[i].iId == 0 )\r
+               {\r
+                       break;\r
+               }\r
+       }\r
+       if ( i == TIMER_MAX )\r
+       {\r
+               /* No free timer */\r
+               return TIMER_RESOURCE_NONE;\r
+       }\r
+\r
+       iTimerId ++;\r
+       if ( iTimerId == 0 )\r
+       {\r
+               iTimerId = 1;\r
+       }\r
+       Timer[i].iId = iTimerId;\r
+\r
+       timer_gettimeofday( &tv, (struct timezone *)NULL );\r
+\r
+       Timer[i].llTime = (int64_t)lTime * 1000;\r
+       Timer[i].llStart = (int64_t)tv.tv_sec * 1000000 + tv.tv_usec;\r
+       Timer[i].pCallbackFunc = pCallbackFunc;\r
+       Timer[i].pCallbackArg = pCallbackArg;\r
+\r
+       if ( piId != NULL )\r
+       {\r
+               *piId = Timer[i].iId;\r
+       }\r
+\r
+       return TIMER_OK;\r
+}\r
+\r
+/************************************************************************************/\r
+/* This is an user defined function for stoping the timer.                                                     */\r
+/************************************************************************************/\r
+void timer_stop( int iId )\r
+{\r
+       int i;\r
+\r
+       /* Check the using timer */\r
+       for( i = 0; i < TIMER_MAX; i++ )\r
+       {\r
+               if ( Timer[i].iId == iId )\r
+               {\r
+                       /* Initialize of the timer */\r
+                       Timer[i].iId = 0;\r
+                       break;\r
+               }\r
+       }\r
+\r
+       return;\r
+}\r
+\r
+/************************************************************************************/\r
+/* This is an user defined function for getting the current time.[us]                          */\r
+/************************************************************************************/\r
+int64_t timer_get_time( void )\r
+{\r
+       int64_t llCurrent;\r
+       struct  timeval tv;\r
+\r
+       timer_gettimeofday( &tv, (struct timezone *)NULL );\r
+\r
+       llCurrent = (int64_t)tv.tv_sec * 1000000 + tv.tv_usec;\r
+\r
+       return llCurrent;\r
+}\r
+\r
+/************************************************************************************/\r
+/* This is an user defined function for calculate the Time Data[ms] (Time of UNIX).    */\r
+/************************************************************************************/\r
+int64_t timer_calculate_time_data( void )\r
+{\r
+       time_t timer;\r
+#ifdef _WIN32\r
+       struct tm t_st;\r
+#elif __linux__\r
+       struct tm *t_st;\r
+#endif\r
+       struct  timeval tv;\r
+       uint16_t usYear, usMonth, usDay;\r
+       uint16_t usHour, usMinute, usSecond, usMilliseconds;\r
+       int64_t llDays;\r
+       int64_t llTime;\r
+\r
+       /* Getting the current time */\r
+       time(&timer);\r
+       timer_gettimeofday( &tv, (struct timezone *)NULL );\r
+\r
+       /* Convert to local time */\r
+#ifdef _WIN32\r
+       localtime_s( &t_st,&timer );\r
+#elif __linux__\r
+       t_st = localtime( &timer );\r
+#endif\r
+#ifdef _WIN32\r
+       usYear = (uint16_t)t_st.tm_year + 1900;\r
+       usMonth = (uint16_t)t_st.tm_mon + 1;\r
+       usDay = (uint16_t)t_st.tm_mday;\r
+       usHour = (uint16_t)t_st.tm_hour;\r
+       usMinute = (uint16_t)t_st.tm_min;\r
+       usSecond = (uint16_t)t_st.tm_sec;\r
+#elif __linux__\r
+       usYear = (uint16_t)t_st->tm_year + 1900;\r
+       usMonth = (uint16_t)t_st->tm_mon + 1;\r
+       usDay = (uint16_t)t_st->tm_mday;\r
+       usHour = (uint16_t)t_st->tm_hour;\r
+       usMinute = (uint16_t)t_st->tm_min;\r
+       usSecond = (uint16_t)t_st->tm_sec;\r
+#endif\r
+       usMilliseconds = (uint16_t)( tv.tv_usec / 1000 );\r
+\r
+       /* Converting the January and the February in the previous year of the month of the 13th and 14th. */\r
+       if ( usMonth <= 2 ) {\r
+               usYear--;\r
+               usMonth += 12;\r
+       }\r
+\r
+       llDays = 365 * ( usYear - 1 )\r
+                       + ( usYear / 4 ) - ( usYear / 100 ) + ( usYear / 400 )\r
+                       + (( usMonth * 979 - 1033 ) / 32 ) + usDay - 1;\r
+\r
+       llTime = (( llDays - 719162 ) * 86400 ) + ( usHour * 3600 ) + ( usMinute * 60 ) + usSecond;\r
+       llTime = ( llTime * 1000 ) + usMilliseconds;\r
+\r
+       return llTime;\r
+}\r
+\r
+/************************************************************************************/\r
+/* This is an user defined function for analyze the Time Data (Time of UNIX).          */\r
+/************************************************************************************/\r
+void timer_analyze_time_data( int64_t llTime, TIMER_TIME_DATA *pTimeData )\r
+{\r
+       /* Number of days table of each month (for the year-round, for a leap year) */\r
+       static const uint8_t    aucDaysTable[2][13] = {\r
+               { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 },\r
+               { 0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }\r
+       };\r
+       uint32_t ulElapsedDays;\r
+       uint32_t ulTotalDays;\r
+       uint32_t ulThisYear;\r
+       uint32_t ulLastYearDays;\r
+       uint32_t ulThisYearDays;\r
+       uint32_t ulTempDays;\r
+       uint16_t usThisMonth;\r
+       uint32_t ulThisMinute;\r
+       uint16_t usIndex;\r
+\r
+       /* Calculate the number of days elapsed */\r
+       ulElapsedDays = (uint32_t)((( llTime / 1000) / 86400 ) + 719162);\r
+\r
+       /* It calculates the total number of days, including the day to the number of days elapsed */\r
+       ulTotalDays = ulElapsedDays + 1;\r
+\r
+       /* Initialized with the previous year */\r
+       ulThisYear = ulTotalDays / 365;\r
+       /* Calculate the year */\r
+       while ( 1 )\r
+       {\r
+               /* Calculate the previous year the number of days */\r
+               ulLastYearDays = ( ulThisYear * 365 ) + ( ulThisYear / 4 ) - ( ulThisYear / 100 ) + ( ulThisYear / 400 );\r
+               if ( ulLastYearDays >= ulTotalDays )\r
+               {\r
+                       ulThisYear --;\r
+               }\r
+               else\r
+               {\r
+                       ulThisYear ++;\r
+                       break;\r
+               }\r
+       }\r
+\r
+       /* Calculate the number of days from January 1 */\r
+       ulThisYearDays = ulTotalDays - ulLastYearDays;\r
+\r
+       /* Calculating the index for the number of days table of each month or the full year or a leap year */\r
+       if (( ulThisYear % 4 == 0 ) && ( ulThisYear % 100 != 0 ) || ( ulThisYear % 400 == 0 ))\r
+       {\r
+               usIndex = 1;\r
+       }\r
+       else\r
+       {\r
+               usIndex = 0;\r
+       }\r
+\r
+       /* Calculate the month */\r
+       ulTempDays = 0;\r
+       for ( usThisMonth = 0; ( ulTempDays < ulThisYearDays ) && ( usThisMonth < 12 ); usThisMonth++ )\r
+       {\r
+               ulTempDays += aucDaysTable[ usIndex ][ usThisMonth + 1 ];\r
+       }\r
+\r
+       /* Results to the argument */\r
+       pTimeData->usYear  = (uint16_t)ulThisYear;\r
+       pTimeData->usMonth = usThisMonth;\r
+       pTimeData->usDay = (uint16_t)( ulThisYearDays - ( ulTempDays - aucDaysTable[ usIndex ][ usThisMonth ]));\r
+       ulThisMinute = (uint32_t)(( llTime / 1000) % 86400 );\r
+       pTimeData->usHour = (uint16_t)( ulThisMinute / 3600 );\r
+       pTimeData->usMinute = (uint16_t)(( ulThisMinute % 3600 ) / 60 );\r
+       pTimeData->usSecond = (uint16_t)(( ulThisMinute % 3600 ) % 60 );\r
+       pTimeData->usMilliseconds = (uint16_t)( llTime % 1000 );\r
+       \r
+       return;\r
+}\r
+\r
+#ifdef _WIN32\r
+#ifdef MS_WINDOWS\r
+/************************************************************************************/\r
+/* This is an user defined function for "gettimeofday" function [us] (POSIX).          */\r
+/* The following is one of a sample in the Windows OS.                                                         */\r
+/************************************************************************************/\r
+\r
+#define EPOCHFILETIME (116444736000000000i64)\r
+\r
+int timer_gettimeofday( struct timeval *tv, struct timezone *tz )\r
+{\r
+       static FILETIME                 ft;\r
+       static LARGE_INTEGER    lTime;\r
+       __int64                                 val64;\r
+       static int                              tv_first = 0, tz_first = 0;\r
+       long                                    lTimezone = 0;\r
+       int                                             iDaylight = 0;\r
+       /* static DWORD                 dwStart; */ /* Method1 */\r
+       /* DWORD                                        dwEnd; */ /* Method1 */\r
+       static LARGE_INTEGER    start; /* Method2 */\r
+       LARGE_INTEGER                   freq, end; /* Method2 */\r
+\r
+       if ( tv != NULL )\r
+       {\r
+               QueryPerformanceFrequency(&freq); /* Method2 */\r
+               if ( tv_first == 0 )\r
+               {\r
+                       GetSystemTimeAsFileTime( &ft );\r
+                       /* dwStart = timeGetTime(); */ /* Method1 */\r
+                       QueryPerformanceCounter(&start); /* Method2 */\r
+                       tv_first = 1;\r
+               }\r
+               /* dwEnd = timeGetTime(); */ /* Method1 */\r
+               QueryPerformanceCounter(&end); /* Method2 */\r
+               lTime.LowPart  = ft.dwLowDateTime;\r
+               lTime.HighPart = ft.dwHighDateTime;\r
+               /* lTime.QuadPart += (dwEnd - dwStart) * 10000; */ /* Method1 */\r
+               lTime.QuadPart += ((end.QuadPart - start.QuadPart) * 10000000) / freq.QuadPart; /* Method2 */\r
+               val64 = lTime.QuadPart;\r
+               val64 = val64 - EPOCHFILETIME;\r
+               val64 = val64 / 10;\r
+               tv->tv_sec  = (long)( val64 / 1000000 );\r
+               tv->tv_usec = (long)( val64 % 1000000 );\r
+       }\r
+\r
+       if ( tz != NULL )\r
+       {\r
+               if ( tz_first == 0 )\r
+               {\r
+                       _tzset();\r
+                       tz_first = 1;\r
+               }\r
+\r
+               _get_timezone( &lTimezone );\r
+               tz->tz_minuteswest = lTimezone / 60;\r
+\r
+               _get_daylight( &iDaylight );\r
+               tz->tz_dsttime = iDaylight;\r
+       }\r
+\r
+       return TIMER_OK;\r
+}\r
+\r
+#else\r
+/************************************************************************************/\r
+/* This is an user defined function for "gettimeofday" function.[us] (POSIX)           */\r
+/* The following is one of a sample. Please rewrite if necessary.                                      */\r
+/************************************************************************************/\r
+int    timer_gettimeofday( struct timeval *tv, struct timezone *tz )\r
+{\r
+       return gettimeofday( tv, tz ); \r
+}\r
+#endif\r
+#elif __linux__\r
+/************************************************************************************/\r
+/* This is an user defined function for "gettimeofday" function.[us] (POSIX)           */\r
+/* The following is one of a sample. Please rewrite if necessary.                                      */\r
+/************************************************************************************/\r
+int    timer_gettimeofday( struct timeval *tv, struct timezone *tz )\r
+{\r
+       return gettimeofday( tv, tz ); \r
+}\r
+#endif\r
diff --git a/CCIEF-BASIC_Master/sample/src/USER_SAMPLE.c b/CCIEF-BASIC_Master/sample/src/USER_SAMPLE.c
new file mode 100644 (file)
index 0000000..121240f
--- /dev/null
@@ -0,0 +1,1304 @@
+/*\r
+ * Copyright (C) 2017 Texas Instruments Incorporated - http://www.ti.com/\r
+ * Copyright (C) 2016 CC-Link Partner Association -http://am.cc-link.org/\r
+ * \r
+ * \r
+ *  Redistribution and use in source and binary forms, with or without \r
+ *  modification, are permitted provided that the following conditions \r
+ *  are met:\r
+ *\r
+ *    Redistributions of source code must retain the above copyright \r
+ *    notice, this list of conditions and the following disclaimer.\r
+ *\r
+ *    Redistributions in binary form must reproduce the above copyright\r
+ *    notice, this list of conditions and the following disclaimer in the \r
+ *    documentation and/or other materials provided with the   \r
+ *    distribution.\r
+ *\r
+ *    Neither the name of Texas Instruments Incorporated nor the names of\r
+ *    its contributors may be used to endorse or promote products derived\r
+ *    from this software without specific prior written permission.\r
+ *\r
+ *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \r
+ *  "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT \r
+ *  LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\r
+ *  A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT \r
+ *  OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, \r
+ *  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT \r
+ *  LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
+ *  DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\r
+ *  THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT \r
+ *  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE \r
+ *  OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
+ *\r
+*/\r
+\r
+#include "SLMP.h"\r
+#include "CCIEF_BASIC_MASTER.h"\r
+#include "USER_SAMPLE.h"\r
+#include "TIMER.h"\r
+\r
+/************************************************************************************/\r
+/* The following is an user defined main program. This main program is one of a                */\r
+/* sample in the Windows OS and Intel x86 CPU. Please rewrite if necessary.                    */\r
+/* This main program is one of a sample in the Linux. Please rewrite if necessary.     */\r
+/************************************************************************************/\r
+\r
+#include <stdio.h>\r
+#ifdef _WIN32\r
+#include <WinSock2.h>\r
+#include <Ws2tcpip.h>\r
+#include <iphlpapi.h>\r
+#include <conio.h>\r
+#elif __linux__\r
+#include <string.h>\r
+#include <sys/socket.h>\r
+#include <sys/ioctl.h>\r
+#include <sys/types.h>\r
+#include <net/if.h>\r
+#include <netinet/in.h>\r
+#include <arpa/inet.h>\r
+#include <net/route.h>\r
+#include <termios.h>\r
+#include <unistd.h>\r
+#include <fcntl.h>\r
+\r
+/*[ Definition for sample program ]*/\r
+#define        MAX_INTERFACE                                           20\r
+#define        MAX_PATH                                                        260\r
+#define        SOCKET_NOT_OPEN                                         0\r
+#define        DIR_PROC_ROUTE                                          "/proc/net/route"\r
+\r
+/*[ Structure of sample program ]*/\r
+typedef struct\r
+{\r
+       char                            IPAddr[INET_ADDRSTRLEN];\r
+       char                            IPMask[INET_ADDRSTRLEN];\r
+       char                            MACAddr[18];\r
+       char                            Defo[1028];\r
+       struct ifreq            USER_ifreq;\r
+} USER_NETWORK_INFO;\r
+\r
+typedef struct \r
+{\r
+       char                            cIface[IF_NAMESIZE];\r
+       struct in_addr          cDst;\r
+       struct in_addr          cGateway;\r
+       unsigned short int      iFlag;\r
+       int                                     iRecCnt;\r
+       int                                     iUse;\r
+       short int                       iMetric;\r
+       struct in_addr          cMask;\r
+       unsigned long int       iMTU;\r
+       unsigned long int       iWindow;\r
+       unsigned short int      iIRTT;\r
+} t_RouteInfo;\r
+#endif\r
+\r
+typedef struct \r
+{\r
+       uint8_t         aucMacAddress[6];                       /* MAC Address */\r
+       uint32_t        ulIpAddress;                            /* IP Address */\r
+       uint32_t        ulSubnetMask;                           /* Subnet Mask */\r
+       uint32_t        ulDefaultGatewayIPAddress;      /* Default Gateway IP Address */\r
+} USER_ADAPTER_INFO;\r
+\r
+/* Definition of external variable of sample program */\r
+static CCIEF_BASIC_MASTER_PARAMETER    UserMasterParameter;\r
+static USER_ADAPTER_INFO                       AdapterInfo;\r
+static char                                                    acMasterParameterFile[MAX_PATH] = "";\r
+\r
+/* Definition of function of sample program */\r
+static void user_callback_cyclic_link_scan_end( uint8_t ucGroupNumber );\r
+static int user_parameter_file_read( char *file_path, CCIEF_BASIC_MASTER_PARAMETER *pParameter );\r
+static void user_get_input_line( char *pcLine, int iLineLength );\r
+static void user_show_menu_top( void );\r
+static int user_input_check( void );\r
+static void user_start_application( void );\r
+static void user_stop_application( void );\r
+static void user_start_cyclic( void );\r
+static void user_stop_cyclic( void );\r
+static void user_show_slave_info( void );\r
+static void user_show_master_info( void );\r
+static void user_show_parameter( void );\r
+static int user_get_adapter_info( USER_ADAPTER_INFO *pGetAdapterInfo );\r
+\r
+/************************************************************************************/\r
+/* This is an user defined function for main function.                                                         */\r
+/* The following is one of a sample in the Windows OS. Please rewrite if necessary.    */\r
+/* The following is one of a sample in the Linux. Please rewrite if necessary.         */\r
+/************************************************************************************/\r
+void main( int argc, char *argv[] )\r
+{\r
+       int iErrCode = 0;\r
+#ifdef _WIN32\r
+       WSADATA wsaData;\r
+#elif __linux__\r
+#endif\r
+       int iResult;\r
+\r
+#ifdef _WIN32\r
+       /* Initialize Winsock */\r
+       iResult = WSAStartup( MAKEWORD(2,2), &wsaData );\r
+       if ( iResult != 0 )\r
+       {\r
+               printf( "WSAStartup failed with error: %d\n", iResult );\r
+               goto end;\r
+       }\r
+#elif __linux__\r
+#endif\r
+\r
+       /* Get the Network adapter information */\r
+       iErrCode = user_get_adapter_info( &AdapterInfo );\r
+       if ( iErrCode != USER_ERR_OK )\r
+       {\r
+               goto end;\r
+       }\r
+\r
+       /* Get command line argument */\r
+       if ( 1 < argc )\r
+       {\r
+#ifdef _WIN32\r
+               strncpy_s( acMasterParameterFile, sizeof(acMasterParameterFile), argv[1], sizeof( acMasterParameterFile ) );\r
+#elif __linux__\r
+               strncpy( acMasterParameterFile, argv[1], sizeof( acMasterParameterFile ) );\r
+#endif\r
+       }\r
+       else\r
+       {\r
+               printf( "Please input the master parameter file:\n> " );\r
+               user_get_input_line( acMasterParameterFile, sizeof( acMasterParameterFile ) );\r
+       }\r
+\r
+       /* Read the parameter file */\r
+       iErrCode = user_parameter_file_read( acMasterParameterFile, &UserMasterParameter );\r
+       if ( iErrCode != USER_ERR_OK )\r
+       {\r
+               goto end;\r
+       }\r
+\r
+       /* Show parameter of the CCIEF-BASIC Master */\r
+       printf( "\nStart CC-Link IE Field Basic Master Station!\n" );\r
+       user_show_parameter();\r
+\r
+       /****************************************************************************/\r
+       /* Initialization of the Timer.                                                                                         */\r
+       /****************************************************************************/\r
+       /* Initialization the timer environment */\r
+       timer_initialize();\r
+\r
+       /****************************************************************************/\r
+       /* Initialization of the CCIEF-BASIC Master.                                                            */\r
+       /****************************************************************************/\r
+       /* Initialization of the CCIEF-BASIC Master */\r
+       iErrCode = ccief_basic_master_initialize( AdapterInfo.ulIpAddress, AdapterInfo.ulSubnetMask, &UserMasterParameter,\r
+                                                                                       user_callback_cyclic_link_scan_end );\r
+       if ( iErrCode != CCIEF_BASIC_MASTER_ERR_OK )\r
+       {\r
+               printf( "\nCCIEF-BASIC Master Station initialization error!\n" );\r
+               goto end;\r
+       }\r
+\r
+       /* Start cyclic operation */\r
+       user_start_cyclic();\r
+\r
+       /* Start application */\r
+       user_start_application();\r
+\r
+       /* Showing the menu */\r
+       user_show_menu_top();\r
+\r
+       /****************************************************************************/\r
+       /* Main loop of sample code.                                                                                            */\r
+       /****************************************************************************/\r
+       while (1)\r
+       {\r
+               /* CCIEF-BASIC Master */\r
+               iErrCode = ccief_basic_master_main();\r
+               if ( iErrCode == CCIEF_BASIC_MASTER_ERR_MASTER_DUPLICATION )\r
+               {\r
+                       printf( "\nMaster duplication! Please check the parameter.\n" );\r
+                       break;\r
+               }\r
+               if ( iErrCode == CCIEF_BASIC_MASTER_ERR_SLAVE_DUPLICATION )\r
+               {\r
+                       printf( "\nSlave duplication! Please check the slave parameter.\n" );\r
+                       break;\r
+               }\r
+\r
+               /* Timer */\r
+               timer_main();\r
+\r
+               /* Check key input */\r
+               iErrCode = user_input_check();\r
+               if ( iErrCode == USER_EXIT )\r
+               {\r
+                       break;\r
+               }\r
+       }\r
+\r
+       /* Termination of CCIEF-BASIC Master */\r
+       ccief_basic_master_terminate();\r
+\r
+       /* Termination of the timer environment */\r
+       timer_terminate();\r
+\r
+       /* Exit the application */\r
+end:\r
+#ifdef _WIN32\r
+       /* WinSock clean up */\r
+       WSACleanup();\r
+#elif __linux__\r
+#endif\r
+\r
+       printf( "\nApplication has exited.(please any press)\n" );\r
+#ifdef _WIN32\r
+       _getch();\r
+#elif __linux__\r
+       getchar();\r
+#endif\r
+       return;\r
+}\r
+\r
+/************************************************************************************/\r
+/* This is an user defined function for callback function for cyclic link scan end. */\r
+/************************************************************************************/\r
+static uint16_t ausSendData[CCIEF_BASIC_MAX_SLAVE_NUMBER] = { 0 };\r
+void user_callback_cyclic_link_scan_end( uint8_t ucGroupNumber )\r
+{\r
+       CCIEF_BASIC_GROUP_INFO MasterInfo;\r
+       uint16_t *pusRWw, *pusRY,usSendData_RY,usSendData_RWw;\r
+       int     i, j, iOccupiedStationNumberTotal;\r
+\r
+       /* Please write here the operating of cyclic link scan end. */\r
+\r
+       /* Getting the master group information */\r
+       ccief_basic_master_get_group_info( ucGroupNumber, &MasterInfo );\r
+\r
+       /*[ Example: Sending the increment data to the slaves. ]*/\r
+       /*----<Sendig data details>-----------------*/\r
+       /* | 0b to  3b| Increment from 0x0 to 0xF   */\r
+       /* | 4b to  7b| RY(0x5) or RWw(0xA)         */\r
+       /* | 8b to 11b| Slave No.                   */\r
+       /* |12b to 15b| Group No.                   */\r
+       /*------------------------------------------*/\r
+       iOccupiedStationNumberTotal = 0;\r
+       for ( i = 0; i < UserMasterParameter.iTotalSlaveNumber; i ++ )\r
+       {\r
+               /* Check the group number */\r
+               if ( UserMasterParameter.Slave[i].ucGroupNumber == ucGroupNumber )\r
+               {\r
+                       usSendData_RY = 0;\r
+                       usSendData_RWw = 0;\r
+                       /* Check the unit information */\r
+                       if (( MasterInfo.usUnitInfo & CCIEF_BASIC_UNIT_INFO_APPLICATION_RUNNING ) == CCIEF_BASIC_UNIT_INFO_APPLICATION_RUNNING )\r
+                       {\r
+                               /* Starting the application */\r
+                               /* Increase the sending data */\r
+                               if ( ausSendData[i] >= 0x000F )\r
+                               {\r
+                                       ausSendData[i] = 0;\r
+                               }\r
+                               else\r
+                               {\r
+                                       ausSendData[i] ++;\r
+                               }\r
+                               usSendData_RY = ausSendData[i];\r
+                               usSendData_RWw = ausSendData[i];\r
+                               usSendData_RY |= ((uint16_t)ucGroupNumber << 12) | 0x0050 | ((uint16_t)(i+1) << 8);\r
+                               usSendData_RWw |= ((uint16_t)ucGroupNumber << 12) | 0x00A0 | ((uint16_t)(i+1) << 8);\r
+                       }\r
+                       else\r
+                       {\r
+                               /* Stopping the application */\r
+                               /* Clear the sending data */\r
+                               ausSendData[i] = 0;\r
+                       }\r
+\r
+                       /* Getting the start pointer of RY */\r
+                       pusRY = ccief_basic_master_get_pointer( CCIEF_BASIC_DEVICE_TYPE_RY )\r
+                                 + ( iOccupiedStationNumberTotal * ( CCIEF_BASIC_RX_RY_SIZE / sizeof( uint16_t )));\r
+                       /* Getting the start pointer of RWw */\r
+                       pusRWw = ccief_basic_master_get_pointer( CCIEF_BASIC_DEVICE_TYPE_RWW )\r
+                                  + ( iOccupiedStationNumberTotal * ( CCIEF_BASIC_RWW_RWR_SIZE / sizeof( uint16_t )));\r
+\r
+                       /* Setting the sending RY data */\r
+                       for ( j = 0; j < (int)( UserMasterParameter.Slave[i].usOccupiedStationNumber * ( CCIEF_BASIC_RX_RY_SIZE / sizeof( uint16_t ))); j ++ )\r
+                       {\r
+                               *pusRY = usSendData_RY;\r
+                               pusRY ++;\r
+                       }\r
+                       /* Setting the sending RWw data */\r
+                       for ( j = 0; j < (int)( UserMasterParameter.Slave[i].usOccupiedStationNumber * ( CCIEF_BASIC_RWW_RWR_SIZE / sizeof( uint16_t ))); j ++ )\r
+                       {\r
+                               *pusRWw = usSendData_RWw;\r
+                               pusRWw ++;\r
+                       }\r
+               }\r
+               iOccupiedStationNumberTotal += UserMasterParameter.Slave[i].usOccupiedStationNumber;\r
+       }\r
+       \r
+       return;\r
+}\r
+\r
+/************************************************************************************/\r
+/* This is an user defined function for parse of the parameter. (csv format)           */\r
+/************************************************************************************/\r
+int user_parameter_file_read( char *file_path, CCIEF_BASIC_MASTER_PARAMETER *pParameter )\r
+{\r
+       FILE *fp;\r
+#ifdef _WIN32\r
+       errno_t error;\r
+#elif __linux__\r
+#endif\r
+       static char aucLine[32];\r
+       static char aucId[32];\r
+       static char aucData[32];\r
+       uint32_t ulIpaddr;\r
+       int iId, iIndex, iResult;\r
+\r
+#ifdef _WIN32\r
+       error = fopen_s(&fp, file_path, "r" );\r
+       if ( error != 0 )\r
+#elif __linux__\r
+       fp = fopen( file_path, "r" );\r
+       if ( fp == NULL )\r
+#endif\r
+       {\r
+               printf( "Could not open file \"%s\"\n", file_path );\r
+               return USER_ERR_NG;\r
+       }\r
+\r
+       memset( pParameter, 0, sizeof( CCIEF_BASIC_MASTER_PARAMETER ) );\r
+\r
+       /* Start analyze the parameter file */\r
+       while ( fgets( aucLine, sizeof(aucLine), fp ) != NULL )\r
+       {\r
+#ifdef _WIN32\r
+               sscanf_s( aucLine, "%[^,],%[^,]", aucId, sizeof(aucId), aucData, sizeof(aucData) );\r
+#elif __linux__\r
+               sscanf( aucLine, "%[^,],%[^,]", aucId, aucData );\r
+#endif\r
+               if ( memcmp( aucId, "Group", 5 ) == 0 )\r
+               {\r
+                       break;\r
+               }\r
+       }\r
+\r
+       /* Getting the parameter of "Group"  */\r
+       while ( fgets( aucLine, sizeof( aucLine ), fp ) != NULL )\r
+       {\r
+               memset( aucId, 0, sizeof( aucId ) );\r
+               memset( aucData, 0, sizeof( aucData ) );\r
+#ifdef _WIN32\r
+               sscanf_s( aucLine, "%[^,],%[^,]", aucId, sizeof(aucId), aucData, sizeof(aucData) );\r
+#elif __linux__\r
+               sscanf( aucLine, "%[^,],%[^,]", aucId, aucData );\r
+#endif\r
+               if ( memcmp( aucId, "Slave", 5 ) == 0 )\r
+               {\r
+                       break;\r
+               }\r
+               iId = strtol( aucId, NULL, 0 );\r
+               switch ( iId )\r
+               {\r
+                       case USER_PARAMETER_GROUP_ID_TOTAL_NUMBER:\r
+                               pParameter->iTotalGroupNumber = strtoul( aucData, NULL, 0 );\r
+\r
+                       /* Please write user parameters here. */\r
+\r
+                       default:\r
+                               iIndex = iId - USER_PARAMETER_GROUP_ID_GROUP_NUMBER;\r
+                               if (( 0 <= iIndex ) && ( iIndex < CCIEF_BASIC_MAX_GROUP_NUMBER * 4 ) )\r
+                               {\r
+                                       if (( iIndex % 4 ) == 0)\r
+                                       {\r
+                                               pParameter->Group[iIndex / 4].ucGroupNumber = (uint8_t)strtoul( aucData, NULL, 0 );\r
+                                       }\r
+                                       else if (( iIndex % 4 ) == 1)\r
+                                       {\r
+                                               pParameter->Group[iIndex / 4].usCyclicTransmissionTimeout = (uint16_t)strtoul( aucData, NULL, 0 );\r
+                                       }\r
+                                       else if (( iIndex % 4 ) == 2)\r
+                                       {\r
+                                               pParameter->Group[iIndex / 4].usCyclicTransmissionTimeoutCount = (uint16_t)strtoul( aucData, NULL, 0 );\r
+                                       }\r
+                                       else if (( iIndex % 4 ) == 3)\r
+                                       {\r
+                                               pParameter->Group[iIndex / 4].usConstantLinkScanTime = (uint16_t)strtoul( aucData, NULL, 0 );\r
+                                       }\r
+                               }\r
+                               break;\r
+               }\r
+       }\r
+\r
+       /* Getting the parameter of "Slave" */\r
+       while ( fgets( aucLine, sizeof( aucLine ), fp ) != NULL )\r
+       {\r
+               memset( aucId, 0, sizeof( aucId ) );\r
+               memset( aucData, 0, sizeof( aucData ) );\r
+#ifdef _WIN32\r
+               sscanf_s( aucLine, "%[^,],%[^,]", aucId, sizeof(aucId), aucData, sizeof(aucData) );\r
+#elif __linux__\r
+               sscanf( aucLine, "%[^,],%[^,]", aucId, aucData );\r
+#endif\r
+               iId = strtol( aucId, NULL, 0 );\r
+               switch ( iId )\r
+               {\r
+                       case USER_PARAMETER_SLAVE_ID_TOTAL_NUMBER:\r
+                               pParameter->iTotalSlaveNumber = strtoul( aucData, NULL, 0 );\r
+                               break;\r
+\r
+                       /* Please write user parameters here. */\r
+\r
+                       default:\r
+                               iIndex = iId - USER_PARAMETER_SLAVE_ID_IP_ADDRESS;\r
+                               if (( 0 <= iIndex ) && ( iIndex < CCIEF_BASIC_MAX_SLAVE_NUMBER * 3 ) )\r
+                               {\r
+                                       if (( iIndex % 3 ) == 0)\r
+                                       {\r
+                                               iResult=inet_pton( AF_INET, aucData, &ulIpaddr );\r
+                                               if ( iResult == 1)\r
+                                               {\r
+                                                       pParameter->Slave[iIndex / 3].ulIpAddress = htonl(ulIpaddr);\r
+                                               }\r
+                                               else\r
+                                               {\r
+                                                       printf("IP address error.\n");\r
+                                                       return USER_ERR_NG;\r
+                                               }\r
+                                       }\r
+                                       else if (( iIndex % 3 ) == 1)\r
+                                       {\r
+                                               pParameter->Slave[iIndex / 3].usOccupiedStationNumber = (uint16_t)strtoul( aucData, NULL, 0 );\r
+                                       }\r
+                                       else if (( iIndex % 3 ) == 2)\r
+                                       {\r
+                                               pParameter->Slave[iIndex / 3].ucGroupNumber = (uint8_t)strtoul( aucData, NULL, 0 );\r
+                                       }\r
+                               }\r
+                               break;\r
+               }\r
+       }\r
+\r
+       fclose( fp );\r
+\r
+       return USER_ERR_OK;\r
+}\r
+\r
+/************************************************************************************/\r
+/* This is an user defined function for getting input line while 'ENTER' key.          */\r
+/************************************************************************************/\r
+void user_get_input_line( char *pcLine, int iLineLength )\r
+{\r
+#ifdef _WIN32\r
+       int     iKey;\r
+       int     iIndex = 0;\r
+\r
+       /* Set 'NULL' */\r
+       memset( pcLine, 0, iLineLength );\r
+\r
+       while ( iIndex <= iLineLength )\r
+       {\r
+               iKey = _getch();\r
+               if ( iKey == 0x08 )\r
+               {       /* 'BackSpace' */\r
+                       if ( 0 < iIndex )\r
+                       {\r
+                               _putch( iKey );\r
+                               *( pcLine + iIndex ) = 0x00;\r
+                               iIndex --;\r
+                               if ( iIndex < 0 )\r
+                               {\r
+                                       iIndex = 0;\r
+                               }\r
+                       }\r
+               }\r
+               else if ( iKey == 0x0d )\r
+               {       /* 'Enter' */\r
+                       printf( "\n" );\r
+                       break;\r
+               }\r
+               else\r
+               {\r
+                       _putch( iKey );\r
+                       *( pcLine + iIndex ) = (char)iKey;\r
+                       iIndex ++;\r
+               }\r
+       }\r
+#elif __linux__\r
+       char input_line[256];\r
+\r
+       fgets(input_line,sizeof(input_line),stdin);\r
+       input_line[strlen(input_line)-1]='\0';\r
+       strcpy(pcLine,input_line);\r
+#endif\r
+       return;\r
+}\r
+\r
+/************************************************************************************/\r
+/* This is an user defined function for show "Top Menu".                                                       */\r
+/************************************************************************************/\r
+void user_show_menu_top( void )\r
+{\r
+       /* Showing the menu */\r
+       printf( "\nPlease input the following key values if you want any action.\n\n" );\r
+       printf( "    '1'   - Start the cyclic.\n" );\r
+       printf( "    '2'   - Stop the cyclic.\n" );\r
+       printf( "    '3'   - Start the application.\n" );\r
+       printf( "    '4'   - Stop the application.\n" );\r
+       printf( "    '5'   - Show information of the slave.\n" );\r
+       printf( "    '6'   - Show information of the master.\n" );\r
+       printf( "    '7'   - Show the parameter.\n" );\r
+       printf( "    'Esc' - Exit the application.\n" );\r
+\r
+       return;\r
+}\r
+\r
+/************************************************************************************/\r
+/* This is an user defined function for check key input.                                                       */\r
+/************************************************************************************/\r
+int user_input_check( void )\r
+{\r
+#ifdef _WIN32\r
+       int     iKey;\r
+       static int iExit = USER_ERR_OK;\r
+\r
+       /* Chcek key input */\r
+       if ( _kbhit() )\r
+       {\r
+               iKey = _getch();\r
+#elif __linux__\r
+       struct termios          oldt;\r
+       struct termios          newt;\r
+       int                                     ch;\r
+       int                                     oldf;\r
+       static int iExit = USER_ERR_OK;\r
+\r
+       /* Get the now of setting */\r
+       tcgetattr(STDIN_FILENO, &oldt);\r
+       newt = oldt;\r
+       newt.c_lflag &= ~(unsigned int)(ICANON | ECHO);\r
+       /* Stop of the echo */\r
+       tcsetattr(STDIN_FILENO, TCSANOW, &newt);\r
+       oldf = fcntl(STDIN_FILENO, F_GETFL, 0);\r
+       fcntl(STDIN_FILENO, F_SETFL, oldf | O_NONBLOCK);\r
+       ch = getchar();\r
+       /* Return to the initial setting */\r
+       tcsetattr(STDIN_FILENO, TCSANOW, &oldt);\r
+       fcntl(STDIN_FILENO, F_SETFL, oldf);\r
+\r
+       if (ch != EOF) \r
+       {\r
+               ungetc(ch, stdin);\r
+#endif\r
+               if ( iExit == USER_ERR_OK )\r
+               {\r
+#ifdef _WIN32\r
+                       switch ( iKey )\r
+#elif __linux__\r
+                       switch ( getchar() )\r
+#endif\r
+                       {\r
+                               case '1':       /* Start cyclic of the slave */\r
+                                       user_start_cyclic();\r
+                                       break;\r
+                               case '2':       /* Stop cyclic of the slave */\r
+                                       user_stop_cyclic();\r
+                                       break;\r
+                               case '3':       /* Start the application */\r
+                                       user_start_application();\r
+                                       break;\r
+                               case '4':       /* Stop the application */\r
+                                       user_stop_application();\r
+                                       break;\r
+                               case '5':       /* Show information of the slave */\r
+                                       user_show_slave_info();\r
+                                       break;\r
+                               case '6':       /* Show information of the master */\r
+                                       user_show_master_info();\r
+                                       break;\r
+                               case '7':       /* Show the parameter */\r
+                                       user_show_parameter();\r
+                                       break;\r
+                               case 0x1b:      /* 'Esc' */\r
+                                       printf( "\nExit the application? (if you want exit, please press 'Y')\n" );\r
+                                       iExit = USER_EXIT;\r
+                                       return USER_ERR_OK;\r
+                               default:        /* Check selecting */\r
+                                       break;\r
+                       }\r
+                       user_show_menu_top();\r
+               }\r
+               else\r
+               {\r
+#ifdef _WIN32\r
+                       switch ( iKey )\r
+#elif __linux__\r
+                       switch ( ch )\r
+#endif\r
+                       {\r
+                               case 'Y':       /* Exit the application */\r
+#ifdef _WIN32\r
+#elif __linux__\r
+                                       getchar();\r
+#endif\r
+                                       return USER_EXIT;\r
+                               default:                        /* Check selecting */\r
+                                       iExit = USER_ERR_OK;\r
+                                       user_show_menu_top();\r
+                                       break;\r
+                       }\r
+               }\r
+       }\r
+\r
+       return USER_ERR_OK;\r
+}\r
+\r
+/************************************************************************************/\r
+/* This is an user defined function for menu of starting the application.                      */\r
+/************************************************************************************/\r
+void user_start_application( void )\r
+{\r
+       printf( "\nStart the application!\n" );\r
+\r
+       /* Set the unit information */\r
+       ccief_basic_master_set_unit_info( CCIEF_BASIC_UNIT_INFO_APPLICATION_RUNNING );\r
+\r
+       return;\r
+}\r
+\r
+/************************************************************************************/\r
+/* This is an user defined function for menu of stopping the application.                      */\r
+/************************************************************************************/\r
+void user_stop_application( void )\r
+{\r
+       printf( "\nStop the application!\n" );\r
+\r
+       /* Set the unit information */\r
+       ccief_basic_master_set_unit_info( CCIEF_BASIC_UNIT_INFO_APPLICATION_STOP );\r
+\r
+       return;\r
+}\r
+\r
+/************************************************************************************/\r
+/* This is an user defined function for menu of starting the cyclic of the slave.      */\r
+/************************************************************************************/\r
+void user_start_cyclic( void )\r
+{\r
+       int i;\r
+\r
+       printf( "\nStart cyclic of all the slaves!\n" );\r
+\r
+       /* Start cyclic all of the slaves */\r
+       for ( i = 0; i < UserMasterParameter.iTotalSlaveNumber; i ++ )\r
+       {\r
+               (void)ccief_basic_master_start_cyclic( i );\r
+       }\r
+\r
+       return;\r
+}\r
+\r
+/************************************************************************************/\r
+/* This is an user defined function for stopping the cyclic of the slave.                      */\r
+/************************************************************************************/\r
+void user_stop_cyclic( void )\r
+{\r
+       int i;\r
+\r
+       printf( "\nStop cyclic of all the slaves!\n" );\r
+\r
+       /* Stop cyclic all of the slaves */\r
+       for ( i = 0; i < UserMasterParameter.iTotalSlaveNumber; i ++ )\r
+       {\r
+               (void)ccief_basic_master_stop_cyclic( i );\r
+       }\r
+\r
+       return;\r
+}\r
+\r
+/************************************************************************************/\r
+/* This is an user defined function for showing information of the slave.                      */\r
+/************************************************************************************/\r
+static char aucSlaveStateStr[][12] = { "INITAL", "DISCONNECT", "CONNECTING", "CYCLIC_STOP", "CYCLIC_END", "CYCLIC" };\r
+void user_show_slave_info( void )\r
+{\r
+       CCIEF_BASIC_MASTER_PARAMETER *pParameter;\r
+       CCIEF_BASIC_SLAVE_INFO SlaveInfo;\r
+       uint16_t *pusRX, *pusRY, *pusRWw, *pusRWr;\r
+       uint16_t *pusData;\r
+       uint16_t usOccupiedStationNumber;\r
+       int iDataIndex, iDataSize;\r
+       int i, j, k, iStationNumber;\r
+\r
+       pParameter = &UserMasterParameter;\r
+       /* Getting the start pointer of RX */\r
+       pusRX = ccief_basic_master_get_pointer( CCIEF_BASIC_DEVICE_TYPE_RX );\r
+       /* Getting the start pointer of RY */\r
+       pusRY = ccief_basic_master_get_pointer( CCIEF_BASIC_DEVICE_TYPE_RY );\r
+       /* Getting the start pointer of RWw */\r
+       pusRWw = ccief_basic_master_get_pointer( CCIEF_BASIC_DEVICE_TYPE_RWW );\r
+       /* Getting the start pointer of RWr */\r
+       pusRWr = ccief_basic_master_get_pointer( CCIEF_BASIC_DEVICE_TYPE_RWR );\r
+\r
+       printf( "\nShow the state of all the slaves!\n" );\r
+\r
+       /* Showing the cyclic data */\r
+       iStationNumber = 0;\r
+       for ( i = 0; i < pParameter->iTotalSlaveNumber; i ++ )\r
+       {\r
+               /* Getting the slave state */\r
+               ccief_basic_master_get_slave_info( i, &SlaveInfo );\r
+               usOccupiedStationNumber = pParameter->Slave[i].usOccupiedStationNumber;\r
+               printf( "\n    Slave No.%d:\n", i + 1 );\r
+               printf( "      Slave ID:\t\t\t0x%08lX\n", SlaveInfo.ulId );\r
+               printf( "      Occupied Station Number:\t%d\n", SlaveInfo.usOccupiedStationNumber );\r
+               if ( SlaveInfo.ucGroupNumber != 0 )\r
+               {\r
+                       printf( "      Group No.:\t\t%d\n", SlaveInfo.ucGroupNumber );\r
+               }\r
+               printf( "      State:\t\t\t%d [%s]\n", SlaveInfo.iState, &aucSlaveStateStr[SlaveInfo.iState] );\r
+               printf( "      Protocol Version:\t\t0x%04X\n", SlaveInfo.usProtocolVersion );\r
+               printf( "      End Code:\t\t\t0x%04X\n", SlaveInfo.usEndCode );\r
+               printf( "      Slave Notify Information:\n" );\r
+               printf( "        Vender Code:\t\t0x%04X\n", SlaveInfo.NotifyInfo.usVenderCode );\r
+               printf( "        Model Code:\t\t0x%08X\n", SlaveInfo.NotifyInfo.ulModelCode );\r
+               printf( "        Machine Version:\t0x%04X\n", SlaveInfo.NotifyInfo.usMachineVersion );\r
+               printf( "        Unit Info:\t\t0x%04X\n", SlaveInfo.NotifyInfo.usUnitInfo );\r
+               printf( "        Error Code:\t\t0x%04X\n", SlaveInfo.NotifyInfo.usErrCode );\r
+               printf( "        Unit Data:\t\t0x%08X\n", SlaveInfo.NotifyInfo.ulUnitData );\r
+               printf( "      Frame sequence number:\t0x%04X\n", SlaveInfo.usFrameSequenceNumber );\r
+               iDataIndex = ( CCIEF_BASIC_RX_RY_SIZE / sizeof( uint16_t ) ) * iStationNumber;\r
+               iDataSize = ( CCIEF_BASIC_RX_RY_SIZE / sizeof( uint16_t ) ) * usOccupiedStationNumber;\r
+               printf( "\n        RX  | F E D C B A 9 8 7 6 5 4 3 2 1 0 |  data\n" );\r
+               printf( "      -------------------------------------------------\n" );\r
+               for ( j = 0; j < iDataSize; j ++ )\r
+               {\r
+                       pusData = pusRX + iDataIndex + j;\r
+                       printf( "       %04X |", ( iDataIndex + j ) * 16 );\r
+                       for ( k = 0; k < 16; k ++ )\r
+                       {\r
+                               printf( " %d", ( *pusData >> ( 16 - ( k + 1 ))) & 0x1 );\r
+                       }\r
+                       printf( " | 0x%04X \n", *pusData );\r
+               }\r
+               printf( "\n        RY  | F E D C B A 9 8 7 6 5 4 3 2 1 0 |  data\n" );\r
+               printf( "      -------------------------------------------------\n" );\r
+               for ( j = 0; j < iDataSize; j ++ )\r
+               {\r
+                       pusData = pusRY + iDataIndex + j;\r
+                       printf( "       %04X |", ( iDataIndex + j ) * 16 );\r
+                       for ( k = 0; k < 16; k ++ ) {\r
+                               printf( " %d", ( *pusData >> ( 16 - ( k + 1 ))) & 0x1 );\r
+                       }\r
+                       printf( " | 0x%04X \n", *pusData );\r
+               }\r
+               iDataIndex = ( CCIEF_BASIC_RWW_RWR_SIZE / sizeof( uint16_t ) ) * iStationNumber;\r
+               iDataSize = ( CCIEF_BASIC_RWW_RWR_SIZE / sizeof( uint16_t ) ) * usOccupiedStationNumber;\r
+               printf( "\n        RWw |   +7     +6     +5     +4     +3     +2     +1     +0  \n" );\r
+               printf( "      ----------------------------------------------------------------\n" );\r
+               for ( j = 0; j < ( iDataSize / 8 ); j ++ )\r
+               {\r
+                       printf( "       %04X |", iDataIndex + j * 8 );\r
+                       pusData = pusRWw + iDataIndex + ( j + 1 ) * 8;\r
+                       for ( k = 0; k < 8; k ++ ) {\r
+                               pusData --;\r
+                               printf( " 0x%04X", *pusData );\r
+                       }\r
+                       printf( "\n" );\r
+               }\r
+               printf( "\n        RWr |   +7     +6     +5     +4     +3     +2     +1     +0  \n" );\r
+               printf( "      ----------------------------------------------------------------\n" );\r
+               for ( j = 0; j < ( iDataSize / 8 ); j ++ )\r
+               {\r
+                       printf( "       %04X |", iDataIndex + j * 8 );\r
+                       pusData = pusRWr + iDataIndex + ( j + 1 ) * 8;\r
+                       for ( k = 0; k < 8; k ++ )\r
+                       {\r
+                               pusData --;\r
+                               printf( " 0x%04X", *pusData );\r
+                       }\r
+                       printf( "\n" );\r
+               }\r
+               iStationNumber += usOccupiedStationNumber;\r
+       }\r
+\r
+       return;\r
+}\r
+\r
+/************************************************************************************/\r
+/* This is an user defined function for showing information of the master.                     */\r
+/************************************************************************************/\r
+char aucMasterStateStr[][14] = { "INITAL", "WAITING", "PERSUASION", "LINK_SCAN", "LINK_SCAN_END" };\r
+void user_show_master_info( void )\r
+{\r
+       CCIEF_BASIC_MASTER_PARAMETER *pParameter;\r
+       static CCIEF_BASIC_GROUP_INFO MasterInfo;\r
+       static CCIEF_BASIC_SLAVE_INFO SlaveInfo;\r
+       TIMER_TIME_DATA TimeData;\r
+       int i, j, iStationNumber;\r
+\r
+       pParameter = &UserMasterParameter;\r
+\r
+       printf( "\nShow the state of master!\n" );\r
+\r
+       /* Showing the state of all the groups */\r
+       iStationNumber = 0;\r
+       for ( i = 0; i < pParameter->iTotalGroupNumber; i ++ )\r
+       {\r
+               /* Getting the master group information */\r
+               ccief_basic_master_get_group_info( i, &MasterInfo );\r
+               if ( i == 0 )\r
+               {\r
+                       printf( "\n    Master:\n" );\r
+                       printf( "      Protocol Version:\t\t\t0x%04X\n", MasterInfo.usProtocolVersion );\r
+                       printf( "      Master ID:\t\t\t0x%08lX\n", MasterInfo.ulId );\r
+                       printf( "      Unit Info:\t\t\t0x%04X\n", MasterInfo.usUnitInfo );\r
+                       printf( "      Parameter ID:\t\t\t0x%04X\n", MasterInfo.usParameterId );\r
+               }\r
+               printf( "\n    Group No.%d:\n", MasterInfo.ucGroupNumber );\r
+               printf( "      Total Number of Slave:\t\t%d\n", MasterInfo.iTotalSlaveNumber );\r
+               printf( "      Total Number of Occupied Station:\t%d\n", MasterInfo.usTotalOccupiedStationNumber );\r
+               printf( "      State:\t\t\t\t%d [%s]\n", MasterInfo.iState, &aucMasterStateStr[MasterInfo.iState] );\r
+               timer_analyze_time_data( MasterInfo.llTimeData, &TimeData );\r
+               printf( "      Time Data:\t\t\t%lld [%02d-%02d-%02d %02d:%02d:%02d.%03d]\n", MasterInfo.llTimeData,\r
+                               TimeData.usYear, TimeData.usMonth, TimeData.usDay, TimeData.usHour, TimeData.usMinute,\r
+                               TimeData.usSecond, TimeData.usMilliseconds );\r
+               printf( "      Frame sequence number:\t\t0x%04X\n", MasterInfo.usFrameSequenceNumber );\r
+               printf( "      Link scan time(Current):\t\t%01.3f[ms]\n", ((float)MasterInfo.llLinkScanTimeCurrent / 1000) );\r
+               printf( "      Link scan time(Minimum):\t\t%01.3f[ms]\n", ((float)MasterInfo.llLinkScanTimeMinimum / 1000) );\r
+               printf( "      Link scan time(Maximum):\t\t%01.3f[ms]\n", ((float)MasterInfo.llLinkScanTimeMaximum / 1000) );\r
+               printf( "      Group:\n" );\r
+               printf( "          Master(ID:0x%08lX)\n", MasterInfo.ulId );\r
+               for ( j = 0; j < pParameter->iTotalSlaveNumber; j ++ )\r
+               {\r
+                       /* Getting the slave state */\r
+                       ccief_basic_master_get_slave_info( j, &SlaveInfo );\r
+                       /* Check the group number */\r
+                       if ( MasterInfo.ucGroupNumber == SlaveInfo.ucGroupNumber )\r
+                       {\r
+                               /* Check the cyclic state */\r
+                               if ( SlaveInfo.iCyclicState == CCIEF_BASIC_CYCLIC_STATE_ON )\r
+                               {\r
+                                       printf( "              |--- Slave No.%-2d (ID:0x%-08lX CyclicState:ON  State:%d [%s])\n",\r
+                                                       ( j + 1 ), SlaveInfo.ulId, SlaveInfo.iState, &aucSlaveStateStr[SlaveInfo.iState] );\r
+                               }\r
+                               else\r
+                               {\r
+                                       printf( "              |--- Slave No.%-2d (ID:0x%-08lX CyclicState:OFF State:%d [%s])\n",\r
+                                                       ( j + 1 ), SlaveInfo.ulId, SlaveInfo.iState, &aucSlaveStateStr[SlaveInfo.iState] );\r
+                               }\r
+                       }\r
+               }\r
+       }\r
+\r
+       return;\r
+}\r
+\r
+/************************************************************************************/\r
+/* This is an user defined function for show parameter of the Master.                          */\r
+/************************************************************************************/\r
+void user_show_parameter( void )\r
+{\r
+       CCIEF_BASIC_MASTER_PARAMETER *pParameter;\r
+       struct in_addr addr;\r
+       char space[3] = "";\r
+       int     i;\r
+       char Ipaddr[16];\r
+\r
+       pParameter = &UserMasterParameter;\r
+\r
+       /* Show parameter of the master */\r
+       /* Setting of the master */\r
+       printf( "\nShow master parameter!\n" );\r
+       printf( "\n    Master:\n" );\r
+#ifdef _WIN32\r
+       addr.S_un.S_addr = htonl(AdapterInfo.ulIpAddress);\r
+#elif __linux__\r
+       addr.s_addr = htonl(AdapterInfo.ulIpAddress);\r
+#endif\r
+       inet_ntop(AF_INET, &addr, Ipaddr, sizeof(Ipaddr) );\r
+       printf( "      IP Address:\t\t\t%s (Master ID:0x%08lX)\n", Ipaddr, AdapterInfo.ulIpAddress );\r
+#ifdef _WIN32\r
+       addr.S_un.S_addr = htonl(AdapterInfo.ulSubnetMask);\r
+#elif __linux__\r
+       addr.s_addr = htonl(AdapterInfo.ulSubnetMask);\r
+#endif\r
+       inet_ntop(AF_INET, &addr, Ipaddr, sizeof(Ipaddr) );\r
+       printf( "      Subnet mask:\t\t\t%s\n", Ipaddr );\r
+#ifdef _WIN32\r
+       addr.S_un.S_addr = htonl(AdapterInfo.ulDefaultGatewayIPAddress);\r
+#elif __linux__\r
+       addr.s_addr = htonl(AdapterInfo.ulDefaultGatewayIPAddress);\r
+#endif\r
+       inet_ntop(AF_INET, &addr, Ipaddr, sizeof(Ipaddr) );\r
+       printf( "      Default GW IP address:\t\t%s\n", Ipaddr );\r
+       /* Setting of the group */\r
+       if (!(( pParameter->iTotalGroupNumber == 1 ) && ( pParameter->Group[0].ucGroupNumber == 0 )))\r
+       {\r
+               printf( "\n    Total Number of Group:\t\t%d\n", pParameter->iTotalGroupNumber );\r
+       }\r
+       for ( i = 0; i < pParameter->iTotalGroupNumber; i++ )\r
+       {\r
+               if ( pParameter->Group[i].ucGroupNumber != 0 )\r
+               {\r
+                       printf( "      Group No.%d:\n", pParameter->Group[i].ucGroupNumber );\r
+#ifdef _WIN32\r
+                       sprintf_s( space, sizeof(space), "  " );\r
+#elif __linux__\r
+                       sprintf( space, "  " );\r
+#endif\r
+               }\r
+               printf( "%s      Disconnection Time[ms]:\t\t%d (0:500[ms])\n", space, pParameter->Group[i].usCyclicTransmissionTimeout );\r
+               printf( "%s      Disconnection Timeout Count:\t%d (0:3)\n", space, pParameter->Group[i].usCyclicTransmissionTimeoutCount );\r
+               if ( pParameter->Group[i].usConstantLinkScanTime == 0 )\r
+               {\r
+                       printf( "%s      Constant Link Scan Time[ms]:\tNot use\n", space );\r
+               }\r
+               else\r
+               {\r
+                       printf( "%s      Constant Link Scan Time[ms]:\t%d:\n", space, pParameter->Group[i].usConstantLinkScanTime );\r
+               }\r
+       }\r
+       /* Setting of the slave */\r
+       printf( "\n    Total Number of Slave:\t\t%d\n", pParameter->iTotalSlaveNumber );\r
+       for ( i = 0; i < pParameter->iTotalSlaveNumber; i++ )\r
+       {\r
+               printf( "      Slave No.%d:\n", i + 1 );\r
+#ifdef _WIN32\r
+               addr.S_un.S_addr = htonl(pParameter->Slave[i].ulIpAddress);\r
+#elif __linux__\r
+               addr.s_addr = htonl(pParameter->Slave[i].ulIpAddress);  \r
+#endif\r
+               inet_ntop(AF_INET, &addr, Ipaddr, sizeof(Ipaddr) );\r
+               printf( "        IP Address:\t\t\t%s (Slave ID:0x%08lX)\n", Ipaddr,\r
+                               pParameter->Slave[i].ulIpAddress );\r
+               printf( "        Occupied Station Number:\t%d\n", pParameter->Slave[i].usOccupiedStationNumber );\r
+               if ( pParameter->Slave[i].ucGroupNumber != 0 )\r
+               {\r
+                       printf( "        Group Number:\t\t\t%d\n", pParameter->Slave[i].ucGroupNumber );\r
+               }\r
+       }\r
+\r
+       return;\r
+}\r
+\r
+#define MALLOC(x) HeapAlloc(GetProcessHeap(), 0, (x))\r
+#define FREE(x) HeapFree(GetProcessHeap(), 0, (x))\r
+\r
+/************************************************************************************/\r
+/* This is an user defined function for get the adapter information.                           */\r
+/* The following is one of a sample in the Windows OS. Please rewrite if necessary.    */\r
+/* The following is one of a sample in the Linux. Please rewrite if necessary.         */\r
+/************************************************************************************/\r
+int user_get_adapter_info( USER_ADAPTER_INFO *pGetAdapterInfo )\r
+{\r
+#ifdef _WIN32 \r
+       ULONG                   ulOutBufLen;\r
+       ULONG                   ulIpaddr, ulSubNetMask, ulDefGateway;\r
+       DWORD                   dwRetVal;\r
+       IP_ADAPTER_INFO *pAdapterInfo;\r
+       IP_ADAPTER_INFO *pAdapter;\r
+       int                             iAdapterNum;\r
+       int                             iKey;\r
+       int                             iInputNumber;\r
+       int                             i;\r
+       int                             iResult;\r
+\r
+       /* GetAdaptersInfo */\r
+       pAdapterInfo = (IP_ADAPTER_INFO *) MALLOC(sizeof( IP_ADAPTER_INFO ));\r
+       if ( pAdapterInfo == NULL )\r
+       {\r
+               printf( "Error allocating memory needed to call GetAdapterInfo\n" );\r
+               return USER_ERR_NG;\r
+       }\r
+       ulOutBufLen = sizeof( IP_ADAPTER_INFO );\r
+\r
+       if ( GetAdaptersInfo( pAdapterInfo, &ulOutBufLen ) == ERROR_BUFFER_OVERFLOW )\r
+       {\r
+               FREE( pAdapterInfo );\r
+               pAdapterInfo = (IP_ADAPTER_INFO *) MALLOC( ulOutBufLen );\r
+               if ( pAdapterInfo == NULL )\r
+               {\r
+                       printf( "Error allocating memory needed to call GetAdapterInfo\n" );\r
+                       return USER_ERR_NG;\r
+               }\r
+       }\r
+\r
+       if (( dwRetVal = GetAdaptersInfo( pAdapterInfo, &ulOutBufLen )) != NO_ERROR )\r
+       {\r
+               printf( "GetAdaptersInfo failed with error %d\n", dwRetVal );\r
+               if ( pAdapterInfo )\r
+               {\r
+                       FREE( pAdapterInfo );\r
+               }\r
+               return USER_ERR_NG;\r
+       }\r
+\r
+       pAdapter = pAdapterInfo;\r
+       iAdapterNum = 0;\r
+\r
+       /* Check the Multiple Adapter */\r
+       if ( pAdapter->Next != NULL )\r
+       {\r
+               printf( "Found the multiple Network adapter!\n\n");\r
+               while ( pAdapter )\r
+               {\r
+                       printf( "%2d: \tAdapter desc: \t\t%s\n", iAdapterNum+1, pAdapter->Description );\r
+                       printf( "\tMAC address: \t\t%02X:%02X:%02X:%02X:%02X:%02X\n",\r
+                                       pAdapter->Address[0], pAdapter->Address[1], pAdapter->Address[2],\r
+                                       pAdapter->Address[3], pAdapter->Address[4], pAdapter->Address[5] );\r
+                       printf( "\tIP address: \t\t%s\n",\r
+                                       pAdapter->IpAddressList.IpAddress.String );\r
+                       printf( "\tSubnet mask: \t\t%s\n", pAdapter->IpAddressList.IpMask.String );\r
+                       printf( "\tDefault GW IP address: \t%s\n", pAdapter->GatewayList.IpAddress.String );\r
+                       printf( "\n");\r
+                       iAdapterNum ++;\r
+                       pAdapter = pAdapter->Next;\r
+               }\r
+               printf( "Please select the adapter number (Press 'Enter' Key after select) [1-%d]: ", iAdapterNum );\r
+\r
+               iInputNumber = 0;\r
+\r
+               while ( 1 )\r
+               {\r
+                       iKey = _getch();\r
+                       if ( iKey != 0x0d )\r
+                       {\r
+                               if (( 0x30 <= iKey ) && ( iKey <= 0x39 ))\r
+                               {\r
+                                       printf( "%c",iKey);\r
+                                       iInputNumber = (iInputNumber*10)+(iKey-0x30);\r
+                               }\r
+                       }\r
+                       else\r
+                       {\r
+                               printf( "\n");\r
+                               if (( iInputNumber == 0 ) || ( iAdapterNum < iInputNumber ))\r
+                               {\r
+                                       printf( "Wrong number select!\n");\r
+                                       iInputNumber = 0;\r
+                                       printf( "Please select the adapter number (Press 'Enter' Key after select) [1-%d]: ", iAdapterNum );\r
+                               }\r
+                               else\r
+                               {\r
+                                       break;\r
+                               }\r
+                       }\r
+               }\r
+               pAdapter = pAdapterInfo;\r
+               for ( i = 1; i < iInputNumber; i++ )\r
+               {\r
+                       pAdapter = pAdapter->Next;\r
+               }\r
+       }\r
+       else\r
+       {\r
+               iAdapterNum = 1;\r
+       }\r
+       printf( "\n" );\r
+\r
+       memcpy( AdapterInfo.aucMacAddress, pAdapter->Address, sizeof( AdapterInfo.aucMacAddress ) );\r
+       iResult=inet_pton( AF_INET, pAdapter->IpAddressList.IpAddress.String, &ulIpaddr );\r
+       if ( iResult == 1)\r
+       {\r
+               AdapterInfo.ulIpAddress = htonl(ulIpaddr);\r
+       }\r
+       else\r
+       {\r
+               printf("Adapter IP address error.\n");\r
+               return USER_ERR_NG;\r
+       }\r
+       iResult=inet_pton( AF_INET, pAdapter->IpAddressList.IpMask.String, &ulSubNetMask );\r
+       if ( iResult == 1)\r
+       {\r
+               AdapterInfo.ulSubnetMask = htonl(ulSubNetMask);\r
+       }\r
+       else\r
+       {\r
+               printf("Adapter sub-net mask error.\n");\r
+               return USER_ERR_NG;\r
+       }\r
+       iResult=inet_pton( AF_INET, pAdapter->GatewayList.IpAddress.String, &ulDefGateway );\r
+       if ( iResult == 1)\r
+       {\r
+               AdapterInfo.ulDefaultGatewayIPAddress = htonl(ulDefGateway);\r
+       }\r
+       else\r
+       {\r
+               printf("Adapter default gateway IP address error.\n");\r
+               return USER_ERR_NG;\r
+       }\r
+\r
+       FREE( pAdapterInfo );\r
+\r
+       /* Copy the argument pointer */\r
+       memcpy( pGetAdapterInfo, &AdapterInfo, sizeof( USER_ADAPTER_INFO ) );\r
+\r
+       return USER_ERR_OK;\r
+\r
+#elif __linux__\r
+       struct ifconf                   Ifc_Get;\r
+       struct ifreq                    Ifreq_Size[MAX_INTERFACE];\r
+       struct sockaddr_in              get_addr[MAX_INTERFACE];\r
+       USER_NETWORK_INFO               User_Adapter[MAX_INTERFACE];\r
+       USER_NETWORK_INFO               User_Get_Info;\r
+       unsigned char                   *pMAC_addr;\r
+       int                                             sock_network;\r
+       int                                             i;\r
+       int                                             ikey;\r
+       int                                             iNet_Number=0;\r
+       FILE                                    *pFile;\r
+       t_RouteInfo                             RouteInfo_Defo[MAX_INTERFACE];\r
+       char                                    input_line[128];\r
+\r
+       Ifc_Get.ifc_len = sizeof( Ifreq_Size );\r
+       Ifc_Get.ifc_ifcu.ifcu_buf=(void *)Ifreq_Size;\r
+\r
+       /* Socket open */\r
+       sock_network = socket( AF_INET, SOCK_DGRAM, 0 );\r
+       if( sock_network < SOCKET_NOT_OPEN )\r
+       {\r
+               perror("Socket not open");\r
+               return USER_ERR_NG;\r
+       }\r
+\r
+       /* Network interface list acquisition */\r
+       if( ioctl( sock_network, SIOCGIFCONF, &Ifc_Get ) == -1 )\r
+       {\r
+               perror("Error can not get the interface list");\r
+               close( sock_network );\r
+               return USER_ERR_NG;\r
+       }\r
+\r
+       /* Calculate the number that came back from the kernel */\r
+       iNet_Number = Ifc_Get.ifc_len / ( int )sizeof( struct ifreq );\r
+       for(i=0;i<iNet_Number;i++)\r
+       {\r
+               /* Interface designation */\r
+               strncpy( User_Adapter[i].USER_ifreq.ifr_name,Ifreq_Size[i].ifr_name,IFNAMSIZ-1 );\r
+\r
+               /* IP address (IPv4) acquisition */\r
+               if ( ioctl( sock_network, SIOCGIFADDR, &User_Adapter[i].USER_ifreq ) == -1 )\r
+               {\r
+                       perror("Error can not get the IP address");\r
+                       close( sock_network );\r
+                       return USER_ERR_NG;\r
+               }\r
+               memcpy( &get_addr[i], &User_Adapter[i].USER_ifreq.ifr_addr, sizeof( struct sockaddr_in ));\r
+               memcpy( &User_Adapter[i].IPAddr, inet_ntoa( get_addr[i].sin_addr ), sizeof( User_Adapter[i].IPAddr ));\r
+\r
+               /* Mask address acquisition */\r
+               if ( ioctl( sock_network, SIOCGIFNETMASK, &User_Adapter[i].USER_ifreq ) == -1 )\r
+               {\r
+                       perror("Error can not get the Mask address");\r
+                       close( sock_network );\r
+                       return USER_ERR_NG;\r
+               }\r
+               memcpy( &get_addr[i], &User_Adapter[i].USER_ifreq.ifr_netmask, sizeof( struct sockaddr_in )); \r
+               memcpy( &User_Adapter[i].IPMask, inet_ntoa( get_addr[i].sin_addr ), sizeof( User_Adapter[i].IPMask ));\r
+\r
+               /* Mac address acquisition */\r
+               if ( ioctl( sock_network, SIOCGIFHWADDR, &User_Adapter[i].USER_ifreq ) == -1 )\r
+               {\r
+                       perror("Error can not get the Mac address");\r
+                       close( sock_network );\r
+                       return USER_ERR_NG;\r
+               }\r
+               pMAC_addr=(unsigned char *)&User_Adapter[i].USER_ifreq.ifr_hwaddr.sa_data;\r
+               sprintf( User_Adapter[i].MACAddr, "%02x:%02x:%02x:%02x:%02x:%02x", *pMAC_addr, *(pMAC_addr+1), *(pMAC_addr+2), *(pMAC_addr+3), *(pMAC_addr+4), *(pMAC_addr+5));\r
+\r
+               /* Get the default gateway from the system file */\r
+               pFile = fopen( DIR_PROC_ROUTE , "r" );\r
+               if( pFile == NULL )\r
+               {\r
+                       printf("Not systemfile read");\r
+                       close( sock_network );\r
+                       return USER_ERR_NG;\r
+               }\r
+\r
+               while(1)\r
+               {\r
+                       if ( fgets( User_Adapter[i].Defo, sizeof( User_Adapter[i].Defo ), pFile ) == 0) \r
+                       {\r
+                               memset( User_Adapter[i].Defo,0x00,sizeof( User_Adapter[i].Defo ));\r
+                               fclose( pFile );\r
+                               break;\r
+                       }\r
+                       //Route information acquisition\r
+                       memset( &RouteInfo_Defo[i], 0x00, sizeof( RouteInfo_Defo[i] ));\r
+                       if ( sscanf( User_Adapter[i].Defo, "%s%x%x%d%d%d%d%x%d%d%d",\r
+                               &RouteInfo_Defo[i].cIface,\r
+                               &RouteInfo_Defo[i].cDst,\r
+                               &RouteInfo_Defo[i].cGateway,\r
+                               &RouteInfo_Defo[i].iFlag,\r
+                               &RouteInfo_Defo[i].iRecCnt,\r
+                               &RouteInfo_Defo[i].iUse,\r
+                               &RouteInfo_Defo[i].iMetric,\r
+                               &RouteInfo_Defo[i].cMask,\r
+                               &RouteInfo_Defo[i].iMTU,\r
+                               &RouteInfo_Defo[i].iWindow,\r
+                               &RouteInfo_Defo[i].iIRTT) == 0 )\r
+                       {\r
+                               printf("Not file read");\r
+                               fclose( pFile );\r
+                               close( sock_network );\r
+                               return USER_ERR_NG;\r
+                       }\r
+                       /* device name and default GW flag check */\r
+                       if (( strstr( RouteInfo_Defo[i].cIface,User_Adapter[i].USER_ifreq.ifr_name ) != NULL ) && ( RouteInfo_Defo[i].iFlag == ( RTF_UP | RTF_GATEWAY )))\r
+                       {\r
+                               memcpy( &User_Adapter[i].Defo, inet_ntoa( RouteInfo_Defo[i].cGateway ), INET_ADDRSTRLEN );\r
+                               fclose( pFile );\r
+                               break;\r
+                       }\r
+                       memset( User_Adapter[i].Defo,0x00,sizeof( User_Adapter[i].Defo ));\r
+               }\r
+       }\r
+       \r
+       \r
+       \r
+       for(i=0;i<iNet_Number;i++)\r
+       {\r
+               printf( "%2d: \tAdapter desc: \t\t%s\n", i+1, User_Adapter[i].USER_ifreq.ifr_name );\r
+               printf( "\tMAC address: \t\t%s\n", User_Adapter[i].MACAddr );\r
+               printf( "\tIP address: \t\t%s\n",User_Adapter[i].IPAddr );\r
+               printf( "\tSubnet mask: \t\t%s\n", User_Adapter[i].IPMask );\r
+               printf( "\tDefault GW IP address: \t%s\n", User_Adapter[i].Defo );\r
+               printf( "\n");\r
+       }\r
+       printf( "Please select the adapter number (Press 'enter' Key after select) [1-%d]: ", iNet_Number );\r
+       while ( 1 )\r
+       {\r
+               fgets( input_line,sizeof( input_line ),stdin );\r
+               sscanf( input_line,"%d",&ikey );\r
+               if (( 1 > ikey ) || ( iNet_Number < ikey ))\r
+               {\r
+                       printf( "Wrong number select!\n");\r
+                       printf( "Please select the adapter number (Press 'Enter' Key after select) [1-%d]: ", iNet_Number );\r
+               }\r
+               else\r
+               {\r
+                       break;\r
+               }\r
+       }\r
+\r
+       User_Get_Info = User_Adapter[ikey-1];\r
+\r
+       /* Conversion of endian */\r
+       AdapterInfo.aucMacAddress[0] = ( uint8_t ) User_Get_Info.USER_ifreq.ifr_hwaddr.sa_data[5];\r
+       AdapterInfo.aucMacAddress[1] = ( uint8_t ) User_Get_Info.USER_ifreq.ifr_hwaddr.sa_data[4];\r
+       AdapterInfo.aucMacAddress[2] = ( uint8_t ) User_Get_Info.USER_ifreq.ifr_hwaddr.sa_data[3];\r
+       AdapterInfo.aucMacAddress[3] = ( uint8_t ) User_Get_Info.USER_ifreq.ifr_hwaddr.sa_data[2];\r
+       AdapterInfo.aucMacAddress[4] = ( uint8_t ) User_Get_Info.USER_ifreq.ifr_hwaddr.sa_data[1];\r
+       AdapterInfo.aucMacAddress[5] = ( uint8_t ) User_Get_Info.USER_ifreq.ifr_hwaddr.sa_data[0];\r
+       AdapterInfo.ulIpAddress = htonl( inet_addr( User_Get_Info.IPAddr ));\r
+       AdapterInfo.ulSubnetMask = htonl( inet_addr( User_Get_Info.IPMask ));\r
+       AdapterInfo.ulDefaultGatewayIPAddress = htonl(inet_addr( User_Get_Info.Defo ));\r
+\r
+       close( sock_network );\r
+\r
+       return USER_ERR_OK;\r
+#endif\r
+}\r
+\r
diff --git a/CCIEF-BASIC_Master/version.txt b/CCIEF-BASIC_Master/version.txt
new file mode 100644 (file)
index 0000000..e15ca4a
--- /dev/null
@@ -0,0 +1 @@
+Version 1.01.4\r
diff --git a/CCIEF-BASIC_Slave/Makefile b/CCIEF-BASIC_Slave/Makefile
new file mode 100644 (file)
index 0000000..408c863
--- /dev/null
@@ -0,0 +1,17 @@
+Slave_sample: SLMP.o SOCKET.o TIMER.o CCIEF_BASIC_SLAVE.o SLMP_SERVER.o USER_SAMPLE.o\r
+       gcc -o Slave_sample SLMP.o SOCKET.o TIMER.o CCIEF_BASIC_SLAVE.o SLMP_SERVER.o USER_SAMPLE.o\r
+\r
+SLMP.o: library/src/SLMP.c\r
+       gcc -I library/include -c library/src/SLMP.c\r
+SOCKET.o: sample/src/SOCKET.c\r
+       gcc -I sample/include -c sample/src/SOCKET.c\r
+TIMER.o: sample/src/TIMER.c\r
+       gcc -I sample/include -c sample/src/TIMER.c\r
+CCIEF_BASIC_SLAVE.o: sample/src/CCIEF_BASIC_SLAVE.c\r
+       gcc -I sample/include -I library/include -c sample/src/CCIEF_BASIC_SLAVE.c\r
+SLMP_SERVER.o: sample/src/SLMP_SERVER.c\r
+       gcc -I sample/include -I library/include -c sample/src/SLMP_SERVER.c\r
+USER_SAMPLE.o: sample/src/USER_SAMPLE.c\r
+       gcc -I sample/include -I library/include -c sample/src/USER_SAMPLE.c\r
+clean:\r
+       rm  -f SLMP.o SOCKET.o TIMER.o CCIEF_BASIC_SLAVE.o SLMP_SERVER.o USER_SAMPLE.o
\ No newline at end of file
diff --git a/CCIEF-BASIC_Slave/SlaveParameter.csv b/CCIEF-BASIC_Slave/SlaveParameter.csv
new file mode 100644 (file)
index 0000000..b7e4024
--- /dev/null
@@ -0,0 +1,9 @@
+,,\r
+CCIEF-BASIC Slave Sample Parameter,,\r
+,,\r
+ID,DATA,COMMENT\r
+1,0,IP Address\r
+2,0,Subnet Mask\r
+3,0,Default Gateway IP Address\r
+4,1,Occupied Station Number\r
+5,0,Cyclic Response Wait Time\r
diff --git a/CCIEF-BASIC_Slave/library/include/SLMP.h b/CCIEF-BASIC_Slave/library/include/SLMP.h
new file mode 100644 (file)
index 0000000..fcb6a95
--- /dev/null
@@ -0,0 +1,280 @@
+/*\r
+ * Copyright (C) 2017 Texas Instruments Incorporated - http://www.ti.com/\r
+ * Copyright (C) 2016 CC-Link Partner Association -http://am.cc-link.org/\r
+ * \r
+ * \r
+ *  Redistribution and use in source and binary forms, with or without \r
+ *  modification, are permitted provided that the following conditions \r
+ *  are met:\r
+ *\r
+ *    Redistributions of source code must retain the above copyright \r
+ *    notice, this list of conditions and the following disclaimer.\r
+ *\r
+ *    Redistributions in binary form must reproduce the above copyright\r
+ *    notice, this list of conditions and the following disclaimer in the \r
+ *    documentation and/or other materials provided with the   \r
+ *    distribution.\r
+ *\r
+ *    Neither the name of Texas Instruments Incorporated nor the names of\r
+ *    its contributors may be used to endorse or promote products derived\r
+ *    from this software without specific prior written permission.\r
+ *\r
+ *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \r
+ *  "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT \r
+ *  LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\r
+ *  A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT \r
+ *  OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, \r
+ *  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT \r
+ *  LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
+ *  DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\r
+ *  THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT \r
+ *  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE \r
+ *  OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
+ *\r
+*/\r
+\r
+#ifndef                __SLMP_H__\r
+#define                __SLMP_H__\r
+\r
+#include <stdint.h>\r
+\r
+/*[ Structure of SLMP Info  ]*/\r
+typedef struct \r
+{\r
+       uint32_t        ulFrameType;                    /* Frame Type */\r
+       uint16_t        usSerialNumber;                 /* Serial Number */\r
+       uint16_t        usNetNumber;                    /* Network Number */\r
+       uint16_t        usNodeNumber;                   /* Node Number */\r
+       uint16_t        usProcNumber;                   /* Processor Number */\r
+       uint16_t        usDataLength;                   /* Data Length */\r
+       uint16_t        usTimer;                                /* Timer Value */\r
+       uint16_t        usCommand;                              /* Command */\r
+       uint16_t        usSubCommand;                   /* Sub Command */\r
+       uint16_t        usEndCode;                              /* End Code */\r
+       uint8_t *       pucData;                                /* Data */\r
+}SLMP_INFO;\r
+\r
+/*[ Definition of Frame Type ]*/\r
+#define        SLMP_FTYPE_BIN_REQ_ST                                                   (0x5000)\r
+#define SLMP_FTYPE_BIN_RES_ST                                                  (0xD000)\r
+#define        SLMP_FTYPE_BIN_REQ_MT                                                   (0x5400)\r
+#define SLMP_FTYPE_BIN_RES_MT                                                  (0xD400)\r
+#define        SLMP_FTYPE_ASCII_REQ_ST                                                 (0x35303030) /* '5000' */\r
+#define        SLMP_FTYPE_ASCII_RES_ST                                                 (0x44303030) /* 'D000' */\r
+#define        SLMP_FTYPE_ASCII_REQ_MT                                                 (0x35343030) /* '5400' */\r
+#define        SLMP_FTYPE_ASCII_RES_MT                                                 (0x44343030) /* 'D400' */\r
+\r
+/*[ Definition of Index per frame type ]*/\r
+#define        SLMP_FTYPE_BIN_REQ_ST_INDEX                                             (0x00)\r
+#define SLMP_FTYPE_BIN_RES_ST_INDEX                                            (0x01)\r
+#define        SLMP_FTYPE_BIN_REQ_MT_INDEX                                             (0x02)\r
+#define SLMP_FTYPE_BIN_RES_MT_INDEX                                            (0x03)\r
+#define        SLMP_FTYPE_ASCII_REQ_ST_INDEX                                   (0x04)\r
+#define        SLMP_FTYPE_ASCII_RES_ST_INDEX                                   (0x05)\r
+#define        SLMP_FTYPE_ASCII_REQ_MT_INDEX                                   (0x06)\r
+#define        SLMP_FTYPE_ASCII_RES_MT_INDEX                                   (0x07)\r
+\r
+/*[ Definition of Data Code ]*/\r
+#define        SLMP_DATA_CODE_BIN                                                              0\r
+#define        SLMP_DATA_CODE_ASCII                                                    1\r
+#define SLMP_DATA_CODE(a)\\r
+       (((a == SLMP_FTYPE_BIN_REQ_ST) | (a == SLMP_FTYPE_BIN_RES_ST) | (a == SLMP_FTYPE_BIN_REQ_MT) | (a == SLMP_FTYPE_BIN_RES_MT)) ? SLMP_DATA_CODE_BIN :\\r
+        ((a == SLMP_FTYPE_ASCII_REQ_ST) | (a == SLMP_FTYPE_ASCII_RES_ST) | (a == SLMP_FTYPE_ASCII_REQ_MT) | (a == SLMP_FTYPE_ASCII_RES_MT)) ? SLMP_DATA_CODE_ASCII : -1)\r
+\r
+/*[ Definition of Response Frame Type ]*/\r
+#define SLMP_RESPONSE_FRAME_TYPE(a)\\r
+       ((a == SLMP_FTYPE_BIN_REQ_ST) ? SLMP_FTYPE_BIN_RES_ST :\\r
+       ((a == SLMP_FTYPE_BIN_REQ_MT) ? SLMP_FTYPE_BIN_RES_MT :\\r
+       ((a == SLMP_FTYPE_ASCII_REQ_ST) ? SLMP_FTYPE_ASCII_RES_ST :\\r
+       ((a == SLMP_FTYPE_ASCII_REQ_MT) ? SLMP_FTYPE_ASCII_RES_MT : -1))))\r
+\r
+/*[ Definition of SLMP Frame Header Size ]*/\r
+#define SLMP_HEADER_SIZE(a)\\r
+       (((a == SLMP_FTYPE_BIN_REQ_ST) | (a == SLMP_FTYPE_BIN_RES_ST)) ? 11 :\\r
+       (((a == SLMP_FTYPE_BIN_REQ_MT) | (a == SLMP_FTYPE_BIN_RES_MT)) ? 15 :\\r
+       (((a == SLMP_FTYPE_ASCII_REQ_ST) | (a == SLMP_FTYPE_ASCII_RES_ST)) ? 22 :\\r
+       (((a == SLMP_FTYPE_ASCII_REQ_MT) | (a == SLMP_FTYPE_ASCII_RES_MT)) ? 30 : 0))))\r
+\r
+/*[ Definition of SLMP Commands ]*/\r
+/* Device */\r
+#define        SLMP_COMMAND_DEVICE_READ                                                        (0x0401)\r
+#define        SLMP_COMMAND_DEVICE_WRITE                                                       (0x1401)\r
+#define        SLMP_COMMAND_DEVICE_READ_RANDOM                                         (0x0403)\r
+#define        SLMP_COMMAND_DEVICE_WRITE_RANDOM                                        (0x1402)\r
+#define        SLMP_COMMAND_DEVICE_ENTRY_MONITOR_DEVICE                        (0x0801)\r
+#define        SLMP_COMMAND_DEVICE_EXECUTE_MONITOR                                     (0x0802)\r
+#define        SLMP_COMMAND_DEVICE_READ_BLOCK                                          (0x0406)\r
+#define SLMP_COMMAND_DEVICE_WRITE_BLOCK                                                (0x1406)\r
+\r
+/* Memory */\r
+#define        SLMP_COMMAND_MEMORY_READ                                                        (0x0613)\r
+#define        SLMP_COMMAND_MEMORY_WRITE                                                       (0x1613)\r
+\r
+/* ExtendUnit */\r
+#define        SLMP_COMMAND_EXTEND_UNIT_READ                                           (0x0601)\r
+#define        SLMP_COMMAND_EXTEND_UNIT_WRITE                                          (0x1601)\r
+\r
+/* RemoteControl */\r
+#define        SLMP_COMMAND_REMOTE_RUN                                                         (0x1001)\r
+#define        SLMP_COMMAND_REMOTE_STOP                                                        (0x1002)\r
+#define        SLMP_COMMAND_REMOTE_PAUSE                                                       (0x1003)\r
+#define        SLMP_COMMAND_REMOTE_LATCH_CLEAR                                         (0x1005)\r
+#define        SLMP_COMMAND_REMOTE_RESET                                                       (0x1006)\r
+#define        SLMP_COMMAND_REMOTE_READ_TYPE_NAME                                      (0x0101)\r
+\r
+/* Drive */\r
+#define        SLMP_COMMAND_DRIVE_READ_DISK_STATE                                      (0x0205)\r
+#define        SLMP_COMMAND_DRIVE_DEFRAG                                                       (0x1207)\r
+\r
+/* FILE */\r
+#define SLMP_COMMAND_FILE_READ_FILE_INFO                                       (0x0201)\r
+#define        SLMP_COMMAND_FILE_READ_FILE_INFO_DETAIL                         (0x0202)\r
+#define        SLMP_COMMAND_FILE_READ_FILE_INFO_FILE_NUMBER_USAGE      (0x0204)\r
+#define        SLMP_COMMAND_FILE_CHANGE_FILE_INFO                                      (0x1204)\r
+#define        SLMP_COMMAND_FILE_SEARCH                                                        (0x0203)\r
+#define        SLMP_COMMAND_FILE_READ_ACCESS_TYPE_A                            (0x0206)\r
+#define        SLMP_COMMAND_FILE_WRITE_ACCESS_TYPE_A                           (0x1203)\r
+#define        SLMP_COMMAND_FILE_LOCK_CONTROL                                          (0x0808)\r
+#define        SLMP_COMMAND_FILE_COPY_ACCESS_TYPE_A                            (0x1206)\r
+#define        SLMP_COMMAND_FILE_COPY_ACCESS_TYPE_B                            (0x1824)\r
+#define        SLMP_COMMAND_FILE_DELETE_ACCESS_TYPE_A                          (0x1205)\r
+#define        SLMP_COMMAND_FILE_DELETE_ACCESS_TYPE_B                          (0x1822)\r
+#define        SLMP_COMMAND_FILE_READ_DEIRECTORY_FILE                          (0x1810)\r
+#define        SLMP_COMMAND_FILE_SEARCH_DIRECTORY_FILE                         (0x1811)\r
+#define        SLMP_COMMAND_FILE_CREATE_NEW_FILE_ACCESS_TYPE_A         (0x1202)\r
+#define        SLMP_COMMAND_FILE_CREATE_NEW_FILE_ACCESS_TYPE_B         (0x1820)\r
+#define        SLMP_COMMAND_FILE_CHANGE_FILE_STATE                                     (0x1825)\r
+#define        SLMP_COMMAND_FILE_CHANGE_FILE_DATE                                      (0x1826)\r
+#define        SLMP_COMMAND_FILE_OPEN_FILE                                                     (0x1827)\r
+#define        SLMP_COMMAND_FILE_READ_ACCESS_TYPE_B                            (0x1828)\r
+#define        SLMP_COMMAND_FILE_WRITE_ACCESS_TYPE_B                           (0x1829)\r
+#define        SLMP_COMMAND_FILE_CLOSE_FILE                                            (0x182A)\r
+\r
+/* TEST */\r
+#define        SLMP_COMMAND_SELF_TEST                                                          (0x0619)\r
+\r
+/* CLEAR ERROR */\r
+#define        SLMP_COMMAND_CLEAR_ERROR_CODE                                           (0x1617)\r
+\r
+/* REMOTE PASSWORD */\r
+#define        SLMP_COMMAND_PASSWORD_LOCK                                                      (0x1630)\r
+#define        SLMP_COMMAND_PASSWORD_UNLOCK                                            (0x1631)\r
+\r
+/* ONDEMAND */\r
+#define        SLMP_COMMAND_ONDEMAND                                                           (0x2101)\r
+\r
+/* NODE CONNECT */\r
+#define        SLMP_COMMAND_NODE_SEARCH_BASIC                                          (0x0E30)\r
+#define        SLMP_COMMAND_IP_ADDRESS_SET_BASIC                                       (0x0E31)\r
+\r
+/* PARAMETER SETTING */\r
+#define        SLMP_COMMAND_DEVICE_INFO_COMPARE                                        (0x0E32)\r
+#define        SLMP_COMMAND_PARAMETER_GET                                                      (0x0E33)\r
+#define        SLMP_COMMAND_PARAMETER_SET                                                      (0x0E34)\r
+#define        SLMP_COMMAND_PARAMETER_SET_START                                        (0x0E35)\r
+#define        SLMP_COMMAND_PARAMETER_SET_END                                          (0x0E36)\r
+#define        SLMP_COMMAND_PARAMETER_SET_CANCEL                                       (0x0E3A)\r
+\r
+/* NODE MONITORING */\r
+#define        SLMP_COMMAND_STATUS_READ                                                        (0x0E44)\r
+#define        SLMP_COMMAND_COMMUNICATION_SETTING_GET                          (0x0E45)\r
+#define        SLMP_COMMAND_STATUS_READ2                                                       (0x0E53)\r
+\r
+/* CCIEF-BASIC */\r
+#define        SLMP_COMMAND_CYCLIC_DATA                                                        (0x0E70)\r
+\r
+/*[ Definition of Processor Number ]*/\r
+#define        SLMP_CPU_ACTIVE                                                                         (0x03D0)\r
+#define        SLMP_CPU_STANDBY                                                                        (0x03D1)\r
+#define        SLMP_CPU_TYPE_A                                                                         (0x03D2)\r
+#define SLMP_CPU_TYPE_B                                                                                (0x03D3)\r
+#define        SLMP_CPU_1                                                                                      (0x03E0)\r
+#define        SLMP_CPU_2                                                                                      (0x03E1)\r
+#define        SLMP_CPU_3                                                                                      (0x03E2)\r
+#define        SLMP_CPU_4                                                                                      (0x03E3)\r
+#define        SLMP_CPU_DEFAULT                                                                        (0x03FF)\r
+\r
+/*[ Definition of Timer Value ]*/\r
+#define        SLMP_TIMER_WAIT_FOREVER                                                         (0x0000)\r
+\r
+/*[ Definition of SLMP Error Codes ]*/\r
+#define SLMP_ERR_COMMAND_SUBCOMMAND                                                    (0xC059)\r
+#define SLMP_ERR_WRONG_DATA                                                                    (0xC05C)\r
+#define SLMP_ERR_DATA_LENGTH                                                           (0xC061)\r
+#define SLMP_ERR_UNDER_EXECUTION                                                       (0xCEE0)\r
+#define SLMP_ERR_REQ_DATA_SIZE                                                         (0xCEE1)\r
+#define SLMP_ERR_RES_DATA_SIZE                                                         (0xCEE2)\r
+#define SLMP_ERR_NO_EXIST_SERVER_NO                                                    (0xCF10)\r
+#define SLMP_ERR_CAN_NOT_COMMUNICATION_SETTING                         (0xCF20)\r
+#define SLMP_ERR_NO_EXIST_PARAM_ID                                                     (0xCF30)\r
+#define SLMP_ERR_CAN_NOT_PARAMETER_SET                                         (0xCF31)\r
+\r
+/*[ Definition for CCIEF-BASIC End Code ]*/\r
+#define        SLMP_END_DUPLICATE_MASTER                                                       (0xCFE0)\r
+#define        SLMP_END_INVALID_NUMBER_OF_OCCUPIED_STATIONS            (0xCFE1)\r
+#define        SLMP_END_SLAVE                                                                          (0xCFF0)\r
+#define SLMP_END_DISCONNECTED_REQUEST                                          (0xCFFF)\r
+\r
+/*[ Definition of value ]*/\r
+#define SLMP_ERR_OK            0\r
+#define SLMP_ERR_NG            (-1)\r
+#ifndef        NULL\r
+#define NULL                   0\r
+#endif\r
+\r
+/*[ Definition of mask value ]*/\r
+#define MASK_UPPER4BIT         (0xF0)\r
+#define MASK_LOWER4BIT         (0x0F)\r
+\r
+/*[ Definition of bit operation ]*/\r
+#define SHIFT_R24(a)                   ((uint8_t)(((a) >> 24) & 0xFF ))\r
+#define SHIFT_R20(a)                   ((uint8_t)(((a) >> 20) & 0xFF ))\r
+#define SHIFT_R16(a)                   ((uint8_t)(((a) >> 16) & 0xFF ))\r
+#define SHIFT_R12(a)                   ((uint8_t)(((a) >> 12) & 0xFF ))\r
+#define SHIFT_R8(a)                            ((uint8_t)(((a) >>  8) & 0xFF ))\r
+#define SHIFT_R7(a)                            ((uint8_t)(((a) >>  7) & 0xFF ))\r
+#define SHIFT_R6(a)                            ((uint8_t)(((a) >>  6) & 0xFF ))\r
+#define SHIFT_R5(a)                            ((uint8_t)(((a) >>  5) & 0xFF ))\r
+#define SHIFT_R4(a)                            ((uint8_t)(((a) >>  4) & 0xFF ))\r
+#define SHIFT_R3(a)                            ((uint8_t)(((a) >>  3) & 0xFF ))\r
+#define SHIFT_R2(a)                            ((uint8_t)(((a) >>  2) & 0xFF ))\r
+#define SHIFT_R1(a)                            ((uint8_t)(((a) >>  1) & 0xFF ))\r
+#define SHIFT_R0(a)                            ((uint8_t)(((a)      ) & 0xFF ))\r
+\r
+#define SHIFT_L0(a)                            ((uint8_t) (((a)      ) & 0xFF ))\r
+#define SHIFT_L1(a)                            ((uint8_t) (((a) <<  1) & 0xFF ))\r
+#define SHIFT_L2(a)                            ((uint8_t) (((a) <<  2) & 0xFF ))\r
+#define SHIFT_L3(a)                            ((uint8_t) (((a) <<  3) & 0xFF ))\r
+#define SHIFT_L4(a)                            ((uint8_t) (((a) <<  4) & 0xFF ))\r
+#define SHIFT_L5(a)                            ((uint8_t) (((a) <<  5) & 0xFF ))\r
+#define SHIFT_L6(a)                            ((uint8_t) (((a) <<  6) & 0xFF ))\r
+#define SHIFT_L7(a)                            ((uint8_t) (((a) <<  7) & 0xFF ))\r
+#define SHIFT_L8(a)                            ((uint16_t)(((a) <<  8) & 0xFFFF))\r
+#define SHIFT_L16(a)                   ((uint32_t)( (a) << 16))\r
+#define SHIFT_L24(a)                   ((uint32_t)( (a) << 24))\r
+\r
+#define CONCAT_2ASCII(a, b)                            (((uint16_t)(a) <<  4) | (b))\r
+#define CONCAT_4ASCII(a, b, c, d)              (((uint16_t)(a) << 12) | ((uint16_t)(b) <<  8) | ((uint16_t)(c) << 4) | (d))\r
+#define CONCAT_6ASCII(a, b, c, d, e, f)        (((uint16_t)(a) << 20) | ((uint16_t)(b) << 16) | ((uint16_t)(c) << 12) |\\r
+                                                                                ((uint16_t)(d) <<  8) | ((uint16_t)(e) <<  4) | (f))\r
+#define CONCAT_8ASCII(a, b, c, d, e, f, g, h)  (((uint16_t)(a) << 28) | ((uint16_t)(b) << 24) | ((uint16_t)(c) << 20) |\\r
+                                                                                                ((uint16_t)(d) << 16) | ((uint16_t)(e) << 12) | ((uint16_t)(f) << 8) |\\r
+                                                                                                ((uint16_t)(g) << 4) | (h))\r
+#define CONCAT_2BIN(a, b)                      (((uint16_t)(a) <<  8) | (b))\r
+#define CONCAT_3BIN(a, b, c)           (((uint16_t)(a) << 16) | ((uint16_t)(b) << 8) | (c))\r
+#define CONCAT_4BIN(a, b, c, d)                (((uint32_t) (a) << 24) | ((uint32_t)(b) << 16) | ((uint32_t)(c) << 8) | (d))\r
+\r
+#define BIT_GET(a, b)                          (((((uint8_t*)a)[(b)/8]) >> ((b)%8)) & 0x01)\r
+#define BIT_SET(a, b, c)                       ((((c) & 0x01) == 0x01) ? ((((uint8_t*)a)[(b)/8]) |= (0x01 << ((b)%8))) : \\r
+                                                                       ((((uint8_t*)a)[(b)/8]) &= ~(0x01 << ((b)%8))))\r
+\r
+\r
+/*[ Definition of Public API ]*/\r
+int SLMP_MakePacketStream ( uint32_t ulFrameType, const SLMP_INFO *p, uint8_t *pucStream );\r
+int SLMP_GetSlmpInfo ( SLMP_INFO *p, const uint8_t *pucStream );\r
+int SLMP_MakeErrorData ( const SLMP_INFO *p, uint8_t *pucStream, uint16_t *pusDataSize );\r
+uint8_t local_itoa( uint8_t ucInt );\r
+uint8_t local_atoi( uint8_t ucInt );\r
+\r
+#endif\r
+/*EOF*/
\ No newline at end of file
diff --git a/CCIEF-BASIC_Slave/library/src/SLMP.c b/CCIEF-BASIC_Slave/library/src/SLMP.c
new file mode 100644 (file)
index 0000000..f0de50a
--- /dev/null
@@ -0,0 +1,931 @@
+/*\r
+ * Copyright (C) 2017 Texas Instruments Incorporated - http://www.ti.com/\r
+ * Copyright (C) 2016 CC-Link Partner Association -http://am.cc-link.org/\r
+ * \r
+ * \r
+ *  Redistribution and use in source and binary forms, with or without \r
+ *  modification, are permitted provided that the following conditions \r
+ *  are met:\r
+ *\r
+ *    Redistributions of source code must retain the above copyright \r
+ *    notice, this list of conditions and the following disclaimer.\r
+ *\r
+ *    Redistributions in binary form must reproduce the above copyright\r
+ *    notice, this list of conditions and the following disclaimer in the \r
+ *    documentation and/or other materials provided with the   \r
+ *    distribution.\r
+ *\r
+ *    Neither the name of Texas Instruments Incorporated nor the names of\r
+ *    its contributors may be used to endorse or promote products derived\r
+ *    from this software without specific prior written permission.\r
+ *\r
+ *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \r
+ *  "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT \r
+ *  LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\r
+ *  A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT \r
+ *  OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, \r
+ *  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT \r
+ *  LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
+ *  DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\r
+ *  THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT \r
+ *  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE \r
+ *  OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
+ *\r
+*/\r
+\r
+#include "SLMP.h"\r
+#include <stdint.h>\r
+#include "string.h"\r
+\r
+static unsigned int uiHeaderLength[]           = {  6,  2,  6,  2, 12,  4, 12,  4};\r
+static unsigned int uiDataAddr[]                       = { 15, 11, 19, 15, 30, 22, 38, 30};\r
+\r
+/* A Function for making packet stream from the SLMP_Info structure */\r
+int SLMP_MakePacketStream ( uint32_t ulFrameType, const SLMP_INFO *p, uint8_t *pucStream )\r
+{\r
+       int i = 0;\r
+       int iLength = 0;\r
+       int iIndex = 0;\r
+\r
+       if ( (p == NULL) || (pucStream == NULL) )\r
+       {\r
+               return SLMP_ERR_NG;\r
+       }\r
+\r
+       /*[ Request : Binary Mode, Single Transmission Type ]*/\r
+       if( (uint16_t)ulFrameType == SLMP_FTYPE_BIN_REQ_ST )\r
+       {\r
+               iIndex = SLMP_FTYPE_BIN_REQ_ST_INDEX;\r
+               iLength = (p->usDataLength)-uiHeaderLength[iIndex];\r
+               if ( iLength < 0 )\r
+               {\r
+                       return SLMP_ERR_NG;\r
+               }\r
+               else if ( iLength > 0 )\r
+               {\r
+                       if ( p->pucData == NULL )\r
+                       {\r
+                               return SLMP_ERR_NG;\r
+                       }\r
+               }\r
+\r
+               pucStream[ 0] = SHIFT_R8(SLMP_FTYPE_BIN_REQ_ST);\r
+               pucStream[ 1] = SHIFT_R0(SLMP_FTYPE_BIN_REQ_ST);\r
+               pucStream[ 2] = SHIFT_R0(p->usNetNumber);\r
+               pucStream[ 3] = SHIFT_R0(p->usNodeNumber);\r
+               pucStream[ 4] = SHIFT_R0(p->usProcNumber);\r
+               pucStream[ 5] = SHIFT_R8(p->usProcNumber);\r
+               pucStream[ 6] = 0x00;\r
+               pucStream[ 7] = SHIFT_R0(p->usDataLength);\r
+               pucStream[ 8] = SHIFT_R8(p->usDataLength);\r
+               pucStream[ 9] = SHIFT_R0(p->usTimer);\r
+               pucStream[10] = SHIFT_R8(p->usTimer);\r
+               pucStream[11] = SHIFT_R0(p->usCommand);\r
+               pucStream[12] = SHIFT_R8(p->usCommand);\r
+               pucStream[13] = SHIFT_R0(p->usSubCommand);\r
+               pucStream[14] = SHIFT_R8(p->usSubCommand);\r
+               for( i=0; i<iLength; i++ )\r
+               {\r
+                       pucStream[uiDataAddr[iIndex]+i] = p->pucData[i];\r
+               }\r
+               return SLMP_ERR_OK;\r
+       }\r
+\r
+       /*[ Response : Binary Mode, Single Transmission Type ]*/\r
+       else if( (uint16_t)ulFrameType == SLMP_FTYPE_BIN_RES_ST )\r
+       {\r
+               iIndex = SLMP_FTYPE_BIN_RES_ST_INDEX;\r
+               iLength = (p->usDataLength)-uiHeaderLength[iIndex]+2;\r
+               if ( iLength < 0 )\r
+               {\r
+                       return SLMP_ERR_NG;\r
+               }\r
+               else if ( iLength > 0 )\r
+               {\r
+                       if ( p->pucData == NULL )\r
+                       {\r
+                               return SLMP_ERR_NG;\r
+                       }\r
+               }\r
+\r
+               pucStream[ 0] = SHIFT_R8(SLMP_FTYPE_BIN_RES_ST);\r
+               pucStream[ 1] = SHIFT_R0(SLMP_FTYPE_BIN_RES_ST);\r
+               pucStream[ 2] = SHIFT_R0(p->usNetNumber);\r
+               pucStream[ 3] = SHIFT_R0(p->usNodeNumber);\r
+               pucStream[ 4] = SHIFT_R0(p->usProcNumber);\r
+               pucStream[ 5] = SHIFT_R8(p->usProcNumber);\r
+               pucStream[ 6] = 0x00;\r
+               pucStream[ 7] = SHIFT_R0(p->usDataLength+2);\r
+               pucStream[ 8] = SHIFT_R8(p->usDataLength+2);\r
+               pucStream[ 9] = SHIFT_R0(p->usEndCode);\r
+               pucStream[10] = SHIFT_R8(p->usEndCode);\r
+\r
+               for( i=0; i<iLength+2; i++ )\r
+               {\r
+                       pucStream[uiDataAddr[iIndex]+i] = p->pucData[i];\r
+               }\r
+               return SLMP_ERR_OK;\r
+       }\r
+\r
+       /*[ Request : Binary Mode, Multiple Transmission Type ]*/\r
+       else if( (uint16_t)ulFrameType == SLMP_FTYPE_BIN_REQ_MT )\r
+       {\r
+               iIndex = SLMP_FTYPE_BIN_REQ_MT_INDEX;\r
+               iLength = (p->usDataLength)-uiHeaderLength[iIndex];\r
+               if ( iLength < 0 )\r
+               {\r
+                       return SLMP_ERR_NG;\r
+               }\r
+               else if ( iLength > 0 )\r
+               {\r
+                       if ( p->pucData == NULL )\r
+                       {\r
+                               return SLMP_ERR_NG;\r
+                       }\r
+               }\r
+\r
+               pucStream[ 0] = SHIFT_R8(SLMP_FTYPE_BIN_REQ_MT);\r
+               pucStream[ 1] = SHIFT_R0(SLMP_FTYPE_BIN_REQ_MT);\r
+               pucStream[ 2] = SHIFT_R0(p->usSerialNumber);\r
+               pucStream[ 3] = SHIFT_R8(p->usSerialNumber);\r
+               pucStream[ 4] = 0x00;\r
+               pucStream[ 5] = 0x00;\r
+               pucStream[ 6] = SHIFT_R0(p->usNetNumber);\r
+               pucStream[ 7] = SHIFT_R0(p->usNodeNumber);\r
+               pucStream[ 8] = SHIFT_R0(p->usProcNumber);\r
+               pucStream[ 9] = SHIFT_R8(p->usProcNumber);\r
+               pucStream[10] = 0x00;\r
+               pucStream[11] = SHIFT_R0(p->usDataLength);\r
+               pucStream[12] = SHIFT_R8(p->usDataLength);\r
+               pucStream[13] = SHIFT_R0(p->usTimer);\r
+               pucStream[14] = SHIFT_R8(p->usTimer);\r
+               pucStream[15] = SHIFT_R0(p->usCommand);\r
+               pucStream[16] = SHIFT_R8(p->usCommand);\r
+               pucStream[17] = SHIFT_R0(p->usSubCommand);\r
+               pucStream[18] = SHIFT_R8(p->usSubCommand);\r
+\r
+               for( i=0; i<iLength; i++ )\r
+               {\r
+                       pucStream[uiDataAddr[iIndex]+i] = p->pucData[i];\r
+               }\r
+               return SLMP_ERR_OK;\r
+       }\r
+\r
+       /*[ Response : Binary Mode, Multiple Transmission Type ]*/\r
+       else if( (uint16_t)ulFrameType == SLMP_FTYPE_BIN_RES_MT )\r
+       {\r
+               iIndex = SLMP_FTYPE_BIN_RES_MT_INDEX;\r
+               iLength = (p->usDataLength)-uiHeaderLength[iIndex]+2;\r
+               if ( iLength < 0 )\r
+               {\r
+                       return SLMP_ERR_NG;\r
+               }\r
+               else if ( iLength > 0 )\r
+               {\r
+                       if ( p->pucData == NULL )\r
+                       {\r
+                               return SLMP_ERR_NG;\r
+                       }\r
+               }\r
+\r
+               pucStream[ 0] = SHIFT_R8(SLMP_FTYPE_BIN_RES_MT);\r
+               pucStream[ 1] = SHIFT_R0(SLMP_FTYPE_BIN_RES_MT);\r
+               pucStream[ 2] = SHIFT_R0(p->usSerialNumber);\r
+               pucStream[ 3] = SHIFT_R8(p->usSerialNumber);\r
+               pucStream[ 4] = 0x00;\r
+               pucStream[ 5] = 0x00;\r
+               pucStream[ 6] = SHIFT_R0(p->usNetNumber);\r
+               pucStream[ 7] = SHIFT_R0(p->usNodeNumber);\r
+               pucStream[ 8] = SHIFT_R0(p->usProcNumber);\r
+               pucStream[ 9] = SHIFT_R8(p->usProcNumber);\r
+               pucStream[10] = 0x00;\r
+               pucStream[11] = SHIFT_R0(p->usDataLength+2);\r
+               pucStream[12] = SHIFT_R8(p->usDataLength+2);\r
+               pucStream[13] = SHIFT_R0(p->usEndCode);\r
+               pucStream[14] = SHIFT_R8(p->usEndCode);\r
+\r
+               for( i=0; i<iLength+2; i++ )\r
+               {\r
+                       pucStream[uiDataAddr[iIndex]+i] = p->pucData[i];\r
+               }\r
+               return SLMP_ERR_OK;\r
+       }\r
+\r
+       /*[ Request : ASCII Mode, Single Transmission Type ]*/\r
+       else if( ulFrameType == SLMP_FTYPE_ASCII_REQ_ST )\r
+       {\r
+               iIndex = SLMP_FTYPE_ASCII_REQ_ST_INDEX;\r
+               iLength = (p->usDataLength)-uiHeaderLength[iIndex];\r
+               if ( iLength < 0 )\r
+               {\r
+                       return SLMP_ERR_NG;\r
+               }\r
+               else if ( iLength > 0 )\r
+               {\r
+                       if ( p->pucData == NULL )\r
+                       {\r
+                               return SLMP_ERR_NG;\r
+                       }\r
+               }\r
+\r
+               pucStream[ 0] = SHIFT_R24(SLMP_FTYPE_ASCII_REQ_ST);\r
+               pucStream[ 1] = SHIFT_R16(SLMP_FTYPE_ASCII_REQ_ST);\r
+               pucStream[ 2] = SHIFT_R8 (SLMP_FTYPE_ASCII_REQ_ST);\r
+               pucStream[ 3] = SHIFT_R0 (SLMP_FTYPE_ASCII_REQ_ST);\r
+               pucStream[ 4] = local_itoa(SHIFT_R4(p->usNetNumber) & MASK_LOWER4BIT);\r
+               pucStream[ 5] = local_itoa(SHIFT_R0(p->usNetNumber) & MASK_LOWER4BIT);\r
+               pucStream[ 6] = local_itoa(SHIFT_R4(p->usNodeNumber) & MASK_LOWER4BIT);\r
+               pucStream[ 7] = local_itoa(SHIFT_R0(p->usNodeNumber) & MASK_LOWER4BIT);\r
+               pucStream[ 8] = local_itoa(SHIFT_R12(p->usProcNumber) & MASK_LOWER4BIT);\r
+               pucStream[ 9] = local_itoa(SHIFT_R8 (p->usProcNumber) & MASK_LOWER4BIT);\r
+               pucStream[10] = local_itoa(SHIFT_R4 (p->usProcNumber) & MASK_LOWER4BIT);\r
+               pucStream[11] = local_itoa(SHIFT_R0 (p->usProcNumber) & MASK_LOWER4BIT);\r
+               pucStream[12] = local_itoa(0x00);\r
+               pucStream[13] = local_itoa(0x00);\r
+               pucStream[14] = local_itoa(SHIFT_R12(p->usDataLength) & MASK_LOWER4BIT);\r
+               pucStream[15] = local_itoa(SHIFT_R8 (p->usDataLength) & MASK_LOWER4BIT);\r
+               pucStream[16] = local_itoa(SHIFT_R4 (p->usDataLength) & MASK_LOWER4BIT);\r
+               pucStream[17] = local_itoa(SHIFT_R0 (p->usDataLength) & MASK_LOWER4BIT);\r
+               pucStream[18] = local_itoa(SHIFT_R12(p->usTimer) & MASK_LOWER4BIT);\r
+               pucStream[19] = local_itoa(SHIFT_R8 (p->usTimer) & MASK_LOWER4BIT);\r
+               pucStream[20] = local_itoa(SHIFT_R4 (p->usTimer) & MASK_LOWER4BIT);\r
+               pucStream[21] = local_itoa(SHIFT_R0 (p->usTimer) & MASK_LOWER4BIT);\r
+               pucStream[22] = local_itoa(SHIFT_R12(p->usCommand) & MASK_LOWER4BIT);\r
+               pucStream[23] = local_itoa(SHIFT_R8 (p->usCommand) & MASK_LOWER4BIT);\r
+               pucStream[24] = local_itoa(SHIFT_R4 (p->usCommand) & MASK_LOWER4BIT);\r
+               pucStream[25] = local_itoa(SHIFT_R0 (p->usCommand) & MASK_LOWER4BIT);\r
+               pucStream[26] = local_itoa(SHIFT_R12(p->usSubCommand) & MASK_LOWER4BIT);\r
+               pucStream[27] = local_itoa(SHIFT_R8 (p->usSubCommand) & MASK_LOWER4BIT);\r
+               pucStream[28] = local_itoa(SHIFT_R4 (p->usSubCommand) & MASK_LOWER4BIT);\r
+               pucStream[29] = local_itoa(SHIFT_R0 (p->usSubCommand) & MASK_LOWER4BIT);\r
+\r
+               for( i=0; i<iLength; i++ )\r
+               {\r
+                       pucStream[uiDataAddr[iIndex]+i] = p->pucData[i];\r
+               }\r
+               return SLMP_ERR_OK;\r
+       }\r
+\r
+       /*[ Response : ASCII Mode, Single Transmission Type ]*/\r
+       else if( ulFrameType == SLMP_FTYPE_ASCII_RES_ST )\r
+       {\r
+               iIndex = SLMP_FTYPE_ASCII_RES_ST_INDEX;\r
+               iLength = (p->usDataLength)-uiHeaderLength[iIndex]+4;\r
+               if ( iLength < 0 )\r
+               {\r
+                       return SLMP_ERR_NG;\r
+               }\r
+               else if ( iLength > 0 )\r
+               {\r
+                       if ( p->pucData == NULL )\r
+                       {\r
+                               return SLMP_ERR_NG;\r
+                       }\r
+               }\r
+\r
+               pucStream[ 0] = SHIFT_R24(SLMP_FTYPE_ASCII_RES_ST);\r
+               pucStream[ 1] = SHIFT_R16(SLMP_FTYPE_ASCII_RES_ST);\r
+               pucStream[ 2] = SHIFT_R8 (SLMP_FTYPE_ASCII_RES_ST);\r
+               pucStream[ 3] = SHIFT_R0 (SLMP_FTYPE_ASCII_RES_ST);\r
+               pucStream[ 4] = local_itoa(SHIFT_R4(p->usNetNumber) & MASK_LOWER4BIT);\r
+               pucStream[ 5] = local_itoa(SHIFT_R0(p->usNetNumber) & MASK_LOWER4BIT);\r
+               pucStream[ 6] = local_itoa(SHIFT_R4(p->usNodeNumber) & MASK_LOWER4BIT);\r
+               pucStream[ 7] = local_itoa(SHIFT_R0(p->usNodeNumber) & MASK_LOWER4BIT);\r
+               pucStream[ 8] = local_itoa(SHIFT_R12(p->usProcNumber) & MASK_LOWER4BIT);\r
+               pucStream[ 9] = local_itoa(SHIFT_R8 (p->usProcNumber) & MASK_LOWER4BIT);\r
+               pucStream[10] = local_itoa(SHIFT_R4 (p->usProcNumber) & MASK_LOWER4BIT);\r
+               pucStream[11] = local_itoa(SHIFT_R0 (p->usProcNumber) & MASK_LOWER4BIT);\r
+               pucStream[12] = local_itoa(0x00);\r
+               pucStream[13] = local_itoa(0x00);\r
+               pucStream[14] = local_itoa(SHIFT_R12(p->usDataLength+4) & MASK_LOWER4BIT);\r
+               pucStream[15] = local_itoa(SHIFT_R8 (p->usDataLength+4) & MASK_LOWER4BIT);\r
+               pucStream[16] = local_itoa(SHIFT_R4 (p->usDataLength+4) & MASK_LOWER4BIT);\r
+               pucStream[17] = local_itoa(SHIFT_R0 (p->usDataLength+4) & MASK_LOWER4BIT);\r
+               pucStream[18] = local_itoa(SHIFT_R12(p->usEndCode) & MASK_LOWER4BIT);\r
+               pucStream[19] = local_itoa(SHIFT_R8 (p->usEndCode) & MASK_LOWER4BIT);\r
+               pucStream[20] = local_itoa(SHIFT_R4 (p->usEndCode) & MASK_LOWER4BIT);\r
+               pucStream[21] = local_itoa(SHIFT_R0 (p->usEndCode) & MASK_LOWER4BIT);\r
+\r
+               for( i=0; i<iLength+4; i++ )\r
+               {\r
+                       pucStream[uiDataAddr[iIndex]+i] = p->pucData[i];\r
+               }\r
+               return SLMP_ERR_OK;\r
+       }\r
+\r
+       /*[ Request : ASCII Mode, Multiple Transmission Type ]*/\r
+       else if( ulFrameType == SLMP_FTYPE_ASCII_REQ_MT )\r
+       {\r
+               iIndex = SLMP_FTYPE_ASCII_REQ_MT_INDEX;\r
+               iLength = (p->usDataLength)-uiHeaderLength[iIndex];\r
+               if ( iLength < 0 )\r
+               {\r
+                       return SLMP_ERR_NG;\r
+               }\r
+               else if ( iLength > 0 )\r
+               {\r
+                       if ( p->pucData == NULL )\r
+                       {\r
+                               return SLMP_ERR_NG;\r
+                       }\r
+               }\r
+\r
+               pucStream[ 0] = SHIFT_R24(SLMP_FTYPE_ASCII_REQ_MT);\r
+               pucStream[ 1] = SHIFT_R16(SLMP_FTYPE_ASCII_REQ_MT);\r
+               pucStream[ 2] = SHIFT_R8 (SLMP_FTYPE_ASCII_REQ_MT);\r
+               pucStream[ 3] = SHIFT_R0 (SLMP_FTYPE_ASCII_REQ_MT);\r
+               pucStream[ 4] = local_itoa(SHIFT_R12(p->usSerialNumber) & MASK_LOWER4BIT);\r
+               pucStream[ 5] = local_itoa(SHIFT_R8 (p->usSerialNumber) & MASK_LOWER4BIT);\r
+               pucStream[ 6] = local_itoa(SHIFT_R4 (p->usSerialNumber) & MASK_LOWER4BIT);\r
+               pucStream[ 7] = local_itoa(SHIFT_R0 (p->usSerialNumber) & MASK_LOWER4BIT);\r
+               pucStream[ 8] = local_itoa(0x00);\r
+               pucStream[ 9] = local_itoa(0x00);\r
+               pucStream[10] = local_itoa(0x00);\r
+               pucStream[11] = local_itoa(0x00);\r
+               pucStream[12] = local_itoa(SHIFT_R4(p->usNetNumber) & MASK_LOWER4BIT);\r
+               pucStream[13] = local_itoa(SHIFT_R0(p->usNetNumber) & MASK_LOWER4BIT);\r
+               pucStream[14] = local_itoa(SHIFT_R4(p->usNodeNumber) & MASK_LOWER4BIT);\r
+               pucStream[15] = local_itoa(SHIFT_R0(p->usNodeNumber) & MASK_LOWER4BIT);\r
+               pucStream[16] = local_itoa(SHIFT_R12(p->usProcNumber) & MASK_LOWER4BIT);\r
+               pucStream[17] = local_itoa(SHIFT_R8 (p->usProcNumber) & MASK_LOWER4BIT);\r
+               pucStream[18] = local_itoa(SHIFT_R4 (p->usProcNumber) & MASK_LOWER4BIT);\r
+               pucStream[19] = local_itoa(SHIFT_R0 (p->usProcNumber) & MASK_LOWER4BIT);\r
+               pucStream[20] = local_itoa(0x00);\r
+               pucStream[21] = local_itoa(0x00);\r
+               pucStream[22] = local_itoa(SHIFT_R12(p->usDataLength) & MASK_LOWER4BIT);\r
+               pucStream[23] = local_itoa(SHIFT_R8 (p->usDataLength) & MASK_LOWER4BIT);\r
+               pucStream[24] = local_itoa(SHIFT_R4 (p->usDataLength) & MASK_LOWER4BIT);\r
+               pucStream[25] = local_itoa(SHIFT_R0 (p->usDataLength) & MASK_LOWER4BIT);\r
+               pucStream[26] = local_itoa(SHIFT_R12(p->usTimer) & MASK_LOWER4BIT);\r
+               pucStream[27] = local_itoa(SHIFT_R8 (p->usTimer) & MASK_LOWER4BIT);\r
+               pucStream[28] = local_itoa(SHIFT_R4 (p->usTimer) & MASK_LOWER4BIT);\r
+               pucStream[29] = local_itoa(SHIFT_R0 (p->usTimer) & MASK_LOWER4BIT);\r
+               pucStream[30] = local_itoa(SHIFT_R12(p->usCommand) & MASK_LOWER4BIT);\r
+               pucStream[31] = local_itoa(SHIFT_R8 (p->usCommand) & MASK_LOWER4BIT);\r
+               pucStream[32] = local_itoa(SHIFT_R4 (p->usCommand) & MASK_LOWER4BIT);\r
+               pucStream[33] = local_itoa(SHIFT_R0 (p->usCommand) & MASK_LOWER4BIT);\r
+               pucStream[34] = local_itoa(SHIFT_R12(p->usSubCommand) & MASK_LOWER4BIT);\r
+               pucStream[35] = local_itoa(SHIFT_R8 (p->usSubCommand) & MASK_LOWER4BIT);\r
+               pucStream[36] = local_itoa(SHIFT_R4 (p->usSubCommand) & MASK_LOWER4BIT);\r
+               pucStream[37] = local_itoa(SHIFT_R0 (p->usSubCommand) & MASK_LOWER4BIT);\r
+\r
+               for( i=0; i<iLength; i++ )\r
+               {\r
+                       pucStream[uiDataAddr[iIndex]+i] = p->pucData[i];\r
+               }\r
+               return SLMP_ERR_OK;\r
+       }\r
+\r
+       /*[ Response : ASCII Mode, Multiple Transmission Type ]*/\r
+       else if( ulFrameType == SLMP_FTYPE_ASCII_RES_MT )\r
+       {\r
+               iIndex = SLMP_FTYPE_ASCII_RES_MT_INDEX;\r
+               iLength = (p->usDataLength)-uiHeaderLength[iIndex]+4;\r
+               if ( iLength < 0 )\r
+               {\r
+                       return SLMP_ERR_NG;\r
+               }\r
+               else if ( iLength > 0 )\r
+               {\r
+                       if ( p->pucData == NULL )\r
+                       {\r
+                               return SLMP_ERR_NG;\r
+                       }\r
+               }\r
+\r
+               pucStream[ 0] = SHIFT_R24(SLMP_FTYPE_ASCII_RES_MT);\r
+               pucStream[ 1] = SHIFT_R16(SLMP_FTYPE_ASCII_RES_MT);\r
+               pucStream[ 2] = SHIFT_R8 (SLMP_FTYPE_ASCII_RES_MT);\r
+               pucStream[ 3] = SHIFT_R0 (SLMP_FTYPE_ASCII_RES_MT);\r
+               pucStream[ 4] = local_itoa(SHIFT_R12(p->usSerialNumber) & MASK_LOWER4BIT);\r
+               pucStream[ 5] = local_itoa(SHIFT_R8 (p->usSerialNumber) & MASK_LOWER4BIT);\r
+               pucStream[ 6] = local_itoa(SHIFT_R4 (p->usSerialNumber) & MASK_LOWER4BIT);\r
+               pucStream[ 7] = local_itoa(SHIFT_R0 (p->usSerialNumber) & MASK_LOWER4BIT);\r
+               pucStream[ 8] = local_itoa(0x00);\r
+               pucStream[ 9] = local_itoa(0x00);\r
+               pucStream[10] = local_itoa(0x00);\r
+               pucStream[11] = local_itoa(0x00);\r
+               pucStream[12] = local_itoa(SHIFT_R4(p->usNetNumber) & MASK_LOWER4BIT);\r
+               pucStream[13] = local_itoa(SHIFT_R0(p->usNetNumber) & MASK_LOWER4BIT);\r
+               pucStream[14] = local_itoa(SHIFT_R4(p->usNodeNumber) & MASK_LOWER4BIT);\r
+               pucStream[15] = local_itoa(SHIFT_R0(p->usNodeNumber) & MASK_LOWER4BIT);\r
+               pucStream[16] = local_itoa(SHIFT_R12(p->usProcNumber) & MASK_LOWER4BIT);\r
+               pucStream[17] = local_itoa(SHIFT_R8 (p->usProcNumber) & MASK_LOWER4BIT);\r
+               pucStream[18] = local_itoa(SHIFT_R4 (p->usProcNumber) & MASK_LOWER4BIT);\r
+               pucStream[19] = local_itoa(SHIFT_R0 (p->usProcNumber) & MASK_LOWER4BIT);\r
+               pucStream[20] = local_itoa(0x00);\r
+               pucStream[21] = local_itoa(0x00);\r
+               pucStream[22] = local_itoa(SHIFT_R12(p->usDataLength+4) & MASK_LOWER4BIT);\r
+               pucStream[23] = local_itoa(SHIFT_R8 (p->usDataLength+4) & MASK_LOWER4BIT);\r
+               pucStream[24] = local_itoa(SHIFT_R4 (p->usDataLength+4) & MASK_LOWER4BIT);\r
+               pucStream[25] = local_itoa(SHIFT_R0 (p->usDataLength+4) & MASK_LOWER4BIT);\r
+               pucStream[26] = local_itoa(SHIFT_R12(p->usEndCode) & MASK_LOWER4BIT);\r
+               pucStream[27] = local_itoa(SHIFT_R8 (p->usEndCode) & MASK_LOWER4BIT);\r
+               pucStream[28] = local_itoa(SHIFT_R4 (p->usEndCode) & MASK_LOWER4BIT);\r
+               pucStream[29] = local_itoa(SHIFT_R0 (p->usEndCode) & MASK_LOWER4BIT);\r
+\r
+               for( i=0; i<iLength+4; i++ )\r
+               {\r
+                       pucStream[uiDataAddr[iIndex]+i] = p->pucData[i];\r
+               }\r
+               return SLMP_ERR_OK;\r
+       }\r
+\r
+       return SLMP_ERR_NG;\r
+}\r
+\r
+/* A Function for getting SLMP_Info from packet stream */\r
+int SLMP_GetSlmpInfo ( SLMP_INFO *p, const uint8_t *pucStream )\r
+{\r
+       int i = 0;\r
+       int iIndex = 0;\r
+       int iLength = 0;\r
+       unsigned int uiTempLength = 0;\r
+       unsigned int uiTemp0 = 0, uiTemp1 = 0, uiTemp2 = 0, uiTemp3 = 0;\r
+       uint16_t        usFrameType = 0;\r
+       uint32_t        ulFrameType = 0;\r
+\r
+       if ( (p == NULL) || (pucStream == NULL) )\r
+       {\r
+               return SLMP_ERR_NG;\r
+       }\r
+\r
+       usFrameType = CONCAT_2BIN(pucStream[0], pucStream[1]);\r
+\r
+       (p->ulFrameType) = usFrameType;\r
+\r
+       /*[ Request : Binary Mode, Single Transmission Type ]*/\r
+       if( usFrameType == SLMP_FTYPE_BIN_REQ_ST )\r
+       {\r
+               iIndex = SLMP_FTYPE_BIN_REQ_ST_INDEX;\r
+               uiTempLength = CONCAT_2BIN(pucStream[ 8], pucStream[ 7]);\r
+\r
+               iLength = uiTempLength - uiHeaderLength[iIndex];\r
+               if ( iLength < 0 )\r
+               {\r
+                       return SLMP_ERR_NG;\r
+               }\r
+               else if ( iLength > 0 )\r
+               {\r
+                       if ( p->pucData == NULL )\r
+                       {\r
+                               return SLMP_ERR_NG;\r
+                       }\r
+               }\r
+\r
+               (p->usNetNumber)        = pucStream[2];\r
+               (p->usNodeNumber)       = pucStream[3];\r
+               (p->usProcNumber)       = CONCAT_2BIN(pucStream[ 5], pucStream[ 4]);\r
+               (p->usDataLength)       = (uint16_t)uiTempLength;\r
+               (p->usTimer)            = CONCAT_2BIN(pucStream[10], pucStream[ 9]);\r
+               (p->usCommand)          = CONCAT_2BIN(pucStream[12], pucStream[11]);\r
+               (p->usSubCommand)       = CONCAT_2BIN(pucStream[14], pucStream[13]);\r
+\r
+               for( i=0; i<iLength; i++ )\r
+               {\r
+                       p->pucData[i] = pucStream[uiDataAddr[iIndex]+i];\r
+               }\r
+\r
+               return SLMP_ERR_OK;\r
+       }\r
+\r
+       /*[ Response : Binary Mode, Single Transmission Type ]*/\r
+       else if( usFrameType == SLMP_FTYPE_BIN_RES_ST )\r
+       {\r
+               iIndex = SLMP_FTYPE_BIN_RES_ST_INDEX;\r
+               uiTempLength = CONCAT_2BIN(pucStream[ 8], pucStream[ 7]);\r
+\r
+               iLength = uiTempLength - uiHeaderLength[iIndex];\r
+               if ( iLength < 0 )\r
+               {\r
+                       return SLMP_ERR_NG;\r
+               }\r
+               else if ( iLength > 0 )\r
+               {\r
+                       if ( p->pucData == NULL )\r
+                       {\r
+                               return SLMP_ERR_NG;\r
+                       }\r
+               }\r
+\r
+               (p->usNetNumber)        = pucStream[2];\r
+               (p->usNodeNumber)       = pucStream[3];\r
+               (p->usProcNumber)       = CONCAT_2BIN(pucStream[ 5], pucStream[ 4]);\r
+               (p->usDataLength)       = (uint16_t)uiTempLength;\r
+               (p->usEndCode)          = CONCAT_2BIN(pucStream[10], pucStream[ 9]);\r
+\r
+               for( i=0; i<iLength; i++ )\r
+               {\r
+                       p->pucData[i] = pucStream[uiDataAddr[iIndex]+i];\r
+               }\r
+\r
+               return SLMP_ERR_OK;\r
+       }\r
+\r
+       /*[ Request : Binary Mode, Multiple Transmission Type ]*/\r
+       else if( usFrameType == SLMP_FTYPE_BIN_REQ_MT )\r
+       {\r
+               iIndex = SLMP_FTYPE_BIN_REQ_MT_INDEX;\r
+               uiTempLength = CONCAT_2BIN(pucStream[12], pucStream[11]);\r
+\r
+               iLength = uiTempLength - uiHeaderLength[iIndex];\r
+               if ( iLength < 0 )\r
+               {\r
+                       return SLMP_ERR_NG;\r
+               }\r
+               else if ( iLength > 0 )\r
+               {\r
+                       if ( p->pucData == NULL )\r
+                       {\r
+                               return SLMP_ERR_NG;\r
+                       }\r
+               }\r
+\r
+               (p->usSerialNumber)     = CONCAT_2BIN(pucStream[3], pucStream[2]);\r
+               (p->usNetNumber)        = pucStream[6];\r
+               (p->usNodeNumber)       = pucStream[7];\r
+               (p->usProcNumber)       = CONCAT_2BIN(pucStream[ 9], pucStream[ 8]);\r
+               (p->usDataLength)       = (uint16_t)uiTempLength;\r
+               (p->usTimer)            = CONCAT_2BIN(pucStream[14], pucStream[13]);\r
+               (p->usCommand)          = CONCAT_2BIN(pucStream[16], pucStream[15]);\r
+               (p->usSubCommand)       = CONCAT_2BIN(pucStream[18], pucStream[17]);\r
+\r
+               for( i=0; i<iLength; i++ )\r
+               {\r
+                       p->pucData[i] = pucStream[uiDataAddr[iIndex]+i];\r
+               }\r
+\r
+               return SLMP_ERR_OK;\r
+       }\r
+\r
+       /*[ Response : Binary Mode, Multiple Transmission Type ]*/\r
+       else if( usFrameType == SLMP_FTYPE_BIN_RES_MT )\r
+       {\r
+               iIndex = SLMP_FTYPE_BIN_RES_MT_INDEX;\r
+               uiTempLength = CONCAT_2BIN(pucStream[12], pucStream[11]);\r
+\r
+               iLength = uiTempLength - uiHeaderLength[iIndex];\r
+               if ( iLength < 0 )\r
+               {\r
+                       return SLMP_ERR_NG;\r
+               }\r
+               else if ( iLength > 0 )\r
+               {\r
+                       if ( p->pucData == NULL )\r
+                       {\r
+                               return SLMP_ERR_NG;\r
+                       }\r
+               }\r
+\r
+               (p->usSerialNumber)     = CONCAT_2BIN(pucStream[3], pucStream[2]);\r
+               (p->usNetNumber)        = pucStream[6];\r
+               (p->usNodeNumber)       = pucStream[7];\r
+               (p->usProcNumber)       = CONCAT_2BIN(pucStream[ 9], pucStream[ 8]);\r
+               (p->usDataLength)       = (uint16_t)uiTempLength;\r
+               (p->usEndCode)          = CONCAT_2BIN(pucStream[14], pucStream[13]);\r
+\r
+               for( i=0; i<iLength; i++ )\r
+               {\r
+                       p->pucData[i] = pucStream[uiDataAddr[iIndex]+i];\r
+               }\r
+\r
+               return SLMP_ERR_OK;\r
+       }\r
+\r
+       ulFrameType = CONCAT_4BIN(pucStream[0], pucStream[1], pucStream[2], pucStream[3]);\r
+\r
+       (p->ulFrameType) = ulFrameType;\r
+\r
+       /*[ Request : ASCII Mode, Single Transmission Type ]*/\r
+       if( ulFrameType == SLMP_FTYPE_ASCII_REQ_ST )\r
+       {\r
+               iIndex = SLMP_FTYPE_ASCII_REQ_ST_INDEX;\r
+               uiTemp0 = local_atoi(pucStream[14]);\r
+               uiTemp1 = local_atoi(pucStream[15]);\r
+               uiTemp2 = local_atoi(pucStream[16]);\r
+               uiTemp3 = local_atoi(pucStream[17]);\r
+               uiTempLength = CONCAT_4ASCII(uiTemp0, uiTemp1, uiTemp2, uiTemp3);\r
+\r
+               iLength = uiTempLength - uiHeaderLength[iIndex];\r
+               if ( iLength < 0 )\r
+               {\r
+                       return SLMP_ERR_NG;\r
+               }\r
+               else if ( iLength > 0 )\r
+               {\r
+                       if ( p->pucData == NULL )\r
+                       {\r
+                               return SLMP_ERR_NG;\r
+                       }\r
+               }\r
+\r
+               uiTemp0 = local_atoi(pucStream[ 4]);\r
+               uiTemp1 = local_atoi(pucStream[ 5]);\r
+               (p->usNetNumber)        = (uint16_t)CONCAT_2ASCII(uiTemp0, uiTemp1);\r
+\r
+               uiTemp0 = local_atoi(pucStream[ 6]);\r
+               uiTemp1 = local_atoi(pucStream[ 7]);\r
+               (p->usNodeNumber)       = (uint16_t)CONCAT_2ASCII(uiTemp0, uiTemp1);\r
+\r
+               uiTemp0 = local_atoi(pucStream[ 8]);\r
+               uiTemp1 = local_atoi(pucStream[ 9]);\r
+               uiTemp2 = local_atoi(pucStream[10]);\r
+               uiTemp3 = local_atoi(pucStream[11]);\r
+               (p->usProcNumber)       = (uint16_t)CONCAT_4ASCII(uiTemp0, uiTemp1, uiTemp2, uiTemp3);\r
+\r
+               (p->usDataLength)       = (uint16_t)uiTempLength;\r
+\r
+               uiTemp0 = local_atoi(pucStream[18]);\r
+               uiTemp1 = local_atoi(pucStream[19]);\r
+               uiTemp2 = local_atoi(pucStream[20]);\r
+               uiTemp3 = local_atoi(pucStream[21]);\r
+               (p->usTimer)            = (uint16_t)CONCAT_4ASCII(uiTemp0, uiTemp1, uiTemp2, uiTemp3);\r
+\r
+               uiTemp0 = local_atoi(pucStream[22]);\r
+               uiTemp1 = local_atoi(pucStream[23]);\r
+               uiTemp2 = local_atoi(pucStream[24]);\r
+               uiTemp3 = local_atoi(pucStream[25]);\r
+               (p->usCommand)          = (uint16_t)CONCAT_4ASCII(uiTemp0, uiTemp1, uiTemp2, uiTemp3);\r
+\r
+               uiTemp0 = local_atoi(pucStream[26]);\r
+               uiTemp1 = local_atoi(pucStream[27]);\r
+               uiTemp2 = local_atoi(pucStream[28]);\r
+               uiTemp3 = local_atoi(pucStream[29]);\r
+               (p->usSubCommand)       = (uint16_t)CONCAT_4ASCII(uiTemp0, uiTemp1, uiTemp2, uiTemp3);\r
+\r
+               for( i=0; i<iLength; i++ )\r
+               {\r
+                       p->pucData[i] = pucStream[uiDataAddr[iIndex]+i];\r
+               }\r
+\r
+               return SLMP_ERR_OK;\r
+       }\r
+\r
+       /*[ Response : ASCII Mode, Single Transmission Type ]*/\r
+       else if( ulFrameType == SLMP_FTYPE_ASCII_RES_ST )\r
+       {\r
+               iIndex = SLMP_FTYPE_ASCII_RES_ST_INDEX;\r
+               uiTemp0 = local_atoi(pucStream[14]);\r
+               uiTemp1 = local_atoi(pucStream[15]);\r
+               uiTemp2 = local_atoi(pucStream[16]);\r
+               uiTemp3 = local_atoi(pucStream[17]);\r
+               uiTempLength = CONCAT_4ASCII(uiTemp0, uiTemp1, uiTemp2, uiTemp3);\r
+\r
+               iLength = uiTempLength - uiHeaderLength[iIndex];\r
+               if ( iLength < 0 )\r
+               {\r
+                       return SLMP_ERR_NG;\r
+               }\r
+               else if ( iLength > 0 )\r
+               {\r
+                       if ( p->pucData == NULL )\r
+                       {\r
+                               return SLMP_ERR_NG;\r
+                       }\r
+               }\r
+\r
+               uiTemp0 = local_atoi(pucStream[ 4]);\r
+               uiTemp1 = local_atoi(pucStream[ 5]);\r
+               (p->usNetNumber)        = (uint16_t)CONCAT_2ASCII(uiTemp0, uiTemp1);\r
+\r
+               uiTemp0 = local_atoi(pucStream[ 6]);\r
+               uiTemp1 = local_atoi(pucStream[ 7]);\r
+               (p->usNodeNumber)       = (uint16_t)CONCAT_2ASCII(uiTemp0, uiTemp1);\r
+\r
+               uiTemp0 = local_atoi(pucStream[ 8]);\r
+               uiTemp1 = local_atoi(pucStream[ 9]);\r
+               uiTemp2 = local_atoi(pucStream[10]);\r
+               uiTemp3 = local_atoi(pucStream[11]);\r
+               (p->usProcNumber)       = (uint16_t)CONCAT_4ASCII(uiTemp0, uiTemp1, uiTemp2, uiTemp3);\r
+\r
+               (p->usDataLength)       = (uint16_t)uiTempLength;\r
+\r
+               uiTemp0 = local_atoi(pucStream[18]);\r
+               uiTemp1 = local_atoi(pucStream[19]);\r
+               uiTemp2 = local_atoi(pucStream[20]);\r
+               uiTemp3 = local_atoi(pucStream[21]);\r
+               (p->usEndCode)          = (uint16_t)CONCAT_4ASCII(uiTemp0, uiTemp1, uiTemp2, uiTemp3);\r
+\r
+               for( i=0; i<iLength; i++ )\r
+               {\r
+                       p->pucData[i] = pucStream[uiDataAddr[iIndex]+i];\r
+               }\r
+\r
+               return SLMP_ERR_OK;\r
+       }\r
+\r
+       /*[ Request : ASCII Mode, Multiple Transmission Type ]*/\r
+       else if( ulFrameType == SLMP_FTYPE_ASCII_REQ_MT )\r
+       {\r
+               iIndex = SLMP_FTYPE_ASCII_REQ_MT_INDEX;\r
+               uiTemp0 = local_atoi(pucStream[22]);\r
+               uiTemp1 = local_atoi(pucStream[23]);\r
+               uiTemp2 = local_atoi(pucStream[24]);\r
+               uiTemp3 = local_atoi(pucStream[25]);\r
+               uiTempLength = CONCAT_4ASCII(uiTemp0, uiTemp1, uiTemp2, uiTemp3);\r
+\r
+               iLength = uiTempLength - uiHeaderLength[iIndex];\r
+               if ( iLength < 0 )\r
+               {\r
+                       return SLMP_ERR_NG;\r
+               }\r
+               else if ( iLength > 0 )\r
+               {\r
+                       if ( p->pucData == NULL )\r
+                       {\r
+                               return SLMP_ERR_NG;\r
+                       }\r
+               }\r
+\r
+               uiTemp0 = local_atoi(pucStream[ 4]);\r
+               uiTemp1 = local_atoi(pucStream[ 5]);\r
+               uiTemp2 = local_atoi(pucStream[ 6]);\r
+               uiTemp3 = local_atoi(pucStream[ 7]);\r
+               (p->usSerialNumber)     = (uint16_t)CONCAT_4ASCII(uiTemp0, uiTemp1, uiTemp2, uiTemp3);\r
+\r
+               uiTemp0 = local_atoi(pucStream[12]);\r
+               uiTemp1 = local_atoi(pucStream[13]);\r
+               (p->usNetNumber)        = (uint16_t)CONCAT_2ASCII(uiTemp0, uiTemp1);\r
+\r
+               uiTemp0 = local_atoi(pucStream[14]);\r
+               uiTemp1 = local_atoi(pucStream[15]);\r
+               (p->usNodeNumber)       = (uint16_t)CONCAT_2ASCII(uiTemp0, uiTemp1);\r
+\r
+               uiTemp0 = local_atoi(pucStream[16]);\r
+               uiTemp1 = local_atoi(pucStream[17]);\r
+               uiTemp2 = local_atoi(pucStream[18]);\r
+               uiTemp3 = local_atoi(pucStream[19]);\r
+               (p->usProcNumber)       = (uint16_t)CONCAT_4ASCII(uiTemp0, uiTemp1, uiTemp2, uiTemp3);\r
+\r
+               (p->usDataLength)       = (uint16_t)uiTempLength;\r
+\r
+               uiTemp0 = local_atoi(pucStream[26]);\r
+               uiTemp1 = local_atoi(pucStream[27]);\r
+               uiTemp2 = local_atoi(pucStream[28]);\r
+               uiTemp3 = local_atoi(pucStream[29]);\r
+               (p->usTimer)            = (uint16_t)CONCAT_4ASCII(uiTemp0, uiTemp1, uiTemp2, uiTemp3);\r
+\r
+               uiTemp0 = local_atoi(pucStream[30]);\r
+               uiTemp1 = local_atoi(pucStream[31]);\r
+               uiTemp2 = local_atoi(pucStream[32]);\r
+               uiTemp3 = local_atoi(pucStream[33]);\r
+               (p->usCommand)          = (uint16_t)CONCAT_4ASCII(uiTemp0, uiTemp1, uiTemp2, uiTemp3);\r
+\r
+               uiTemp0 = local_atoi(pucStream[34]);\r
+               uiTemp1 = local_atoi(pucStream[35]);\r
+               uiTemp2 = local_atoi(pucStream[36]);\r
+               uiTemp3 = local_atoi(pucStream[37]);\r
+               (p->usSubCommand)       = (uint16_t)CONCAT_4ASCII(uiTemp0, uiTemp1, uiTemp2, uiTemp3);\r
+\r
+               for( i=0; i<iLength; i++ )\r
+               {\r
+                       p->pucData[i] = pucStream[uiDataAddr[iIndex]+i];\r
+               }\r
+\r
+               return SLMP_ERR_OK;\r
+       }\r
+\r
+       /*[ Response : ASCII Mode, Multiple Transmission Type ]*/\r
+       else if( ulFrameType == SLMP_FTYPE_ASCII_RES_MT )\r
+       {\r
+               iIndex = SLMP_FTYPE_ASCII_RES_MT_INDEX;\r
+               uiTemp0 = local_atoi(pucStream[22]);\r
+               uiTemp1 = local_atoi(pucStream[23]);\r
+               uiTemp2 = local_atoi(pucStream[24]);\r
+               uiTemp3 = local_atoi(pucStream[25]);\r
+               uiTempLength = CONCAT_4ASCII(uiTemp0, uiTemp1, uiTemp2, uiTemp3);\r
+               \r
+               iLength = uiTempLength - uiHeaderLength[iIndex];\r
+               if ( iLength < 0 )\r
+               {\r
+                       return SLMP_ERR_NG;\r
+               }\r
+               else if ( iLength > 0 )\r
+               {\r
+                       if ( p->pucData == NULL )\r
+                       {\r
+                               return SLMP_ERR_NG;\r
+                       }\r
+               }\r
+\r
+               uiTemp0 = local_atoi(pucStream[ 4]);\r
+               uiTemp1 = local_atoi(pucStream[ 5]);\r
+               uiTemp2 = local_atoi(pucStream[ 6]);\r
+               uiTemp3 = local_atoi(pucStream[ 7]);\r
+               (p->usSerialNumber)     = (uint16_t)CONCAT_4ASCII(uiTemp0, uiTemp1, uiTemp2, uiTemp3);\r
+\r
+               uiTemp0 = local_atoi(pucStream[12]);\r
+               uiTemp1 = local_atoi(pucStream[13]);\r
+               (p->usNetNumber)        = (uint16_t)CONCAT_2ASCII(uiTemp0, uiTemp1);\r
+\r
+               uiTemp0 = local_atoi(pucStream[14]);\r
+               uiTemp1 = local_atoi(pucStream[15]);\r
+               (p->usNodeNumber)       = (uint16_t)CONCAT_2ASCII(uiTemp0, uiTemp1);\r
+\r
+               uiTemp0 = local_atoi(pucStream[16]);\r
+               uiTemp1 = local_atoi(pucStream[17]);\r
+               uiTemp2 = local_atoi(pucStream[18]);\r
+               uiTemp3 = local_atoi(pucStream[19]);\r
+               (p->usProcNumber)       = (uint16_t)CONCAT_4ASCII(uiTemp0, uiTemp1, uiTemp2, uiTemp3);\r
+\r
+               (p->usDataLength)       = (uint16_t)uiTempLength;\r
+\r
+               uiTemp0 = local_atoi(pucStream[26]);\r
+               uiTemp1 = local_atoi(pucStream[27]);\r
+               uiTemp2 = local_atoi(pucStream[28]);\r
+               uiTemp3 = local_atoi(pucStream[29]);\r
+               (p->usEndCode)          = (uint16_t)CONCAT_4ASCII(uiTemp0, uiTemp1, uiTemp2, uiTemp3);\r
+\r
+               for( i=0; i<iLength; i++ )\r
+               {\r
+                       p->pucData[i] = pucStream[uiDataAddr[iIndex]+i];\r
+               }\r
+\r
+               return SLMP_ERR_OK;\r
+       }\r
+       return SLMP_ERR_NG;\r
+}\r
+\r
+/*[ translating from integer to ascii ]*/\r
+uint8_t local_itoa( uint8_t ucInt){\r
+       unsigned char ucTable[] = {     '0','1','2','3','4','5','6','7','8','9',\r
+                                               'A','B','C','D','E','F'};\r
+       return ucTable[ucInt];\r
+}\r
+\r
+/*[ translating from ascii to integer ]*/\r
+uint8_t local_atoi( uint8_t ucInt){\r
+       switch(ucInt)\r
+       {\r
+               case 'A' :\r
+                       return 0x0A;\r
+               case 'B' :\r
+                       return 0x0B;\r
+               case 'C' :\r
+                       return 0x0C;\r
+               case 'D' :\r
+                       return 0x0D;\r
+               case 'E' :\r
+                       return 0x0E;\r
+               case 'F' :\r
+                       return 0x0F;\r
+               default :\r
+                       return (ucInt-'0');\r
+       }\r
+}\r
+\r
+/* A Function for making error response data from the SLMP_Info structure */\r
+int SLMP_MakeErrorData ( const SLMP_INFO *p, uint8_t *pucStream, uint16_t *pusDataSize )\r
+{\r
+       if ( (p == NULL) || (pucStream == NULL) )\r
+       {\r
+               return SLMP_ERR_NG;\r
+       }\r
+\r
+       /*[ Binary Mode ]*/\r
+       if ( SLMP_DATA_CODE(p->ulFrameType) == SLMP_DATA_CODE_BIN )\r
+       {\r
+               pucStream[ 0] = SHIFT_R0(p->usNetNumber);\r
+               pucStream[ 1] = SHIFT_R0(p->usNodeNumber);\r
+               pucStream[ 2] = SHIFT_R0(p->usProcNumber);\r
+               pucStream[ 3] = SHIFT_R8(p->usProcNumber);\r
+               pucStream[ 4] = 0x00;\r
+               pucStream[ 5] = SHIFT_R0(p->usCommand);\r
+               pucStream[ 6] = SHIFT_R8(p->usCommand);\r
+               pucStream[ 7] = SHIFT_R0(p->usSubCommand);\r
+               pucStream[ 8] = SHIFT_R8(p->usSubCommand);\r
+               (*pusDataSize) = 0x0009;\r
+       }\r
+\r
+       /*[ ASCII Mode ]*/\r
+       else if ( SLMP_DATA_CODE(p->ulFrameType) == SLMP_DATA_CODE_ASCII )\r
+       {\r
+               pucStream[ 0] = local_itoa(SHIFT_R4(p->usNetNumber) & MASK_LOWER4BIT);\r
+               pucStream[ 1] = local_itoa(SHIFT_R0(p->usNetNumber) & MASK_LOWER4BIT);\r
+               pucStream[ 2] = local_itoa(SHIFT_R4(p->usNodeNumber) & MASK_LOWER4BIT);\r
+               pucStream[ 3] = local_itoa(SHIFT_R0(p->usNodeNumber) & MASK_LOWER4BIT);\r
+               pucStream[ 4] = local_itoa(SHIFT_R12(p->usProcNumber) & MASK_LOWER4BIT);\r
+               pucStream[ 5] = local_itoa(SHIFT_R8 (p->usProcNumber) & MASK_LOWER4BIT);\r
+               pucStream[ 6] = local_itoa(SHIFT_R4 (p->usProcNumber) & MASK_LOWER4BIT);\r
+               pucStream[ 7] = local_itoa(SHIFT_R0 (p->usProcNumber) & MASK_LOWER4BIT);\r
+               pucStream[ 8] = local_itoa(0x00);\r
+               pucStream[ 9] = local_itoa(0x00);\r
+               pucStream[10] = local_itoa(SHIFT_R12(p->usCommand) & MASK_LOWER4BIT);\r
+               pucStream[11] = local_itoa(SHIFT_R8 (p->usCommand) & MASK_LOWER4BIT);\r
+               pucStream[12] = local_itoa(SHIFT_R4 (p->usCommand) & MASK_LOWER4BIT);\r
+               pucStream[13] = local_itoa(SHIFT_R0 (p->usCommand) & MASK_LOWER4BIT);\r
+               pucStream[14] = local_itoa(SHIFT_R12(p->usSubCommand) & MASK_LOWER4BIT);\r
+               pucStream[15] = local_itoa(SHIFT_R8 (p->usSubCommand) & MASK_LOWER4BIT);\r
+               pucStream[16] = local_itoa(SHIFT_R4 (p->usSubCommand) & MASK_LOWER4BIT);\r
+               pucStream[17] = local_itoa(SHIFT_R0 (p->usSubCommand) & MASK_LOWER4BIT);\r
+               (*pusDataSize) = 0x0012;\r
+       }\r
+\r
+       /*[ Data Code Error ]*/\r
+       else\r
+       {\r
+               return SLMP_ERR_NG;\r
+       }\r
+\r
+       return SLMP_ERR_OK;\r
+}\r
diff --git a/CCIEF-BASIC_Slave/manual/CC-Link IE Field NetworkBasic Sample Code User's Manual(Slave Station)v1.02.4.pdf b/CCIEF-BASIC_Slave/manual/CC-Link IE Field NetworkBasic Sample Code User's Manual(Slave Station)v1.02.4.pdf
new file mode 100644 (file)
index 0000000..756117d
Binary files /dev/null and b/CCIEF-BASIC_Slave/manual/CC-Link IE Field NetworkBasic Sample Code User's Manual(Slave Station)v1.02.4.pdf differ
diff --git a/CCIEF-BASIC_Slave/readme.txt b/CCIEF-BASIC_Slave/readme.txt
new file mode 100644 (file)
index 0000000..ccd70f6
--- /dev/null
@@ -0,0 +1,16 @@
+---------------------------------------------------------------------\r
+CC-Link IE Field Network Basic Slave Application sample code\r
+\r
+readme\r
+\r
+---------------------------------------------------------------------\r
+\r
+Contents.\r
+\r
+root  -+-  library  -+-  include  ... SLMP library code header file\r
+       |             +-  src      ... SLMP library code file\r
+       |\r
+       +-  sample   -+-  include  ... user sample program header file\r
+       |             +-  src      ... user sample program code file\r
+       |\r
+       +-  manual   ---  User manual
\ No newline at end of file
diff --git a/CCIEF-BASIC_Slave/sample/include/CCIEF_BASIC_SLAVE.h b/CCIEF-BASIC_Slave/sample/include/CCIEF_BASIC_SLAVE.h
new file mode 100644 (file)
index 0000000..0e43ab6
--- /dev/null
@@ -0,0 +1,135 @@
+/*\r
+ * Copyright (C) 2017 Texas Instruments Incorporated - http://www.ti.com/\r
+ * Copyright (C) 2016 CC-Link Partner Association -http://am.cc-link.org/\r
+ * \r
+ * \r
+ *  Redistribution and use in source and binary forms, with or without \r
+ *  modification, are permitted provided that the following conditions \r
+ *  are met:\r
+ *\r
+ *    Redistributions of source code must retain the above copyright \r
+ *    notice, this list of conditions and the following disclaimer.\r
+ *\r
+ *    Redistributions in binary form must reproduce the above copyright\r
+ *    notice, this list of conditions and the following disclaimer in the \r
+ *    documentation and/or other materials provided with the   \r
+ *    distribution.\r
+ *\r
+ *    Neither the name of Texas Instruments Incorporated nor the names of\r
+ *    its contributors may be used to endorse or promote products derived\r
+ *    from this software without specific prior written permission.\r
+ *\r
+ *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \r
+ *  "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT \r
+ *  LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\r
+ *  A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT \r
+ *  OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, \r
+ *  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT \r
+ *  LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
+ *  DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\r
+ *  THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT \r
+ *  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE \r
+ *  OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
+ *\r
+*/\r
+\r
+#ifndef                __CCIEF_BASIC_SLAVE_H__\r
+#define                __CCIEF_BASIC_SLAVE_H__\r
+\r
+#include <stdint.h>\r
+\r
+/*[ Definition for sample code ]*/\r
+#define        CCIEF_BASIC_SLAVE_ERR_OK                                                        0\r
+#define        CCIEF_BASIC_SLAVE_ERR_NG                                                        (-1)\r
+#define CCIEF_BASIC_SLAVE_ERR_DEVICE_RANGE                                     (-100)\r
+\r
+/*[ Definition for CCIEF-BASIC environment ]*/\r
+#define        CCIEF_BASIC_PROTCOL_VERSION                                                     1                       /* Protocol Version */\r
+#define        CCIEF_BASIC_PORT_NUMBER                                                         61450           /* Port number */\r
+#define        CCIEF_BASIC_MAX_FRAME_SIZE                                                      6000            /* Size of MAX Packet [byte] */\r
+#define        CCIEF_BASIC_RX_RY_SIZE                                                          8                       /* Size of RX/RY [byte] */\r
+#define        CCIEF_BASIC_RWW_RWR_SIZE                                                        64                      /* Size of RWw/RWr [byte] */\r
+#define        CCIEF_BASIC_MAX_NUMBER_OF_OCCUPIED_STATIONS_GROUP       16                      /* Number of MAX occupied stations for group */\r
+#define        CCIEF_BASIC_SLMP_COMMAND_CYCLIC_DATA                            0x0E70          /* Cyclic Data(0E70h) of SLMP Command */\r
+#define        CCIEF_BASIC_CYCLIC_TRANSMISSION_TIMEOUT                         500                     /* Default cyclic transmission timeout [ms] */\r
+#define        CCIEF_BASIC_CYCLIC_TRANSMISSION_TIMEOUT_COUNT           3                       /* Default count of cyclic transmission timeout */\r
+#define        CCIEF_BASIC_UNIT_INFO_APPLICATION_STOP                          0x0000          /* Stopping application for setting the unit info */\r
+#define        CCIEF_BASIC_UNIT_INFO_APPLICATION_RUNNING                       0x0001          /* Running application for setting the unit info */\r
+\r
+/*[ Definition for CCIEF-BASIC End Code ]*/\r
+#define        CCIEF_BASIC_END_OK                                                                      0x0000          /* Processing success. */\r
+#define        CCIEF_BASIC_END_DUPLICATE_MASTER                                        0xCFE0          /* Duplicate of the master. */\r
+#define        CCIEF_BASIC_END_NUMBER_OF_OCCUPIED_STATIONS                     0xCFE1          /* Invalid number of occupied stations. */\r
+#define        CCIEF_BASIC_END_SLAVE                                                           0xCFF0          /* Error of the slave. */\r
+#define CCIEF_BASIC_END_DISCONNECTED_REQUEST                           0xCFFF          /* Disconnected request to Master. */\r
+\r
+/*[ Definition for CCIEF-BASIC sample code ]*/\r
+#define        CCIEF_BASIC_BIT_ON                                                                      1                       /* Bit ON */\r
+#define        CCIEF_BASIC_BIT_OFF                                                                     0                       /* Bit OFF */\r
+#define        CCIEF_BASIC_CYCLIC_DATA_VALID                                           1                       /* Valid of the cyclic data */\r
+#define        CCIEF_BASIC_CYCLIC_DATA_INVALID                                         0                       /* Invalid of the cyclic data */\r
+#define        CCIEF_BASIC_SLAVE_ID_OCCUPIED_STATIONS                          0xFFFFFFFF      /* Slave Id of occupied stations. */\r
+#define        CCIEF_BASIC_DEVICE_TYPE_RX                                                      1                       /* Type of device for RX. */\r
+#define        CCIEF_BASIC_DEVICE_TYPE_RY                                                      2                       /* Type of device for RY. */\r
+#define        CCIEF_BASIC_DEVICE_TYPE_RWW                                                     3                       /* Type of device for RWw. */\r
+#define        CCIEF_BASIC_DEVICE_TYPE_RWR                                                     4                       /* Type of device for RWr. */\r
+\r
+/*[ Structure for sample code ]*/\r
+\r
+#ifdef _WIN32\r
+typedef struct \r
+{\r
+       uint16_t        usVenderCode;                           /* Vender code */\r
+       uint32_t        ulModelCode;                            /* Model code */\r
+       uint16_t        usMachineVersion;                       /* Machine version */\r
+       uint32_t        ulIpAddress;                            /* Slave ip address */\r
+       int                     iOccupiedStationNumber;         /* Number of occupied stations */\r
+} CCIEF_BASIC_SLAVE_INFO;\r
+#elif __linux__\r
+typedef struct \r
+{\r
+       uint16_t        usVenderCode;                           /* Vender code */\r
+       uint32_t        ulModelCode;                            /* Model code */\r
+       uint16_t        usMachineVersion;                       /* Machine version */\r
+       uint32_t        ulIpAddress;                            /* Slave ip address */\r
+       uint32_t        ulSubnetMask;                           /* Slave subnet mask */\r
+       int                     iOccupiedStationNumber;         /* Number of occupied stations */\r
+} CCIEF_BASIC_SLAVE_INFO;\r
+#endif\r
+\r
+typedef struct \r
+{\r
+       uint16_t        usUnitInfo;                     /* Information of the unit */\r
+       uint16_t        usReserve;                      /* Reserve */\r
+       uint8_t         aucTimeData[8];         /* Time of the master */\r
+} CCIEF_BASIC_MASTER_NOTIFY_INFO;\r
+\r
+typedef struct\r
+{\r
+       uint32_t                                                ulId;                                                   /* Id of the master */\r
+       uint8_t                                                 ucGroupNumber;                                  /* Group number */\r
+       CCIEF_BASIC_MASTER_NOTIFY_INFO  NotifyInfo;                                             /* Notify information of the master */\r
+} CCIEF_BASIC_SLAVE_MASTER_INFO;\r
+\r
+/*[ Definition of callback function ]*/\r
+typedef void(*CCIEF_BASIC_SLAVE_CALLBACK_RECV_CYCLIC_DATA)( int iCyclicState, int iOccupiedStationNumber );\r
+typedef void(*CCIEF_BASIC_SLAVE_CALLBACK_CYCLIC_DISCONNECTION)( void );\r
+\r
+/* Definition of function of sample code */\r
+extern int ccief_basic_slave_initialize( CCIEF_BASIC_SLAVE_INFO *pInitialInfo, \r
+                                                                          CCIEF_BASIC_SLAVE_CALLBACK_RECV_CYCLIC_DATA pRecvCyclicDataFunc,\r
+                                                                          CCIEF_BASIC_SLAVE_CALLBACK_CYCLIC_DISCONNECTION pCyclicDisconnectionFunc );\r
+extern void ccief_basic_slave_terminate( void );\r
+extern int ccief_basic_slave_main( void );\r
+extern int ccief_basic_slave_set_rx( int iNumber, int iValue );\r
+extern int ccief_basic_slave_get_ry( int iNumber, int *piValue );\r
+extern int ccief_basic_slave_get_rww( int iNumber, uint16_t *pusValue );\r
+extern int ccief_basic_slave_set_rwr( int iNumber, uint16_t usValue );\r
+extern uint16_t *ccief_basic_slave_get_pointer( int iDeviceType );\r
+extern void ccief_basic_slave_set_unit_info( uint16_t usUnitInfo );\r
+extern void ccief_basic_slave_set_err_code( uint16_t usErrCode );\r
+extern void ccief_basic_slave_set_unit_data( uint32_t ulUnitData );\r
+extern void ccief_basic_slave_get_master_info( CCIEF_BASIC_SLAVE_MASTER_INFO *pInfo );\r
+\r
+#endif\r
+/*EOF*/
\ No newline at end of file
diff --git a/CCIEF-BASIC_Slave/sample/include/SLMP_SERVER.h b/CCIEF-BASIC_Slave/sample/include/SLMP_SERVER.h
new file mode 100644 (file)
index 0000000..b638ea9
--- /dev/null
@@ -0,0 +1,150 @@
+/*\r
+ * Copyright (C) 2017 Texas Instruments Incorporated - http://www.ti.com/\r
+ * Copyright (C) 2016 CC-Link Partner Association -http://am.cc-link.org/\r
+ * \r
+ * \r
+ *  Redistribution and use in source and binary forms, with or without \r
+ *  modification, are permitted provided that the following conditions \r
+ *  are met:\r
+ *\r
+ *    Redistributions of source code must retain the above copyright \r
+ *    notice, this list of conditions and the following disclaimer.\r
+ *\r
+ *    Redistributions in binary form must reproduce the above copyright\r
+ *    notice, this list of conditions and the following disclaimer in the \r
+ *    documentation and/or other materials provided with the   \r
+ *    distribution.\r
+ *\r
+ *    Neither the name of Texas Instruments Incorporated nor the names of\r
+ *    its contributors may be used to endorse or promote products derived\r
+ *    from this software without specific prior written permission.\r
+ *\r
+ *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \r
+ *  "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT \r
+ *  LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\r
+ *  A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT \r
+ *  OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, \r
+ *  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT \r
+ *  LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
+ *  DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\r
+ *  THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT \r
+ *  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE \r
+ *  OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
+ *\r
+*/\r
+\r
+#ifndef                __SLMP_SERVER_H__\r
+#define                __SLMP_SERVER_H__\r
+\r
+#include "SLMP.h"\r
+\r
+#include <stdint.h>\r
+#ifdef _WIN32\r
+#include <winsock2.h>\r
+#elif __linux__\r
+#include <sys/socket.h>\r
+#endif\r
+\r
+/*[ Definition of SLMP Server environment ]*/\r
+#define        SLMP_SERVER_MAX_FRAME_SIZE                                      4096\r
+#define        SLMP_SERVER_TIMEOUT                                                     30000\r
+#define        SLMP_SERVER_SET_PARAMETER_TIMEOUT                       10000\r
+#define        SLMP_SERVER_MAX_BROADCAST_SEND_WAIT_TIME        1500\r
+#define SLMP_SERVER_PORT_NUMBER                                                61451           /* Port number for NodeConnect */\r
+#define SLMP_SERVER_PORT_NUMBER_PARAMSET                       45237           /* Port number for Parameter set */\r
+\r
+/*[ Definition for SLMP Server Error Code ]*/\r
+#define        SLMP_SERVER_ERR_OK                                                              0\r
+#define        SLMP_SERVER_ERR_NG                                                              (-1)\r
+#define SLMP_SERVER_ERR_UNSUPPORT_SERVICE                              (-2)\r
+\r
+/*[ Structure of Service Function ]*/\r
+typedef struct \r
+{\r
+       uint16_t        usCommand;                                                              /* Command */\r
+#ifdef _WIN32\r
+       int                     (*pFunc)( SOCKET sock, const SLMP_INFO *source, uint32_t ulRecvAddr,\r
+                                                 uint16_t usRecvPortNumber );  /* Function */\r
+#elif __linux__\r
+       int     (*pFunc)(int sock, const SLMP_INFO *source, uint32_t ulRecvAddr,uint16_t usRecvPortNumber);     /* Function */\r
+#endif\r
+} SLMP_SERVICE;\r
+\r
+/*[ Structure of the SLMP Server Information ]*/\r
+typedef struct \r
+{\r
+       uint16_t                usVenderCode;                           /* Vender code */\r
+       uint32_t                ulModelCode;                            /* Model code */\r
+       uint16_t                usMachineVersion;                       /* Machine version */\r
+       uint8_t                 aucMacAddress[6];                       /* Mac Address */\r
+       uint32_t                ulIpAddress;                            /* Server ip address */\r
+       uint32_t                ulSubnetMask;                           /* Server subnet mask */\r
+       uint32_t                ulDefaultGatewayIPAddress;      /* Server default gateway ip address */\r
+       uint16_t                usPortNumber;                           /* Server port number */\r
+       uint8_t                 acHostname[64];                         /* Hostname */\r
+       uint16_t                usStatus;                                       /* Status */\r
+       uint8_t                 acTypeName[16];                         /* Type name */\r
+       uint16_t                usTypeNameCode;                         /* Type name code */\r
+       uint16_t                *pusMemory;                                     /* Pointer of the user memory */\r
+       unsigned int    uiMemorySize;                           /* Size of the user memory */\r
+} SLMP_SERVER_INFO;\r
+\r
+/*[ Structure of a Parameter ID ]*/\r
+typedef struct {\r
+       uint16_t                usSize;                 /* Parameter Size */\r
+       uint8_t                 aucData[512];   /* Parameter Data */\r
+} SLMP_PARAMETER_ID;\r
+\r
+/*[ Definition of callback function ]*/\r
+typedef void(*SLMP_SERVER_CALLBACK_IPADDRESS_SET_BASIC)( uint32_t ulIpAddress, uint32_t ulSubnetMask );\r
+typedef int(*SLMP_SERVER_CALLBACK_PARAMETER_GET)( uint16_t usId, uint16_t *pusSize, uint8_t **ppucData );\r
+typedef int(*SLMP_SERVER_CALLBACK_PARAMETER_SET)( uint16_t usId, uint16_t usSize, uint8_t *pucData );\r
+typedef int(*SLMP_SERVER_CALLBACK_PARAMETER_SET_END)( void );\r
+typedef int(*SLMP_SERVER_CALLBACK_REMOTE_RESET)( void );\r
+\r
+/*[ Definition of function of sample program ]*/\r
+extern int slmp_server_initialize( SLMP_SERVER_INFO *pServerInfo, SLMP_SERVER_CALLBACK_IPADDRESS_SET_BASIC pIpAddresSetFunc,\r
+                                                                  SLMP_SERVER_CALLBACK_PARAMETER_GET pParameterGetFunc, SLMP_SERVER_CALLBACK_PARAMETER_SET pParameterSetFunc,\r
+                                                                  SLMP_SERVER_CALLBACK_PARAMETER_SET_END pParameterSetEndFunc, SLMP_SERVER_CALLBACK_REMOTE_RESET pRemoteResetFunc );\r
+extern void slmp_server_terminate( void );\r
+extern int slmp_server_main( void );\r
+extern int slmp_server_user_port( void );\r
+extern int slmp_server_basic_port( void );\r
+extern int slmp_server_paramset_port( void );\r
+extern void slmp_server_set_status( uint16_t usStatus );\r
+#ifdef _WIN32\r
+extern int slmp_server_service ( SOCKET sock, const SLMP_INFO *source, uint32_t ulRecvAddr, uint16_t usRecvPortNumber,\r
+                                                                SLMP_SERVICE *pServiceTable, int iServiceTableNumber );\r
+extern int slmp_server_memory_read( SOCKET sock, const SLMP_INFO *source, uint32_t ulRecvAddr, uint16_t usRecvPortNumber );\r
+extern int slmp_server_memory_write( SOCKET sock, const SLMP_INFO *source, uint32_t ulRecvAddr, uint16_t usRecvPortNumber );\r
+extern int slmp_server_node_search_basic( SOCKET sock, const SLMP_INFO *source, uint32_t ulRecvAddr, uint16_t usRecvPortNumber );\r
+extern int slmp_server_ip_address_set_basic( SOCKET sock, const SLMP_INFO *source, uint32_t ulRecvAddr, uint16_t usRecvPortNumber );\r
+extern int slmp_server_device_info_compare( SOCKET sock, const SLMP_INFO *source, uint32_t ulRecvAddr, uint16_t usRecvPortNumber );\r
+extern int slmp_server_parameter_get( SOCKET sock, const SLMP_INFO *source, uint32_t ulRecvAddr, uint16_t usRecvPortNumber );\r
+extern int slmp_server_parameter_set( SOCKET sock, const SLMP_INFO *source, uint32_t ulRecvAddr, uint16_t usRecvPortNumber );\r
+extern int slmp_server_parameter_set_start( SOCKET sock, const SLMP_INFO *source, uint32_t ulRecvAddr, uint16_t usRecvPortNumber );\r
+extern int slmp_server_parameter_set_end( SOCKET sock, const SLMP_INFO *source, uint32_t ulRecvAddr, uint16_t usRecvPortNumber );\r
+extern int slmp_server_parameter_set_cancel( SOCKET sock, const SLMP_INFO *source, uint32_t ulRecvAddr, uint16_t usRecvPortNumber );\r
+extern int slmp_server_communication_setting_get( SOCKET sock, const SLMP_INFO *source, uint32_t ulRecvAddr, uint16_t usRecvPortNumber );\r
+extern int slmp_server_read_type_name( SOCKET sock, const SLMP_INFO *source, uint32_t ulRecvAddr, uint16_t usRecvPortNumber );\r
+extern int slmp_server_remote_reset( SOCKET sock, const SLMP_INFO *source, uint32_t ulRecvAddr, uint16_t usRecvPortNumber );\r
+#elif __linux__\r
+extern int slmp_server_service ( int sock, const SLMP_INFO *source, uint32_t ulRecvAddr, uint16_t usRecvPortNumber,\r
+                                                                SLMP_SERVICE *pServiceTable, int iServiceTableNumber );\r
+extern int slmp_server_memory_read( int sock, const SLMP_INFO *source, uint32_t ulRecvAddr, uint16_t usRecvPortNumber );\r
+extern int slmp_server_memory_write( int sock, const SLMP_INFO *source, uint32_t ulRecvAddr, uint16_t usRecvPortNumber );\r
+extern int slmp_server_node_search_basic( int sock, const SLMP_INFO *source, uint32_t ulRecvAddr, uint16_t usRecvPortNumber );\r
+extern int slmp_server_ip_address_set_basic( int sock, const SLMP_INFO *source, uint32_t ulRecvAddr, uint16_t usRecvPortNumber );\r
+extern int slmp_server_device_info_compare( int sock, const SLMP_INFO *source, uint32_t ulRecvAddr, uint16_t usRecvPortNumber );\r
+extern int slmp_server_parameter_get( int sock, const SLMP_INFO *source, uint32_t ulRecvAddr, uint16_t usRecvPortNumber );\r
+extern int slmp_server_parameter_set( int sock, const SLMP_INFO *source, uint32_t ulRecvAddr, uint16_t usRecvPortNumber );\r
+extern int slmp_server_parameter_set_start( int sock, const SLMP_INFO *source, uint32_t ulRecvAddr, uint16_t usRecvPortNumber );\r
+extern int slmp_server_parameter_set_end( int sock, const SLMP_INFO *source, uint32_t ulRecvAddr, uint16_t usRecvPortNumber );\r
+extern int slmp_server_parameter_set_cancel( int sock, const SLMP_INFO *source, uint32_t ulRecvAddr, uint16_t usRecvPortNumber );\r
+extern int slmp_server_communication_setting_get( int sock, const SLMP_INFO *source, uint32_t ulRecvAddr, uint16_t usRecvPortNumber );\r
+extern int slmp_server_read_type_name( int sock, const SLMP_INFO *source, uint32_t ulRecvAddr, uint16_t usRecvPortNumber );\r
+extern int slmp_server_remote_reset( int sock, const SLMP_INFO *source, uint32_t ulRecvAddr, uint16_t usRecvPortNumber );\r
+#endif\r
+\r
+#endif\r
+/*EOF*/\r
diff --git a/CCIEF-BASIC_Slave/sample/include/SOCKET.h b/CCIEF-BASIC_Slave/sample/include/SOCKET.h
new file mode 100644 (file)
index 0000000..6966ebb
--- /dev/null
@@ -0,0 +1,67 @@
+/*\r
+ * Copyright (C) 2017 Texas Instruments Incorporated - http://www.ti.com/\r
+ * Copyright (C) 2016 CC-Link Partner Association -http://am.cc-link.org/\r
+ * \r
+ * \r
+ *  Redistribution and use in source and binary forms, with or without \r
+ *  modification, are permitted provided that the following conditions \r
+ *  are met:\r
+ *\r
+ *    Redistributions of source code must retain the above copyright \r
+ *    notice, this list of conditions and the following disclaimer.\r
+ *\r
+ *    Redistributions in binary form must reproduce the above copyright\r
+ *    notice, this list of conditions and the following disclaimer in the \r
+ *    documentation and/or other materials provided with the   \r
+ *    distribution.\r
+ *\r
+ *    Neither the name of Texas Instruments Incorporated nor the names of\r
+ *    its contributors may be used to endorse or promote products derived\r
+ *    from this software without specific prior written permission.\r
+ *\r
+ *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \r
+ *  "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT \r
+ *  LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\r
+ *  A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT \r
+ *  OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, \r
+ *  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT \r
+ *  LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
+ *  DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\r
+ *  THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT \r
+ *  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE \r
+ *  OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
+ *\r
+*/\r
+\r
+#ifndef                __SOCKET_H__\r
+#define                __SOCKET_H__\r
+\r
+#include <stdint.h>\r
+#ifdef _WIN32\r
+#include <winsock2.h>\r
+#elif __linux__\r
+#include <sys/socket.h>\r
+#endif\r
+\r
+/*[ Definition for sample code ]*/\r
+#define        SOCKET_ERR_OK                                                   0\r
+#define        SOCKET_ERR_SOCKET                                               (-100)\r
+#define        SOCKET_ERR_RECV                                                 (-103)\r
+#define        SOCKET_ERR_SEND                                                 (-104)\r
+#define        SOCKET_ERR_NO_RECEIVABLE                                (-200)\r
+\r
+/* Definition of function of sample code */\r
+#ifdef _WIN32\r
+extern int socket_initialize( SOCKET *sock, uint32_t ulIpAddress, uint16_t usPortNumber );\r
+extern void socket_terminate( SOCKET sock );\r
+extern int socket_recv( SOCKET sock, uint8_t *pucStream, int iLength, uint32_t *pulRecvAddr, uint16_t *pusRecvPortNumber );\r
+extern int socket_send( SOCKET sock, uint8_t *pucStream, int iLength, uint32_t ulSendAddr, uint16_t usSendPortNumber );\r
+#elif __linux__\r
+extern int socket_initialize( int *sock, uint32_t ulIpAddress, uint16_t usPortNumber );\r
+extern void socket_terminate( int sock );\r
+extern int socket_recv( int sock, uint8_t *pucStream, int iLength, uint32_t *pulRecvAddr, uint16_t *pusRecvPortNumber );\r
+extern int socket_send( int sock, uint8_t *pucStream, int iLength, uint32_t ulSendAddr, uint16_t usSendPortNumber );\r
+#endif\r
+\r
+#endif\r
+/*EOF*/\r
diff --git a/CCIEF-BASIC_Slave/sample/include/TIMER.h b/CCIEF-BASIC_Slave/sample/include/TIMER.h
new file mode 100644 (file)
index 0000000..53c8261
--- /dev/null
@@ -0,0 +1,72 @@
+/*\r
+ * Copyright (C) 2017 Texas Instruments Incorporated - http://www.ti.com/\r
+ * Copyright (C) 2016 CC-Link Partner Association -http://am.cc-link.org/\r
+ * \r
+ * \r
+ *  Redistribution and use in source and binary forms, with or without \r
+ *  modification, are permitted provided that the following conditions \r
+ *  are met:\r
+ *\r
+ *    Redistributions of source code must retain the above copyright \r
+ *    notice, this list of conditions and the following disclaimer.\r
+ *\r
+ *    Redistributions in binary form must reproduce the above copyright\r
+ *    notice, this list of conditions and the following disclaimer in the \r
+ *    documentation and/or other materials provided with the   \r
+ *    distribution.\r
+ *\r
+ *    Neither the name of Texas Instruments Incorporated nor the names of\r
+ *    its contributors may be used to endorse or promote products derived\r
+ *    from this software without specific prior written permission.\r
+ *\r
+ *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \r
+ *  "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT \r
+ *  LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\r
+ *  A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT \r
+ *  OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, \r
+ *  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT \r
+ *  LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
+ *  DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\r
+ *  THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT \r
+ *  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE \r
+ *  OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
+ *\r
+*/\r
+\r
+#ifndef                __TIMER_H__\r
+#define                __TIMER_H__\r
+\r
+#include <stdint.h>\r
+\r
+/*[ Definition for timer ]*/\r
+#define        TIMER_OK                                0\r
+#define        TIMER_RESOURCE_NONE             (-1)\r
+#define        TIMER_MAX                               5               /* Number of timer MAX */\r
+\r
+/*[ Structure for sample code ]*/\r
+typedef struct \r
+{\r
+       uint16_t        usYear;                         /* Year */\r
+       uint16_t        usMonth;                        /* Month */\r
+       uint16_t        usDay;                          /* Day */\r
+       uint16_t        usHour;                         /* Hour */\r
+       uint16_t        usMinute;                       /* Minute */\r
+       uint16_t        usSecond;                       /* Second */\r
+       uint16_t        usMilliseconds;         /* Milliseconds */\r
+} TIMER_TIME_DATA;\r
+\r
+/*[ Definition of callback function ]*/\r
+typedef void (*TIMER_CALLBACK)( int iId, void *pCallbackArg );\r
+\r
+/* Definition of function of the timer */\r
+extern void timer_initialize( void );\r
+extern void timer_terminate( void );\r
+extern void timer_main( void );\r
+extern int timer_start( uint32_t ulTime, int *piId, TIMER_CALLBACK pCallbackFunc, void *pCallbackArg );\r
+extern void timer_stop( int iId );\r
+extern uint32_t timer_get_time( void );\r
+extern uint32_t timer_broadcast_send_wait_time ( uint32_t ulMaxWaitTime );\r
+extern void timer_analyze_time_data( int64_t ullTime, TIMER_TIME_DATA *pTimeData );\r
+\r
+#endif\r
+/*EOF*/
\ No newline at end of file
diff --git a/CCIEF-BASIC_Slave/sample/include/USER_SAMPLE.h b/CCIEF-BASIC_Slave/sample/include/USER_SAMPLE.h
new file mode 100644 (file)
index 0000000..0569b62
--- /dev/null
@@ -0,0 +1,79 @@
+/*\r
+ * Copyright (C) 2017 Texas Instruments Incorporated - http://www.ti.com/\r
+ * Copyright (C) 2016 CC-Link Partner Association -http://am.cc-link.org/\r
+ * \r
+ * \r
+ *  Redistribution and use in source and binary forms, with or without \r
+ *  modification, are permitted provided that the following conditions \r
+ *  are met:\r
+ *\r
+ *    Redistributions of source code must retain the above copyright \r
+ *    notice, this list of conditions and the following disclaimer.\r
+ *\r
+ *    Redistributions in binary form must reproduce the above copyright\r
+ *    notice, this list of conditions and the following disclaimer in the \r
+ *    documentation and/or other materials provided with the   \r
+ *    distribution.\r
+ *\r
+ *    Neither the name of Texas Instruments Incorporated nor the names of\r
+ *    its contributors may be used to endorse or promote products derived\r
+ *    from this software without specific prior written permission.\r
+ *\r
+ *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \r
+ *  "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT \r
+ *  LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\r
+ *  A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT \r
+ *  OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, \r
+ *  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT \r
+ *  LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
+ *  DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\r
+ *  THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT \r
+ *  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE \r
+ *  OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
+ *\r
+*/\r
+\r
+#ifndef                __USER_SAMPLE_H__\r
+#define                __USER_SAMPLE_H__\r
+\r
+#include <stdint.h>\r
+\r
+/*[ Definition of CCIEF-BASIC profile for sample code (Please rewrite for user environment) ]*/\r
+#define        USER_PROFILE_VENDOR_CODE                                0x1234\r
+#define        USER_PROFILE_MODEL_CODE                                 0x00010001\r
+#define        USER_PROFILE_MACHINE_VERSION                    0x0001\r
+\r
+/*[ Definition of prameter for sample code (Please rewrite for user environment) ]*/\r
+#define        USER_PARAMETER_ID_IP_ADDRESS                                            1\r
+#define        USER_PARAMETER_ID_SUBNET_MASK                                           2\r
+#define        USER_PARAMETER_ID_DEFAULT_GW_IP_ADDRESS                         3\r
+#define        USER_PARAMETER_ID_OCCUPIED_STATION_NUMBER                       4\r
+#define        USER_PARAMETER_ID_CYCLIC_RESPONSE_WAIT_TIME                     5\r
+\r
+/*[ Definition of type name for SLMP node (Please rewrite for user environment) ]*/\r
+#define        USER_TYPE_NAME                          "SampleCode      "              /* Less than 16 characters, space(20H) is stored for the remaining character */\r
+#define        USER_TYPE_NAME_CODE                     0x1234\r
+\r
+/*[ Definition of SLMP server information for sample code (Please rewrite for user environment) ]*/\r
+#define        USER_SERVER_PORT_NUMBER         20000\r
+#define        USER_SERVER_HOSTNAME            "SlaveSample"\r
+\r
+/*[ Structure of prameter for sample code (Please rewrite for user environment) ]*/\r
+typedef struct \r
+{\r
+       uint32_t        ulIpAddress;                            /* Slave ip address */\r
+       uint32_t        ulSubnetMask;                           /* Subnet Mask */\r
+       uint32_t        ulDefaultGatewayIPAddress;      /* Default Gateway IP Address */\r
+       uint16_t        usOccupiedStationNumber;        /* Number of occupied stations */\r
+       uint32_t        ulCyclicResponseWaitTime;       /* Wait for cyclic response time [ms] (0:Not wait) */\r
+} USER_SLAVE_PARAMETER;\r
+\r
+/*[ Definition for sample code ]*/\r
+#define        USER_ERR_OK                     0\r
+#define        USER_ERR_NG                     (-1)\r
+#define        USER_RESET_NONE         0\r
+#define        USER_RESET                      1\r
+\r
+\r
+#endif\r
+/*EOF*/
\ No newline at end of file
diff --git a/CCIEF-BASIC_Slave/sample/src/CCIEF_BASIC_SLAVE.c b/CCIEF-BASIC_Slave/sample/src/CCIEF_BASIC_SLAVE.c
new file mode 100644 (file)
index 0000000..e6cba05
--- /dev/null
@@ -0,0 +1,941 @@
+/*\r
+ * Copyright (C) 2017 Texas Instruments Incorporated - http://www.ti.com/\r
+ * Copyright (C) 2016 CC-Link Partner Association -http://am.cc-link.org/\r
+ * \r
+ * \r
+ *  Redistribution and use in source and binary forms, with or without \r
+ *  modification, are permitted provided that the following conditions \r
+ *  are met:\r
+ *\r
+ *    Redistributions of source code must retain the above copyright \r
+ *    notice, this list of conditions and the following disclaimer.\r
+ *\r
+ *    Redistributions in binary form must reproduce the above copyright\r
+ *    notice, this list of conditions and the following disclaimer in the \r
+ *    documentation and/or other materials provided with the   \r
+ *    distribution.\r
+ *\r
+ *    Neither the name of Texas Instruments Incorporated nor the names of\r
+ *    its contributors may be used to endorse or promote products derived\r
+ *    from this software without specific prior written permission.\r
+ *\r
+ *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \r
+ *  "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT \r
+ *  LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\r
+ *  A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT \r
+ *  OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, \r
+ *  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT \r
+ *  LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
+ *  DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\r
+ *  THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT \r
+ *  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE \r
+ *  OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
+ *\r
+*/\r
+\r
+#include "SLMP.h"\r
+#include "CCIEF_BASIC_SLAVE.h"\r
+#include "SLMP_SERVER.h"\r
+#include "SOCKET.h"\r
+#include "TIMER.h"\r
+\r
+/************************************************************************************/\r
+/* The following is an user defined main program. This main program is one of a                */\r
+/* sample in the Windows OS and Intel x86 CPU. Please rewrite if necessary.                    */\r
+/* This main program is one of a sample in the Linux. Please rewrite if necessary.     */\r
+/*                                                                                                                                                                     */\r
+/* This sample program for CCIEF-BASIC Slave Application.                                                      */\r
+/*                                                                                                                                                                     */\r
+/************************************************************************************/\r
+\r
+#ifdef _WIN32\r
+#include <stdint.h>\r
+#include <winsock2.h>\r
+#include <Ws2tcpip.h>\r
+#elif __linux__\r
+#include <netinet/in.h>\r
+#include <string.h>\r
+#endif\r
+#include <stdio.h>\r
+\r
+/*[ Structure for sample code ]*/\r
+typedef struct \r
+{\r
+       uint16_t        usVenderCode;           /* Vender code */\r
+       uint16_t        usReserve1;                     /* Reserve */\r
+       uint32_t        ulModelCode;            /* Model code */\r
+       uint16_t        usMachineVersion;       /* Machine version */\r
+       uint16_t        usReserve2;                     /* Reserve */\r
+       uint16_t        usUnitInfo;                     /* Information of the unit */\r
+       uint16_t        usErrCode;                      /* Error code */\r
+       uint32_t        ulUnitData;                     /* Data of the unit */\r
+} CCIEF_BASIC_SLAVE_NOTIFY_INFO;\r
+\r
+typedef struct \r
+{\r
+       int                                                             iFirst;                                                 /* Flag for check the first cyclic data(0:First 1:Not First) */\r
+       uint32_t                                                ulId;                                                   /* Id of the slave */\r
+       CCIEF_BASIC_SLAVE_NOTIFY_INFO   SlaveNotifyInfo;                                /* Notify information from the slave */\r
+       CCIEF_BASIC_MASTER_NOTIFY_INFO  MasterNotifyInfo;                               /* Notify information from the master */\r
+       uint32_t                                                ulMasterId;                                             /* Id of the master */\r
+       uint8_t                                                 ucGroupNumber;                                  /* Group number */\r
+       uint16_t                                                usParameterIdNumber;                    /* Parameter id number */\r
+       uint16_t                                                usSlaveIdOffsetIndex;                   /* Index of the slave id offset */\r
+       uint16_t                                                usCyclicStateOffsetIndex;               /* Index of the cyclic state offset */\r
+       uint16_t                                                usRYOffsetIndex;                                /* Index of RY offset */\r
+       uint16_t                                                usRWwOffsetIndex;                               /* Index of RWw offset */\r
+       int                                                             iOccupiedStationNumber;                 /* Number of occupied stations */\r
+       int                                                             iStationNumber;                                 /* Number of stations */\r
+       int                                                             iCyclicState;                                   /* Cyclic state */\r
+       int                                                             iDisconnectionTimer;                    /* Flag for the disconnection timer (0:Stop 1:Start) */\r
+       int                                                             iDisconnectionTimerId;                  /* Id for the disconnection timer */\r
+} CCIEF_BASIC_SLAVE_CYCLIC_DATA_INFO;\r
+\r
+/* Definition of external variable of sample code */\r
+#ifdef _WIN32\r
+static SOCKET sock_slave = 0;          /* sokect for CCIEF-BASIC Slave */\r
+#elif __linux__\r
+static int sock_slave = 0;                     /* sokect for CCIEF-BASIC Slave */\r
+#endif\r
+static uint8_t aucSendData[CCIEF_BASIC_MAX_FRAME_SIZE];                /* Data for sending packet */\r
+static uint8_t aucRecvData[CCIEF_BASIC_MAX_FRAME_SIZE];                /* Data for receiving packet */\r
+static uint8_t aucSendPacket[CCIEF_BASIC_MAX_FRAME_SIZE];      /* Buffer for sending packet */\r
+static uint8_t aucRecvPacket[CCIEF_BASIC_MAX_FRAME_SIZE];      /* Buffer for receiving packet */\r
+\r
+static uint16_t ausRX[(CCIEF_BASIC_RX_RY_SIZE / sizeof( uint16_t )) * CCIEF_BASIC_MAX_NUMBER_OF_OCCUPIED_STATIONS_GROUP];              /* RX */\r
+static uint16_t ausRY[(CCIEF_BASIC_RX_RY_SIZE / sizeof( uint16_t)) * CCIEF_BASIC_MAX_NUMBER_OF_OCCUPIED_STATIONS_GROUP];               /* RY */\r
+static uint16_t ausRWw[(CCIEF_BASIC_RWW_RWR_SIZE / sizeof( uint16_t )) * CCIEF_BASIC_MAX_NUMBER_OF_OCCUPIED_STATIONS_GROUP];   /* RWw */\r
+static uint16_t ausRWr[(CCIEF_BASIC_RWW_RWR_SIZE / sizeof( uint16_t )) * CCIEF_BASIC_MAX_NUMBER_OF_OCCUPIED_STATIONS_GROUP];   /* RWr */\r
+\r
+static CCIEF_BASIC_SLAVE_CALLBACK_RECV_CYCLIC_DATA             pUserRecvCyclicDataFunc = NULL;                 /* Callback function for receiving the cyclic data */\r
+static CCIEF_BASIC_SLAVE_CALLBACK_CYCLIC_DISCONNECTION pUserCyclicDisconnectionFunc = NULL;    /* Callback function for disconnecting of cyclic */\r
+\r
+static CCIEF_BASIC_SLAVE_INFO                          Slave;                  /* Information of the slave */\r
+static CCIEF_BASIC_SLAVE_CYCLIC_DATA_INFO      CyclicData;             /* Information of the cyclic data */\r
+\r
+/* Definition of function of sample code */\r
+#ifdef _WIN32\r
+static int ccief_basic_slave_recv_cyclic_data( SOCKET sock, const SLMP_INFO *source, uint32_t ulRecvAddr, uint16_t usRecvPortNumber );\r
+static int ccief_basic_slave_send_cyclic_data( SOCKET sock, const SLMP_INFO *source, uint32_t ulSendAddr, uint16_t usSendPortNumber );\r
+static int ccief_basic_slave_send_cyclic_data_error( SOCKET sock, const SLMP_INFO *source, uint16_t usEndCode, uint32_t ulSendAddr, uint16_t usSendPortNumber );\r
+#elif __linux__\r
+static int ccief_basic_slave_recv_cyclic_data( int sock, const SLMP_INFO *source, uint32_t ulRecvAddr, uint16_t usRecvPortNumber );\r
+static int ccief_basic_slave_send_cyclic_data( int sock, const SLMP_INFO *source, uint32_t ulSendAddr, uint16_t usSendPortNumber );\r
+static int ccief_basic_slave_send_cyclic_data_error( int sock, const SLMP_INFO *source, uint16_t usErrCode, uint32_t ulSendAddr, uint16_t usSendPortNumber );\r
+#endif\r
+static void ccief_basic_slave_disconnection( void );\r
+static void ccief_basic_slave_disconnection_timer_timeout( int iId, void *pCallbackArg );\r
+\r
+/*[ Service Function Table ]*/\r
+static SLMP_SERVICE service_table[] =\r
+{\r
+       { SLMP_COMMAND_CYCLIC_DATA, ccief_basic_slave_recv_cyclic_data },\r
+};\r
+\r
+/************************************************************************************/\r
+/* This is an user defined function for initialization of the CCIEF-BASIC Slave.       */\r
+/************************************************************************************/\r
+int ccief_basic_slave_initialize( CCIEF_BASIC_SLAVE_INFO *pSlave, \r
+                                                               CCIEF_BASIC_SLAVE_CALLBACK_RECV_CYCLIC_DATA pRecvCyclicDataFunc,\r
+                                                               CCIEF_BASIC_SLAVE_CALLBACK_CYCLIC_DISCONNECTION pCyclicDisconnectionFunc )\r
+{\r
+       int iErrCode = 0;\r
+\r
+       /* Getting of the slave information */\r
+       memcpy( &Slave, pSlave, sizeof( Slave ) );\r
+\r
+       /* Initialization of the cyclic data information */\r
+       memset( &CyclicData, 0, sizeof( CyclicData ) );\r
+\r
+       /* User callback function */\r
+       pUserRecvCyclicDataFunc = pRecvCyclicDataFunc;\r
+       pUserCyclicDisconnectionFunc = pCyclicDisconnectionFunc;\r
+\r
+       /* Initialization of the socket */\r
+       iErrCode = socket_initialize( &sock_slave, Slave.ulIpAddress, CCIEF_BASIC_PORT_NUMBER );\r
+       if( iErrCode != CCIEF_BASIC_SLAVE_ERR_OK )\r
+       {\r
+               return iErrCode;\r
+       }\r
+\r
+       /* Set of the cyclic data information */\r
+       CyclicData.ulId = Slave.ulIpAddress;\r
+       CyclicData.SlaveNotifyInfo.usVenderCode = pSlave->usVenderCode;\r
+       CyclicData.SlaveNotifyInfo.ulModelCode = pSlave->ulModelCode;\r
+       CyclicData.SlaveNotifyInfo.usMachineVersion = pSlave->usMachineVersion;\r
+\r
+       return CCIEF_BASIC_SLAVE_ERR_OK;\r
+}\r
+\r
+/************************************************************************************/\r
+/* This is an user defined function for termination of CCIEF-BASIC Slave.                      */\r
+/************************************************************************************/\r
+void ccief_basic_slave_terminate( void )\r
+{\r
+       /* Check the disconnection timer */\r
+       if ( CyclicData.iDisconnectionTimer != 0 )\r
+       {\r
+               /* Stop the disconnection timer */\r
+               timer_stop( CyclicData.iDisconnectionTimerId );\r
+       }\r
+\r
+       /* Termination of slave_socket */\r
+       socket_terminate( sock_slave );\r
+\r
+       return;\r
+}\r
+\r
+/************************************************************************************/\r
+/* This is an user defined function for main function of CCIEF-BASIC Slave.                    */\r
+/************************************************************************************/\r
+int ccief_basic_slave_main( void )\r
+{\r
+       SLMP_INFO                               source;                 /* SLMP Infomation for received packet */\r
+       int                                             iErrCode = 0;\r
+       uint32_t                                ulRecvAddr;\r
+       uint16_t                                usRecvPortNumber;\r
+       char                                    Ipaddr[16];\r
+       struct in_addr                  addrSender;\r
+#ifdef _WIN32\r
+#elif __linux__\r
+       uint32_t                                ulMyNetAddress;\r
+       uint32_t                                ulOtherNetAddress;\r
+#endif\r
+\r
+       /* Receive a request packet. */\r
+       iErrCode = socket_recv( sock_slave, aucRecvPacket, sizeof( aucRecvPacket ), &ulRecvAddr, &usRecvPortNumber );\r
+       if ( iErrCode != SOCKET_ERR_OK )\r
+       {\r
+               if ( iErrCode == SOCKET_ERR_NO_RECEIVABLE )\r
+               {\r
+                       return CCIEF_BASIC_SLAVE_ERR_OK;\r
+               }\r
+               else\r
+               {\r
+                       return iErrCode;\r
+               }\r
+       }\r
+\r
+#ifdef _WIN32\r
+#elif __linux__\r
+\r
+       ulMyNetAddress = ( Slave.ulIpAddress & Slave.ulSubnetMask );\r
+       ulOtherNetAddress = ( ulRecvAddr & Slave.ulSubnetMask );\r
+\r
+       /* Other network broadcast break*/\r
+       if( ulMyNetAddress != ulOtherNetAddress )\r
+       {\r
+               return CCIEF_BASIC_SLAVE_ERR_OK;\r
+       }\r
+#endif\r
+\r
+       /* Sets the SLMP Information for receiving. */\r
+       source.pucData = aucRecvData;\r
+\r
+       /* Get the SLMP Information from the request packet using the SLMP library. */\r
+       iErrCode = SLMP_GetSlmpInfo( &source, aucRecvPacket );\r
+       if ( iErrCode != SLMP_ERR_OK )\r
+       {\r
+               printf("ERR : SLMP_GetSlmpInfo  %d\n",iErrCode);\r
+               return CCIEF_BASIC_SLAVE_ERR_OK;\r
+       }\r
+\r
+       /* Check the frame type */\r
+       if( (source.ulFrameType == SLMP_FTYPE_BIN_REQ_ST) || (source.ulFrameType == SLMP_FTYPE_BIN_REQ_MT) )\r
+       {       /* Request */\r
+               /* Check the SLMP Command. */\r
+               if ( source.usCommand != CCIEF_BASIC_SLMP_COMMAND_CYCLIC_DATA )\r
+               {\r
+                       /* Display the received packet information. */\r
+#ifdef _WIN32\r
+                       addrSender.S_un.S_addr = htonl(ulRecvAddr);\r
+#elif __linux__\r
+                       addrSender.s_addr = htonl(ulRecvAddr);\r
+#endif\r
+                       inet_ntop(AF_INET, &addrSender, Ipaddr, sizeof(Ipaddr) );\r
+                       printf("SLMP: Receive: %-15s:%-5u  Command: %04X  Subcommand: %04X\n", Ipaddr, usRecvPortNumber,source.usCommand,source.usSubCommand);\r
+               }\r
+\r
+               /* Execute a request service. */\r
+               iErrCode = slmp_server_service( sock_slave, &source, ulRecvAddr, usRecvPortNumber, service_table, (sizeof( service_table ) / sizeof( service_table[0] )) );\r
+               if ( iErrCode != SLMP_SERVER_ERR_OK )\r
+               {\r
+                       printf("ERR : SLMP Service  %d\n",iErrCode);\r
+                       return CCIEF_BASIC_SLAVE_ERR_OK;\r
+               }\r
+       }\r
+\r
+       return CCIEF_BASIC_SLAVE_ERR_OK;\r
+}\r
+\r
+/************************************************************************************/\r
+/* This is an user defined function for setting the RX.                                                                */\r
+/************************************************************************************/\r
+int ccief_basic_slave_set_rx( int iNumber, int iValue )\r
+{\r
+       uint16_t usTemp;\r
+\r
+       /* Check the number of device */\r
+       if (( iNumber < 0 ) || ((( CCIEF_BASIC_RX_RY_SIZE * 8 ) * Slave.iOccupiedStationNumber ) <= iNumber ))\r
+       {\r
+               return CCIEF_BASIC_SLAVE_ERR_DEVICE_RANGE;\r
+       }\r
+\r
+       /* Check the value */\r
+       if (( iValue == CCIEF_BASIC_BIT_OFF ) || ( iValue == CCIEF_BASIC_BIT_ON ))\r
+       {\r
+               usTemp = ausRX[( iNumber / 16 )];\r
+               usTemp = (uint16_t)(( usTemp & ~( 1 << ( iNumber % 16 ))) | ( iValue << ( iNumber % 16 )));\r
+               ausRX[( iNumber / 16 )] = usTemp;\r
+       }\r
+       else\r
+       {\r
+               return CCIEF_BASIC_SLAVE_ERR_NG;\r
+       }\r
+       \r
+       return CCIEF_BASIC_SLAVE_ERR_OK;\r
+}\r
+\r
+/************************************************************************************/\r
+/* This is an user defined function for getting the RY.                                                                */\r
+/************************************************************************************/\r
+int ccief_basic_slave_get_ry( int iNumber, int *piValue )\r
+{\r
+       uint16_t usTemp;\r
+\r
+       /* Check the number of device */\r
+       if (( iNumber < 0 ) || ((( CCIEF_BASIC_RX_RY_SIZE * 8 ) * Slave.iOccupiedStationNumber ) <= iNumber ))\r
+       {\r
+               return CCIEF_BASIC_SLAVE_ERR_DEVICE_RANGE;\r
+       }\r
+\r
+       usTemp = ausRY[( iNumber / 16 )];\r
+       if (( usTemp & ( 1 << ( iNumber % 16 ))) == CCIEF_BASIC_BIT_OFF )\r
+       {\r
+               *piValue = CCIEF_BASIC_BIT_OFF;\r
+       }\r
+       else\r
+       {\r
+               *piValue = CCIEF_BASIC_BIT_ON;\r
+       }\r
+       \r
+       return CCIEF_BASIC_SLAVE_ERR_OK;\r
+}\r
+\r
+/************************************************************************************/\r
+/* This is an user defined function for getting the RWw.                                                       */\r
+/************************************************************************************/\r
+int ccief_basic_slave_get_rww( int iNumber, uint16_t *pusValue )\r
+{\r
+       int iMaxNumber;\r
+\r
+       /* Check the number of device */\r
+       iMaxNumber = ( CCIEF_BASIC_RWW_RWR_SIZE / sizeof( uint16_t )) * Slave.iOccupiedStationNumber;\r
+       if (( iNumber < 0 ) || ( iMaxNumber <= iNumber ))\r
+       {\r
+               return CCIEF_BASIC_SLAVE_ERR_DEVICE_RANGE;\r
+       }\r
+\r
+       *pusValue = ausRWw[ iNumber ];\r
+       \r
+       return CCIEF_BASIC_SLAVE_ERR_OK;\r
+}\r
+\r
+/************************************************************************************/\r
+/* This is an user defined function for setting the RWr.                                                       */\r
+/************************************************************************************/\r
+int ccief_basic_slave_set_rwr( int iNumber, uint16_t usValue )\r
+{\r
+       int iMaxNumber;\r
+\r
+       /* Check the number of device */\r
+       iMaxNumber = ( CCIEF_BASIC_RWW_RWR_SIZE / sizeof( uint16_t )) * Slave.iOccupiedStationNumber;\r
+       if (( iNumber < 0 ) || ( iMaxNumber <= iNumber ))\r
+       {\r
+               return CCIEF_BASIC_SLAVE_ERR_DEVICE_RANGE;\r
+       }\r
+\r
+       ausRWr[ iNumber ] = usValue;\r
+       \r
+       return CCIEF_BASIC_SLAVE_ERR_OK;\r
+}\r
+\r
+/************************************************************************************/\r
+/* This is an user defined function for getting the device start pointer.                      */\r
+/************************************************************************************/\r
+uint16_t *ccief_basic_slave_get_pointer( int iDeviceType )\r
+{\r
+       uint16_t *pusStartPointer;\r
+\r
+       /* Getting the device start pointer */\r
+\r
+       /* Check the device type */\r
+       switch ( iDeviceType )\r
+       {\r
+               /* RX */\r
+               case CCIEF_BASIC_DEVICE_TYPE_RX:\r
+                       pusStartPointer = ausRX;\r
+                       break;\r
+               /* RY */\r
+               case CCIEF_BASIC_DEVICE_TYPE_RY:\r
+                       pusStartPointer = ausRY;\r
+                       break;\r
+               /* RWw */\r
+               case CCIEF_BASIC_DEVICE_TYPE_RWW:\r
+                       pusStartPointer = ausRWw;\r
+                       break;\r
+               /* RWr */\r
+               case CCIEF_BASIC_DEVICE_TYPE_RWR:\r
+                       pusStartPointer = ausRWr;\r
+                       break;\r
+               /* Error of argument */\r
+               default:\r
+                       pusStartPointer = NULL;\r
+                       break;\r
+       }\r
+       \r
+       return pusStartPointer;\r
+}\r
+\r
+/************************************************************************************/\r
+/* This is an user defined function for setting the unit info.                                         */\r
+/************************************************************************************/\r
+void ccief_basic_slave_set_unit_info( uint16_t usUnitInfo )\r
+{\r
+       CyclicData.SlaveNotifyInfo.usUnitInfo = usUnitInfo;\r
+\r
+       return;\r
+}\r
+\r
+/************************************************************************************/\r
+/* This is an user defined function for setting the error code.                                                */\r
+/************************************************************************************/\r
+void ccief_basic_slave_set_err_code( uint16_t usErrCode )\r
+{\r
+       CyclicData.SlaveNotifyInfo.usErrCode = usErrCode;\r
+\r
+       return;\r
+}\r
+\r
+/************************************************************************************/\r
+/* This is an user defined function for setting the unit data.                                         */\r
+/************************************************************************************/\r
+void ccief_basic_slave_set_unit_data( uint32_t ulUnitData )\r
+{\r
+       CyclicData.SlaveNotifyInfo.ulUnitData = ulUnitData;\r
+\r
+       return;\r
+}\r
+\r
+/************************************************************************************/\r
+/* This is an user defined function for getting the slave status information.          */\r
+/************************************************************************************/\r
+void ccief_basic_slave_get_master_info( CCIEF_BASIC_SLAVE_MASTER_INFO *pInfo )\r
+{\r
+       /* Getting the master information */\r
+       pInfo->ucGroupNumber = CyclicData.ucGroupNumber;\r
+       pInfo->ulId = CyclicData.ulMasterId;\r
+       if ( pInfo->ulId == 0 )\r
+       {\r
+               memset( &pInfo->NotifyInfo, 0, sizeof( pInfo->NotifyInfo ) );\r
+       }\r
+       else\r
+       {\r
+               memcpy( &pInfo->NotifyInfo, &CyclicData.MasterNotifyInfo, sizeof( pInfo->NotifyInfo ) );\r
+       }\r
+\r
+       return;\r
+}\r
+\r
+/************************************************************************************/\r
+/* This is an user defined function for receiving Cyclic Data request.                         */\r
+/************************************************************************************/\r
+#define REQUEST_OFFSET_ADDRESS_MASTER_INFO_DATA                0x0014\r
+\r
+#ifdef _WIN32\r
+int ccief_basic_slave_recv_cyclic_data( SOCKET sock, const SLMP_INFO *source, uint32_t ulRecvAddr, uint16_t usRecvPortNumber )\r
+#elif __linux__\r
+int ccief_basic_slave_recv_cyclic_data( int sock, const SLMP_INFO *source, uint32_t ulRecvAddr, uint16_t usRecvPortNumber )\r
+#endif\r
+{\r
+       uint8_t         *pucData;\r
+       uint32_t        ulMasterId;                                                     /* Id of the master */\r
+       uint8_t         ucGroupNumber;                                          /* Group number */\r
+       uint16_t        usCyclicTransmissionTimeout;            /* Cyclic transmission timeout [ms] */\r
+       uint16_t        usCyclicTransmissionTimeoutCount;       /* Count of cyclic transmission timeout */\r
+       uint16_t        usParameterIdNumber;                            /* Parameter id number */\r
+       uint16_t        usFrameSequenceNumber;                          /* Frame sequence number */\r
+       uint32_t        ulCyclicTransmissionTime;                       /* Cyclic transmission time */\r
+       int                     iTotalOccupiedStationNumber;            /* Total number of occupied stations */\r
+       int                     iStationNumber;                                         /* Number of stations */\r
+       int                     iOccupiedStationNumber;                         /* Number of occupied stations */\r
+       int                     iCyclicState;                                           /* Cyclic state */\r
+       uint16_t        *pusCyclicState;\r
+       uint32_t        *pulSlaveId;\r
+       uint8_t         *pucRWw, *pucRY;\r
+       uint32_t        ulSlaveId;\r
+       int                     i, j, iIndex;\r
+       int                     iErrCode;\r
+\r
+       /* Get Cyclic Data pointer */\r
+       pucData = source->pucData;\r
+\r
+       /* Cyclic information */\r
+       iIndex = SHIFT_L8( pucData[5] ) + SHIFT_L0( pucData[4] );\r
+       iIndex -= 4;            /* Adjust for SLMP Library */\r
+       /* Master id */\r
+       memcpy( &ulMasterId, &pucData[iIndex], sizeof(uint32_t) );\r
+       iIndex += 4;\r
+       /* Group number */\r
+       ucGroupNumber = pucData[iIndex];\r
+       iIndex += 2;\r
+       /* Check the master id */\r
+       if (( CyclicData.iFirst != 0 ) && ( ulMasterId != CyclicData.ulMasterId ))\r
+       {\r
+               printf( "ERR : Found the duplicate Master!\n" );\r
+               /* Send the response data of Cyclic Data. */\r
+               iErrCode = ccief_basic_slave_send_cyclic_data_error( sock, source, SLMP_END_DUPLICATE_MASTER, ulRecvAddr, usRecvPortNumber );\r
+               return iErrCode;\r
+       }\r
+       /* Frame sequence number */\r
+       usFrameSequenceNumber = SHIFT_L8( pucData[iIndex + 1] ) + SHIFT_L0( pucData[iIndex] );\r
+       iIndex += 2;\r
+       /* Cyclic transmission timeout */\r
+       usCyclicTransmissionTimeout = SHIFT_L8( pucData[iIndex + 1] ) + SHIFT_L0( pucData[iIndex] );\r
+       iIndex += 2;\r
+       if ( usCyclicTransmissionTimeout == 0 )\r
+       {\r
+               usCyclicTransmissionTimeout = CCIEF_BASIC_CYCLIC_TRANSMISSION_TIMEOUT;\r
+       }\r
+       /* Count of cyclic transmission timeout */\r
+       usCyclicTransmissionTimeoutCount = SHIFT_L8( pucData[iIndex + 1] ) + SHIFT_L0( pucData[iIndex] );\r
+       iIndex += 2;\r
+       if ( usCyclicTransmissionTimeoutCount == 0 )\r
+       {\r
+               usCyclicTransmissionTimeoutCount = CCIEF_BASIC_CYCLIC_TRANSMISSION_TIMEOUT_COUNT;\r
+       }\r
+       /* Calculate the cyclic transmission timeout */\r
+       ulCyclicTransmissionTime = usCyclicTransmissionTimeout * usCyclicTransmissionTimeoutCount;\r
+       /* Parameter id */\r
+       usParameterIdNumber = SHIFT_L8( pucData[iIndex + 1] ) + SHIFT_L0( pucData[iIndex] );\r
+       iIndex += 2;\r
+\r
+       /* Master notify information */\r
+       memcpy( &CyclicData.MasterNotifyInfo, &pucData[REQUEST_OFFSET_ADDRESS_MASTER_INFO_DATA],\r
+                       sizeof( CyclicData.MasterNotifyInfo ) );\r
+\r
+       /* Check the parameter id number */\r
+       if (( CyclicData.iFirst == 0 ) || ( usParameterIdNumber != CyclicData.usParameterIdNumber ) || ( usFrameSequenceNumber == 0 ) )\r
+       {\r
+               /* Total occupied station number of the slaves */\r
+               iTotalOccupiedStationNumber = SHIFT_L8( pucData[iIndex + 1] ) + SHIFT_L0( pucData[iIndex] );\r
+               iIndex += 2;\r
+               /* Cyclic state */\r
+               CyclicData.usCyclicStateOffsetIndex = (uint16_t)(&pucData[iIndex] - pucData);\r
+               iIndex += 4;\r
+               /* Slave id */\r
+               pulSlaveId = (uint32_t*)&pucData[iIndex];\r
+               iStationNumber = 0;\r
+               /* Found the slave id */\r
+               for ( i = 0; ( i < iTotalOccupiedStationNumber ) && ( i < CCIEF_BASIC_MAX_NUMBER_OF_OCCUPIED_STATIONS_GROUP ); i ++ )\r
+               {\r
+                       ulSlaveId = *pulSlaveId;\r
+                       /* Check the slave id */\r
+                       if ( CyclicData.ulId == ulSlaveId )\r
+                       {\r
+                               /* Check the cyclic state */\r
+                               pusCyclicState = (uint16_t*)(pucData + CyclicData.usCyclicStateOffsetIndex);\r
+                               iCyclicState = ( (*pusCyclicState >> ( i % 16 )) & 0x0001 );\r
+                               if( iCyclicState == CCIEF_BASIC_CYCLIC_DATA_VALID )\r
+                               {       /* Valid the cyclic data */\r
+                                       printf( "ERR : Slave duplication or timeout!\n" );\r
+                                       return CCIEF_BASIC_SLAVE_ERR_OK;\r
+                               }\r
+                               \r
+                               /* Group number */\r
+                               CyclicData.ucGroupNumber = ucGroupNumber;\r
+                               /* Master id */\r
+                               CyclicData.ulMasterId = ulMasterId;\r
+                               /* The first receiving the cyclic data or changed the parameter */\r
+                               CyclicData.usParameterIdNumber = usParameterIdNumber;\r
+                               /* Offset of Slave id */\r
+                               CyclicData.usSlaveIdOffsetIndex = (uint16_t)((uint8_t*)pulSlaveId - pucData);\r
+                               pulSlaveId += 1;\r
+                               iStationNumber = i;\r
+                               iOccupiedStationNumber = 1;\r
+                               /* Getting the occupied station number */\r
+                               for ( j = 0; ( j < ( CCIEF_BASIC_MAX_NUMBER_OF_OCCUPIED_STATIONS_GROUP - 1 )) && ((( i + 1 ) + j ) < iTotalOccupiedStationNumber ); j++ )\r
+                               {\r
+                                       ulSlaveId = *pulSlaveId;\r
+                                       pulSlaveId += 1;\r
+                                       if ( ulSlaveId == CCIEF_BASIC_SLAVE_ID_OCCUPIED_STATIONS )\r
+                                       {\r
+                                               iOccupiedStationNumber ++;\r
+                                       }\r
+                                       else\r
+                                       {\r
+                                               break;\r
+                                       }\r
+                               }\r
+                               CyclicData.iStationNumber = iStationNumber;\r
+                               CyclicData.iOccupiedStationNumber = iOccupiedStationNumber;\r
+                               /* RWw offset */\r
+                               iIndex += iTotalOccupiedStationNumber * 4;\r
+                               CyclicData.usRWwOffsetIndex =\r
+                                       (uint16_t)(&pucData[iIndex + iStationNumber * CCIEF_BASIC_RWW_RWR_SIZE] - pucData);\r
+                               /* RY offset */\r
+                               iIndex += iTotalOccupiedStationNumber * CCIEF_BASIC_RWW_RWR_SIZE;\r
+                               CyclicData.usRYOffsetIndex =\r
+                                       (uint16_t)(&pucData[iIndex + iStationNumber * CCIEF_BASIC_RX_RY_SIZE] - pucData);\r
+\r
+                               CyclicData.iFirst = 1;\r
+                               break;\r
+                       }\r
+                       pulSlaveId += 1;\r
+               }\r
+               if (( i == iTotalOccupiedStationNumber ) || ( i == CCIEF_BASIC_MAX_NUMBER_OF_OCCUPIED_STATIONS_GROUP ))\r
+               {\r
+                       /* Not found slave id! */\r
+                       /* Destruction of a packet */\r
+                       return CCIEF_BASIC_SLAVE_ERR_OK;\r
+               }\r
+       }\r
+       else\r
+       {\r
+               /* The same parameters as the previous */\r
+               /* Nothing */\r
+       }\r
+\r
+       /* Check the group number */\r
+       if ( ucGroupNumber != CyclicData.ucGroupNumber )\r
+       {\r
+               /* Invalid group number! */\r
+               /* Destruction of a packet */\r
+               return CCIEF_BASIC_SLAVE_ERR_OK;\r
+       }\r
+       \r
+       /* Check the disconnection timer */\r
+       if ( CyclicData.iDisconnectionTimer != 0 )\r
+       {\r
+               /* Stop the disconnection timer */\r
+               timer_stop( CyclicData.iDisconnectionTimerId );\r
+       }\r
+       /* Start the disconnection timer */\r
+       timer_start( ulCyclicTransmissionTime, &CyclicData.iDisconnectionTimerId, &ccief_basic_slave_disconnection_timer_timeout, NULL );\r
+       /* Running the disconnection timer */\r
+       CyclicData.iDisconnectionTimer = 1;\r
+       \r
+       /* Check number of occupied stations */\r
+       if ( CyclicData.iOccupiedStationNumber <= Slave.iOccupiedStationNumber )\r
+       {       /* Valid the occupied stations number */\r
+               /* Check the slave id */\r
+               pulSlaveId = (uint32_t*)(pucData + CyclicData.usSlaveIdOffsetIndex);\r
+               if ( *pulSlaveId == CyclicData.ulId )\r
+               {\r
+                       /* Start cyclic */\r
+                       /* Check the cyclic state */\r
+                       pusCyclicState = (uint16_t*)(pucData + CyclicData.usCyclicStateOffsetIndex);\r
+                       iCyclicState = ( (*pusCyclicState >> ( CyclicData.iStationNumber % 16 )) & 0x0001 );\r
+                       CyclicData.iCyclicState = iCyclicState;\r
+\r
+                       /* Check Cyclic state */\r
+                       if ( iCyclicState == CCIEF_BASIC_CYCLIC_DATA_VALID )\r
+                       {       /* Valid the cyclic data */\r
+                               /* Receiving the cyclic data. */\r
+                               pucRWw = pucData + CyclicData.usRWwOffsetIndex;\r
+                               pucRY = pucData + CyclicData.usRYOffsetIndex;\r
+\r
+                               memcpy( ausRWw, pucRWw, CCIEF_BASIC_RWW_RWR_SIZE * CyclicData.iOccupiedStationNumber );\r
+                               memcpy( ausRY, pucRY, CCIEF_BASIC_RX_RY_SIZE * CyclicData.iOccupiedStationNumber );\r
+                       }\r
+                       else\r
+                       {       /* Invalid the cyclic data */\r
+                               /* Nothig */\r
+                       }\r
+               }\r
+               else\r
+               {\r
+                       /* Not found slave id */\r
+                       /* Destruction of a packet */\r
+                       return CCIEF_BASIC_SLAVE_ERR_OK;\r
+               }\r
+       }\r
+       else\r
+       {\r
+               /* Invalid the occupied stations number */\r
+               printf( "ERR : Invalid the occupied stations number from the master!\n" );\r
+               /* Send the response data of Cyclic Data. */\r
+               iErrCode = ccief_basic_slave_send_cyclic_data_error( sock, source, SLMP_END_INVALID_NUMBER_OF_OCCUPIED_STATIONS, ulRecvAddr, usRecvPortNumber );\r
+               return iErrCode;\r
+       }\r
+\r
+       /* Callback to the user function. */\r
+       if ( pUserRecvCyclicDataFunc != NULL )\r
+       {\r
+               pUserRecvCyclicDataFunc( CyclicData.iCyclicState, CyclicData.iOccupiedStationNumber );\r
+       }\r
+\r
+       /* Send the response data of Cyclic Data. */\r
+       iErrCode = ccief_basic_slave_send_cyclic_data( sock, source, ulRecvAddr, usRecvPortNumber );\r
+\r
+       return iErrCode;\r
+}\r
+\r
+/************************************************************************************/\r
+/* This is an user defined function for sending Cyclic Data response.                          */\r
+/************************************************************************************/\r
+#define RESPONSE_OFFSET_ADDRESS_CYCLIC_INFO    0x0028\r
+\r
+#ifdef _WIN32\r
+int ccief_basic_slave_send_cyclic_data( SOCKET sock, const SLMP_INFO *source, uint32_t ulSendAddr, uint16_t usSendPortNumber )\r
+#elif __linux__\r
+int ccief_basic_slave_send_cyclic_data( int sock, const SLMP_INFO *source, uint32_t ulSendAddr, uint16_t usSendPortNumber )\r
+#endif\r
+{\r
+       SLMP_INFO       target;                 /* SLMP Infomation for sending packet*/\r
+       uint8_t         *pucData;\r
+       uint16_t        usFrameSequenceNumber;  /* Frame sequence number */\r
+       int                     iIndex;\r
+       uint16_t        usSendDataSize;\r
+       int                     iErrCode = 0;\r
+\r
+       /* Get Cyclic Data pointer */\r
+       pucData = source->pucData;\r
+       /* Cyclic information */\r
+       iIndex = SHIFT_L8( pucData[5] ) + SHIFT_L0( pucData[4] );\r
+       iIndex -= 4;            /* Adjust for SLMP Library */\r
+       /* Frame sequence number */\r
+       iIndex += 6;\r
+       usFrameSequenceNumber = SHIFT_L8( pucData[iIndex + 1] ) + SHIFT_L0( pucData[iIndex] );\r
+\r
+       /* Make the Cyclic Data response data. */\r
+       iIndex = 0;\r
+       /* Protocol Version */\r
+       aucSendData[iIndex    ] = SHIFT_R0(CCIEF_BASIC_PROTCOL_VERSION);\r
+       aucSendData[iIndex + 1] = SHIFT_R8(CCIEF_BASIC_PROTCOL_VERSION);\r
+       iIndex += 2;\r
+       /* Error code */\r
+       aucSendData[iIndex    ] = SHIFT_R0(0);\r
+       aucSendData[iIndex + 1] = SHIFT_R8(0);\r
+       iIndex += 2;\r
+       /* Offset address (Cyclic information) */\r
+       aucSendData[iIndex    ] = SHIFT_R0(RESPONSE_OFFSET_ADDRESS_CYCLIC_INFO);\r
+       aucSendData[iIndex + 1] = SHIFT_R8(RESPONSE_OFFSET_ADDRESS_CYCLIC_INFO);\r
+       iIndex += 2;\r
+       /* Offset address (Reserved) */\r
+       memset( &aucSendData[iIndex], 0, 14 );\r
+       iIndex += 14;\r
+\r
+       /* Notify information */\r
+       memcpy( &aucSendData[iIndex], &CyclicData.SlaveNotifyInfo, sizeof( CyclicData.SlaveNotifyInfo ));\r
+\r
+       /* Cyclic information */\r
+       iIndex = RESPONSE_OFFSET_ADDRESS_CYCLIC_INFO;\r
+       /* Slave id */\r
+       memcpy( &aucSendData[iIndex], &CyclicData.ulId, sizeof(uint32_t) );\r
+       iIndex += 4;\r
+       /* Group number */\r
+       aucSendData[iIndex    ] = CyclicData.ucGroupNumber;\r
+       iIndex += 1;\r
+       /* Reserved */\r
+       aucSendData[iIndex    ] = 0;\r
+       iIndex += 1;\r
+       /* Frame sequence number */\r
+       aucSendData[iIndex    ] = SHIFT_R0(usFrameSequenceNumber);\r
+       aucSendData[iIndex + 1] = SHIFT_R8(usFrameSequenceNumber);\r
+       iIndex += 2;\r
+       /* Check cyclic state */\r
+       if ( CyclicData.iCyclicState == CCIEF_BASIC_CYCLIC_DATA_VALID )\r
+       {       /* Valid the cyclic data */\r
+               /* Sending the cyclic data. */\r
+               memcpy( &aucSendData[iIndex], ausRWr, CCIEF_BASIC_RWW_RWR_SIZE * CyclicData.iOccupiedStationNumber );\r
+               memcpy( &aucSendData[iIndex + (CCIEF_BASIC_RWW_RWR_SIZE * CyclicData.iOccupiedStationNumber)],\r
+                               ausRX, CCIEF_BASIC_RX_RY_SIZE * CyclicData.iOccupiedStationNumber );\r
+       }\r
+       else\r
+       {       /* Invalid the cyclic data */\r
+               memset( &aucSendData[iIndex], 0, (CCIEF_BASIC_RWW_RWR_SIZE + CCIEF_BASIC_RX_RY_SIZE) * CyclicData.iOccupiedStationNumber );\r
+       }\r
+       iIndex += (CCIEF_BASIC_RWW_RWR_SIZE + CCIEF_BASIC_RX_RY_SIZE) * CyclicData.iOccupiedStationNumber;\r
+       \r
+       usSendDataSize = (uint16_t)iIndex;\r
+       /* Sets the SLMP Information for sending. */\r
+       target.ulFrameType = SLMP_RESPONSE_FRAME_TYPE(source->ulFrameType);\r
+       target.usSerialNumber = source->usSerialNumber;\r
+       target.usNetNumber = source->usNetNumber;\r
+       target.usNodeNumber = source->usNodeNumber;\r
+       target.usProcNumber = source->usProcNumber;\r
+       target.usTimer = source->usTimer;\r
+       target.usCommand = source->usCommand;\r
+       target.usSubCommand = source->usSubCommand;\r
+       target.usDataLength = usSendDataSize;\r
+       target.usEndCode = CCIEF_BASIC_SLAVE_ERR_OK;\r
+       target.pucData = aucSendData;\r
+\r
+       /* Make a packet stream using the SLMP library. */\r
+       iErrCode = SLMP_MakePacketStream( target.ulFrameType, &target, aucSendPacket );\r
+       if( iErrCode != SLMP_ERR_OK )\r
+       {\r
+               /* Could not be created. */\r
+               return CCIEF_BASIC_SLAVE_ERR_OK;\r
+       }\r
+\r
+       /* Send the packet for cyclic response. */\r
+       iErrCode = socket_send( sock, aucSendPacket, usSendDataSize + SLMP_HEADER_SIZE(target.ulFrameType),\r
+                                                                        ulSendAddr, usSendPortNumber );\r
+       if ( iErrCode != SOCKET_ERR_OK )\r
+       {\r
+               return iErrCode;\r
+       }\r
+\r
+       return CCIEF_BASIC_SLAVE_ERR_OK;\r
+}\r
+\r
+/************************************************************************************/\r
+/* This is an user defined function for sending Cyclic Data error response.                    */\r
+/************************************************************************************/\r
+#ifdef _WIN32\r
+int ccief_basic_slave_send_cyclic_data_error( SOCKET sock, const SLMP_INFO *source, uint16_t usEndCode, uint32_t ulSendAddr, uint16_t usSendPortNumber )\r
+#elif __linux__\r
+int ccief_basic_slave_send_cyclic_data_error( int sock, const SLMP_INFO *source, uint16_t usEndCode, uint32_t ulSendAddr, uint16_t usSendPortNumber )\r
+#endif\r
+{\r
+       SLMP_INFO       target;                                 /* SLMP Infomation for sending packet*/\r
+       uint8_t         *pucData;\r
+       uint8_t         ucGroupNumber;                  /* Group number */\r
+       uint16_t        usFrameSequenceNumber;  /* Frame sequence number */\r
+       int                     iIndex;\r
+       uint16_t        usSendDataSize;\r
+       int                     iErrCode = 0;\r
+       int                     iOccupiedStationNumber;\r
+\r
+       /* Get Cyclic Data pointer */\r
+       pucData = source->pucData;\r
+       /* Cyclic information */\r
+       iIndex = SHIFT_L8( pucData[5] ) + SHIFT_L0( pucData[4] );\r
+       /* Group number */\r
+       ucGroupNumber = pucData[iIndex];\r
+       iIndex += 2;\r
+       /* Frame sequence number */\r
+       usFrameSequenceNumber = SHIFT_L8( pucData[iIndex + 1] ) + SHIFT_L0( pucData[iIndex] );\r
+       /* Occupied station number*/\r
+       if( CyclicData.iFirst == 1 )\r
+       {\r
+               /* Control master station is determined */\r
+               iOccupiedStationNumber = CyclicData.iOccupiedStationNumber;\r
+       }\r
+       else\r
+       {\r
+               /* Control master station is undetermined */\r
+               iOccupiedStationNumber = 1;\r
+       }\r
+\r
+       /* Make the Cyclic Data response data. */\r
+       iIndex = 0;\r
+       /* Protocol Version */\r
+       aucSendData[iIndex    ] = SHIFT_R0(CCIEF_BASIC_PROTCOL_VERSION);\r
+       aucSendData[iIndex + 1] = SHIFT_R8(CCIEF_BASIC_PROTCOL_VERSION);\r
+       iIndex += 2;\r
+       /* End code */\r
+       aucSendData[iIndex    ] = SHIFT_R0(usEndCode);\r
+       aucSendData[iIndex + 1] = SHIFT_R8(usEndCode);\r
+       iIndex += 2;\r
+       /* Offset address (Cyclic information) */\r
+       aucSendData[iIndex    ] = SHIFT_R0(RESPONSE_OFFSET_ADDRESS_CYCLIC_INFO);\r
+       aucSendData[iIndex + 1] = SHIFT_R8(RESPONSE_OFFSET_ADDRESS_CYCLIC_INFO);\r
+       iIndex += 2;\r
+       /* Offset address (Reserved) */\r
+       memset( &aucSendData[iIndex], 0, 14 );\r
+       iIndex += 14;\r
+\r
+       /* Notify information */\r
+       memcpy( &aucSendData[iIndex], &CyclicData.SlaveNotifyInfo, sizeof( CyclicData.SlaveNotifyInfo ));\r
+\r
+       /* Cyclic information */\r
+       iIndex = RESPONSE_OFFSET_ADDRESS_CYCLIC_INFO;\r
+       /* Slave id */\r
+       memcpy( &aucSendData[iIndex], &CyclicData.ulId, sizeof(uint32_t) );\r
+       iIndex += 4;\r
+       /* Group number */\r
+       aucSendData[iIndex    ] = ucGroupNumber;\r
+       iIndex += 1;\r
+       /* Reserve */\r
+       aucSendData[iIndex    ] = 0;\r
+       iIndex += 1;\r
+       /* Frame sequence number */\r
+       aucSendData[iIndex    ] = SHIFT_R0(usFrameSequenceNumber);\r
+       aucSendData[iIndex + 1] = SHIFT_R8(usFrameSequenceNumber);\r
+       iIndex += 2;\r
+       /* Cyclic data */\r
+       memset( &aucSendData[iIndex], 0, iOccupiedStationNumber * ( CCIEF_BASIC_RWW_RWR_SIZE + CCIEF_BASIC_RX_RY_SIZE ) );\r
+       iIndex += iOccupiedStationNumber * ( CCIEF_BASIC_RWW_RWR_SIZE + CCIEF_BASIC_RX_RY_SIZE );\r
+\r
+       usSendDataSize = (uint16_t)iIndex;\r
+       /* Sets the SLMP Information for sending. */\r
+       target.ulFrameType = SLMP_RESPONSE_FRAME_TYPE(source->ulFrameType);\r
+       target.usSerialNumber = source->usSerialNumber;\r
+       target.usNetNumber = source->usNetNumber;\r
+       target.usNodeNumber = source->usNodeNumber;\r
+       target.usProcNumber = source->usProcNumber;\r
+       target.usTimer = source->usTimer;\r
+       target.usCommand = source->usCommand;\r
+       target.usSubCommand = source->usSubCommand;\r
+       target.usDataLength = usSendDataSize;\r
+       target.usEndCode = CCIEF_BASIC_SLAVE_ERR_OK;\r
+       target.pucData = aucSendData;\r
+\r
+       /* Make a packet stream using the SLMP library. */\r
+       iErrCode = SLMP_MakePacketStream( target.ulFrameType, &target, aucSendPacket );\r
+       if( iErrCode != SLMP_ERR_OK )\r
+       {\r
+               /* Could not be created. */\r
+               return CCIEF_BASIC_SLAVE_ERR_OK;\r
+       }\r
+\r
+       /* Send the packet for cyclic response. */\r
+       iErrCode = socket_send( sock, aucSendPacket, usSendDataSize + SLMP_HEADER_SIZE(target.ulFrameType),\r
+                                                                        ulSendAddr, usSendPortNumber );\r
+       if ( iErrCode != SOCKET_ERR_OK )\r
+       {\r
+               return iErrCode;\r
+       }\r
+\r
+       return CCIEF_BASIC_SLAVE_ERR_OK;\r
+}\r
+\r
+/************************************************************************************/\r
+/* This is an user defined function for disconnection the master.                                      */\r
+/************************************************************************************/\r
+void ccief_basic_slave_disconnection( void )\r
+{\r
+       /* Execute of the callback function */\r
+       if ( pUserCyclicDisconnectionFunc != NULL )\r
+       {\r
+               pUserCyclicDisconnectionFunc();\r
+       }\r
+       /* Initialization of the cyclic data information */\r
+       CyclicData.iFirst = 0;\r
+       CyclicData.ulMasterId = 0;\r
+       CyclicData.ucGroupNumber = 0;\r
+       CyclicData.usParameterIdNumber = 0;\r
+       /* Check the disconnection timer */\r
+       if ( CyclicData.iDisconnectionTimer != 0 )\r
+       {\r
+               /* Stop the disconnection timer */\r
+               timer_stop( CyclicData.iDisconnectionTimerId );\r
+       }\r
+       CyclicData.iDisconnectionTimer = 0;\r
+\r
+       return;\r
+}\r
+\r
+/************************************************************************************/\r
+/* This is an user defined function of timeout for the disconnection timer.                    */\r
+/************************************************************************************/\r
+void ccief_basic_slave_disconnection_timer_timeout( int iId, void *pCallbackArg )\r
+{\r
+       /* Disconnection the master */\r
+       ccief_basic_slave_disconnection();\r
+\r
+       return;\r
+}\r
diff --git a/CCIEF-BASIC_Slave/sample/src/SLMP_SERVER.c b/CCIEF-BASIC_Slave/sample/src/SLMP_SERVER.c
new file mode 100644 (file)
index 0000000..b91f969
--- /dev/null
@@ -0,0 +1,1587 @@
+/*\r
+ * Copyright (C) 2017 Texas Instruments Incorporated - http://www.ti.com/\r
+ * Copyright (C) 2016 CC-Link Partner Association -http://am.cc-link.org/\r
+ * \r
+ * \r
+ *  Redistribution and use in source and binary forms, with or without \r
+ *  modification, are permitted provided that the following conditions \r
+ *  are met:\r
+ *\r
+ *    Redistributions of source code must retain the above copyright \r
+ *    notice, this list of conditions and the following disclaimer.\r
+ *\r
+ *    Redistributions in binary form must reproduce the above copyright\r
+ *    notice, this list of conditions and the following disclaimer in the \r
+ *    documentation and/or other materials provided with the   \r
+ *    distribution.\r
+ *\r
+ *    Neither the name of Texas Instruments Incorporated nor the names of\r
+ *    its contributors may be used to endorse or promote products derived\r
+ *    from this software without specific prior written permission.\r
+ *\r
+ *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \r
+ *  "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT \r
+ *  LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\r
+ *  A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT \r
+ *  OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, \r
+ *  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT \r
+ *  LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
+ *  DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\r
+ *  THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT \r
+ *  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE \r
+ *  OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
+ *\r
+*/\r
+\r
+#include "SLMP.h"\r
+#include "CCIEF_BASIC_SLAVE.h"\r
+#include "SLMP_SERVER.h"\r
+#include "SOCKET.h"\r
+#include "TIMER.h"\r
+\r
+/************************************************************************************/\r
+/* The following is an user defined main program. This main program is one of a                */\r
+/* sample in the Windows OS and Intel x86 CPU. Please rewrite if necessary.                    */\r
+/* This main program is one of a sample in the Linux. Please rewrite if necessary.     */\r
+/*                                                                                                                                                                     */\r
+/* This sample program for SLMP Server Application.                                                                    */\r
+/*                                                                                                                                                                     */\r
+/* If you would like to execute another process, you may change "user_service"         */\r
+/* function.                                                                                                                                           */\r
+/************************************************************************************/\r
+\r
+#ifdef _WIN32\r
+#include <stdint.h>\r
+#include <winsock2.h>\r
+#include <Ws2tcpip.h>\r
+#elif __linux__\r
+#include <netinet/in.h>\r
+#endif\r
+#include <stdio.h>\r
+#include <string.h>\r
+\r
+/*[ Structure for sample code ]*/\r
+typedef struct \r
+{\r
+       int                     iTimerFlag;                     /* Flag for response wait timer.(0:Not start timer  1:Starting timer) */\r
+       int                     iTimerId;                       /* Id for response wait timer */\r
+       SLMP_INFO       source;                         /* Information of SLMP source */\r
+       uint32_t        ulSendAddr;                     /* Address of the target */\r
+       uint16_t        usPortNumber;           /* Port number of the target */\r
+       uint8_t         *pucSendData;           /* Send response data */\r
+       uint16_t        usSendDataSize;         /* Size of the send response data */\r
+#ifdef _WIN32\r
+       SOCKET          sock;                           /* Socket for sending response */\r
+#elif __linux__\r
+       int                     sock;                           /* Socket for sending response */\r
+#endif\r
+} SLMP_SERVER_SEND_RESPONSE_INFO;\r
+\r
+#ifdef _WIN32\r
+static SOCKET sock_server;                     /* SCOKET for SLMP Server */\r
+static SOCKET sock_ccief_basic;                /* SCOKET for CC-LinkIEF Basic */\r
+static SOCKET sock_ccief_paramset;     /* SCOKET for parameter set */\r
+#elif __linux__\r
+static int             sock_server;                    /* SCOKET for SLMP Server */\r
+static int             sock_ccief_basic;               /* SCOKET for CC-LinkIEF Basic */\r
+static int             sock_ccief_paramset;    /* SCOKET for parameter set */\r
+#endif\r
+\r
+static uint8_t aucSendData[SLMP_SERVER_MAX_FRAME_SIZE];                /* Data for sending packet */\r
+static uint8_t aucRecvData[SLMP_SERVER_MAX_FRAME_SIZE];                /* Data for receiving packet */\r
+static uint8_t aucSendPacket[SLMP_SERVER_MAX_FRAME_SIZE];      /* Buffer for sending packet */\r
+static uint8_t aucRecvPacket[SLMP_SERVER_MAX_FRAME_SIZE];      /* Buffer for receiving packet */\r
+static uint8_t aucSendDataNodeSearch[SLMP_SERVER_MAX_FRAME_SIZE];      /* Buffer for sending packet of NodeSearch */\r
+\r
+static SLMP_SERVER_INFO        ServerInfo;\r
+\r
+static int                             iParameterSetFlag = 0;          /* 0:Enable ParameterSet  1:Disable ParameterSet */\r
+static unsigned long   ulParameterSetTimer = 0;        /* Timer-value of after executing ParameterSet */\r
+\r
+static SLMP_SERVER_CALLBACK_IPADDRESS_SET_BASIC                pUserIpAddresSetFunc;\r
+static SLMP_SERVER_CALLBACK_PARAMETER_GET                      pUserSlaveParameterGetFunc;\r
+static SLMP_SERVER_CALLBACK_PARAMETER_SET                      pUserSlaveParameterSetFunc;\r
+static SLMP_SERVER_CALLBACK_PARAMETER_SET_END          pUserSlaveParameterSetEndFunc;\r
+static SLMP_SERVER_CALLBACK_REMOTE_RESET                       pUserRemoteResetFunc;\r
+\r
+/*[ Service Function Table ]*/\r
+static SLMP_SERVICE service_table[] =\r
+{\r
+       { SLMP_COMMAND_MEMORY_READ, slmp_server_memory_read },\r
+       { SLMP_COMMAND_MEMORY_WRITE, slmp_server_memory_write },\r
+       { SLMP_COMMAND_DEVICE_INFO_COMPARE, slmp_server_device_info_compare },\r
+       { SLMP_COMMAND_PARAMETER_GET, slmp_server_parameter_get },\r
+       { SLMP_COMMAND_PARAMETER_SET, slmp_server_parameter_set },\r
+       { SLMP_COMMAND_PARAMETER_SET_START, slmp_server_parameter_set_start },\r
+       { SLMP_COMMAND_PARAMETER_SET_END, slmp_server_parameter_set_end },\r
+       { SLMP_COMMAND_PARAMETER_SET_CANCEL, slmp_server_parameter_set_cancel },\r
+       { SLMP_COMMAND_REMOTE_READ_TYPE_NAME, slmp_server_read_type_name },\r
+       { SLMP_COMMAND_REMOTE_RESET, slmp_server_remote_reset },\r
+       /* Add the other Service here. */\r
+};\r
+\r
+/*[ Service Function Table for CC-LinkIEF Basic]*/\r
+static SLMP_SERVICE service_table_basic[] =\r
+{\r
+       { SLMP_COMMAND_NODE_SEARCH_BASIC, slmp_server_node_search_basic },\r
+       { SLMP_COMMAND_IP_ADDRESS_SET_BASIC, slmp_server_ip_address_set_basic },\r
+};\r
+\r
+/*[ Service Function Table use in parameter set port]*/\r
+static SLMP_SERVICE service_table_paramset[] =\r
+{\r
+       { SLMP_COMMAND_COMMUNICATION_SETTING_GET, slmp_server_communication_setting_get },\r
+};\r
+\r
+/* Information for NodeSearch response */\r
+SLMP_SERVER_SEND_RESPONSE_INFO NodeSearchResponseInfo;\r
+\r
+/* Definition of Internal API */\r
+#ifdef _WIN32\r
+static int slmp_server_slmp_send_response( SOCKET sock, const SLMP_INFO *source, uint32_t ulSendAddr, uint16_t usSendPortNumber,\r
+                                                                                  uint8_t *pucSendData, uint16_t usSendDataSize );\r
+static int slmp_server_slmp_send_err_response( SOCKET sock, const SLMP_INFO *source, uint16_t usEndCode, uint32_t ulSendAddr, uint16_t usSendPortNumber );\r
+#elif __linux__\r
+static int slmp_server_slmp_send_response( int sock, const SLMP_INFO *source, uint32_t ulSendAddr, uint16_t usSendPortNumber,\r
+                                                                                  uint8_t *pucSendData, uint16_t usSendDataSize );\r
+static int slmp_server_slmp_send_err_response( int sock, const SLMP_INFO *source, uint16_t usEndCode, uint32_t ulSendAddr, uint16_t usSendPortNumber );\r
+#endif\r
+static void slmp_server_node_search_send_response_timeout( int iId, void *pCallbackArg );\r
+\r
+/************************************************************************************/\r
+/* This is an user defined function for initialization of the SLMP Server.                     */\r
+/************************************************************************************/\r
+int slmp_server_initialize( SLMP_SERVER_INFO *pServerInfo, SLMP_SERVER_CALLBACK_IPADDRESS_SET_BASIC pIpAddresSetFunc,\r
+                                                       SLMP_SERVER_CALLBACK_PARAMETER_GET pParameterGetFunc, SLMP_SERVER_CALLBACK_PARAMETER_SET pParameterSetFunc,\r
+                                                       SLMP_SERVER_CALLBACK_PARAMETER_SET_END pParameterSetEndFunc, SLMP_SERVER_CALLBACK_REMOTE_RESET pRemoteResetFunc )\r
+{\r
+       int iErrCode = 0;\r
+\r
+       /* Getting the information of SLMP Server */\r
+       memcpy( &ServerInfo, pServerInfo, sizeof( ServerInfo ) );\r
+\r
+       /* Initialization of socket */\r
+       /* for User port */\r
+       iErrCode = socket_initialize( &sock_server, ServerInfo.ulIpAddress, pServerInfo->usPortNumber );\r
+       if( iErrCode !=SOCKET_ERR_OK )\r
+       {\r
+               return iErrCode;\r
+       }\r
+       /* for CC-LinkIEF Basic port */\r
+       iErrCode = socket_initialize( &sock_ccief_basic, ServerInfo.ulIpAddress, SLMP_SERVER_PORT_NUMBER );\r
+       if( iErrCode !=SOCKET_ERR_OK )\r
+       {\r
+               return iErrCode;\r
+       }\r
+       /* for parameter get port */\r
+       iErrCode = socket_initialize( &sock_ccief_paramset, ServerInfo.ulIpAddress, SLMP_SERVER_PORT_NUMBER_PARAMSET );\r
+       if( iErrCode !=SOCKET_ERR_OK )\r
+       {\r
+               return iErrCode;\r
+       }\r
+\r
+       /* Callback function for exectute user ParameterSetting */\r
+       pUserIpAddresSetFunc = pIpAddresSetFunc;\r
+       pUserSlaveParameterGetFunc = pParameterGetFunc;\r
+       pUserSlaveParameterSetFunc = pParameterSetFunc;\r
+       pUserSlaveParameterSetEndFunc = pParameterSetEndFunc;\r
+       pUserRemoteResetFunc = pRemoteResetFunc;\r
+\r
+       /* Sets the ParameterSet Flag Enabled */ \r
+       iParameterSetFlag = 0;\r
+\r
+       /* Initialization of NodeSearch response information */\r
+       NodeSearchResponseInfo.iTimerFlag = 0;\r
+\r
+       return SLMP_SERVER_ERR_OK;\r
+}\r
+\r
+/************************************************************************************/\r
+/* This is an user defined function for termination of the SLMP Server.                                */\r
+/************************************************************************************/\r
+void slmp_server_terminate( void )\r
+{\r
+       /* Termination of socket */\r
+       socket_terminate( sock_server );\r
+\r
+       return;\r
+}\r
+\r
+/************************************************************************************/\r
+/* This is an user defined function for main of the SLMP Server.                                       */\r
+/************************************************************************************/\r
+int slmp_server_main( void )\r
+{\r
+       int                                             iErrCode = 0;\r
+\r
+       /* Received at the user port */\r
+       iErrCode = slmp_server_user_port();\r
+       if ( iErrCode != SLMP_SERVER_ERR_OK )\r
+       {\r
+               return iErrCode;\r
+       }\r
+\r
+       /* Received at the CC-Link IEF Basic port */\r
+       iErrCode = slmp_server_basic_port();\r
+       if ( iErrCode != SLMP_SERVER_ERR_OK )\r
+       {\r
+               return iErrCode;\r
+       }\r
+       /* Received at the parameter set port */\r
+       iErrCode = slmp_server_paramset_port();\r
+       if ( iErrCode != SLMP_SERVER_ERR_OK )\r
+       {\r
+               return iErrCode;\r
+       }\r
+\r
+       return SLMP_SERVER_ERR_OK;\r
+\r
+}\r
+\r
+/************************************************************************************/\r
+/* This is an user defined function for received at the user port of the SLMP          */\r
+/* Server.                                                                                                                                                     */\r
+/************************************************************************************/\r
+int slmp_server_user_port( void )\r
+{\r
+       SLMP_INFO                               source;                 /* SLMP Infomation for received packet */\r
+       int                                             iErrCode = 0;\r
+       uint32_t                                ulRecvAddr;\r
+       uint16_t                                usRecvPortNumber;\r
+       struct in_addr                  addrSender;\r
+       int_fast8_t                             Ipaddr[16];\r
+#ifdef _WIN32\r
+#elif __linux__\r
+       uint32_t                                ulMyNetAddress;\r
+       uint32_t                                ulOtherNetAddress;\r
+#endif\r
+\r
+       /* Receive a request packet. */\r
+       iErrCode = socket_recv( sock_server, aucRecvPacket, sizeof( aucRecvPacket ), &ulRecvAddr, &usRecvPortNumber );\r
+       if ( iErrCode != SLMP_SERVER_ERR_OK )\r
+       {\r
+               if ( iErrCode == SOCKET_ERR_NO_RECEIVABLE )\r
+               {\r
+                       return SLMP_SERVER_ERR_OK;\r
+               }\r
+               else\r
+               {\r
+                       return iErrCode;\r
+               }\r
+       }\r
+\r
+#ifdef _WIN32\r
+#elif __linux__\r
+       ulMyNetAddress = ( ServerInfo.ulIpAddress & ServerInfo.ulSubnetMask );\r
+       ulOtherNetAddress = ( ulRecvAddr & ServerInfo.ulSubnetMask );\r
+\r
+       /* Other network broadcast break*/\r
+       if( ulMyNetAddress != ulOtherNetAddress )\r
+       {\r
+               return SLMP_SERVER_ERR_OK;\r
+       }\r
+#endif\r
+\r
+       /* Sets the SLMP Information for receiving. */\r
+       source.pucData = aucRecvData;\r
+\r
+       /* Get the SLMP Information from the request packet using the SLMP library. */\r
+       iErrCode = SLMP_GetSlmpInfo( &source, aucRecvPacket );\r
+       if ( iErrCode != SLMP_ERR_OK )\r
+       {\r
+               printf("ERR : SLMP_GetSlmpInfo  %d\n",iErrCode);\r
+               return SLMP_SERVER_ERR_OK;\r
+       }\r
+\r
+       /* Check the frame type */\r
+       if( (source.ulFrameType == SLMP_FTYPE_BIN_REQ_ST) || (source.ulFrameType == SLMP_FTYPE_BIN_REQ_MT) )\r
+       {       /* Request */\r
+               /* Display the received packet information. */\r
+#ifdef _WIN32\r
+               addrSender.S_un.S_addr = htonl(ulRecvAddr);\r
+#elif __linux__\r
+               addrSender.s_addr = htonl(ulRecvAddr);\r
+#endif\r
+               inet_ntop(AF_INET, &addrSender, Ipaddr, sizeof(Ipaddr) );\r
+               printf("SLMP: Receive: %-15s:%-5u  Command: %04X  Subcommand: %04X\n", Ipaddr, usRecvPortNumber,source.usCommand,source.usSubCommand);\r
+\r
+               /* Execute a request service. */\r
+               iErrCode = slmp_server_service( sock_server, &source, ulRecvAddr, usRecvPortNumber, service_table, (sizeof( service_table ) / sizeof( service_table[0] )) );\r
+               if ( iErrCode != SLMP_SERVER_ERR_OK )\r
+               {\r
+                       printf("ERR : SLMP Service  %d\n",iErrCode);\r
+                       return SLMP_SERVER_ERR_OK;\r
+               }\r
+       }\r
+\r
+       return SLMP_SERVER_ERR_OK;\r
+}\r
+\r
+/************************************************************************************/\r
+/* This is an user defined function for received at the CC-LinkIEF Basic port of       */\r
+/* the SLMP Server.                                                                                                                            */\r
+/************************************************************************************/\r
+int slmp_server_basic_port( void )\r
+{\r
+       SLMP_INFO                               source;                 /* SLMP Infomation for received packet */\r
+       int                                             iErrCode = 0;\r
+       uint32_t                                ulRecvAddr;\r
+       uint16_t                                usRecvPortNumber;\r
+       int_fast8_t                             Ipaddr[16];\r
+       struct in_addr                  addrSender;\r
+\r
+       /* Receive a request packet. */\r
+       iErrCode = socket_recv( sock_ccief_basic, aucRecvPacket, sizeof( aucRecvPacket ), &ulRecvAddr, &usRecvPortNumber );\r
+       if ( iErrCode != SLMP_SERVER_ERR_OK )\r
+       {\r
+               if ( iErrCode == SOCKET_ERR_NO_RECEIVABLE )\r
+               {\r
+                       return SLMP_SERVER_ERR_OK;\r
+               }\r
+               else\r
+               {\r
+                       return iErrCode;\r
+               }\r
+       }\r
+\r
+       /* Sets the SLMP Information for receiving. */\r
+       source.pucData = aucRecvData;\r
+\r
+       /* Get the SLMP Information from the request packet using the SLMP library. */\r
+       iErrCode = SLMP_GetSlmpInfo( &source, aucRecvPacket );\r
+       if ( iErrCode != SLMP_ERR_OK )\r
+       {\r
+               printf("ERR : SLMP_GetSlmpInfo  %d\n",iErrCode);\r
+               return SLMP_SERVER_ERR_OK;\r
+       }\r
+\r
+       /* Check the frame type */\r
+       if( (source.ulFrameType == SLMP_FTYPE_BIN_REQ_ST) || (source.ulFrameType == SLMP_FTYPE_BIN_REQ_MT) )\r
+       {       /* Request */\r
+               /* Display the received packet information. */\r
+#ifdef _WIN32\r
+               addrSender.S_un.S_addr = htonl(ulRecvAddr);\r
+#elif __linux__\r
+               addrSender.s_addr = htonl(ulRecvAddr);\r
+#endif\r
+               inet_ntop(AF_INET, &addrSender, Ipaddr, sizeof(Ipaddr) );\r
+               printf("SLMP: Receive: %-15s:%-5u  Command: %04X  Subcommand: %04X\n", Ipaddr, usRecvPortNumber,source.usCommand,source.usSubCommand);\r
+\r
+               /* Execute a request service. */\r
+               iErrCode = slmp_server_service( sock_ccief_basic, &source, ulRecvAddr, usRecvPortNumber, service_table_basic, (sizeof( service_table_basic ) / sizeof( service_table_basic[0] )) );\r
+               if ( iErrCode != SLMP_SERVER_ERR_OK )\r
+               {\r
+                       printf("ERR : SLMP Service  %d\n",iErrCode);\r
+                       return SLMP_SERVER_ERR_OK;\r
+               }\r
+       }\r
+\r
+       return SLMP_SERVER_ERR_OK;\r
+\r
+}\r
+\r
+/************************************************************************************/\r
+/* This is an user defined function for received at the parameter set port of          */\r
+/* the SLMP Server.                                                                                                                            */\r
+/************************************************************************************/\r
+int slmp_server_paramset_port( void )\r
+{\r
+       SLMP_INFO                               source;                 /* SLMP Infomation for received packet */\r
+       int                                             iErrCode = 0;\r
+       uint32_t                                ulRecvAddr;\r
+       uint16_t                                usRecvPortNumber;\r
+       int_fast8_t                             Ipaddr[16];\r
+       struct in_addr                  addrSender;\r
+#ifdef _WIN32\r
+#elif __linux__\r
+       uint32_t                                ulMyNetAddress;\r
+       uint32_t                                ulOtherNetAddress;\r
+#endif\r
+\r
+       /* Receive a request packet. */\r
+       iErrCode = socket_recv( sock_ccief_paramset, aucRecvPacket, sizeof( aucRecvPacket ), &ulRecvAddr, &usRecvPortNumber );\r
+       if ( iErrCode != SLMP_SERVER_ERR_OK )\r
+       {\r
+               if ( iErrCode == SOCKET_ERR_NO_RECEIVABLE )\r
+               {\r
+                       return SLMP_SERVER_ERR_OK;\r
+               }\r
+               else\r
+               {\r
+                       return iErrCode;\r
+               }\r
+       }\r
+\r
+#ifdef _WIN32\r
+#elif __linux__\r
+       ulMyNetAddress = ( ServerInfo.ulIpAddress & ServerInfo.ulSubnetMask );\r
+       ulOtherNetAddress = ( ulRecvAddr & ServerInfo.ulSubnetMask );\r
+\r
+       /* Other network broadcast break*/\r
+       if( ulMyNetAddress != ulOtherNetAddress )\r
+       {\r
+               return SLMP_SERVER_ERR_OK;\r
+       }\r
+#endif\r
+\r
+       /* Sets the SLMP Information for receiving. */\r
+       source.pucData = aucRecvData;\r
+\r
+       /* Get the SLMP Information from the request packet using the SLMP library. */\r
+       iErrCode = SLMP_GetSlmpInfo( &source, aucRecvPacket );\r
+       if ( iErrCode != SLMP_ERR_OK )\r
+       {\r
+               printf("ERR : SLMP_GetSlmpInfo  %d\n",iErrCode);\r
+               return SLMP_SERVER_ERR_OK;\r
+       }\r
+\r
+       /* Check the frame type */\r
+       if( (source.ulFrameType == SLMP_FTYPE_BIN_REQ_ST) || (source.ulFrameType == SLMP_FTYPE_BIN_REQ_MT) )\r
+       {       /* Request */\r
+               /* Display the received packet information. */\r
+#ifdef _WIN32\r
+               addrSender.S_un.S_addr = htonl(ulRecvAddr);\r
+#elif __linux__\r
+               addrSender.s_addr = htonl(ulRecvAddr);\r
+#endif\r
+               inet_ntop(AF_INET, &addrSender, Ipaddr, sizeof(Ipaddr) );\r
+               printf("SLMP: Receive: %-15s:%-5u  Command: %04X  Subcommand: %04X\n", Ipaddr ,usRecvPortNumber,source.usCommand,source.usSubCommand);\r
+\r
+               /* Execute a request service. */\r
+               iErrCode = slmp_server_service( sock_ccief_basic, &source, ulRecvAddr, usRecvPortNumber, service_table_paramset, (sizeof( service_table_paramset ) / sizeof( service_table_paramset[0] )) );\r
+               if ( iErrCode != SLMP_SERVER_ERR_OK )\r
+               {\r
+                       printf("ERR : SLMP Service  %d\n",iErrCode);\r
+                       return SLMP_SERVER_ERR_OK;\r
+               }\r
+       }\r
+\r
+       return SLMP_SERVER_ERR_OK;\r
+\r
+}\r
+\r
+/************************************************************************************/\r
+/* This is an user defined function for setting the status of the SLMP Server.         */\r
+/************************************************************************************/\r
+void slmp_server_set_status( uint16_t usStatus )\r
+{\r
+       ServerInfo.usStatus = usStatus;\r
+\r
+       return;\r
+}\r
+\r
+/************************************************************************************/\r
+/* This is an user defined function for sending SLMP frame.                                                    */\r
+/************************************************************************************/\r
+#ifdef _WIN32\r
+int slmp_server_slmp_send_response( SOCKET sock, const SLMP_INFO *source, uint32_t ulSendAddr, uint16_t usSendPortNumber,\r
+                                                                       uint8_t *pucSendData, uint16_t usSendDataSize )\r
+\r
+#elif __linux__\r
+int slmp_server_slmp_send_response( int sock, const SLMP_INFO *source, uint32_t ulSendAddr, uint16_t usSendPortNumber,\r
+                                                                       uint8_t *pucSendData, uint16_t usSendDataSize )\r
+#endif\r
+{\r
+       static SLMP_INFO        target;                 /* SLMP Infomation for sending packet*/\r
+       int                                     iErrCode = 0;\r
+       struct in_addr          addrSender;\r
+       int_fast8_t                     Ipaddr[16];\r
+\r
+       /* Sets the SLMP Information for sending. */\r
+       target.ulFrameType = SLMP_RESPONSE_FRAME_TYPE(source->ulFrameType);\r
+       target.usSerialNumber = source->usSerialNumber;\r
+       target.usNetNumber = source->usNetNumber;\r
+       target.usNodeNumber = source->usNodeNumber;\r
+       target.usProcNumber = source->usProcNumber;\r
+       target.usTimer = source->usTimer;\r
+       target.usCommand = source->usCommand;\r
+       target.usSubCommand = source->usSubCommand;\r
+       target.usDataLength = usSendDataSize;\r
+       target.usEndCode = SLMP_ERR_OK;\r
+       target.pucData = pucSendData;\r
+\r
+       /* Make a packet stream using the SLMP library. */\r
+       iErrCode = SLMP_MakePacketStream( target.ulFrameType, &target, aucSendPacket );\r
+       if ( iErrCode != SLMP_ERR_OK )\r
+       {\r
+               printf("ERR : SLMP_MakePacketStream  %d\n", iErrCode);\r
+               return SLMP_SERVER_ERR_OK;\r
+       }\r
+\r
+       /* Send the packet for service response. */\r
+       iErrCode = socket_send( sock, aucSendPacket, usSendDataSize + SLMP_HEADER_SIZE(target.ulFrameType), ulSendAddr, usSendPortNumber );\r
+       if( iErrCode != SOCKET_ERR_OK )\r
+       {\r
+               return iErrCode;\r
+       }\r
+\r
+       /* Display the sending packet information. */\r
+#ifdef _WIN32\r
+       addrSender.S_un.S_addr = htonl(ulSendAddr);\r
+#elif __linux__\r
+       addrSender.s_addr = htonl(ulSendAddr);\r
+#endif\r
+       inet_ntop(AF_INET, &addrSender, Ipaddr, sizeof(Ipaddr) );\r
+       printf("SLMP: Send:    %-15s:%-5u  Endcode: %04X\n", Ipaddr, usSendPortNumber, SLMP_ERR_OK );\r
+\r
+       return SLMP_SERVER_ERR_OK;\r
+}\r
+\r
+/************************************************************************************/\r
+/* This is an user defined function for sending SLMP Error frame.                                      */\r
+/************************************************************************************/\r
+#ifdef _WIN32\r
+int slmp_server_slmp_send_err_response( SOCKET sock, const SLMP_INFO *source, uint16_t usEndCode, uint32_t ulSendAddr, uint16_t usSendPortNumber )\r
+#elif __linux__\r
+int slmp_server_slmp_send_err_response( int sock, const SLMP_INFO *source, uint16_t usEndCode, uint32_t ulSendAddr, uint16_t usSendPortNumber )\r
+#endif\r
+{\r
+       static SLMP_INFO        target;                 /* SLMP Infomation for sending packet*/\r
+       uint8_t                         *pucSendData;\r
+       uint16_t                        usSendDataSize;\r
+       int                                     iErrCode = 0;\r
+       struct in_addr          addrSender;\r
+       int_fast8_t                     Ipaddr[16];\r
+\r
+       pucSendData = aucSendData;\r
+\r
+       /* Make a error response data. */\r
+       iErrCode = SLMP_MakeErrorData( source, aucSendData, &usSendDataSize );\r
+       if( iErrCode != SLMP_ERR_OK )\r
+       {\r
+               printf("ERR : SLMP_MakeErrorData  %d\n", iErrCode);\r
+               return SLMP_SERVER_ERR_OK;\r
+       }\r
+\r
+       /* Sets the SLMP Information for sending. */\r
+       target.ulFrameType = SLMP_RESPONSE_FRAME_TYPE(source->ulFrameType);\r
+       target.usSerialNumber = source->usSerialNumber;\r
+       target.usNetNumber = source->usNetNumber;\r
+       target.usNodeNumber = source->usNodeNumber;\r
+       target.usProcNumber = source->usProcNumber;\r
+       target.usTimer = source->usTimer;\r
+       target.usCommand = source->usCommand;\r
+       target.usSubCommand = source->usSubCommand;\r
+       target.usDataLength = usSendDataSize;\r
+       target.usEndCode = usEndCode;\r
+       target.pucData = pucSendData;\r
+\r
+       /* Make a packet stream using the SLMP library. */\r
+       iErrCode = SLMP_MakePacketStream( target.ulFrameType, &target, aucSendPacket );\r
+       if ( iErrCode != SLMP_ERR_OK )\r
+       {\r
+               printf("ERR : SLMP_MakePacketStream  %d\n", iErrCode);\r
+               return SLMP_SERVER_ERR_OK;\r
+       }\r
+\r
+       /* Send the packet for service response. */\r
+       iErrCode = socket_send( sock, aucSendPacket, usSendDataSize + SLMP_HEADER_SIZE(target.ulFrameType), ulSendAddr, usSendPortNumber );\r
+       if( iErrCode != SOCKET_ERR_OK )\r
+       {\r
+               return iErrCode;\r
+       }\r
+\r
+       /* Display the sending packet information. */\r
+#ifdef _WIN32\r
+       addrSender.S_un.S_addr = htonl(ulSendAddr);\r
+#elif __linux__\r
+       addrSender.s_addr = htonl(ulSendAddr);\r
+#endif\r
+       inet_ntop(AF_INET, &addrSender, Ipaddr, sizeof(Ipaddr) );\r
+       printf("SLMP: Send:    %-15s:%-5u  Endcode: %04X\n", Ipaddr, usSendPortNumber, usEndCode );\r
+\r
+       return SLMP_SERVER_ERR_OK;\r
+}\r
+\r
+/************************************************************************************/\r
+/* This is an user defined function for SLMP service execute. The following is         */\r
+/* one of a sample in the Windows OS. Please rewrite if necessary.                                     */\r
+/* The following is one of a sample in the Linux. Please rewrite if necessary.         */\r
+/************************************************************************************/\r
+#ifdef _WIN32\r
+int slmp_server_service( SOCKET sock, const SLMP_INFO *source, uint32_t ulRecvAddr, uint16_t usRecvPortNumber,\r
+                                                SLMP_SERVICE *pServiceTable, int iServiceTableNumber )\r
+#elif __linux__\r
+int slmp_server_service( int sock, const SLMP_INFO *source, uint32_t ulRecvAddr, uint16_t usRecvPortNumber,\r
+                                                SLMP_SERVICE *pServiceTable, int iServiceTableNumber )\r
+#endif\r
+{\r
+       uint32_t ulDataCode;\r
+       int i, iErrCode = SLMP_SERVER_ERR_UNSUPPORT_SERVICE;\r
+\r
+       /* Gets a data code of the SLMP packet. */\r
+       ulDataCode = SLMP_DATA_CODE(source->ulFrameType);\r
+\r
+       /* Search a service and execute the function. */\r
+       for( i = 0; i < iServiceTableNumber; i ++ )\r
+       {\r
+               if ( source->usCommand == pServiceTable[i].usCommand )\r
+               {\r
+                       /*[ Binary Mode ]*/\r
+                       if ( ulDataCode == SLMP_DATA_CODE_BIN )\r
+                       {\r
+                               /* Execute a service function. */\r
+                               iErrCode = pServiceTable[i].pFunc( sock, source, ulRecvAddr, usRecvPortNumber );\r
+                               break;\r
+                       }\r
+                       /*[ Data Code Error ]*/\r
+                       else\r
+                       {\r
+                               /* Send error response */\r
+                               iErrCode = slmp_server_slmp_send_err_response( sock, source, SLMP_ERR_WRONG_DATA, ulRecvAddr, usRecvPortNumber );\r
+                               break;\r
+                       }\r
+               }\r
+       }\r
+\r
+       return iErrCode;\r
+}\r
+\r
+/************************************************************************************/\r
+/* This is an user defined function for Memory Read (Command: 0613)                                    */\r
+/************************************************************************************/\r
+#ifdef _WIN32\r
+int slmp_server_memory_read( SOCKET sock, const SLMP_INFO *source, uint32_t ulRecvAddr, uint16_t usRecvPortNumber )\r
+#elif __linux__\r
+int slmp_server_memory_read( int sock, const SLMP_INFO *source, uint32_t ulRecvAddr, uint16_t usRecvPortNumber )\r
+#endif\r
+{\r
+       uint8_t *pucRecvData;\r
+       uint8_t *pucSendData;\r
+       uint16_t usSendDataSize;\r
+       int iErrCode;\r
+       unsigned int i;\r
+       unsigned int uiHeadAddress = 0;\r
+       unsigned int uiWordLength = 0;\r
+\r
+       if ( source->usSubCommand != 0x0000 )\r
+       {\r
+               /* Send error response */\r
+               iErrCode = slmp_server_slmp_send_err_response( sock, source, SLMP_ERR_COMMAND_SUBCOMMAND, ulRecvAddr, usRecvPortNumber );\r
+\r
+               return iErrCode;\r
+       }\r
+\r
+       /*[ Request data of Memory Read ]*/\r
+       pucRecvData = source->pucData;\r
+       /* Head Address */\r
+       uiHeadAddress = CONCAT_4BIN(pucRecvData[3], pucRecvData[2], pucRecvData[1], pucRecvData[0]);\r
+       /* Word Length */\r
+       uiWordLength = CONCAT_2BIN(pucRecvData[5], pucRecvData[4]);\r
+\r
+       /* Checked a range of Memory */\r
+       if (( ServerInfo.pusMemory == NULL) || ( ServerInfo.uiMemorySize <= (uiHeadAddress+uiWordLength) ))\r
+       {\r
+               /* Send error response */\r
+               iErrCode = slmp_server_slmp_send_err_response( sock, source, SLMP_ERR_DATA_LENGTH, ulRecvAddr, usRecvPortNumber );\r
+\r
+               return iErrCode;\r
+       }\r
+\r
+       /*[ Response data of Memory Read ]*/\r
+       /* Read data of Memory */\r
+       usSendDataSize = 0;\r
+       pucSendData = aucSendData;\r
+       for( i = 0; i < uiWordLength; i ++ )\r
+       {\r
+               pucSendData[i * 2] = SHIFT_R0(ServerInfo.pusMemory[uiHeadAddress + i]);\r
+               pucSendData[( i * 2 ) + 1] = SHIFT_R8(ServerInfo.pusMemory[uiHeadAddress + i]);\r
+               usSendDataSize += 2;\r
+       }\r
+\r
+       /* Send response data */\r
+       iErrCode = slmp_server_slmp_send_response( sock, source, ulRecvAddr, usRecvPortNumber, pucSendData, usSendDataSize );\r
+\r
+       return iErrCode;\r
+}\r
+\r
+/************************************************************************************/\r
+/* This is an user defined function for Memory Write (Command: 1613)                           */\r
+/************************************************************************************/\r
+#ifdef _WIN32\r
+int slmp_server_memory_write( SOCKET sock, const SLMP_INFO *source, uint32_t ulRecvAddr, uint16_t usRecvPortNumber )\r
+#elif __linux__\r
+int slmp_server_memory_write( int sock, const SLMP_INFO *source, uint32_t ulRecvAddr, uint16_t usRecvPortNumber )\r
+#endif\r
+{\r
+       uint8_t *pucRecvData;\r
+       uint8_t *pucSendData;\r
+       uint16_t usSendDataSize;\r
+       int iErrCode;\r
+       unsigned int i;\r
+       unsigned int uiHeadAddress = 0;\r
+       unsigned int uiWordLength = 0;\r
+\r
+       if ( source->usSubCommand != 0x0000 )\r
+       {\r
+               /* Send error response */\r
+               iErrCode = slmp_server_slmp_send_err_response( sock, source, SLMP_ERR_COMMAND_SUBCOMMAND, ulRecvAddr, usRecvPortNumber );\r
+\r
+               return iErrCode;\r
+       }\r
+\r
+       /*[ Request data of Memory Write ]*/\r
+       pucRecvData = source->pucData;\r
+       /* Head Address */\r
+       uiHeadAddress = CONCAT_4BIN(pucRecvData[3], pucRecvData[2], pucRecvData[1], pucRecvData[0]);\r
+       /* Word Length */\r
+       uiWordLength = CONCAT_2BIN(pucRecvData[5], pucRecvData[4]);\r
+\r
+       /* Checked a range of Memory */\r
+       if (( ServerInfo.pusMemory == NULL) || ( ServerInfo.uiMemorySize <= (uiHeadAddress+uiWordLength) ))\r
+       {\r
+               /* Send error response */\r
+               iErrCode = slmp_server_slmp_send_err_response( sock, source, SLMP_ERR_DATA_LENGTH, ulRecvAddr, usRecvPortNumber );\r
+\r
+               return iErrCode;\r
+       }\r
+\r
+       /* Write data of Memory */\r
+       usSendDataSize = 0;\r
+       pucSendData = aucSendData;\r
+       for( i = 0; i < uiWordLength; i ++ )\r
+       {\r
+               ServerInfo.pusMemory[uiHeadAddress + i] = SHIFT_L8(pucRecvData[(( i * 2 ) + 1) + 6]) + SHIFT_R0(pucRecvData[( i * 2 ) + 6]);\r
+       }\r
+\r
+       usSendDataSize = 0;\r
+\r
+       /* Send response data */\r
+       iErrCode = slmp_server_slmp_send_response( sock, source, ulRecvAddr, usRecvPortNumber, pucSendData, usSendDataSize );\r
+\r
+       return iErrCode;\r
+}\r
+\r
+/************************************************************************************/\r
+/* This is an user defined function for NodeSearch (Command: 0E30)                                     */\r
+/* For CC-Link IEF Basic use.                                                                                                          */\r
+/************************************************************************************/\r
+#ifdef _WIN32\r
+int slmp_server_node_search_basic( SOCKET sock, const SLMP_INFO *source, uint32_t ulRecvAddr, uint16_t usRecvPortNumber )\r
+#elif __linux__\r
+int slmp_server_node_search_basic( int sock, const SLMP_INFO *source, uint32_t ulRecvAddr, uint16_t usRecvPortNumber )\r
+#endif\r
+{\r
+       uint8_t *pucRecvData;\r
+       uint8_t *pucSendData;\r
+       uint16_t usSendDataSize;\r
+       uint32_t ulSendDelayTime;               /* Timer-value of sending a broadcast */\r
+       int iErrCode;\r
+       int iIndex = 0, iLength;\r
+\r
+       /* Subcommand Check */\r
+       if ( source->usSubCommand != 0x0000 )\r
+       {\r
+               /* Send error response */\r
+               iErrCode = slmp_server_slmp_send_err_response( sock, source, SLMP_ERR_COMMAND_SUBCOMMAND, ulRecvAddr, usRecvPortNumber );\r
+\r
+               return iErrCode;\r
+       }\r
+\r
+       /*[ Request data of NodeSearch ]*/\r
+       pucRecvData = source->pucData;\r
+       /* Client MAC Address */\r
+       /* Client IP Address Size */\r
+       /* Client IP Address */\r
+\r
+       /*[ Check the response wait timer ]*/\r
+       if ( NodeSearchResponseInfo.iTimerFlag != 0 )\r
+       {\r
+               /* Destruction of a packet */\r
+               return SLMP_SERVER_ERR_OK;\r
+       }\r
+\r
+       /*[ Response data of NodeSearch ]*/\r
+       pucSendData = aucSendDataNodeSearch;\r
+       /* Client MAC Address */\r
+       memcpy( &pucSendData[0], &pucRecvData[0], 6 );\r
+       iIndex = 6;\r
+       /* Client IP Address Size */\r
+       pucSendData[iIndex] = pucRecvData[6];\r
+       iIndex += 1;\r
+       /* Client IP Address */\r
+       memcpy( &pucSendData[iIndex], &pucRecvData[7], pucRecvData[6] );\r
+       iIndex += pucRecvData[6];\r
+       /* Server MAC Address */\r
+       memcpy( &pucSendData[iIndex], &ServerInfo.aucMacAddress, 6 );\r
+       iIndex += 6;\r
+       /* Server IP Address Size */\r
+       pucSendData[iIndex] = sizeof( ServerInfo.ulIpAddress );\r
+       iIndex += 1;\r
+       /* Server IP Address */\r
+       memcpy( &pucSendData[iIndex], &ServerInfo.ulIpAddress, sizeof( ServerInfo.ulIpAddress ) );\r
+       iIndex += sizeof( ServerInfo.ulIpAddress );\r
+       /* Server Subnet Mask */\r
+       memcpy( &pucSendData[iIndex], &ServerInfo.ulSubnetMask, sizeof( ServerInfo.ulSubnetMask ) );\r
+       iIndex += sizeof( ServerInfo.ulSubnetMask );\r
+       /* Server Default Gateway IP Address(fixed value:0xFFFFFFFF) */\r
+       pucSendData[iIndex    ] = 0xFF;\r
+       pucSendData[iIndex + 1] = 0xFF;\r
+       pucSendData[iIndex + 2] = 0xFF;\r
+       pucSendData[iIndex + 3] = 0xFF;\r
+       iIndex += 4;\r
+       /* Server Hostname Size(fixed value:0) */\r
+       iLength = 0x00;\r
+       pucSendData[iIndex] = 0x00;\r
+       iIndex += 1;\r
+       /* Server Hostname */\r
+       memcpy( &pucSendData[iIndex], ServerInfo.acHostname, iLength );\r
+       iIndex += iLength;\r
+       /* Server Vendor Code */\r
+       memcpy( &pucSendData[iIndex], &ServerInfo.usVenderCode, 2 );\r
+       iIndex += 2;\r
+       /* Server Model Code */\r
+       memcpy( &pucSendData[iIndex], &ServerInfo.ulModelCode, 4 );\r
+       iIndex += 4;\r
+       /* Server Machine Version */\r
+       memcpy( &pucSendData[iIndex], &ServerInfo.usMachineVersion, 2 );\r
+       iIndex += 2;\r
+       /* Target Unit IP Address Size(fixed value:4[IPv4]) */\r
+       pucSendData[iIndex] = 0x04;\r
+       iIndex += 1;\r
+       /* Target Unit IP Address(fixed value:0xFFFFFFFFFF) */\r
+       pucSendData[iIndex    ] = 0xFF;\r
+       pucSendData[iIndex + 1] = 0xFF;\r
+       pucSendData[iIndex + 2] = 0xFF;\r
+       pucSendData[iIndex + 3] = 0xFF;\r
+       iIndex += 4;\r
+       /* Target Port Number(fixed value:0xFFFF) */\r
+       pucSendData[iIndex    ] = 0xFF;\r
+       pucSendData[iIndex + 1] = 0xFF;\r
+       iIndex += 2;\r
+       /* Server Status */\r
+       memcpy( &pucSendData[iIndex], &ServerInfo.usStatus, 2 );\r
+       iIndex += 2;\r
+       /* Server Port Number */\r
+       pucSendData[iIndex    ] = SHIFT_R0(SLMP_SERVER_PORT_NUMBER);\r
+       pucSendData[iIndex + 1] = SHIFT_R8(SLMP_SERVER_PORT_NUMBER);\r
+       iIndex += 2;\r
+       /* Server Protocol(fixed value:1[UDP]) */\r
+       pucSendData[iIndex    ] = 1;\r
+       iIndex += 1;\r
+\r
+       usSendDataSize = (uint16_t)iIndex;\r
+\r
+       /* Set response data information */\r
+       memcpy( &NodeSearchResponseInfo.source, source, sizeof( NodeSearchResponseInfo.source ) );\r
+       inet_pton( AF_INET, "255.255.255.255", &NodeSearchResponseInfo.ulSendAddr );\r
+       NodeSearchResponseInfo.usPortNumber = usRecvPortNumber;\r
+       NodeSearchResponseInfo.pucSendData = pucSendData;\r
+       NodeSearchResponseInfo.usSendDataSize = usSendDataSize;\r
+       NodeSearchResponseInfo.sock = sock;\r
+\r
+       /* Start the response wait timer */\r
+       ulSendDelayTime = timer_broadcast_send_wait_time( SLMP_SERVER_MAX_BROADCAST_SEND_WAIT_TIME );\r
+       timer_start( ulSendDelayTime, &NodeSearchResponseInfo.iTimerId,\r
+                                &slmp_server_node_search_send_response_timeout, (void *)&NodeSearchResponseInfo );\r
+\r
+       NodeSearchResponseInfo.iTimerFlag = 1;\r
+\r
+       return SLMP_SERVER_ERR_OK;\r
+}\r
+\r
+/************************************************************************************/\r
+/* This is an user defined function of timeout for sending NodeSearch response.                */\r
+/************************************************************************************/\r
+void slmp_server_node_search_send_response_timeout( int iId, void *pCallbackArg )\r
+{\r
+       SLMP_SERVER_SEND_RESPONSE_INFO  *pNodeSearchResponseInfo;\r
+\r
+       pNodeSearchResponseInfo = (SLMP_SERVER_SEND_RESPONSE_INFO *)pCallbackArg;\r
+\r
+       /* Send response data */\r
+       (void)slmp_server_slmp_send_response( pNodeSearchResponseInfo->sock, &pNodeSearchResponseInfo->source, pNodeSearchResponseInfo->ulSendAddr, pNodeSearchResponseInfo->usPortNumber,\r
+                                                                                 pNodeSearchResponseInfo->pucSendData, pNodeSearchResponseInfo->usSendDataSize );\r
+\r
+       NodeSearchResponseInfo.iTimerFlag = 0;\r
+\r
+       return;\r
+}\r
+\r
+/************************************************************************************/\r
+/* This is an user defined function for IPAddressSet (Command: 0E31)                           */\r
+/* For CC-Link IEF Basic use.                                                                                                          */\r
+/************************************************************************************/\r
+#ifdef _WIN32\r
+int slmp_server_ip_address_set_basic( SOCKET sock, const SLMP_INFO *source, uint32_t ulRecvAddr, uint16_t usRecvPortNumber )\r
+#elif __linux__\r
+int slmp_server_ip_address_set_basic( int sock, const SLMP_INFO *source, uint32_t ulRecvAddr, uint16_t usRecvPortNumber )\r
+#endif\r
+{\r
+       uint8_t *pucRecvData;\r
+       uint8_t *pucSendData;\r
+       uint16_t usSendDataSize;\r
+       int iErrCode;\r
+       uint32_t ulSendAddr;\r
+       int iIndex = 0;\r
+       uint8_t aucClientMacAddr[6];\r
+       int iIpAddressSize, iHostnameSize;\r
+       uint8_t aucTemp[6];\r
+       uint32_t ulRequestIpAddress, ulRequestSubnetMask, ulRequestDefaultGatewayIPAddress;\r
+\r
+       /* Subcommand Check */\r
+       if ( source->usSubCommand != 0x0000 )\r
+       {\r
+               /* Send error response */\r
+               iErrCode = slmp_server_slmp_send_err_response( sock, source, SLMP_ERR_COMMAND_SUBCOMMAND, ulRecvAddr, usRecvPortNumber );\r
+\r
+               return iErrCode;\r
+       }\r
+\r
+       /*[ Request data of IPAddressSet ]*/\r
+       pucRecvData = source->pucData;\r
+       /* Server MAC Address */\r
+       iIndex = 6 + 1 + pucRecvData[6];\r
+       memcpy( aucTemp, &pucRecvData[iIndex], 6 );\r
+\r
+       /*[ Check Server MAC Address ]*/\r
+       if ( memcmp( ServerInfo.aucMacAddress, aucTemp, sizeof( aucTemp ) ) != 0 )\r
+       {\r
+               /* Destruction of a packet */\r
+               return SLMP_SERVER_ERR_OK;\r
+       }\r
+\r
+       /* Client MAC Address */\r
+       iIndex = 0;\r
+       memcpy( aucClientMacAddr, &pucRecvData[iIndex], 6 );\r
+       iIndex = 6;\r
+       /* Client IP Address Size */\r
+       iIpAddressSize = pucRecvData[iIndex];\r
+       iIndex += 1;\r
+       /* Client IP Address */\r
+       iIndex += iIpAddressSize;\r
+       /* Skip Server MAC Address */\r
+       iIndex += 6;\r
+       /* Server IP Address Size */\r
+       iIpAddressSize = pucRecvData[iIndex];\r
+       iIndex += 1;\r
+       /* Server IP Address */\r
+       memcpy( &ulRequestIpAddress, &pucRecvData[iIndex], iIpAddressSize );\r
+       iIndex += iIpAddressSize;\r
+       /* Server Subnet Mask */\r
+       memcpy( &ulRequestSubnetMask, &pucRecvData[iIndex], iIpAddressSize );\r
+       iIndex += iIpAddressSize;\r
+       /* Server Default Gateway IP Address */\r
+       memcpy( &ulRequestDefaultGatewayIPAddress, &pucRecvData[iIndex], iIpAddressSize );\r
+       iIndex += iIpAddressSize;\r
+       /* Server Hostname Size */\r
+       iHostnameSize = pucRecvData[iIndex];\r
+       iIndex += 1;\r
+       /* Server Hostname */\r
+       /* Do not support */\r
+       iIndex += iHostnameSize;\r
+       /* Target Unit IP Address Size */\r
+       /* Do not support */\r
+       iIpAddressSize = pucRecvData[iIndex];\r
+       iIndex += 1;\r
+       /* Target Unit IP Address */\r
+       /* Do not support */\r
+       iIndex += iIpAddressSize;\r
+       /* Target Port Number */\r
+       /* Do not support */\r
+       iIndex += 2;\r
+       /* Server Protocol */\r
+       /* Do not support */\r
+       iIndex += 1;\r
+\r
+       /*[ Response data of IPAddressSet ]*/\r
+       pucSendData = aucSendData;\r
+       /* Client MAC Address */\r
+       memcpy( &pucSendData[0], aucClientMacAddr, 6 );\r
+       iIndex = 6;\r
+\r
+       usSendDataSize = (uint16_t)iIndex;\r
+\r
+       /* Execute user callback function */\r
+       if ( pUserIpAddresSetFunc != NULL )\r
+       {\r
+               pUserIpAddresSetFunc( ulRequestIpAddress, ulRequestSubnetMask );\r
+       }\r
+\r
+       /* Sets a broadcast address */\r
+       inet_pton( AF_INET, "255.255.255.255", &ulSendAddr );\r
+\r
+       /* Send response data */\r
+       iErrCode = slmp_server_slmp_send_response( sock, source, ulSendAddr, usRecvPortNumber, pucSendData, usSendDataSize );\r
+\r
+       return iErrCode;\r
+}\r
+\r
+/************************************************************************************/\r
+/* This is an user defined function for DeviceInfoCompare (Command: 0E32)                      */\r
+/************************************************************************************/\r
+#ifdef _WIN32\r
+int slmp_server_device_info_compare( SOCKET sock, const SLMP_INFO *source, uint32_t ulRecvAddr, uint16_t usRecvPortNumber )\r
+#elif __linux__\r
+int slmp_server_device_info_compare( int sock, const SLMP_INFO *source, uint32_t ulRecvAddr, uint16_t usRecvPortNumber )\r
+#endif\r
+{\r
+       uint8_t *pucRecvData;\r
+       uint8_t *pucSendData;\r
+       uint16_t usSendDataSize;\r
+       int iErrCode;\r
+       int iIndex = 0;\r
+       uint16_t usCompareTarget;               /* Compare Target  */\r
+       uint16_t usTempVenderCode;              /* Server Vendor Code */\r
+       uint32_t ulTempTypeNameCode;    /* Server Model Code */\r
+       uint16_t usTempVersion;                 /* Server Machine Version */\r
+       uint16_t usCompareResult;               /* Compare Result  */\r
+\r
+       /* Subcommand Check */\r
+       if ( source->usSubCommand != 0x0000 )\r
+       {\r
+               /* Send error response */\r
+               iErrCode = slmp_server_slmp_send_err_response( sock, source, SLMP_ERR_COMMAND_SUBCOMMAND, ulRecvAddr, usRecvPortNumber );\r
+\r
+               return iErrCode;\r
+       }\r
+\r
+       /*[ Request data of DeviceInfoCompare ]*/\r
+       pucRecvData = source->pucData;\r
+       /* Compare Target */\r
+       usCompareTarget = SHIFT_L8(pucRecvData[1])+SHIFT_L0(pucRecvData[0]);\r
+       /* Vendor Code */\r
+       usTempVenderCode = SHIFT_L8(pucRecvData[3])+SHIFT_L0(pucRecvData[2]);\r
+       /* Model Code */\r
+       ulTempTypeNameCode = SHIFT_L24(pucRecvData[7])+SHIFT_L16(pucRecvData[6])+\r
+                                                SHIFT_L8(pucRecvData[5])+SHIFT_L0(pucRecvData[4]);\r
+       /* MachineVersion */\r
+       usTempVersion = SHIFT_L8(pucRecvData[9])+SHIFT_L0(pucRecvData[8]);\r
+\r
+       /*[ Response data of DeviceInfoCompare ]*/\r
+       pucSendData = aucSendData;\r
+       iIndex = 0;\r
+       /* Compare Target */\r
+       memcpy( &pucSendData[iIndex], &usCompareTarget, 2 );\r
+       iIndex += 2;\r
+\r
+       usCompareResult = 0x0000;\r
+       /* Compare the Vendor Code */\r
+       if ( (usCompareTarget & 0x0001) == 0x0001 )\r
+       {\r
+               if ( ServerInfo.usVenderCode != usTempVenderCode )\r
+               {\r
+                       usCompareResult |= 0x0001;\r
+               }\r
+       }\r
+       /* Compare the Model Code */\r
+       if ( (usCompareTarget & 0x0002) == 0x0002 )\r
+       {\r
+               if ( ServerInfo.ulModelCode != ulTempTypeNameCode )\r
+               {\r
+                       usCompareResult |= 0x0002;\r
+               }\r
+       }\r
+       /* Compare the Machine Version */\r
+       if ( (usCompareTarget & 0x0004) == 0x0004 )\r
+       {\r
+               if ( ServerInfo.usMachineVersion != usTempVersion )\r
+               {\r
+                       usCompareResult |= 0x0004;\r
+\r
+                       /* Detailed Information */\r
+                       if ( ServerInfo.usMachineVersion > usTempVersion )\r
+                       {\r
+                               usCompareResult |= 0x4000;\r
+                       }\r
+\r
+                       else if ( ServerInfo.usMachineVersion < usTempVersion )\r
+                       {\r
+                               usCompareResult |= 0x8000;\r
+                       }\r
+\r
+                       else\r
+                       {\r
+                               usCompareResult |= 0xC000;\r
+                       }\r
+               }\r
+       }\r
+       /* Compare Result */\r
+       memcpy( &pucSendData[iIndex], &usCompareResult, 2 );\r
+       iIndex += 2;\r
+\r
+       usSendDataSize = (uint16_t)iIndex;\r
+\r
+       /* Send response data */\r
+       iErrCode = slmp_server_slmp_send_response( sock, source, ulRecvAddr, usRecvPortNumber, pucSendData, usSendDataSize );\r
+\r
+       return iErrCode;\r
+}\r
+\r
+/************************************************************************************/\r
+/* This is an user defined function for ParameterGet (Command: 0E33)                           */\r
+/************************************************************************************/\r
+#ifdef _WIN32\r
+int slmp_server_parameter_get( SOCKET sock, const SLMP_INFO *source, uint32_t ulRecvAddr, uint16_t usRecvPortNumber )\r
+#elif __linux__\r
+int slmp_server_parameter_get( int sock, const SLMP_INFO *source, uint32_t ulRecvAddr, uint16_t usRecvPortNumber )\r
+#endif\r
+{\r
+       uint8_t *pucRecvData;\r
+       uint8_t *pucSendData;\r
+       uint16_t usSendDataSize;\r
+       int iErrCode, iEndCode;\r
+       int i, j;\r
+       int iIndex = 0;\r
+       uint16_t usGetParameter;\r
+       uint16_t ausParameterId[3];\r
+       uint16_t usParameterSize;\r
+       uint8_t *pucParameterData;\r
+\r
+       /* Subcommand Check */\r
+       if ( source->usSubCommand != 0x0000 )\r
+       {\r
+               /* Send error response */\r
+               iErrCode = slmp_server_slmp_send_err_response( sock, source, SLMP_ERR_COMMAND_SUBCOMMAND, ulRecvAddr, usRecvPortNumber );\r
+\r
+               return iErrCode;\r
+       }\r
+\r
+       /*[ Request data of ParameterGet ]*/\r
+       pucRecvData = source->pucData;\r
+       /* Parameter Number */\r
+       usGetParameter = SHIFT_L8(pucRecvData[1])+SHIFT_L0(pucRecvData[0]);\r
+\r
+       if ( (usGetParameter == 0) || (3 < usGetParameter) )\r
+       {\r
+               /* Send error response */\r
+               iErrCode = slmp_server_slmp_send_err_response( sock, source, SLMP_ERR_WRONG_DATA, ulRecvAddr, usRecvPortNumber );\r
+\r
+               return iErrCode;\r
+       }\r
+\r
+       /* ParameterID */\r
+       for( i = 0; i < usGetParameter; i ++ )\r
+       {\r
+               ausParameterId[i] = SHIFT_L8(pucRecvData[( i * 2 + 1 ) + 2])+SHIFT_L0(pucRecvData[( i * 2 ) + 2]);\r
+       }\r
+\r
+       /*[ Response data of ParameterGet ]*/\r
+       pucSendData = aucSendData;\r
+       /* Parameter Number */\r
+       pucSendData[0] = SHIFT_R0(usGetParameter);\r
+       pucSendData[1] = SHIFT_R8(usGetParameter);\r
+       iIndex += 2;\r
+       for( i = 0; i < usGetParameter; i ++ )\r
+       {\r
+               /* Execute user callback function */\r
+               if ( pUserSlaveParameterGetFunc != NULL )\r
+               {\r
+                       iEndCode = pUserSlaveParameterGetFunc( ausParameterId[i], &usParameterSize, &pucParameterData );\r
+                       if ( iEndCode != SLMP_ERR_OK )\r
+                       {\r
+                               /* Send error response */\r
+                               iErrCode = slmp_server_slmp_send_err_response( sock, source, (uint16_t)iEndCode, ulRecvAddr, usRecvPortNumber );\r
+\r
+                               return iErrCode;\r
+                       }\r
+                       /* ParameterID */\r
+                       pucSendData[iIndex] = SHIFT_R0(ausParameterId[i]);\r
+                       pucSendData[iIndex+1] = SHIFT_R8(ausParameterId[i]);\r
+                       /* Parameter Size */\r
+                       pucSendData[iIndex+2] = SHIFT_R0(usParameterSize);\r
+                       pucSendData[iIndex+3] = SHIFT_R8(usParameterSize);\r
+                       /* Parameter Data */\r
+                       for( j = 0; j < usParameterSize; j ++ )\r
+                       {\r
+                               pucSendData[iIndex + 4 + j] = pucParameterData[j];\r
+                       }\r
+                       iIndex += 4 + usParameterSize;\r
+               }\r
+               else\r
+               {\r
+                       /* Send error response */\r
+                       iErrCode = slmp_server_slmp_send_err_response( sock, source, SLMP_ERR_NO_EXIST_PARAM_ID, ulRecvAddr, usRecvPortNumber );\r
+\r
+                       return iErrCode;\r
+               }\r
+       }\r
+\r
+       usSendDataSize = (uint16_t)iIndex;\r
+\r
+       /* Send response data */\r
+       iErrCode = slmp_server_slmp_send_response( sock, source, ulRecvAddr, usRecvPortNumber, pucSendData, usSendDataSize );\r
+\r
+       return iErrCode;\r
+}\r
+\r
+/************************************************************************************/\r
+/* This is an user defined function for ParameterSet (Command: 0E34)                           */\r
+/************************************************************************************/\r
+#ifdef _WIN32\r
+int slmp_server_parameter_set( SOCKET sock, const SLMP_INFO *source, uint32_t ulRecvAddr, uint16_t usRecvPortNumber )\r
+#elif __linux__\r
+int slmp_server_parameter_set( int sock, const SLMP_INFO *source, uint32_t ulRecvAddr, uint16_t usRecvPortNumber )\r
+#endif\r
+{\r
+       uint8_t *pucRecvData;\r
+       uint8_t *pucSendData;\r
+       uint16_t usSendDataSize;\r
+       int iErrCode, iEndCode;\r
+       int i;\r
+       int iIndex = 0;\r
+       uint16_t usSetParameter;\r
+       uint16_t usParameterId;\r
+       uint16_t usParameterSize;\r
+       static uint8_t aucParameterData[512 + 1];\r
+\r
+       /* Subcommand Check */\r
+       if ( source->usSubCommand != 0x0000 )\r
+       {\r
+               /* Send error response */\r
+               iErrCode = slmp_server_slmp_send_err_response( sock, source, SLMP_ERR_COMMAND_SUBCOMMAND, ulRecvAddr, usRecvPortNumber );\r
+\r
+               return iErrCode;\r
+       }\r
+\r
+       /* Check the ParameterSet Start */ \r
+       if ( iParameterSetFlag == 0 )\r
+       {\r
+               /* Send error response */\r
+               iErrCode = slmp_server_slmp_send_err_response( sock, source, SLMP_ERR_CAN_NOT_PARAMETER_SET, ulRecvAddr, usRecvPortNumber );\r
+\r
+               return iErrCode;\r
+       }\r
+       else\r
+       {\r
+               ulParameterSetTimer = timer_get_time();\r
+       }\r
+\r
+       /*[ Request data of ParameterSet ]*/\r
+       pucRecvData = source->pucData;\r
+       /* Parameter Number */\r
+       usSetParameter = SHIFT_L8(pucRecvData[1]) + SHIFT_L0(pucRecvData[0]);\r
+       iIndex += 2;\r
+\r
+       if ( (usSetParameter == 0) || (3 < usSetParameter) )\r
+       {\r
+               /* Send error response */\r
+               iErrCode = slmp_server_slmp_send_err_response( sock, source, SLMP_ERR_WRONG_DATA, ulRecvAddr, usRecvPortNumber );\r
+\r
+               return iErrCode;\r
+       }\r
+               \r
+       for( i = 0; i < usSetParameter; i ++ )\r
+       {\r
+               /* ParameterID */\r
+               usParameterId = SHIFT_L8(pucRecvData[iIndex + 1]) + SHIFT_L0(pucRecvData[iIndex]);\r
+\r
+               /* Parameter Size */\r
+               usParameterSize = SHIFT_L8(pucRecvData[iIndex + 3]) + SHIFT_L0(pucRecvData[iIndex + 2]);\r
+\r
+               /* Parameter Data */\r
+               memcpy( aucParameterData, &pucRecvData[iIndex + 4], usParameterSize );\r
+               aucParameterData[ usParameterSize ] = 0x00;\r
+\r
+               /* Execute user callback function */\r
+               if ( pUserSlaveParameterSetFunc != NULL )\r
+               {\r
+                       iEndCode = pUserSlaveParameterSetFunc( usParameterId, usParameterSize, aucParameterData );\r
+                       if ( iEndCode != SLMP_ERR_OK )\r
+                       {\r
+                               /* Send error response */\r
+                               iErrCode = slmp_server_slmp_send_err_response( sock, source, (uint16_t)iEndCode, ulRecvAddr, usRecvPortNumber );\r
+\r
+                               return iErrCode;\r
+                       }\r
+               }\r
+               else\r
+               {\r
+                       /* Send error response */\r
+                       iErrCode = slmp_server_slmp_send_err_response( sock, source, SLMP_ERR_NO_EXIST_PARAM_ID, ulRecvAddr, usRecvPortNumber );\r
+\r
+                       return iErrCode;\r
+               }\r
+\r
+               iIndex += 4 + usParameterSize;\r
+       }\r
+\r
+       /*[ Response data of ParameterSet ]*/\r
+       pucSendData = aucSendData;\r
+\r
+       usSendDataSize = 0;\r
+\r
+       /* Send response data */\r
+       iErrCode = slmp_server_slmp_send_response( sock, source, ulRecvAddr, usRecvPortNumber, pucSendData, usSendDataSize );\r
+\r
+       return iErrCode;\r
+}\r
+\r
+/************************************************************************************/\r
+/* This is an user defined function for ParameterSetStart (Command: 0E35)                      */\r
+/************************************************************************************/\r
+#ifdef _WIN32\r
+int slmp_server_parameter_set_start( SOCKET sock, const SLMP_INFO *source, uint32_t ulRecvAddr, uint16_t usRecvPortNumber )\r
+#elif __linux__\r
+int slmp_server_parameter_set_start( int sock, const SLMP_INFO *source, uint32_t ulRecvAddr, uint16_t usRecvPortNumber )\r
+#endif\r
+{\r
+       uint8_t *pucSendData;\r
+       uint16_t usSendDataSize;\r
+       int iErrCode;\r
+       uint32_t ulCheckTimeout;\r
+\r
+       /* Subcommand Check */\r
+       if ( source->usSubCommand != 0x0000 )\r
+       {\r
+               /* Send error response */\r
+               iErrCode = slmp_server_slmp_send_err_response( sock, source, SLMP_ERR_COMMAND_SUBCOMMAND, ulRecvAddr, usRecvPortNumber );\r
+\r
+               return iErrCode;\r
+       }\r
+\r
+       /* Check the ParameterSet Flag */ \r
+       if ( iParameterSetFlag == 1 )\r
+       {\r
+               /* Check the ParameterSet Timeout */ \r
+               ulCheckTimeout = timer_get_time() - ulParameterSetTimer;\r
+\r
+               if ( SLMP_SERVER_SET_PARAMETER_TIMEOUT <= ulCheckTimeout )\r
+               {\r
+                       /* Start ParameterSet */ \r
+                       ulParameterSetTimer = timer_get_time();\r
+               }\r
+               else\r
+               {\r
+                       /* Send error response */\r
+                       iErrCode = slmp_server_slmp_send_err_response( sock, source, SLMP_ERR_CAN_NOT_PARAMETER_SET, ulRecvAddr, usRecvPortNumber );\r
+\r
+                       return iErrCode;\r
+               }\r
+       }\r
+       else\r
+       {\r
+               /* Sets the ParameterSet Flag Disabled */ \r
+               iParameterSetFlag = 1;\r
+               ulParameterSetTimer = timer_get_time();\r
+       }\r
+\r
+       /*[ Response data of ParameterSetStart ]*/\r
+       pucSendData = aucSendData;\r
+\r
+       usSendDataSize = 0;\r
+\r
+       /* Send response data */\r
+       iErrCode = slmp_server_slmp_send_response( sock, source, ulRecvAddr, usRecvPortNumber, pucSendData, usSendDataSize );\r
+\r
+       return iErrCode;\r
+}\r
+\r
+/************************************************************************************/\r
+/* This is an user defined function for ParameterSetEnd (Command: 0E36)                                */\r
+/************************************************************************************/\r
+#ifdef _WIN32\r
+int slmp_server_parameter_set_end( SOCKET sock, const SLMP_INFO *source, uint32_t ulRecvAddr, uint16_t usRecvPortNumber )\r
+#elif __linux__\r
+int slmp_server_parameter_set_end( int sock, const SLMP_INFO *source, uint32_t ulRecvAddr, uint16_t usRecvPortNumber )\r
+#endif\r
+{\r
+       uint8_t *pucSendData;\r
+       uint16_t usSendDataSize;\r
+       int iErrCode, iEndCode;\r
+\r
+       /* Subcommand Check */\r
+       if ( source->usSubCommand != 0x0000 )\r
+       {\r
+               /* Send error response */\r
+               iErrCode = slmp_server_slmp_send_err_response( sock, source, SLMP_ERR_COMMAND_SUBCOMMAND, ulRecvAddr, usRecvPortNumber );\r
+\r
+               return iErrCode;\r
+       }\r
+\r
+       /* Execute user callback function */\r
+       if ( pUserSlaveParameterSetEndFunc != NULL )\r
+       {\r
+               iEndCode = pUserSlaveParameterSetEndFunc();\r
+               if ( iEndCode != SLMP_ERR_OK )\r
+               {\r
+                       /* Send error response */\r
+                       iErrCode = slmp_server_slmp_send_err_response( sock, source, (uint16_t)iEndCode, ulRecvAddr, usRecvPortNumber );\r
+\r
+                       return iErrCode;\r
+               }\r
+       }\r
+\r
+       /* Sets the ParameterSet Flag Enable */ \r
+       iParameterSetFlag = 0;\r
+\r
+       /*[ Response data of ParameterSetEnd ]*/\r
+       pucSendData = aucSendData;\r
+\r
+       usSendDataSize = 0;\r
+\r
+       /* Send response data */\r
+       iErrCode = slmp_server_slmp_send_response( sock, source, ulRecvAddr, usRecvPortNumber, pucSendData, usSendDataSize );\r
+\r
+       return iErrCode;\r
+}\r
+\r
+/************************************************************************************/\r
+/* This is an user defined function for ParameterSetCancel (Command: 0E3A)                     */\r
+/************************************************************************************/\r
+#ifdef _WIN32\r
+int slmp_server_parameter_set_cancel( SOCKET sock, const SLMP_INFO *source, uint32_t ulRecvAddr, uint16_t usRecvPortNumber )\r
+#elif __linux__\r
+int slmp_server_parameter_set_cancel( int sock, const SLMP_INFO *source, uint32_t ulRecvAddr, uint16_t usRecvPortNumber )\r
+#endif\r
+{\r
+       uint8_t *pucSendData;\r
+       uint16_t usSendDataSize;\r
+       int iErrCode;\r
+\r
+       /* Subcommand Check */\r
+       if ( source->usSubCommand != 0x0000 )\r
+       {\r
+               /* Send error response */\r
+               iErrCode = slmp_server_slmp_send_err_response( sock, source, SLMP_ERR_COMMAND_SUBCOMMAND, ulRecvAddr, usRecvPortNumber );\r
+\r
+               return iErrCode;\r
+       }\r
+\r
+       /* Sets the ParameterSet Flag Enabled */ \r
+       iParameterSetFlag = 0;\r
+\r
+       /*[ Response data of ParameterSetCancel ]*/\r
+       pucSendData = aucSendData;\r
+\r
+       usSendDataSize = 0;\r
+\r
+       /* Send response data */\r
+       iErrCode = slmp_server_slmp_send_response( sock, source, ulRecvAddr, usRecvPortNumber, pucSendData, usSendDataSize );\r
+\r
+       return iErrCode;\r
+}\r
+\r
+/************************************************************************************/\r
+/* This is an user defined function for CommunicationSettingGet (Command: 0E45)                */\r
+/************************************************************************************/\r
+#ifdef _WIN32\r
+int slmp_server_communication_setting_get( SOCKET sock, const SLMP_INFO *source, uint32_t ulRecvAddr, uint16_t usRecvPortNumber )\r
+#elif __linux__\r
+int slmp_server_communication_setting_get( int sock, const SLMP_INFO *source, uint32_t ulRecvAddr, uint16_t usRecvPortNumber )\r
+#endif\r
+{\r
+       uint8_t *pucRecvData;\r
+       uint8_t *pucSendData;\r
+       uint16_t usSendDataSize;\r
+       int iErrCode;\r
+       int iIndex = 0;\r
+       uint16_t usGetTarget;\r
+       uint32_t ulTimeoutValue;\r
+\r
+       if ( source->usSubCommand != 0x0000 )\r
+       {\r
+               /* Send error response */\r
+               iErrCode = slmp_server_slmp_send_err_response( sock, source, SLMP_ERR_COMMAND_SUBCOMMAND, ulRecvAddr, usRecvPortNumber );\r
+\r
+               return iErrCode;\r
+       }\r
+\r
+       /*[ Request data of CommunicationSettingGet ]*/\r
+       pucRecvData = source->pucData;\r
+       /* Get Target */\r
+       usGetTarget = SHIFT_L8(pucRecvData[1]) + SHIFT_L0(pucRecvData[0]);\r
+\r
+       /*[ Response data of CommunicationSettingGet ]*/\r
+       pucSendData = aucSendData;\r
+       iIndex = 0;\r
+       /* Get Target */\r
+       memcpy( &pucSendData[iIndex], &usGetTarget, 2 );\r
+       iIndex += 2;\r
+\r
+       /* Port Number */\r
+       if ( (usGetTarget & 0x0001) == 0x0001 )\r
+       {\r
+               pucSendData[iIndex    ] = SHIFT_R0(ServerInfo.usPortNumber);\r
+               pucSendData[iIndex + 1] = SHIFT_R8(ServerInfo.usPortNumber);\r
+       }\r
+       else\r
+       {\r
+               memset( &pucSendData[iIndex], 0, 2 );\r
+       }\r
+       iIndex += 2;\r
+\r
+       /* Timeout Value */\r
+       if ( (usGetTarget & 0x0002) == 0x0002 )\r
+       {\r
+               ulTimeoutValue = SLMP_SERVER_TIMEOUT;\r
+               memcpy( &pucSendData[iIndex], &ulTimeoutValue, 4 );\r
+       }\r
+       else\r
+       {\r
+               memset( &pucSendData[iIndex], 0, 4 );\r
+       }\r
+       iIndex += 4;\r
+\r
+       usSendDataSize = (uint16_t)iIndex;\r
+\r
+       /* Send response data */\r
+       iErrCode = slmp_server_slmp_send_response( sock, source, ulRecvAddr, usRecvPortNumber, pucSendData, usSendDataSize );\r
+\r
+       return iErrCode;\r
+}\r
+\r
+/************************************************************************************/\r
+/* This is an user defined function for ReadTypeName (Command: 0101)                           */\r
+/************************************************************************************/\r
+#ifdef _WIN32\r
+int slmp_server_read_type_name( SOCKET sock, const SLMP_INFO *source, uint32_t ulRecvAddr, uint16_t usRecvPortNumber )\r
+#elif __linux__\r
+int slmp_server_read_type_name( int sock, const SLMP_INFO *source, uint32_t ulRecvAddr, uint16_t usRecvPortNumber )\r
+#endif\r
+{\r
+       uint8_t *pucSendData;\r
+       uint16_t usSendDataSize;\r
+       int iErrCode;\r
+       int iIndex = 0;\r
+\r
+       /*[ Response data of ReadTypeName ]*/\r
+       pucSendData = aucSendData;\r
+       iIndex = 0;\r
+       /* Type Name */\r
+       memcpy( &pucSendData[iIndex], &ServerInfo.acTypeName, 16 );\r
+       iIndex += 16;\r
+       /* Type Name Code */\r
+       pucSendData[iIndex    ] = SHIFT_R0(ServerInfo.usTypeNameCode);\r
+       pucSendData[iIndex + 1] = SHIFT_R8(ServerInfo.usTypeNameCode);\r
+       iIndex += 2;\r
+\r
+       usSendDataSize = (uint16_t)iIndex;\r
+\r
+       /* Send response data */\r
+       iErrCode = slmp_server_slmp_send_response( sock, source, ulRecvAddr, usRecvPortNumber, pucSendData, usSendDataSize );\r
+\r
+       return iErrCode;\r
+}\r
+\r
+/************************************************************************************/\r
+/* This is an user defined function for RemoteReset (Command: 1006)                                    */\r
+/************************************************************************************/\r
+#ifdef _WIN32\r
+int slmp_server_remote_reset( SOCKET sock, const SLMP_INFO *source, uint32_t ulRecvAddr, uint16_t usRecvPortNumber )\r
+#elif __linux__\r
+int slmp_server_remote_reset( int sock, const SLMP_INFO *source, uint32_t ulRecvAddr, uint16_t usRecvPortNumber )\r
+#endif\r
+{\r
+       int iErrCode = 0, iEndCode = 0;\r
+\r
+       /* Execute user callback function */\r
+       if ( pUserRemoteResetFunc != NULL )\r
+       {\r
+               iEndCode = pUserRemoteResetFunc();\r
+               if ( iEndCode != SLMP_ERR_OK )\r
+               {\r
+                       /* Send error response */\r
+                       iErrCode = slmp_server_slmp_send_err_response( sock, source, (uint16_t)iEndCode, ulRecvAddr, usRecvPortNumber );\r
+\r
+                       return iErrCode;\r
+               }\r
+       }\r
+       else\r
+       {\r
+               /* Send error response */\r
+               iErrCode = slmp_server_slmp_send_err_response( sock, source, SLMP_ERR_COMMAND_SUBCOMMAND, ulRecvAddr, usRecvPortNumber );\r
+       }\r
+\r
+       return iErrCode;\r
+}\r
diff --git a/CCIEF-BASIC_Slave/sample/src/SOCKET.c b/CCIEF-BASIC_Slave/sample/src/SOCKET.c
new file mode 100644 (file)
index 0000000..8791dee
--- /dev/null
@@ -0,0 +1,291 @@
+/*\r
+ * Copyright (C) 2017 Texas Instruments Incorporated - http://www.ti.com/\r
+ * Copyright (C) 2016 CC-Link Partner Association -http://am.cc-link.org/\r
+ * \r
+ * \r
+ *  Redistribution and use in source and binary forms, with or without \r
+ *  modification, are permitted provided that the following conditions \r
+ *  are met:\r
+ *\r
+ *    Redistributions of source code must retain the above copyright \r
+ *    notice, this list of conditions and the following disclaimer.\r
+ *\r
+ *    Redistributions in binary form must reproduce the above copyright\r
+ *    notice, this list of conditions and the following disclaimer in the \r
+ *    documentation and/or other materials provided with the   \r
+ *    distribution.\r
+ *\r
+ *    Neither the name of Texas Instruments Incorporated nor the names of\r
+ *    its contributors may be used to endorse or promote products derived\r
+ *    from this software without specific prior written permission.\r
+ *\r
+ *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \r
+ *  "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT \r
+ *  LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\r
+ *  A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT \r
+ *  OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, \r
+ *  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT \r
+ *  LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
+ *  DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\r
+ *  THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT \r
+ *  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE \r
+ *  OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
+ *\r
+*/\r
+\r
+#include "SOCKET.h"\r
+\r
+/************************************************************************************/\r
+/* The following is an user defined main program. This main program is one of a                */\r
+/* sample in the Windows OS and Intel x86 CPU. Please rewrite if necessary.                    */\r
+/* This main program is one of a sample in the Linux. Please rewrite if necessary.     */\r
+/*                                                                                                                                                                     */\r
+/* This sample program for CCIEF-BASIC Slave Application.                                                      */\r
+/*                                                                                                                                                                     */\r
+/************************************************************************************/\r
+\r
+#include <stdio.h>\r
+#ifdef _WIN32\r
+#include <stdint.h>\r
+#include <winsock2.h>\r
+#elif __linux__\r
+#include <sys/socket.h>\r
+#include <netinet/in.h>\r
+#include <sys/ioctl.h>\r
+#include <sys/types.h>\r
+#include <errno.h>\r
+\r
+#define SOCKET_ERROR   -1\r
+#define SOCKET_NOT_OPEN        0\r
+#define TRUE                   1\r
+#endif\r
+\r
+/************************************************************************************/\r
+/* This is an user defined function for initialization of the socket.                          */\r
+/* The following is one of a sample in the Windows OS. Please rewrite if necessary.    */\r
+/* The following is one of a sample in the Linux. Please rewrite if necessary.         */\r
+/************************************************************************************/\r
+#ifdef _WIN32 \r
+int socket_initialize( SOCKET *sock, uint32_t ulIpAddress, uint16_t usPortNumber )\r
+#elif __linux__\r
+int socket_initialize( int *sock, uint32_t ulIpAddress, uint16_t usPortNumber )\r
+#endif\r
+{\r
+#ifdef _WIN32\r
+       SOCKET          sock_tmp;\r
+       SOCKADDR_IN     addr;\r
+       int                     addr_len = 0;\r
+       BOOL            opt_val = FALSE;\r
+       int                     opt_len = sizeof( BOOL );\r
+#elif __linux__\r
+       struct sockaddr_in      addr;\r
+       int                                     sock_tmp;\r
+       int                                     addr_len = 0;\r
+       int                                     opt_val = 0;\r
+       int                                     opt_len = sizeof( int );\r
+#endif\r
+       u_long          val = 0;\r
+       int                     iResult;\r
+\r
+       /* Create a socket */\r
+       sock_tmp = socket( AF_INET, SOCK_DGRAM, 0 );\r
+#ifdef _WIN32\r
+       if ( sock_tmp == INVALID_SOCKET )\r
+#elif __linux__\r
+       if ( sock_tmp < SOCKET_NOT_OPEN )\r
+#endif\r
+       {\r
+#ifdef _WIN32\r
+               printf( "socket failed with error: %ld\n", WSAGetLastError() );\r
+#elif __linux__\r
+               perror( "socket failed with error" );\r
+#endif\r
+               return SOCKET_ERR_SOCKET;\r
+       }\r
+\r
+       /* Setup the UDP socket */\r
+       addr.sin_family = AF_INET;                                      /* Address Famiry : Internet */\r
+       addr.sin_port   = htons(usPortNumber);          /* Port number */\r
+#ifdef _WIN32 \r
+       addr.sin_addr.s_addr = htonl(ulIpAddress);      /* IP address */\r
+#elif __linux__\r
+       addr.sin_addr.s_addr = INADDR_ANY;                      /* It can be bound to all of the local interface */\r
+#endif\r
+       addr_len = sizeof( addr );\r
+\r
+#ifdef _WIN32\r
+       iResult = bind( sock_tmp, (SOCKADDR *)&addr, (int)addr_len );\r
+#elif __linux__\r
+       iResult = bind( sock_tmp, (struct sockaddr *)&addr, (unsigned int )addr_len );\r
+#endif\r
+       if ( iResult == SOCKET_ERROR )\r
+       {\r
+#ifdef _WIN32\r
+               printf( "bind failed with error: %d\n", WSAGetLastError() );\r
+               closesocket( sock_tmp );\r
+#elif __linux__\r
+               perror( "bind failed with error" );\r
+               close( sock_tmp );\r
+#endif\r
+               return SOCKET_ERR_SOCKET;\r
+       }\r
+\r
+       /* Sets the socket option for broadcast packet. */\r
+       opt_val = TRUE;\r
+\r
+#ifdef _WIN32\r
+       iResult = setsockopt( sock_tmp, SOL_SOCKET, SO_BROADCAST, (char *) &opt_val, opt_len );\r
+#elif __linux__\r
+       iResult = setsockopt( sock_tmp, SOL_SOCKET, SO_BROADCAST, (char *) &opt_val, (unsigned int )opt_len );\r
+#endif\r
+       if (iResult == SOCKET_ERROR)\r
+       {\r
+#ifdef _WIN32\r
+               printf("ERR : setsockopt : SO_BROADCAST\n");\r
+               closesocket( sock_tmp );\r
+#elif __linux__\r
+               perror( "ERR : setsockopt : SO_BROADCAST" );\r
+               close( sock_tmp );\r
+#endif\r
+               return SOCKET_ERR_SOCKET;\r
+       }\r
+\r
+       /* for Non-blocking operation */\r
+       val = 1;\r
+#ifdef _WIN32\r
+       ioctlsocket( sock_tmp, FIONBIO, &val );\r
+#elif __linux__\r
+       ioctl( sock_tmp, FIONBIO, &val );\r
+#endif\r
+\r
+       *sock = sock_tmp;\r
+\r
+       return SOCKET_ERR_OK;\r
+}\r
+\r
+/************************************************************************************/\r
+/* This is an user defined function for termination of the socket.                                     */\r
+/* The following is one of a sample in the Windows OS. Please rewrite if necessary.    */\r
+/* The following is one of a sample in the Linux. Please rewrite if necessary.         */\r
+/************************************************************************************/\r
+#ifdef _WIN32\r
+void socket_terminate( SOCKET sock )\r
+#elif __linux__\r
+void socket_terminate( int sock )\r
+#endif\r
+{\r
+       /* Close a socket */\r
+#ifdef _WIN32\r
+       closesocket( sock );\r
+#elif __linux__\r
+       close( sock );\r
+#endif\r
+\r
+       return;\r
+}\r
+\r
+/************************************************************************************/\r
+/* This is an user defined function for receiving packet. The following is one of a    */\r
+/* sample in the Windows OS. Please rewrite if necessary.                                                      */\r
+/*The following is one of a    sample in the Linux. Please rewrite if necessary.               */\r
+/************************************************************************************/\r
+#ifdef _WIN32\r
+int socket_recv( SOCKET sock, uint8_t *pucStream, int iLength, uint32_t *pulRecvAddr, uint16_t *pusRecvPortNumber )\r
+#elif __linux__\r
+int socket_recv( int sock, uint8_t *pucStream, int iLength, uint32_t *pulRecvAddr, uint16_t *pusRecvPortNumber )\r
+#endif\r
+{\r
+       int                             iErrCode = 0;\r
+       int                             iAddrSize = 0;\r
+#ifdef _WIN32\r
+       SOCKADDR_IN             addrSender;\r
+\r
+       iAddrSize = sizeof( SOCKADDR_IN );\r
+#elif __linux__\r
+       struct sockaddr_in              addrSender;\r
+       iAddrSize = sizeof( addrSender );\r
+#endif\r
+\r
+       /* Packet receiving */\r
+#ifdef _WIN32\r
+       iErrCode = recvfrom( sock, (char *)pucStream, iLength, 0, (SOCKADDR *)&addrSender, &iAddrSize );\r
+#elif __linux__\r
+       iErrCode = recvfrom( sock, (char *)pucStream, iLength, 0, (struct sockaddr *)&addrSender, &iAddrSize );\r
+#endif\r
+\r
+       if( iErrCode == SOCKET_ERROR )\r
+       {\r
+               /*No received data*/\r
+#ifdef _WIN32\r
+               errno = WSAGetLastError();\r
+               if ( errno == WSAEWOULDBLOCK )\r
+#elif __linux__\r
+               if( errno == EAGAIN )\r
+#endif\r
+               {\r
+                       return SOCKET_ERR_NO_RECEIVABLE;\r
+               }\r
+               else\r
+               {\r
+#ifdef _WIN32\r
+                       printf( "ERR : recvfrom failed with error: %ld\n", errno );\r
+#elif __linux__\r
+                       perror("recvfrom failed with error");\r
+#endif\r
+                       return SOCKET_ERR_RECV;\r
+               }\r
+       }\r
+       else if ( iErrCode == 0 )\r
+       {\r
+               printf( "ERR : recvfrom failed with error: disconnected\n" );\r
+               return SOCKET_ERR_RECV;\r
+       }\r
+\r
+       (*pulRecvAddr) = ntohl(addrSender.sin_addr.s_addr);\r
+       (*pusRecvPortNumber) = ntohs(addrSender.sin_port);\r
+\r
+       return SOCKET_ERR_OK;\r
+}\r
+\r
+/************************************************************************************/\r
+/* This is an user defined function for sending packet. The following is one of a      */\r
+/* sample in the Windows OS. Please rewrite if necessary.                                                      */\r
+/* The following is one of a sample in the Linux. Please rewrite if necessary.         */\r
+/************************************************************************************/\r
+#ifdef _WIN32\r
+int socket_send( SOCKET sock, uint8_t *pucStream, int iLength, uint32_t ulSendAddr, uint16_t usSendPortNumber )\r
+#elif __linux__\r
+int socket_send( int sock, uint8_t *pucStream, int iLength, uint32_t ulSendAddr, uint16_t usSendPortNumber )\r
+#endif\r
+{\r
+       int                             iErrCode = 0;\r
+       int                             iAddrSize = 0;\r
+#ifdef _WIN32\r
+       SOCKADDR_IN             addrServer;\r
+#elif __linux__\r
+       struct sockaddr_in      addrServer;\r
+#endif\r
+\r
+       addrServer.sin_family = AF_INET;                                /* Address Famiry       : Internet */\r
+       addrServer.sin_port     = htons(usSendPortNumber);      /* Port Number */\r
+       addrServer.sin_addr.s_addr = htonl(ulSendAddr);\r
+       iAddrSize = sizeof( addrServer );\r
+\r
+       /* Packet Sending */\r
+#ifdef _WIN32\r
+       iErrCode = sendto( sock, (char *)pucStream, iLength, 0, (LPSOCKADDR)&addrServer, iAddrSize );\r
+#elif __linux__\r
+       iErrCode = sendto( sock, (char *)pucStream, iLength, 0, (struct sockaddr *)&addrServer, iAddrSize );\r
+#endif\r
+       if( iErrCode == SOCKET_ERROR )\r
+       {\r
+#ifdef _WIN32\r
+               printf( "sendto failed with error: %ld\n", WSAGetLastError() );\r
+#elif __linux__\r
+               perror("send to failed with error");\r
+#endif\r
+               return SOCKET_ERR_SEND;\r
+       }\r
+\r
+       return SOCKET_ERR_OK;\r
+}\r
diff --git a/CCIEF-BASIC_Slave/sample/src/TIMER.c b/CCIEF-BASIC_Slave/sample/src/TIMER.c
new file mode 100644 (file)
index 0000000..b6a71a7
--- /dev/null
@@ -0,0 +1,282 @@
+/*\r
+ * Copyright (C) 2017 Texas Instruments Incorporated - http://www.ti.com/\r
+ * Copyright (C) 2016 CC-Link Partner Association -http://am.cc-link.org/\r
+ * \r
+ * \r
+ *  Redistribution and use in source and binary forms, with or without \r
+ *  modification, are permitted provided that the following conditions \r
+ *  are met:\r
+ *\r
+ *    Redistributions of source code must retain the above copyright \r
+ *    notice, this list of conditions and the following disclaimer.\r
+ *\r
+ *    Redistributions in binary form must reproduce the above copyright\r
+ *    notice, this list of conditions and the following disclaimer in the \r
+ *    documentation and/or other materials provided with the   \r
+ *    distribution.\r
+ *\r
+ *    Neither the name of Texas Instruments Incorporated nor the names of\r
+ *    its contributors may be used to endorse or promote products derived\r
+ *    from this software without specific prior written permission.\r
+ *\r
+ *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \r
+ *  "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT \r
+ *  LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\r
+ *  A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT \r
+ *  OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, \r
+ *  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT \r
+ *  LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
+ *  DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\r
+ *  THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT \r
+ *  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE \r
+ *  OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
+ *\r
+*/\r
+\r
+#ifdef _WIN32\r
+#include <stdint.h>\r
+#include <stdlib.h>\r
+#elif __linux__\r
+#endif\r
+#include <time.h>\r
+#include <string.h>\r
+#include "TIMER.h"\r
+\r
+/*[ Structure for the timer ]*/\r
+typedef struct \r
+{\r
+       int                             iId;                    /* Timer id */\r
+       uint32_t                ulTime;                 /* Period of time [ms] */\r
+       uint32_t                ulStart;                /* Start of time [ms] */\r
+       TIMER_CALLBACK  pCallbackFunc;  /* Callback function */\r
+       void                    *pCallbackArg;  /* Callback argument */\r
+} TIMER;\r
+\r
+static TIMER Timer[TIMER_MAX];\r
+static int iTimerId = 0;\r
+\r
+/************************************************************************************/\r
+/* This is an user defined function for initialize the timer.                                          */\r
+/************************************************************************************/\r
+void timer_initialize( void )\r
+{\r
+       /* Initialize the timer environment */\r
+       memset( &Timer, 0, sizeof( Timer ) );\r
+\r
+       return;\r
+}\r
+\r
+/************************************************************************************/\r
+/* This is an user defined function for terminate the timer.                                           */\r
+/************************************************************************************/\r
+void timer_terminate( void )\r
+{\r
+       /* Terminate the timer environment */\r
+       /* if needed */\r
+\r
+       return;\r
+}\r
+\r
+/************************************************************************************/\r
+/* This is an user defined function for main the timer.                                                                */\r
+/************************************************************************************/\r
+void timer_main( void )\r
+{\r
+       int i, iStopId;\r
+       uint32_t ulCurrent;\r
+\r
+       /* main loop for the timer */\r
+       for( i = 0; i < TIMER_MAX; i++ )\r
+       {\r
+               if ( Timer[i].iId != 0 )\r
+               {\r
+                       /* Get the difference time */\r
+                       ulCurrent = timer_get_time();\r
+                       /* Timeout the timer */\r
+                       if ( Timer[i].ulTime <= ( ulCurrent - Timer[i].ulStart ))\r
+                       {\r
+                               iStopId = Timer[i].iId;\r
+                               if ( Timer[i].pCallbackFunc != NULL )\r
+                               {\r
+                                       /* Execute of the callback function */\r
+                                       Timer[i].pCallbackFunc( Timer[i].iId, Timer[i].pCallbackArg );\r
+                               }\r
+                               /* Initialize of the timer */\r
+                               if ( iStopId == Timer[i].iId )\r
+                               {\r
+                                       Timer[i].iId = 0;\r
+                               }\r
+                       }\r
+               }\r
+       }\r
+\r
+       return;\r
+}\r
+\r
+/************************************************************************************/\r
+/* This is an user defined function for starting the timer.[ms]                                                */\r
+/************************************************************************************/\r
+int timer_start( uint32_t ulTime, int *piId, TIMER_CALLBACK pCallbackFunc, void *pCallbackArg )\r
+{\r
+       int i;\r
+\r
+       /* Check the unusing timer */\r
+       for( i = 0; i < TIMER_MAX; i++ )\r
+       {\r
+               if ( Timer[i].iId == 0 )\r
+               {\r
+                       break;\r
+               }\r
+       }\r
+       if ( i == TIMER_MAX )\r
+       {\r
+               /* No free timer */\r
+               return TIMER_RESOURCE_NONE;\r
+       }\r
+\r
+       iTimerId ++;\r
+       if ( iTimerId == 0 )\r
+       {\r
+               iTimerId = 1;\r
+       }\r
+       Timer[i].iId = iTimerId;\r
+\r
+       Timer[i].ulTime = ulTime;\r
+       Timer[i].ulStart = timer_get_time();\r
+       Timer[i].pCallbackFunc = pCallbackFunc;\r
+       Timer[i].pCallbackArg = pCallbackArg;\r
+\r
+       if ( piId != NULL )\r
+       {\r
+               *piId = Timer[i].iId;\r
+       }\r
+\r
+       return TIMER_OK;\r
+}\r
+\r
+/************************************************************************************/\r
+/* This is an user defined function for stoping the timer.                                                     */\r
+/************************************************************************************/\r
+void timer_stop( int iId )\r
+{\r
+       int i;\r
+\r
+       /* Check the using timer */\r
+       for( i = 0; i < TIMER_MAX; i++ )\r
+       {\r
+               if ( Timer[i].iId == iId )\r
+               {\r
+                       /* Initialize of the timer */\r
+                       Timer[i].iId = 0;\r
+                       break;\r
+               }\r
+       }\r
+\r
+       return;\r
+}\r
+\r
+/************************************************************************************/\r
+/* This is an user defined function for getting the elapsed time from the start                */\r
+/* of the program.[ms]  Please rewrite for user environment.                                           */\r
+/************************************************************************************/\r
+uint32_t timer_get_time( void )\r
+{\r
+       uint32_t ulTime;\r
+\r
+       ulTime = (uint32_t)(((int64_t)clock() * 1000 ) / CLOCKS_PER_SEC );\r
+\r
+       return ulTime;\r
+}\r
+\r
+/************************************************************************************/\r
+/* This is an user defined function for calculate the broad cast wait time.[ms]                */\r
+/************************************************************************************/\r
+uint32_t timer_broadcast_send_wait_time ( uint32_t ulMaxWaitTime )\r
+{\r
+       uint32_t ulWaitTime;\r
+\r
+       /* Change of random number sequence */\r
+       srand( (unsigned)time( NULL ) );\r
+\r
+       /* Gets a wait time  */\r
+       ulWaitTime = rand() % ulMaxWaitTime;\r
+\r
+       return ulWaitTime;\r
+}\r
+\r
+/************************************************************************************/\r
+/* This is an user defined function for analyze the Time Data (Time of UNIX).          */\r
+/************************************************************************************/\r
+void timer_analyze_time_data( int64_t llTime, TIMER_TIME_DATA *pTimeData )\r
+{\r
+       /* Number of days table of each month (for the year-round, for a leap year) */\r
+       static const uint8_t    aucDaysTable[2][13] = {\r
+               { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 },\r
+               { 0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }\r
+       };\r
+       uint32_t ulElapsedDays;\r
+       uint32_t ulTotalDays;\r
+       uint32_t ulThisYear;\r
+       uint32_t ulLastYearDays;\r
+       uint32_t ulThisYearDays;\r
+       uint32_t ulTempDays;\r
+       uint16_t usThisMonth;\r
+       uint32_t ulThisMinute;\r
+       uint16_t usIndex;\r
+\r
+       /* Calculate the number of days elapsed */\r
+       ulElapsedDays = (uint32_t)((( llTime / 1000) / 86400 ) + 719162);\r
+\r
+       /* It calculates the total number of days, including the day to the number of days elapsed */\r
+       ulTotalDays = ulElapsedDays + 1;\r
+\r
+       /* Initialized with the previous year */\r
+       ulThisYear = ulTotalDays / 365;\r
+       /* Calculate the year */\r
+       while ( 1 )\r
+       {\r
+               /* Calculate the previous year the number of days */\r
+               ulLastYearDays = ( ulThisYear * 365 ) + ( ulThisYear / 4 ) - ( ulThisYear / 100 ) + ( ulThisYear / 400 );\r
+               if ( ulLastYearDays >= ulTotalDays )\r
+               {\r
+                       ulThisYear --;\r
+               }\r
+               else\r
+               {\r
+                       ulThisYear ++;\r
+                       break;\r
+               }\r
+       }\r
+\r
+       /* Calculate the number of days from January 1 */\r
+       ulThisYearDays = ulTotalDays - ulLastYearDays;\r
+\r
+       /* Calculating the index for the number of days table of each month or the full year or a leap year */\r
+       if (( ulThisYear % 4 == 0 ) && ( ulThisYear % 100 != 0 ) || ( ulThisYear % 400 == 0 ))\r
+       {\r
+               usIndex = 1;\r
+       }\r
+       else\r
+       {\r
+               usIndex = 0;\r
+       }\r
+\r
+       /* Calculate the month */\r
+       ulTempDays = 0;\r
+       for ( usThisMonth = 0; ( ulTempDays < ulThisYearDays ) && ( usThisMonth < 12 ); usThisMonth++ )\r
+       {\r
+               ulTempDays += aucDaysTable[ usIndex ][ usThisMonth + 1 ];\r
+       }\r
+\r
+       /* Results to the argument */\r
+       pTimeData->usYear  = (uint16_t)ulThisYear;\r
+       pTimeData->usMonth = usThisMonth;\r
+       pTimeData->usDay = (uint16_t)( ulThisYearDays - ( ulTempDays - aucDaysTable[ usIndex ][ usThisMonth ]));\r
+       ulThisMinute = (uint32_t)(( llTime / 1000) % 86400 );\r
+       pTimeData->usHour = (uint16_t)( ulThisMinute / 3600 );\r
+       pTimeData->usMinute = (uint16_t)(( ulThisMinute % 3600 ) / 60 );\r
+       pTimeData->usSecond = (uint16_t)(( ulThisMinute % 3600 ) % 60 );\r
+       pTimeData->usMilliseconds = (uint16_t)( llTime % 1000 );\r
+       \r
+       return;\r
+}\r
diff --git a/CCIEF-BASIC_Slave/sample/src/USER_SAMPLE.c b/CCIEF-BASIC_Slave/sample/src/USER_SAMPLE.c
new file mode 100644 (file)
index 0000000..bfc6f7c
--- /dev/null
@@ -0,0 +1,1667 @@
+/*\r
+ * Copyright (C) 2017 Texas Instruments Incorporated - http://www.ti.com/\r
+ * Copyright (C) 2016 CC-Link Partner Association -http://am.cc-link.org/\r
+ * \r
+ * \r
+ *  Redistribution and use in source and binary forms, with or without \r
+ *  modification, are permitted provided that the following conditions \r
+ *  are met:\r
+ *\r
+ *    Redistributions of source code must retain the above copyright \r
+ *    notice, this list of conditions and the following disclaimer.\r
+ *\r
+ *    Redistributions in binary form must reproduce the above copyright\r
+ *    notice, this list of conditions and the following disclaimer in the \r
+ *    documentation and/or other materials provided with the   \r
+ *    distribution.\r
+ *\r
+ *    Neither the name of Texas Instruments Incorporated nor the names of\r
+ *    its contributors may be used to endorse or promote products derived\r
+ *    from this software without specific prior written permission.\r
+ *\r
+ *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \r
+ *  "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT \r
+ *  LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\r
+ *  A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT \r
+ *  OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, \r
+ *  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT \r
+ *  LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
+ *  DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\r
+ *  THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT \r
+ *  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE \r
+ *  OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
+ *\r
+*/\r
+\r
+#include "SLMP.h"\r
+#include "CCIEF_BASIC_SLAVE.h"\r
+#include "SLMP_SERVER.h"\r
+#include "TIMER.h"\r
+#include "USER_SAMPLE.h"\r
+\r
+/************************************************************************************/\r
+/* The following is an user defined main program. This main program is one of a                */\r
+/* sample in the Windows OS and Intel x86 CPU. Please rewrite if necessary.                    */\r
+/* This main program is one of a sample in the Linux. Please rewrite if necessary.     */\r
+/************************************************************************************/\r
+\r
+#include <stdio.h>\r
+#ifdef _WIN32\r
+#include <stdint.h>\r
+#include <winsock2.h>\r
+#include <Ws2tcpip.h>\r
+#include <windows.h>\r
+#include <iphlpapi.h>\r
+#include <conio.h>\r
+#include <direct.h>\r
+#include <sys/stat.h>\r
+#elif __linux__\r
+#include <string.h>\r
+#include <sys/socket.h>\r
+#include <sys/types.h>\r
+#include <sys/ioctl.h>\r
+#include <net/if.h>\r
+#include <netinet/in.h>\r
+#include <arpa/inet.h>\r
+#include <net/route.h>\r
+#endif\r
+\r
+/*[ Definition for sample program ]*/\r
+#define        USER_PARAMETER_FILE_READ                        1               /* Read the parameter file */\r
+#define        USER_PARAMETER_FILE_NOT_READ            0               /* Not read the parameter file */\r
+#define        USER_DISPLAY_INTERVAL_TIME                      5000    /* Interval time for the display of the cyclic state [ms] */\r
+#ifdef _WIN32\r
+#elif __linux__\r
+#define        MAX_INTERFACE                                           20\r
+#define        MAX_PATH                                                        260\r
+#define        SOCKET_NOT_OPEN                                         0\r
+#define        DIR_PROC_ROUTE                                          "/proc/net/route"\r
+\r
+/*[ Structure of sample program ]*/\r
+typedef struct \r
+{\r
+       char                            IPAddr[INET_ADDRSTRLEN];\r
+       char                            IPMask[INET_ADDRSTRLEN];\r
+       char                            MACAddr[18];\r
+       char                            Defo[1028];\r
+       struct ifreq            USER_ifreq;\r
+} USER_NETWORK_INFO;\r
+\r
+typedef struct \r
+{\r
+       char                            cIface[IF_NAMESIZE];\r
+       struct in_addr          cDst;\r
+       struct in_addr          cGateway;\r
+       unsigned short int      iFlag;\r
+       int                                     iRecCnt;\r
+       int                                     iUse;\r
+       short int                       iMetric;\r
+       struct in_addr          cMask;\r
+       unsigned long int       iMTU;\r
+       unsigned long int       iWindow;\r
+       unsigned short int      iIRTT;\r
+} t_RouteInfo;\r
+#endif\r
+\r
+typedef struct \r
+{\r
+       uint8_t         aucMacAddress[6];                       /* MAC Address */\r
+       uint32_t        ulIpAddress;                            /* IP Address */\r
+       uint32_t        ulSubnetMask;                           /* Subnet Mask */\r
+       uint32_t        ulDefaultGatewayIPAddress;      /* Default Gateway IP Address */\r
+} USER_ADAPTER_INFO;\r
+\r
+/************************************************************************************/\r
+/* This is an user defined data for the CCIEF-BASIC Slave sample.                                      */\r
+/************************************************************************************/\r
+static USER_SLAVE_PARAMETER            UserSlaveParameter = { 0, 0, 0, 1, 0 }; /* Parameter of user setting */\r
+static char                                            acParameterFilePath[MAX_PATH];                  /* Path of the parameter file */\r
+static int                                             iParameterFileRead;                                             /* Flag of the parameter read */\r
+\r
+/************************************************************************************/\r
+/* This is an user defined data for the SLMP Server sample.                                                    */\r
+/************************************************************************************/\r
+/* Memory */\r
+static uint16_t                                ausUserMemory[10000];   /* User Memory */\r
+\r
+/************************************************************************************/\r
+/* This is an user defined data for user sample.                                                                       */\r
+/************************************************************************************/\r
+static USER_ADAPTER_INFO       AdapterInfo;                    /* Information of the Network adapter */\r
+static int                                     iReset;                                 /* Flag of user reset */\r
+static unsigned long           ulCyclicDataCount = 0;  /* Count of the cyclic data at intervals */\r
+\r
+/* Definition of function of sample program */\r
+static void user_callback_recv_cyclic_data( int iCyclicState, int iOccupiedStationNumber );\r
+static void user_callback_cyclic_disconnection( void );\r
+static void user_callback_set_ip_address_basic( uint32_t ulIpAddress, uint32_t ulSubnetMask );\r
+static int user_callback_parameter_get( uint16_t usId, uint16_t *pusSize, uint8_t **ppucData );\r
+static int user_callback_parameter_set( uint16_t usId, uint16_t usSize, uint8_t *pucData );\r
+static int user_callback_parameter_set_end( void );\r
+static int user_callback_remote_reset( void );\r
+static int32_t user_parameter_file_read( char *file_path, USER_SLAVE_PARAMETER *pParameter, USER_ADAPTER_INFO *pAdapterInfo );\r
+static int32_t user_parameter_file_write( char *file_path, USER_SLAVE_PARAMETER *pParameter );\r
+static void user_display_cyclic_information( void );\r
+static int user_get_adapter_info( USER_ADAPTER_INFO *pGetAdapterInfo );\r
+static int user_set_adapter_info( USER_ADAPTER_INFO *pSetAdapterInfo );\r
+\r
+/************************************************************************************/\r
+/* This is an user defined function for main function.                                                         */\r
+/* The following is one of a sample in the Windows OS. Please rewrite if necessary.    */\r
+/* The following is one of a sample in the Linux. Please rewrite if necessary.         */\r
+/************************************************************************************/\r
+void main( int argc, char *argv[] )\r
+{\r
+       CCIEF_BASIC_SLAVE_INFO Slave;\r
+       SLMP_SERVER_INFO ServerInfo;\r
+       int iErrCode = 0;\r
+       int iResult;\r
+       struct in_addr addr;\r
+       char Ipaddr[16];\r
+#ifdef _WIN32\r
+       WSADATA wsaData;\r
+       \r
+       /* Initialize Winsock */\r
+       iResult = WSAStartup( MAKEWORD(2,2), &wsaData );\r
+       if ( iResult != 0 )\r
+       {\r
+               printf( "WSAStartup failed with error: %d\n", iResult );\r
+               goto end;\r
+       }\r
+#elif __linux__\r
+#endif\r
+\r
+       /* Get the Network adapter information */\r
+       iErrCode = user_get_adapter_info( &AdapterInfo );\r
+       if ( iErrCode != USER_ERR_OK )\r
+       {\r
+               goto end;\r
+       }\r
+\r
+       /* Get command line argument */\r
+       if ( 1 < argc )\r
+       {\r
+#ifdef _WIN32\r
+               strncpy_s( acParameterFilePath, sizeof( acParameterFilePath ), argv[1], sizeof( acParameterFilePath ) );\r
+#elif __linux__\r
+               strncpy( acParameterFilePath, argv[1], sizeof( acParameterFilePath ) );\r
+#endif\r
+               /* Read the parameter file */\r
+               iParameterFileRead = USER_PARAMETER_FILE_READ;\r
+       }\r
+       else\r
+       {\r
+               printf( "Not found the parameter file!\n" );\r
+               printf( "\nStarting with the default parameter.\n" );\r
+               /* Not read the parameter file */\r
+               iParameterFileRead = USER_PARAMETER_FILE_NOT_READ;\r
+       }\r
+\r
+reset:\r
+       iReset = USER_RESET_NONE;\r
+\r
+       /* Check the parameter refresh */\r
+       if ( iParameterFileRead == USER_PARAMETER_FILE_READ )\r
+       {\r
+               /* Read the parameter file */\r
+               iErrCode = user_parameter_file_read( acParameterFilePath, &UserSlaveParameter, &AdapterInfo );\r
+               if ( iErrCode != USER_ERR_OK )\r
+               {\r
+                       goto end;\r
+               }\r
+               /* Not read the parameter file */\r
+               iParameterFileRead = USER_PARAMETER_FILE_NOT_READ;\r
+       }\r
+\r
+       /* Set ip address */\r
+       iErrCode = user_set_adapter_info( &AdapterInfo );\r
+       if ( iErrCode != USER_ERR_OK )\r
+       {\r
+               goto end;\r
+       }\r
+\r
+       /****************************************************************************/\r
+       /* Initialization of the Timer.                                                                                         */\r
+       /****************************************************************************/\r
+       /* Initialization the timer environment */\r
+       timer_initialize();\r
+\r
+       /****************************************************************************/\r
+       /* Initialization of the CCIEF-BASIC Slave.                                                                     */\r
+       /****************************************************************************/\r
+       /* Initialization of the CCIEF-BASIC Slave */\r
+       Slave.usVenderCode = USER_PROFILE_VENDOR_CODE;\r
+       Slave.ulModelCode = USER_PROFILE_MODEL_CODE;\r
+       Slave.usMachineVersion = USER_PROFILE_MACHINE_VERSION;\r
+       Slave.ulIpAddress = AdapterInfo.ulIpAddress;\r
+#ifdef _WIN32\r
+#elif __linux__\r
+       Slave.ulSubnetMask = AdapterInfo.ulSubnetMask;\r
+#endif\r
+       Slave.iOccupiedStationNumber = (int)UserSlaveParameter.usOccupiedStationNumber;\r
+       iErrCode = ccief_basic_slave_initialize( &Slave, user_callback_recv_cyclic_data,\r
+                                                                                  user_callback_cyclic_disconnection );\r
+       if ( iErrCode != CCIEF_BASIC_SLAVE_ERR_OK )\r
+       {\r
+               printf( "\nCCIEF-BASIC Slave Station initialization error!\n" );\r
+               goto end;\r
+       }\r
+\r
+       /* Show the parameter of the slave */\r
+       printf( "\nStart CC-Link IE Field Basic Slave Station!\n" );\r
+#ifdef _WIN32\r
+       addr.S_un.S_addr = htonl(AdapterInfo.ulIpAddress);\r
+#elif __linux__\r
+       addr.s_addr = htonl(AdapterInfo.ulIpAddress);\r
+#endif\r
+       inet_ntop(AF_INET, &addr, Ipaddr, sizeof(Ipaddr) );\r
+       printf( "\n    IP Address:\t\t\t\t%s\n", Ipaddr );\r
+#ifdef _WIN32\r
+       addr.S_un.S_addr = htonl(AdapterInfo.ulSubnetMask);\r
+#elif __linux__\r
+       addr.s_addr = htonl(AdapterInfo.ulSubnetMask);\r
+#endif\r
+       inet_ntop(AF_INET, &addr, Ipaddr, sizeof(Ipaddr) );\r
+       printf( "    Subnet mask:\t\t\t%s\n", Ipaddr );\r
+#ifdef _WIN32\r
+       addr.S_un.S_addr = htonl(AdapterInfo.ulDefaultGatewayIPAddress);\r
+#elif __linux__\r
+       addr.s_addr = htonl(AdapterInfo.ulDefaultGatewayIPAddress);\r
+#endif\r
+       inet_ntop(AF_INET, &addr, Ipaddr, sizeof(Ipaddr) );\r
+       printf( "    Default GW IP address:\t\t%s\n", Ipaddr );\r
+       printf( "    Number of Occupied Stations:\t%d\n", UserSlaveParameter.usOccupiedStationNumber );\r
+       printf( "    Cyclic response wait time:\t\t%d[ms] (0:Not wait)\n", UserSlaveParameter.ulCyclicResponseWaitTime );\r
+\r
+       /****************************************************************************/\r
+       /* Initialization of the SLMP Server.                                                                           */\r
+       /****************************************************************************/\r
+       /* Set the SLMP Server Information */\r
+       ServerInfo.usVenderCode = Slave.usVenderCode;\r
+       ServerInfo.ulModelCode = Slave.ulModelCode;\r
+       ServerInfo.usMachineVersion = Slave.usMachineVersion;\r
+       memcpy( &ServerInfo.aucMacAddress, AdapterInfo.aucMacAddress, sizeof( ServerInfo.aucMacAddress ) );\r
+       ServerInfo.ulIpAddress = AdapterInfo.ulIpAddress;\r
+       ServerInfo.ulSubnetMask = AdapterInfo.ulSubnetMask;\r
+       ServerInfo.ulDefaultGatewayIPAddress = AdapterInfo.ulDefaultGatewayIPAddress;\r
+       ServerInfo.usPortNumber = USER_SERVER_PORT_NUMBER;\r
+#ifdef _WIN32\r
+       strncpy_s( (char*)ServerInfo.acHostname, sizeof(ServerInfo.acHostname), USER_SERVER_HOSTNAME, 64 );\r
+#elif __linux__\r
+       strncpy( (char*)ServerInfo.acHostname, USER_SERVER_HOSTNAME, 64 );\r
+#endif\r
+       ServerInfo.usStatus = 0x0000;\r
+       memcpy( &ServerInfo.acTypeName, USER_TYPE_NAME, sizeof(ServerInfo.acTypeName) );\r
+       ServerInfo.usTypeNameCode = USER_TYPE_NAME_CODE;\r
+       ServerInfo.pusMemory = ausUserMemory;\r
+       ServerInfo.uiMemorySize = sizeof( ausUserMemory ) / sizeof( uint16_t );\r
+\r
+       /* Initialization of the SLMP Server */\r
+       iErrCode = slmp_server_initialize( &ServerInfo, &user_callback_set_ip_address_basic, &user_callback_parameter_get, &user_callback_parameter_set,\r
+                                                                          &user_callback_parameter_set_end, &user_callback_remote_reset );\r
+       if ( iErrCode != SLMP_SERVER_ERR_OK )\r
+       {\r
+               printf( "\nSLMP Server initialization error!\n" );\r
+               goto end;\r
+       }\r
+\r
+       /* Set the slave information data */\r
+       ccief_basic_slave_set_err_code( USER_ERR_OK );\r
+       ccief_basic_slave_set_unit_info( CCIEF_BASIC_UNIT_INFO_APPLICATION_STOP );\r
+       ccief_basic_slave_set_unit_data( 0x00000000 );\r
+\r
+       /* Show the information for display of the cyclic state */\r
+       printf( "\n  Show the cyclic information at %d-second intervals.\n", ( USER_DISPLAY_INTERVAL_TIME / 1000 ));\r
+       printf( "\n" );\r
+       printf( "    Master | Cyclic Data | Link scan time | Time Data\n" );\r
+       printf( "\n" );\r
+       printf( "      Master         - The control master station.(Master ID / Group Number)\n" );\r
+       printf( "      Cyclic Data    - Count of the receive Cyclic Data at intervals.\n" );\r
+       printf( "      Link scan time - The link scan time at intervals.[ms]\n" );\r
+       printf( "      Time Data      - The time from the master information data.\n" );\r
+       printf( "\n" );\r
+\r
+       /****************************************************************************/\r
+       /* Main loop of sample code.                                                                                            */\r
+       /****************************************************************************/\r
+       while ( 1 )\r
+       {\r
+               /* CCIEF-BASIC Slave */\r
+               iErrCode = ccief_basic_slave_main();\r
+               if ( iErrCode != CCIEF_BASIC_SLAVE_ERR_OK )\r
+               {\r
+                       break;\r
+               }\r
+\r
+               /* SLMP Server */\r
+               iErrCode = slmp_server_main();\r
+               if ( iErrCode != SLMP_SERVER_ERR_OK )\r
+               {\r
+                       break;\r
+               }\r
+\r
+               /* Timer */\r
+               timer_main();\r
+\r
+               /* Check reset */\r
+               if ( iReset == USER_RESET )\r
+               {\r
+                       break;\r
+               }\r
+\r
+               /* Display of the cyclic information */\r
+               user_display_cyclic_information();\r
+       }\r
+\r
+       /* Termination of CCIEF-BASIC Slave */\r
+       ccief_basic_slave_terminate();\r
+\r
+       /* Termination of SLMP Server */\r
+       slmp_server_terminate();\r
+\r
+       /* Termination of the timer environment */\r
+       timer_terminate();\r
+\r
+       /* Check the reset */\r
+       if ( iReset == USER_RESET )\r
+       {\r
+               printf( "\nReset the unit!\n" );\r
+               goto reset;\r
+       }\r
+\r
+       /* Exit the application */\r
+end:\r
+#ifdef _WIN32\r
+       /* WinSock clean up */\r
+       WSACleanup();\r
+#elif __linux__\r
+#endif\r
+       printf( "\nApplication has exited.(please any press)\n" );\r
+#ifdef _WIN32\r
+       _getch();\r
+#elif __linux__\r
+       getchar();\r
+#endif\r
+       return;\r
+}\r
+\r
+/************************************************************************************/\r
+/* This is an user defined function for callback function for receiving             */\r
+/* the Cyclic Data from the master.                                                    */\r
+/************************************************************************************/\r
+void user_callback_recv_cyclic_data( int iCyclicState, int iOccupiedStationNumber )\r
+{\r
+       uint16_t *pusRWw, *pusRY, *pusRX, *pusRWr; \r
+       uint32_t ulTimerStart, ulTimerEnd;\r
+\r
+       /*[ Example: Sample code is data transfer from receiving data to sending data. ]*/\r
+       /* Check the cyclic state. */\r
+       if ( iCyclicState == CCIEF_BASIC_CYCLIC_DATA_VALID )\r
+       {\r
+               /* Please write here receiving the cyclic data from the master. */\r
+\r
+               /* Getting the start pointer of RWw */\r
+               pusRWw = ccief_basic_slave_get_pointer( CCIEF_BASIC_DEVICE_TYPE_RWW );\r
+               /* Getting the start pointer of RY */\r
+               pusRY = ccief_basic_slave_get_pointer( CCIEF_BASIC_DEVICE_TYPE_RY );\r
+\r
+               /* Getting the start pointer of RWr */\r
+               pusRWr = ccief_basic_slave_get_pointer( CCIEF_BASIC_DEVICE_TYPE_RWR );\r
+               /* Getting the start pointer of RX */\r
+               pusRX = ccief_basic_slave_get_pointer( CCIEF_BASIC_DEVICE_TYPE_RX );\r
+\r
+               /* Data transfer from RY to RX */\r
+               memcpy( pusRX, pusRY, iOccupiedStationNumber * CCIEF_BASIC_RX_RY_SIZE );\r
+               /* Data transfer from RWw to RWr */\r
+               memcpy( pusRWr, pusRWw, iOccupiedStationNumber * CCIEF_BASIC_RWW_RWR_SIZE );\r
+       }\r
+\r
+       /* Increase the counter of Cyclic Data. */\r
+       ulCyclicDataCount ++;\r
+\r
+       /*[ Example: Wait for cyclic response for sample code.(for debug the slow scan time) ]*/ \r
+       if ( UserSlaveParameter.ulCyclicResponseWaitTime != 0 )\r
+       {\r
+               ulTimerStart = timer_get_time();\r
+               while ( 1 )\r
+               {\r
+                       ulTimerEnd = timer_get_time();\r
+                       if ( UserSlaveParameter.ulCyclicResponseWaitTime < ( ulTimerEnd - ulTimerStart ))\r
+                       {\r
+                               break;\r
+                       }\r
+               }\r
+       }\r
+\r
+       /*[ Example: Set the unit information data. ]*/\r
+       ccief_basic_slave_set_unit_info( CCIEF_BASIC_UNIT_INFO_APPLICATION_RUNNING );\r
+\r
+       return;\r
+}\r
+\r
+/************************************************************************************/\r
+/* This is an user defined function for cyclic disconnection timeout.                          */\r
+/************************************************************************************/\r
+void user_callback_cyclic_disconnection( void )\r
+{\r
+       /*[ Example: Set the unit information data. ]*/\r
+       ccief_basic_slave_set_unit_info( CCIEF_BASIC_UNIT_INFO_APPLICATION_STOP );\r
+\r
+       /* Please write for disconnection of cyclic operateion here */\r
+\r
+       return;\r
+}\r
+\r
+/************************************************************************************/\r
+/* This is an user defined function for callback function for set the ip address.      */\r
+/* For CC-Link IEF Basic use.                                                                                                          */\r
+/************************************************************************************/\r
+void user_callback_set_ip_address_basic( uint32_t ulIpAddress, uint32_t ulSubnetMask )\r
+{\r
+       /* check the subnet mask */\r
+       if ( ulSubnetMask == 0xFFFFFFFF )\r
+       {\r
+               /* Not setting */\r
+               ulSubnetMask = 0;\r
+       }\r
+\r
+       /* set the ip address */\r
+       AdapterInfo.ulIpAddress = ulIpAddress;\r
+       AdapterInfo.ulSubnetMask = ulSubnetMask;\r
+       UserSlaveParameter.ulIpAddress = ulIpAddress;\r
+       UserSlaveParameter.ulSubnetMask = ulSubnetMask;\r
+\r
+       /* Write the parameter file */\r
+       (void)user_parameter_file_write( acParameterFilePath, &UserSlaveParameter );\r
+\r
+       iReset = USER_RESET;\r
+       return;\r
+}\r
+\r
+/************************************************************************************/\r
+/* This is an user defined function for callback function for parameter get.           */\r
+/************************************************************************************/\r
+int user_callback_parameter_get( uint16_t usId, uint16_t *pusSize, uint8_t **ppucData )\r
+{\r
+       struct in_addr addr;\r
+       char *addrStr;\r
+       char Ipaddr[16];\r
+\r
+       /* Check the parameter id */\r
+       switch ( usId )\r
+       {\r
+               /* Getting of the ip address */\r
+               case USER_PARAMETER_ID_IP_ADDRESS:\r
+#ifdef _WIN32\r
+                       addr.S_un.S_addr = htonl(UserSlaveParameter.ulIpAddress);\r
+#elif __linux__\r
+                       addr.s_addr = htonl(UserSlaveParameter.ulIpAddress);\r
+#endif\r
+                       inet_ntop(AF_INET, &addr, Ipaddr, sizeof(Ipaddr) );\r
+                       addrStr = Ipaddr;\r
+                       *pusSize = (uint16_t)strlen( addrStr );\r
+                       *ppucData = (uint8_t*)addrStr;\r
+                       break;\r
+               /* Getting of the subnet mask */\r
+               case USER_PARAMETER_ID_SUBNET_MASK:\r
+#ifdef _WIN32\r
+                       addr.S_un.S_addr = htonl(UserSlaveParameter.ulSubnetMask);\r
+#elif __linux__\r
+                       addr.s_addr = htonl(UserSlaveParameter.ulSubnetMask);\r
+#endif\r
+                       inet_ntop(AF_INET, &addr, Ipaddr, sizeof(Ipaddr) );\r
+                       addrStr = Ipaddr;\r
+                       *pusSize = (uint16_t)strlen( addrStr );\r
+                       *ppucData = (uint8_t*)addrStr;\r
+                       break;\r
+               /* Getting of the default gateway ip address */\r
+               case USER_PARAMETER_ID_DEFAULT_GW_IP_ADDRESS:\r
+#ifdef _WIN32\r
+                       addr.S_un.S_addr = htonl(UserSlaveParameter.ulDefaultGatewayIPAddress);\r
+#elif __linux__\r
+                       addr.s_addr = htonl(UserSlaveParameter.ulDefaultGatewayIPAddress);\r
+#endif\r
+                       inet_ntop(AF_INET, &addr, Ipaddr, sizeof(Ipaddr) );\r
+                       addrStr = Ipaddr;\r
+                       *pusSize = (uint16_t)strlen( addrStr );\r
+                       *ppucData = (uint8_t*)addrStr;\r
+                       break;\r
+               /* Getting of the occupied station number */\r
+               case USER_PARAMETER_ID_OCCUPIED_STATION_NUMBER:\r
+                       *pusSize = sizeof( uint16_t );\r
+                       *ppucData = (uint8_t*)&UserSlaveParameter.usOccupiedStationNumber;\r
+                       break;\r
+               /* Getting of the cyclic response wait time */\r
+               case USER_PARAMETER_ID_CYCLIC_RESPONSE_WAIT_TIME:\r
+                       *pusSize = sizeof( uint16_t );\r
+                       *ppucData = (uint8_t*)&UserSlaveParameter.ulCyclicResponseWaitTime;\r
+                       break;\r
+\r
+               /* Please write user parameters here. */\r
+\r
+               default:\r
+                       return SLMP_ERR_NO_EXIST_PARAM_ID;\r
+       }\r
+\r
+       return SLMP_ERR_OK;\r
+}\r
+\r
+/************************************************************************************/\r
+/* This is an user defined function for callback function for parameter set.           */\r
+/************************************************************************************/\r
+int user_callback_parameter_set( uint16_t usId, uint16_t usSize, uint8_t *pucData )\r
+{\r
+       uint32_t        ulIpaddr;\r
+       int                     iResult;\r
+\r
+       /* Check the parameter id */\r
+       switch ( usId )\r
+       {\r
+               /* Getting of the ip address */\r
+               case USER_PARAMETER_ID_IP_ADDRESS:\r
+                       iResult = inet_pton( AF_INET, (char*)pucData, &ulIpaddr );\r
+                       if( iResult == 1 )\r
+                       {\r
+                               UserSlaveParameter.ulIpAddress = htonl(ulIpaddr);\r
+                       }\r
+                       else\r
+                       {\r
+                               UserSlaveParameter.ulIpAddress = 0;\r
+                       }\r
+                       break;\r
+               /* Getting of the subnet mask */\r
+               case USER_PARAMETER_ID_SUBNET_MASK:\r
+                       inet_pton( AF_INET, (char*)pucData, &ulIpaddr );\r
+                       iResult = inet_pton( AF_INET, (char*)pucData, &ulIpaddr );\r
+                       if( iResult == 1 )\r
+                       {\r
+                               UserSlaveParameter.ulSubnetMask = htonl(ulIpaddr);\r
+                       }\r
+                       else\r
+                       {\r
+                               UserSlaveParameter.ulSubnetMask = 0;\r
+                       }\r
+                       break;\r
+               /* Getting of the default gateway ip address */\r
+               case USER_PARAMETER_ID_DEFAULT_GW_IP_ADDRESS:\r
+                       iResult = inet_pton( AF_INET, (char*)pucData, &ulIpaddr );\r
+                       if( iResult == 1 )\r
+                       {\r
+                               UserSlaveParameter.ulDefaultGatewayIPAddress = htonl(ulIpaddr);\r
+                       }\r
+                       else\r
+                       {\r
+                               UserSlaveParameter.ulDefaultGatewayIPAddress = 0;\r
+                       }\r
+                       break;\r
+               /* Getting of the occupied station number */\r
+               case USER_PARAMETER_ID_OCCUPIED_STATION_NUMBER:\r
+                       memcpy( &UserSlaveParameter.usOccupiedStationNumber, pucData, sizeof( UserSlaveParameter.usOccupiedStationNumber ) );\r
+                       break;\r
+               /* Getting of the cyclic response wait time */\r
+               case USER_PARAMETER_ID_CYCLIC_RESPONSE_WAIT_TIME:\r
+                       memcpy( &UserSlaveParameter.ulCyclicResponseWaitTime, pucData, sizeof( UserSlaveParameter.ulCyclicResponseWaitTime ) );\r
+                       break;\r
+\r
+               /* Please write user parameters here. */\r
+\r
+               default:\r
+                       return SLMP_ERR_NO_EXIST_PARAM_ID;\r
+       }\r
+\r
+       return SLMP_ERR_OK;\r
+}\r
+\r
+/************************************************************************************/\r
+/* This is an user defined function for callback function for parameter set end.       */\r
+/************************************************************************************/\r
+int user_callback_parameter_set_end( void )\r
+{\r
+       /* Write the parameter file */\r
+       (void)user_parameter_file_write( acParameterFilePath, &UserSlaveParameter );\r
+\r
+       /* Read the parameter file */\r
+       iParameterFileRead = USER_PARAMETER_FILE_READ;\r
+\r
+       return SLMP_ERR_OK;\r
+}\r
+\r
+/************************************************************************************/\r
+/* This is an user defined function for callback function for remote reset                     */\r
+/************************************************************************************/\r
+int user_callback_remote_reset( void )\r
+{\r
+       /* Reset the operation */\r
+       iReset = USER_RESET;\r
+\r
+       return SLMP_ERR_OK;\r
+}\r
+\r
+/************************************************************************************/\r
+/* This is an user defined function for read of the parameter file (csv format).       */\r
+/************************************************************************************/\r
+int user_parameter_file_read( char *file_path, USER_SLAVE_PARAMETER *pParameter, USER_ADAPTER_INFO *pAdapterInfo )\r
+{\r
+       uint32_t ulIpaddr;\r
+       FILE *fp;\r
+#ifdef _WIN32\r
+       errno_t error;\r
+#elif __linux__\r
+#endif\r
+       static char aucLine[32];\r
+       static char aucId[32];\r
+       static char aucData[32];\r
+       int iId, iResult;\r
+       int iErrCode = USER_ERR_OK;\r
+\r
+#ifdef _WIN32\r
+       error = fopen_s( &fp, file_path, "r" );\r
+       if ( error != 0 )\r
+#elif __linux__\r
+       fp = fopen( file_path, "r" );\r
+       if ( fp == NULL )\r
+#endif\r
+       {\r
+               printf( "Could not open file \"%s\"\n", file_path );\r
+               return USER_ERR_NG;\r
+       }\r
+\r
+       /* Start analyze the parameter file */\r
+       while ( fgets( aucLine, sizeof( aucLine ), fp ) != NULL )\r
+       {\r
+               memset( aucId, 0, sizeof( aucId ) );\r
+               memset( aucData, 0, sizeof( aucData ) );\r
+#ifdef _WIN32\r
+               sscanf_s( aucLine, "%[^,],%[^,]", aucId, sizeof(aucId), aucData, sizeof(aucData) );\r
+#elif __linux__\r
+               sscanf( aucLine, "%[^,],%[^,]", aucId, aucData );\r
+#endif\r
+               iId = strtol( aucId, NULL, 0 );\r
+               switch ( iId )\r
+               {\r
+                       case USER_PARAMETER_ID_IP_ADDRESS:\r
+                               iResult = inet_pton( AF_INET, aucData, &ulIpaddr );\r
+                               if ( iResult == 1 )\r
+                               {\r
+                                       pParameter->ulIpAddress = htonl(ulIpaddr);\r
+                               }\r
+                               /* Check the ip address */\r
+                               if ( pParameter->ulIpAddress != 0 )\r
+                               {\r
+                                       /* Setting the adapter ip address */\r
+                                       pAdapterInfo->ulIpAddress = pParameter->ulIpAddress;\r
+                               }\r
+                               break;\r
+                       case USER_PARAMETER_ID_SUBNET_MASK:\r
+                               iResult = inet_pton( AF_INET, aucData, &ulIpaddr );\r
+                               if ( iResult == 1 )\r
+                               {\r
+                                       pParameter->ulSubnetMask = htonl(ulIpaddr);\r
+                               }\r
+                               /* Check the subnet mask */\r
+                               if ( pParameter->ulSubnetMask != 0 )\r
+                               {\r
+                                       /* Setting the adapter subnet mask */\r
+                                       pAdapterInfo->ulSubnetMask = pParameter->ulSubnetMask;\r
+                               }\r
+                               break;\r
+                       case USER_PARAMETER_ID_DEFAULT_GW_IP_ADDRESS:\r
+                               iResult = inet_pton( AF_INET, aucData, &ulIpaddr );\r
+                               if ( iResult == 1 )\r
+                               {\r
+                                       pParameter->ulDefaultGatewayIPAddress = htonl(ulIpaddr);\r
+                               }\r
+                                       /* Check the default gateway ip address */\r
+                               if ( pParameter->ulDefaultGatewayIPAddress != 0 )\r
+                               {\r
+                                       /* Setting the adapter default gateway ip address */\r
+                                       pAdapterInfo->ulDefaultGatewayIPAddress = pParameter->ulDefaultGatewayIPAddress;\r
+                               }\r
+                               break;\r
+                       case USER_PARAMETER_ID_OCCUPIED_STATION_NUMBER:\r
+                               pParameter->usOccupiedStationNumber = (uint16_t)strtoul( aucData, NULL, 0 );\r
+                               /* Check the occupied station number */\r
+                               if (( pParameter->usOccupiedStationNumber <= 0 ) || ( CCIEF_BASIC_MAX_NUMBER_OF_OCCUPIED_STATIONS_GROUP < pParameter->usOccupiedStationNumber ))\r
+                               {\r
+                                       printf( "Parameter Error: Invalid number of occupied stations! %d (range: 1-64)\n", pParameter->usOccupiedStationNumber );\r
+                                       iErrCode = USER_ERR_NG;\r
+                                       goto end;\r
+                               }\r
+                               break;\r
+                       case USER_PARAMETER_ID_CYCLIC_RESPONSE_WAIT_TIME:\r
+                               pParameter->ulCyclicResponseWaitTime = strtoul( aucData, NULL, 0 );\r
+                               break;\r
+\r
+                       /* Please write user parameters here. */\r
+\r
+                       default:\r
+                               break;\r
+               }\r
+       }\r
+\r
+end:\r
+       fclose( fp );\r
+\r
+       return USER_ERR_OK;\r
+}\r
+\r
+/************************************************************************************/\r
+/* This is an user defined function for write of the parameter file (csv format).      */\r
+/************************************************************************************/\r
+int user_parameter_file_write( char *file_path, USER_SLAVE_PARAMETER *pParameter )\r
+{\r
+       static char aucLine[1024];\r
+       struct in_addr addr;\r
+       FILE *fp;\r
+#ifdef _WIN32\r
+       errno_t error;\r
+#elif __linux__\r
+#endif\r
+       char Ipaddr[16];\r
+\r
+#ifdef _WIN32\r
+       error = fopen_s( &fp, file_path, "w" );\r
+       if ( error != 0 )\r
+#elif __linux__\r
+       fp = fopen( file_path, "w" );\r
+       if ( fp == NULL )\r
+#endif\r
+       {\r
+               printf( "Could not open file \"%s\"\n", file_path );\r
+               return USER_ERR_NG;\r
+       }\r
+\r
+#ifdef _WIN32\r
+       sprintf_s( aucLine, sizeof(aucLine), ",,\n" );\r
+#elif __linux__\r
+       sprintf( aucLine,  ",,\n" );\r
+#endif\r
+       fputs( aucLine, fp );\r
+#ifdef _WIN32\r
+       sprintf_s( aucLine, sizeof(aucLine), "CCIEF-SIM Slave Sample Parameter,,\n" );\r
+#elif __linux__\r
+       sprintf( aucLine, "CCIEF-SIM Slave Sample Parameter,,\n" );\r
+#endif\r
+       fputs( aucLine, fp );\r
+#ifdef _WIN32\r
+       sprintf_s( aucLine, sizeof(aucLine), ",,\n" );\r
+#elif __linux__\r
+       sprintf( aucLine, ",,\n" );\r
+#endif\r
+       fputs( aucLine, fp );\r
+#ifdef _WIN32\r
+       sprintf_s( aucLine,  sizeof(aucLine),"ID,DATA,COMMENT\n" );\r
+#elif __linux__\r
+       sprintf( aucLine,  "ID,DATA,COMMENT\n" );\r
+#endif\r
+       fputs( aucLine, fp );\r
+\r
+       if ( pParameter->ulIpAddress != 0 )\r
+       {\r
+#ifdef _WIN32\r
+               addr.S_un.S_addr = htonl(pParameter->ulIpAddress);\r
+#elif __linux__\r
+               addr.s_addr = htonl(pParameter->ulIpAddress);\r
+#endif\r
+               inet_ntop(AF_INET, &addr, Ipaddr, sizeof(Ipaddr) );\r
+#ifdef _WIN32\r
+               sprintf_s( aucLine,  sizeof(aucLine), "1,%s,IP address\n", Ipaddr );\r
+#elif __linux__\r
+               sprintf( aucLine, "1,%s,IP address\n", Ipaddr );\r
+#endif\r
+       }\r
+       else\r
+       {\r
+#ifdef _WIN32\r
+               sprintf_s( aucLine, sizeof(aucLine), "1,0,IP address\n" );\r
+#elif __linux__\r
+               sprintf( aucLine, "1,0,IP address\n" );\r
+#endif\r
+       }\r
+       fputs( aucLine, fp );\r
+       if ( pParameter->ulSubnetMask != 0 )\r
+       {\r
+#ifdef _WIN32\r
+               addr.S_un.S_addr = htonl(pParameter->ulSubnetMask);\r
+#elif __linux__\r
+               addr.s_addr = htonl(pParameter->ulSubnetMask);\r
+#endif\r
+               inet_ntop(AF_INET, &addr, Ipaddr, sizeof(Ipaddr) );\r
+#ifdef _WIN32\r
+               sprintf_s( aucLine, sizeof(aucLine), "2,%s,Subnet mask\n", Ipaddr );\r
+#elif __linux__\r
+               sprintf( aucLine, "2,%s,Subnet mask\n", Ipaddr );\r
+#endif\r
+       }\r
+       else\r
+       {\r
+#ifdef _WIN32\r
+               sprintf_s( aucLine, sizeof(aucLine), "2,0,Subnet mask\n" );\r
+#elif __linux__\r
+               sprintf( aucLine, "2,0,Subnet mask\n" );\r
+#endif\r
+       }\r
+       fputs( aucLine, fp );\r
+       if ( pParameter->ulDefaultGatewayIPAddress != 0 )\r
+       {\r
+#ifdef _WIN32\r
+               addr.S_un.S_addr = htonl(pParameter->ulDefaultGatewayIPAddress);\r
+#elif __linux__\r
+               addr.s_addr = htonl(pParameter->ulDefaultGatewayIPAddress);\r
+#endif\r
+               inet_ntop(AF_INET, &addr, Ipaddr, sizeof(Ipaddr) );\r
+#ifdef _WIN32\r
+               sprintf_s( aucLine, sizeof(aucLine), "3,%s,Default gateway IP address\n", Ipaddr );\r
+#elif __linux__\r
+               sprintf( aucLine, "3,%s,Default gateway IP address\n", Ipaddr );\r
+#endif\r
+       }\r
+       else\r
+       {\r
+#ifdef _WIN32\r
+               sprintf_s( aucLine, sizeof(aucLine), "3,0,Default gateway IP address\n" );\r
+#elif __linux__\r
+               sprintf( aucLine, "3,0,Default gateway IP address\n" );\r
+#endif\r
+       }\r
+       fputs( aucLine, fp );\r
+#ifdef _WIN32\r
+       sprintf_s( aucLine, sizeof(aucLine), "4,%d,Number of occupied stations\n", pParameter->usOccupiedStationNumber );\r
+#elif __linux__\r
+       sprintf( aucLine, "4,%d,Number of occupied stations\n", pParameter->usOccupiedStationNumber );\r
+#endif\r
+       fputs( aucLine, fp );\r
+#ifdef _WIN32\r
+       sprintf_s( aucLine, sizeof(aucLine), "5,%lu,Cyclic response wait time\n", pParameter->ulCyclicResponseWaitTime );\r
+#elif __linux__\r
+       sprintf( aucLine, "5,%lu,Cyclic response wait time\n", pParameter->ulCyclicResponseWaitTime );\r
+#endif\r
+       fputs( aucLine, fp );\r
+\r
+       /* Please write user parameters here. */\r
+\r
+       fclose( fp );\r
+\r
+       return USER_ERR_OK;\r
+}\r
+\r
+/************************************************************************************/\r
+/* This is an user defined function for display the cyclic state.                                      */\r
+/************************************************************************************/\r
+void user_display_cyclic_information( void )\r
+{\r
+       static CCIEF_BASIC_SLAVE_MASTER_INFO    MasterInfo;\r
+       TIMER_TIME_DATA                                         TimeData;\r
+       static uint32_t                                         ulDisplayTimerStart = 0;        /* Start time of the display timer */\r
+       uint32_t                                                        ulDisplayTimerEnd;                      /* End time of the display timer */\r
+       int64_t                                                         llTimeData;\r
+\r
+       if ( ulDisplayTimerStart == 0 ) {\r
+               ulDisplayTimerStart = timer_get_time();\r
+       }\r
+\r
+       /* Check the display time. */\r
+       ulDisplayTimerEnd = timer_get_time();\r
+       if ( USER_DISPLAY_INTERVAL_TIME < ( ulDisplayTimerEnd - ulDisplayTimerStart ))\r
+       {\r
+               ulDisplayTimerStart = ulDisplayTimerEnd;\r
+\r
+               /* Getting the master information */\r
+               ccief_basic_slave_get_master_info( &MasterInfo );\r
+\r
+               /* Show the current cyclic state */\r
+               if ( MasterInfo.ulId == 0 )\r
+               {\r
+                       printf( "CCIEF-BASIC: Master(Unknown) | Cyclic Data=0 | 0.000[ms] |\n" );\r
+               }\r
+               else\r
+               {\r
+                       if ( ulCyclicDataCount == 0 )\r
+                       {\r
+                               printf( "CCIEF-BASIC: Master(0x%08lX/%d) | Cyclic Data=%lu | 0.000[ms] |\n", MasterInfo.ulId,\r
+                                               ulCyclicDataCount, MasterInfo.ucGroupNumber );\r
+                       }\r
+                       else\r
+                       {\r
+                               printf( "CCIEF-BASIC: Master(0x%08lX/%d) | Cyclic Data=%lu | %01.3f[ms] | ", MasterInfo.ulId,\r
+                                               MasterInfo.ucGroupNumber, ulCyclicDataCount, ((float)USER_DISPLAY_INTERVAL_TIME / ulCyclicDataCount) );\r
+                               memcpy( &llTimeData, MasterInfo.NotifyInfo.aucTimeData, sizeof( llTimeData ) );\r
+                               timer_analyze_time_data( llTimeData, &TimeData );\r
+                               printf( "%d-%02d-%02d %02d:%02d:%02d\n", TimeData.usYear, TimeData.usMonth, TimeData.usDay, TimeData.usHour,\r
+                                               TimeData.usMinute, TimeData.usSecond );\r
+                       }\r
+               }\r
+\r
+               /* Clear the count of cyclic data */\r
+               ulCyclicDataCount = 0;\r
+       }\r
+\r
+       return;\r
+}\r
+\r
+#define MALLOC(x) HeapAlloc(GetProcessHeap(), 0, (x))\r
+#define FREE(x) HeapFree(GetProcessHeap(), 0, (x))\r
+\r
+/************************************************************************************/\r
+/* This is an user defined function for get the adapter information.                           */\r
+/* The following is one of a sample in the Windows OS. Please rewrite if necessary.    */\r
+/* The following is one of a sample in the Linux. Please rewrite if necessary.         */\r
+/************************************************************************************/\r
+int user_get_adapter_info( USER_ADAPTER_INFO *pGetAdapterInfo )\r
+{\r
+#ifdef _WIN32\r
+       ULONG                   ulOutBufLen;\r
+       ULONG                   ulIpaddr, ulSubNetMask, ulDefGateway;\r
+       DWORD                   dwRetVal;\r
+       IP_ADAPTER_INFO *pAdapterInfo;\r
+       IP_ADAPTER_INFO *pAdapter;\r
+       int                             iAdapterNum;\r
+       int                             iKey;\r
+       int                             iInputNumber;\r
+       int                             i;\r
+       int                             iResult;\r
+\r
+       /* GetAdaptersInfo */\r
+       pAdapterInfo = (IP_ADAPTER_INFO *) MALLOC(sizeof( IP_ADAPTER_INFO ));\r
+       if ( pAdapterInfo == NULL )\r
+       {\r
+               printf( "Error allocating memory needed to call GetAdapterInfo\n" );\r
+               return USER_ERR_NG;\r
+       }\r
+       ulOutBufLen = sizeof( IP_ADAPTER_INFO );\r
+\r
+       if ( GetAdaptersInfo( pAdapterInfo, &ulOutBufLen ) == ERROR_BUFFER_OVERFLOW )\r
+       {\r
+               FREE( pAdapterInfo );\r
+               pAdapterInfo = (IP_ADAPTER_INFO *) MALLOC( ulOutBufLen );\r
+               if ( pAdapterInfo == NULL )\r
+               {\r
+                       printf( "Error allocating memory needed to call GetAdapterInfo\n" );\r
+                       return USER_ERR_NG;\r
+               }\r
+       }\r
+\r
+       if (( dwRetVal = GetAdaptersInfo( pAdapterInfo, &ulOutBufLen )) != NO_ERROR )\r
+       {\r
+               printf( "GetAdaptersInfo failed with error %d\n", dwRetVal );\r
+               if ( pAdapterInfo )\r
+               {\r
+                       FREE( pAdapterInfo );\r
+               }\r
+               return USER_ERR_NG;\r
+       }\r
+\r
+       pAdapter = pAdapterInfo;\r
+       iAdapterNum = 0;\r
+\r
+       /* Check the Multiple Adapter */\r
+       if ( pAdapter->Next != NULL )\r
+       {\r
+               printf( "Found the multiple Network adapter!\n\n");\r
+               while ( pAdapter )\r
+               {\r
+                       printf( "%2d: \tAdapter desc: \t\t%s\n", iAdapterNum+1, pAdapter->Description );\r
+                       printf( "\tMAC address: \t\t%02X:%02X:%02X:%02X:%02X:%02X\n",\r
+                                       pAdapter->Address[0], pAdapter->Address[1], pAdapter->Address[2],\r
+                                       pAdapter->Address[3], pAdapter->Address[4], pAdapter->Address[5] );\r
+                       printf( "\tIP address: \t\t%s\n",\r
+                                       pAdapter->IpAddressList.IpAddress.String );\r
+                       printf( "\tSubnet mask: \t\t%s\n", pAdapter->IpAddressList.IpMask.String );\r
+                       printf( "\tDefault GW IP address: \t%s\n", pAdapter->GatewayList.IpAddress.String );\r
+                       printf( "\n");\r
+                       iAdapterNum ++;\r
+                       pAdapter = pAdapter->Next;\r
+               }\r
+               printf( "Please select the adapter number (Press 'Enter' Key after select) [1-%d]: ", iAdapterNum );\r
+\r
+               iInputNumber = 0;\r
+\r
+               while ( 1 )\r
+               {\r
+                       iKey = _getch();\r
+                       if ( iKey != 0x0d )\r
+                       {\r
+                               if (( 0x30 <= iKey ) && ( iKey <= 0x39 ))\r
+                               {\r
+                                       printf( "%c",iKey);\r
+                                       iInputNumber = (iInputNumber*10)+(iKey-0x30);\r
+                               }\r
+                       }\r
+                       else\r
+                       {\r
+                               printf( "\n");\r
+                               if (( iInputNumber == 0 ) || ( iAdapterNum < iInputNumber ))\r
+                               {\r
+                                       printf( "Wrong number select!\n");\r
+                                       iInputNumber = 0;\r
+                                       printf( "Please select the adapter number (Press 'Enter' Key after select) [1-%d]: ", iAdapterNum );\r
+                               }\r
+                               else\r
+                               {\r
+                                       break;\r
+                               }\r
+                       }\r
+               }\r
+               pAdapter = pAdapterInfo;\r
+               for ( i = 1; i < iInputNumber; i++ )\r
+               {\r
+                       pAdapter = pAdapter->Next;\r
+               }\r
+       }\r
+       else\r
+       {\r
+               iAdapterNum = 1;\r
+       }\r
+       printf( "\n" );\r
+\r
+       /* Conversion of endian */\r
+       AdapterInfo.aucMacAddress[0] = pAdapter->Address[5];\r
+       AdapterInfo.aucMacAddress[1] = pAdapter->Address[4];\r
+       AdapterInfo.aucMacAddress[2] = pAdapter->Address[3];\r
+       AdapterInfo.aucMacAddress[3] = pAdapter->Address[2];\r
+       AdapterInfo.aucMacAddress[4] = pAdapter->Address[1];\r
+       AdapterInfo.aucMacAddress[5] = pAdapter->Address[0];\r
+       iResult = inet_pton( AF_INET, pAdapter->IpAddressList.IpAddress.String, &ulIpaddr );\r
+       if ( iResult == 1)\r
+       {\r
+               AdapterInfo.ulIpAddress = htonl(ulIpaddr);\r
+       }\r
+       else\r
+       {\r
+               printf("Adapter IP address error.\n");\r
+               return USER_ERR_NG;\r
+       }\r
+       iResult = inet_pton( AF_INET, pAdapter->IpAddressList.IpMask.String, &ulSubNetMask );\r
+       if ( iResult == 1)\r
+       {\r
+               AdapterInfo.ulSubnetMask = htonl(ulSubNetMask);\r
+       }\r
+       else\r
+       {\r
+               printf("Adapter sub-net mask error.\n");\r
+               return USER_ERR_NG;\r
+       }\r
+       iResult = inet_pton( AF_INET, pAdapter->GatewayList.IpAddress.String, &ulDefGateway );\r
+       if ( iResult == 1)\r
+       {\r
+               AdapterInfo.ulDefaultGatewayIPAddress = htonl(ulDefGateway);\r
+       }\r
+       else\r
+       {\r
+               printf("Adapter default gateway IP address error.\n");\r
+               return USER_ERR_NG;\r
+       }\r
+\r
+       FREE( pAdapterInfo );\r
+\r
+       /* Copy the argument pointer */\r
+       memcpy( pGetAdapterInfo, &AdapterInfo, sizeof(USER_ADAPTER_INFO) );\r
+\r
+       return USER_ERR_OK;\r
+#elif __linux__\r
+       struct ifconf                   Ifc_Get;\r
+       struct ifreq                    Ifreq_Size[MAX_INTERFACE];\r
+       struct sockaddr_in              get_addr[MAX_INTERFACE];\r
+       USER_NETWORK_INFO               User_Adapter[MAX_INTERFACE];\r
+       USER_NETWORK_INFO               User_Get_Info;\r
+       unsigned char                   *pMAC_addr;\r
+       int                                             sock_network;\r
+       int                                             i;\r
+       int                                             ikey;\r
+       int                                             iNet_Number=0;\r
+       FILE                                    *pFile;\r
+       t_RouteInfo                             RouteInfo_Defo[MAX_INTERFACE];\r
+       char                                    input_line[128];\r
+\r
+       Ifc_Get.ifc_len = sizeof( Ifreq_Size );\r
+       Ifc_Get.ifc_ifcu.ifcu_buf=(void *)Ifreq_Size;\r
+\r
+       /* Socket open */\r
+       sock_network = socket( AF_INET, SOCK_DGRAM, 0 );\r
+       if( sock_network < SOCKET_NOT_OPEN )\r
+       {\r
+               perror("Socket not open");\r
+               return USER_ERR_NG;\r
+       }\r
+\r
+       /* Network interface list acquisition */\r
+       if( ioctl( sock_network, SIOCGIFCONF, &Ifc_Get ) == -1 )\r
+       {\r
+               perror("Error can not get the interface list");\r
+               close( sock_network );\r
+               return USER_ERR_NG;\r
+       }\r
+\r
+       /* Calculate the number that came back from the kernel */\r
+       iNet_Number = Ifc_Get.ifc_len / ( int )sizeof( struct ifreq );\r
+       for(i=0;i<iNet_Number;i++)\r
+       {\r
+               /* Interface designation */\r
+               strncpy( User_Adapter[i].USER_ifreq.ifr_name,Ifreq_Size[i].ifr_name,IFNAMSIZ-1 );\r
+\r
+               /* IP address (IPv4) acquisition */\r
+               if ( ioctl( sock_network, SIOCGIFADDR, &User_Adapter[i].USER_ifreq ) == -1 )\r
+               {\r
+                       perror("Error can not get the IP address");\r
+                       close( sock_network );\r
+                       return USER_ERR_NG;\r
+               }\r
+               memcpy( &get_addr[i], &User_Adapter[i].USER_ifreq.ifr_addr, sizeof( struct sockaddr_in ));\r
+               memcpy( &User_Adapter[i].IPAddr, inet_ntoa( get_addr[i].sin_addr ), sizeof( User_Adapter[i].IPAddr ));\r
+\r
+               /* Mask address acquisition */\r
+               if ( ioctl( sock_network, SIOCGIFNETMASK, &User_Adapter[i].USER_ifreq ) == -1 )\r
+               {\r
+                       perror("Error can not get the Mask address");\r
+                       close( sock_network );\r
+                       return USER_ERR_NG;\r
+               }\r
+               memcpy( &get_addr[i], &User_Adapter[i].USER_ifreq.ifr_netmask, sizeof( struct sockaddr_in )); \r
+               memcpy( &User_Adapter[i].IPMask, inet_ntoa( get_addr[i].sin_addr ), sizeof( User_Adapter[i].IPMask ));\r
+\r
+               /* Mac address acquisition */\r
+               if ( ioctl( sock_network, SIOCGIFHWADDR, &User_Adapter[i].USER_ifreq ) == -1 )\r
+               {\r
+                       perror("Error can not get the Mac address");\r
+                       close( sock_network );\r
+                       return USER_ERR_NG;\r
+               }\r
+               pMAC_addr=(unsigned char *)&User_Adapter[i].USER_ifreq.ifr_hwaddr.sa_data;\r
+               sprintf( User_Adapter[i].MACAddr, "%02x:%02x:%02x:%02x:%02x:%02x", *pMAC_addr, *(pMAC_addr+1), *(pMAC_addr+2), *(pMAC_addr+3), *(pMAC_addr+4), *(pMAC_addr+5));\r
+\r
+               /* Get the default gateway from the system file */\r
+               pFile = fopen( DIR_PROC_ROUTE , "r" );\r
+               if( pFile == NULL )\r
+               {\r
+                       printf("Not systemfile read");\r
+                       close( sock_network );\r
+                       return USER_ERR_NG;\r
+               }\r
+\r
+               while(1)\r
+               {\r
+                       if ( fgets( User_Adapter[i].Defo, sizeof( User_Adapter[i].Defo ), pFile ) == 0) \r
+                       {\r
+                               memset( User_Adapter[i].Defo,0x00,sizeof( User_Adapter[i].Defo ));\r
+                               fclose( pFile );\r
+                               break;\r
+                       }\r
+                       //Route information acquisition\r
+                       memset( &RouteInfo_Defo[i], 0x00, sizeof( RouteInfo_Defo[i] ));\r
+                       if ( sscanf( User_Adapter[i].Defo, "%s%x%x%d%d%d%d%x%d%d%d",\r
+                               &RouteInfo_Defo[i].cIface,\r
+                               &RouteInfo_Defo[i].cDst,\r
+                               &RouteInfo_Defo[i].cGateway,\r
+                               &RouteInfo_Defo[i].iFlag,\r
+                               &RouteInfo_Defo[i].iRecCnt,\r
+                               &RouteInfo_Defo[i].iUse,\r
+                               &RouteInfo_Defo[i].iMetric,\r
+                               &RouteInfo_Defo[i].cMask,\r
+                               &RouteInfo_Defo[i].iMTU,\r
+                               &RouteInfo_Defo[i].iWindow,\r
+                               &RouteInfo_Defo[i].iIRTT) == 0 )\r
+                       {\r
+                               printf("Not file read");\r
+                               fclose( pFile );\r
+                               close( sock_network );\r
+                               return USER_ERR_NG;\r
+                       }\r
+                       /* device name and default GW flag check */\r
+                       if (( strstr( RouteInfo_Defo[i].cIface,User_Adapter[i].USER_ifreq.ifr_name ) != NULL ) && ( RouteInfo_Defo[i].iFlag == ( RTF_UP | RTF_GATEWAY )))\r
+                       {\r
+                               memcpy( &User_Adapter[i].Defo, inet_ntoa( RouteInfo_Defo[i].cGateway ), INET_ADDRSTRLEN );\r
+                               fclose( pFile );\r
+                               break;\r
+                       }\r
+                       memset( User_Adapter[i].Defo,0x00,sizeof( User_Adapter[i].Defo ));\r
+               }\r
+       }\r
+       \r
+       \r
+       \r
+       for(i=0;i<iNet_Number;i++)\r
+       {\r
+               printf( "%2d: \tAdapter desc: \t\t%s\n", i+1, User_Adapter[i].USER_ifreq.ifr_name );\r
+               printf( "\tMAC address: \t\t%s\n", User_Adapter[i].MACAddr );\r
+               printf( "\tIP address: \t\t%s\n",User_Adapter[i].IPAddr );\r
+               printf( "\tSubnet mask: \t\t%s\n", User_Adapter[i].IPMask );\r
+               printf( "\tDefault GW IP address: \t%s\n", User_Adapter[i].Defo );\r
+               printf( "\n");\r
+       }\r
+       printf( "Please select the adapter number (Press 'enter' Key after select) [1-%d]: ", iNet_Number );\r
+       while ( 1 )\r
+       {\r
+               fgets( input_line,sizeof( input_line ),stdin );\r
+               sscanf( input_line,"%d",&ikey );\r
+               if (( 1 > ikey ) || ( iNet_Number < ikey ))\r
+               {\r
+                       printf( "Wrong number select!\n");\r
+                       printf( "Please select the adapter number (Press 'Enter' Key after select) [1-%d]: ", iNet_Number );\r
+               }\r
+               else\r
+               {\r
+                       break;\r
+               }\r
+       }\r
+\r
+       User_Get_Info = User_Adapter[ikey-1];\r
+\r
+       /* Conversion of endian */\r
+       AdapterInfo.aucMacAddress[0] = ( uint8_t ) User_Get_Info.USER_ifreq.ifr_hwaddr.sa_data[5];\r
+       AdapterInfo.aucMacAddress[1] = ( uint8_t ) User_Get_Info.USER_ifreq.ifr_hwaddr.sa_data[4];\r
+       AdapterInfo.aucMacAddress[2] = ( uint8_t ) User_Get_Info.USER_ifreq.ifr_hwaddr.sa_data[3];\r
+       AdapterInfo.aucMacAddress[3] = ( uint8_t ) User_Get_Info.USER_ifreq.ifr_hwaddr.sa_data[2];\r
+       AdapterInfo.aucMacAddress[4] = ( uint8_t ) User_Get_Info.USER_ifreq.ifr_hwaddr.sa_data[1];\r
+       AdapterInfo.aucMacAddress[5] = ( uint8_t ) User_Get_Info.USER_ifreq.ifr_hwaddr.sa_data[0];\r
+       AdapterInfo.ulIpAddress = htonl( inet_addr( User_Get_Info.IPAddr ));\r
+       AdapterInfo.ulSubnetMask = htonl( inet_addr( User_Get_Info.IPMask ));\r
+       AdapterInfo.ulDefaultGatewayIPAddress = htonl(inet_addr( User_Get_Info.Defo ));\r
+\r
+       close( sock_network );\r
+\r
+       return USER_ERR_OK;\r
+#endif\r
+}\r
+\r
+/************************************************************************************/\r
+/* This is an user defined function for set the ip address.                                                    */\r
+/* The following is one of a sample in the Windows OS. Please rewrite if necessary.    */\r
+/* The following is one of a sample in the Linux. Please rewrite if necessary.                 */\r
+/************************************************************************************/\r
+int user_set_adapter_info( USER_ADAPTER_INFO *pSetAdapterInfo )\r
+{\r
+#ifdef _WIN32\r
+       static char                             str[2000];\r
+       static char                             szAdapterName[BUFSIZ];\r
+       uint8_t                                 aucMacAddress[6];\r
+       PIP_ADAPTER_ADDRESSES   pAdapterAddresses, pAdapterAddress;\r
+       DWORD                                   dwRet, dwSize;\r
+       int                                             len;\r
+       ULONG                                   ulOutBufLen;\r
+       ULONG                                   ulIpaddr, ulSubNetMask, ulDefGateway;\r
+       DWORD                                   dwRetVal;\r
+       IP_ADAPTER_INFO                 *pAdapterInfo;\r
+       IP_ADAPTER_INFO                 *pAdapter;\r
+       static int                              iKey, iFirst = 0;\r
+       struct in_addr                  addrIpAddress, addrSubnetMask, addrDefaultGatewayIPAddress;\r
+       char                                    Ipaddr[16],SubNetMask[16],Gateway[16];\r
+\r
+       /* GetAdaptersAddresses */\r
+       dwRet = GetAdaptersAddresses( AF_UNSPEC, GAA_FLAG_INCLUDE_PREFIX, NULL, NULL, &dwSize );\r
+       if ( dwRet != ERROR_BUFFER_OVERFLOW )\r
+       {\r
+               printf( "Error call GetAdaptersAddresses\n" );\r
+               return USER_ERR_NG;\r
+       }\r
+\r
+       pAdapterAddresses = (PIP_ADAPTER_ADDRESSES)MALLOC( dwSize );\r
+       if (pAdapterAddresses == NULL)\r
+       {\r
+               printf( "Error allocating memory needed to call GetAdaptersAddresses\n" );\r
+               return USER_ERR_NG;\r
+       }\r
+\r
+       dwRet = GetAdaptersAddresses( AF_UNSPEC, GAA_FLAG_INCLUDE_PREFIX, NULL, pAdapterAddresses, &dwSize );\r
+       if (dwRet != ERROR_SUCCESS)\r
+       {\r
+               printf( "Error call GetAdaptersAddresses\n" );\r
+               return USER_ERR_NG;\r
+       }\r
+\r
+       /* Conversion of endian */\r
+       aucMacAddress[0] = pSetAdapterInfo->aucMacAddress[5];\r
+       aucMacAddress[1] = pSetAdapterInfo->aucMacAddress[4];\r
+       aucMacAddress[2] = pSetAdapterInfo->aucMacAddress[3];\r
+       aucMacAddress[3] = pSetAdapterInfo->aucMacAddress[2];\r
+       aucMacAddress[4] = pSetAdapterInfo->aucMacAddress[1];\r
+       aucMacAddress[5] = pSetAdapterInfo->aucMacAddress[0];\r
+\r
+       /* Get Adapter Name */\r
+       for ( pAdapterAddress = pAdapterAddresses; pAdapterAddress; pAdapterAddress = pAdapterAddress->Next )\r
+       {\r
+               if ( memcmp( pAdapterAddress->PhysicalAddress, aucMacAddress, pAdapterAddress->PhysicalAddressLength ) == 0 )\r
+               {\r
+                       len = WideCharToMultiByte(CP_ACP, 0, \r
+                                                                         pAdapterAddress->FriendlyName, wcslen(pAdapterAddress->FriendlyName),\r
+                                                                         szAdapterName, sizeof( szAdapterName ), NULL, NULL);\r
+                       if ( len == 0 )\r
+                       {\r
+                               printf( "Error Adapter Name\n" );\r
+                               return USER_ERR_NG;\r
+                       }\r
+\r
+                       szAdapterName[len] = '\0';\r
+                       break;\r
+               }\r
+       }\r
+\r
+       FREE( pAdapterAddresses );\r
+\r
+       /* GetAdaptersInfo */\r
+       pAdapterInfo = (IP_ADAPTER_INFO *) MALLOC(sizeof( IP_ADAPTER_INFO ));\r
+       if ( pAdapterInfo == NULL )\r
+       {\r
+               printf( "Error allocating memory needed to call GetAdapterInfo\n" );\r
+               return USER_ERR_NG;\r
+       }\r
+       ulOutBufLen = sizeof( IP_ADAPTER_INFO );\r
+\r
+       if ( GetAdaptersInfo( pAdapterInfo, &ulOutBufLen ) == ERROR_BUFFER_OVERFLOW )\r
+       {\r
+               FREE( pAdapterInfo );\r
+               pAdapterInfo = (IP_ADAPTER_INFO *) MALLOC( ulOutBufLen );\r
+               if ( pAdapterInfo == NULL )\r
+               {\r
+                       printf( "Error allocating memory needed to call GetAdapterInfo\n" );\r
+                       return USER_ERR_NG;\r
+               }\r
+       }\r
+\r
+       if (( dwRetVal = GetAdaptersInfo( pAdapterInfo, &ulOutBufLen )) != NO_ERROR )\r
+       {\r
+               printf( "GetAdaptersInfo failed with error %d\n", dwRetVal );\r
+               if ( pAdapterInfo )\r
+               {\r
+                       FREE( pAdapterInfo );\r
+               }\r
+               return USER_ERR_NG;\r
+       }\r
+\r
+       pAdapter = pAdapterInfo;\r
+\r
+       /* Check the adapter */\r
+       if ( pAdapter != NULL )\r
+       {\r
+               while ( pAdapter )\r
+               {\r
+                       if ( memcmp( pAdapter->Address, aucMacAddress, pAdapter->AddressLength ) == 0 )\r
+                       {\r
+                               inet_pton( AF_INET, pAdapter->IpAddressList.IpAddress.String, &ulIpaddr );\r
+                               inet_pton( AF_INET, pAdapter->IpAddressList.IpMask.String, &ulSubNetMask );\r
+                               inet_pton( AF_INET, pAdapter->GatewayList.IpAddress.String, &ulDefGateway );\r
+\r
+                               if (( pSetAdapterInfo->ulIpAddress == htonl(ulIpaddr))\r
+                                && ( pSetAdapterInfo->ulSubnetMask == htonl(ulSubNetMask))\r
+                                && ( pSetAdapterInfo->ulDefaultGatewayIPAddress == htonl(ulDefGateway)))\r
+                               {\r
+                                       /* Nothing */\r
+                               }\r
+                               else\r
+                               {\r
+                                       addrIpAddress.S_un.S_addr = htonl(pSetAdapterInfo->ulIpAddress);\r
+                                       inet_ntop(AF_INET, &addrIpAddress, Ipaddr, sizeof(Ipaddr) );\r
+                                       addrSubnetMask.S_un.S_addr = htonl(pSetAdapterInfo->ulSubnetMask);\r
+                                       inet_ntop(AF_INET, &addrSubnetMask, SubNetMask, sizeof(SubNetMask) );\r
+                                       addrDefaultGatewayIPAddress.S_un.S_addr = htonl(pSetAdapterInfo->ulDefaultGatewayIPAddress);\r
+                                       inet_ntop(AF_INET, &addrDefaultGatewayIPAddress, Gateway, sizeof(Gateway) );\r
+                                       /* Check the setting first */\r
+                                       if ( iFirst == 0 )\r
+                                       {\r
+                                               printf( "Change the Network adapter setting ?\n" );\r
+                                               printf( "\n    ""\"%s\"""\n", szAdapterName );\r
+                                               printf( "\tIP address:\t\t%s --> %s\n", pAdapter->IpAddressList.IpAddress.String, Ipaddr );\r
+                                               printf( "\tSubnet mask:\t\t%s --> %s\n", pAdapter->IpAddressList.IpMask.String, SubNetMask );\r
+                                               printf( "\tDefault GW IP address:\t%s --> %s\n", pAdapter->GatewayList.IpAddress.String, Gateway );\r
+                                               while ( 1 )\r
+                                               {\r
+                                                       printf( "\nPlease Press Key if change the Network adapter setting Yes('Y') or No('N')\n" );\r
+                                                       iKey = _getch();\r
+                                                       if (( iKey == 'Y' ) || ( iKey == 'y' ))\r
+                                                       {\r
+                                                               break;\r
+                                                       }\r
+                                                       else if (( iKey == 'N' ) || ( iKey == 'n' ))\r
+                                                       {\r
+                                                               FREE( pAdapterInfo );\r
+\r
+                                                               return USER_ERR_NG;\r
+                                                       }\r
+                                               }\r
+                                       }\r
+                                       /* Change the Network adapter setting */\r
+                                       sprintf_s( str, sizeof(str), "\nnetsh interface ip set address ""\"%s\""" static addr=%s mask=",\r
+                                                        szAdapterName, Ipaddr );\r
+                                       strcat_s( str, sizeof(str), SubNetMask );\r
+                                       if( addrDefaultGatewayIPAddress.S_un.S_addr != 0 )\r
+                                       {\r
+                                               strcat_s( str, sizeof(str), " gateway=" );\r
+                                               strcat_s( str, sizeof(str), Gateway );\r
+                                       }\r
+                                       strcat_s( str, sizeof(str), " gwmetric=1" );\r
+                                       printf( str );\r
+                                       system( str );\r
+\r
+                                       /* Wait for changing the ip address */\r
+                                       Sleep(200);\r
+                                       NotifyAddrChange( NULL, NULL );\r
+                               }\r
+                               iFirst = 1;\r
+                               break;\r
+                       }\r
+                       pAdapter = pAdapter->Next;\r
+               }\r
+       }\r
+\r
+       FREE( pAdapterInfo );\r
+\r
+       return USER_ERR_OK;\r
+#elif __linux__\r
+       static struct ifconf    Ifc_Get;\r
+       struct ifreq                    Ifreq_Size[MAX_INTERFACE];\r
+       struct in_addr                  addrip_get,addrMask_get,addrdg_get;\r
+       struct in_addr                  addrip_set,addrMask_set,addrdg_set;\r
+       struct ifreq                    ifr_set;\r
+       struct sockaddr_in              *s_in;\r
+       struct sockaddr_in              get_addr;\r
+       USER_NETWORK_INFO               User_Network[MAX_INTERFACE];\r
+       USER_ADAPTER_INFO               Get_NetworkInfo;\r
+       FILE                                    *pFile;\r
+       t_RouteInfo                             RouteInfo_Defo;\r
+       int                                             sock_network;\r
+       int                                             iErrCode;\r
+       int                                             i;\r
+       int                                             iNet_Number;\r
+       int                                     Interface_Number;\r
+       int                                             NotGateway=0;\r
+       char                                    system_call[256];\r
+       char                                    iKey;\r
+       uint8_t                                 aucUser_MacAddress[6];\r
+       unsigned char                   *pMAC_addr;\r
+\r
+       Interface_Number=0;\r
+\r
+       Ifc_Get.ifc_len = sizeof( Ifreq_Size );\r
+       Ifc_Get.ifc_ifcu.ifcu_buf=(void *)Ifreq_Size;\r
+\r
+       sock_network = socket( AF_INET, SOCK_DGRAM, 0 );\r
+       if( sock_network < SOCKET_NOT_OPEN )\r
+       {\r
+               perror("Socket not open");\r
+               return USER_ERR_NG;\r
+       }\r
+\r
+       if( ioctl ( sock_network, SIOCGIFCONF, &Ifc_Get ) == -1 )\r
+       {\r
+               perror("Error can not get the interface list");\r
+               close( sock_network );\r
+               return USER_ERR_NG;\r
+       }\r
+\r
+       /* Calculate the number that came back from the kernel */\r
+       iNet_Number = Ifc_Get.ifc_len / ( int )sizeof( struct ifreq );\r
+\r
+       for(i=0;i<iNet_Number;i++)\r
+       {\r
+               /* Interface specification */\r
+               strncpy ( User_Network[i].USER_ifreq.ifr_name,Ifreq_Size[i].ifr_name,IFNAMSIZ-1 );\r
+\r
+               /* Mac address acquisition */\r
+               if( ioctl ( sock_network, SIOCGIFHWADDR, &User_Network[i].USER_ifreq ) == -1 )\r
+               {\r
+                       perror("Error can not get the Mac address");\r
+                       close( sock_network );\r
+                       return USER_ERR_NG;\r
+               }\r
+\r
+               pMAC_addr=( unsigned char *)&User_Network[i].USER_ifreq.ifr_hwaddr.sa_data;\r
+               sprintf( User_Network[i].MACAddr, "%02x:%02x:%02x:%02x:%02x:%02x", *pMAC_addr, *( pMAC_addr+1 ), *( pMAC_addr+2 ), *( pMAC_addr+3 ), *( pMAC_addr+4 ), *( pMAC_addr+5 ));\r
+               aucUser_MacAddress[0] = ( uint8_t ) User_Network[i].USER_ifreq.ifr_hwaddr.sa_data[5];\r
+               aucUser_MacAddress[1] = ( uint8_t ) User_Network[i].USER_ifreq.ifr_hwaddr.sa_data[4];\r
+               aucUser_MacAddress[2] = ( uint8_t ) User_Network[i].USER_ifreq.ifr_hwaddr.sa_data[3];\r
+               aucUser_MacAddress[3] = ( uint8_t ) User_Network[i].USER_ifreq.ifr_hwaddr.sa_data[2];\r
+               aucUser_MacAddress[4] = ( uint8_t ) User_Network[i].USER_ifreq.ifr_hwaddr.sa_data[1];\r
+               aucUser_MacAddress[5] = ( uint8_t ) User_Network[i].USER_ifreq.ifr_hwaddr.sa_data[0];\r
+\r
+               if( memcmp(pSetAdapterInfo->aucMacAddress,aucUser_MacAddress,sizeof( aucUser_MacAddress )) == 0 )\r
+               {\r
+                       Interface_Number=i;\r
+                       break;\r
+               }\r
+       }\r
+\r
+       /* IP address (IPv4) acquisition */\r
+       if ( ioctl ( sock_network, SIOCGIFADDR, &User_Network[Interface_Number].USER_ifreq ) == -1 )\r
+       {\r
+               perror( "Error can not get the IP address" );\r
+               close( sock_network );\r
+               return USER_ERR_NG;\r
+       }\r
+       memcpy( &get_addr, &User_Network[Interface_Number].USER_ifreq.ifr_addr, sizeof( struct sockaddr_in ));\r
+       memcpy( &User_Network[Interface_Number].IPAddr, inet_ntoa( get_addr.sin_addr ), sizeof(User_Network[Interface_Number].IPAddr )); \r
+\r
+       /* Mask address acquisition */\r
+       if ( ioctl ( sock_network, SIOCGIFNETMASK, &User_Network[Interface_Number].USER_ifreq ) == -1 )\r
+       {\r
+               perror( "Error can not get the Mask address" );\r
+               close( sock_network );\r
+               return USER_ERR_NG;\r
+       }\r
+       memcpy( &get_addr, &User_Network[Interface_Number].USER_ifreq.ifr_netmask, sizeof( struct sockaddr_in )); \r
+       memcpy( &User_Network[Interface_Number].IPMask, inet_ntoa( get_addr.sin_addr ), sizeof( User_Network[Interface_Number].IPMask ));\r
+\r
+       /* Get the default gateway from the system file */\r
+       pFile = fopen(DIR_PROC_ROUTE , "r" );\r
+       if( pFile == NULL )\r
+       {\r
+               printf( "Not systemfile read" );\r
+               close( sock_network );\r
+               return USER_ERR_NG;\r
+       }\r
+       while(1)\r
+       {\r
+               if ( fgets( User_Network[Interface_Number].Defo, sizeof( User_Network[Interface_Number].Defo ), pFile ) == 0 ) \r
+               {\r
+                       memset( User_Network[Interface_Number].Defo,0x00,sizeof( User_Network[Interface_Number].Defo ));\r
+                       fclose( pFile );\r
+                       NotGateway = 1;\r
+                       break;\r
+               }\r
+               //Route information acquisition\r
+               memset( &RouteInfo_Defo, 0x00, sizeof( RouteInfo_Defo ));\r
+               if ( sscanf(User_Network[Interface_Number].Defo, "%s%x%x%d%d%d%d%x%d%d%d",\r
+                               &RouteInfo_Defo.cIface,\r
+                               &RouteInfo_Defo.cDst,\r
+                               &RouteInfo_Defo.cGateway,\r
+                               &RouteInfo_Defo.iFlag,\r
+                               &RouteInfo_Defo.iRecCnt,\r
+                               &RouteInfo_Defo.iUse,\r
+                               &RouteInfo_Defo.iMetric,\r
+                               &RouteInfo_Defo.cMask,\r
+                               &RouteInfo_Defo.iMTU,\r
+                               &RouteInfo_Defo.iWindow,\r
+                               &RouteInfo_Defo.iIRTT) == 0 ) \r
+               {\r
+                       printf( "Not file read" );\r
+                       close( sock_network );\r
+                       fclose( pFile );\r
+                       return USER_ERR_NG;\r
+               }\r
+\r
+               /* device name and default GW flag check */\r
+               if (( strstr ( RouteInfo_Defo.cIface,User_Network[Interface_Number].USER_ifreq.ifr_name ) != NULL ) && ( RouteInfo_Defo.iFlag == ( RTF_UP | RTF_GATEWAY )))\r
+               {\r
+                       memcpy( &User_Network[Interface_Number].Defo, inet_ntoa( RouteInfo_Defo.cGateway ), INET_ADDRSTRLEN );\r
+                       fclose( pFile );\r
+                       break;\r
+               }\r
+               memset( User_Network[Interface_Number].Defo,0x00,sizeof( User_Network[Interface_Number].Defo ));\r
+       }\r
+\r
+       Get_NetworkInfo.ulIpAddress = htonl( inet_addr(User_Network[Interface_Number].IPAddr ));\r
+       Get_NetworkInfo.ulSubnetMask = htonl( inet_addr( User_Network[Interface_Number].IPMask ));\r
+       Get_NetworkInfo.ulDefaultGatewayIPAddress = htonl( inet_addr(User_Network[Interface_Number].Defo ));\r
+\r
+       /* Check that the network is the same */\r
+       if(( pSetAdapterInfo->ulIpAddress == Get_NetworkInfo.ulIpAddress )    &&\r
+               ( pSetAdapterInfo->ulSubnetMask == Get_NetworkInfo.ulSubnetMask ) &&\r
+               ( pSetAdapterInfo->ulDefaultGatewayIPAddress == Get_NetworkInfo.ulDefaultGatewayIPAddress ))\r
+       {\r
+               return USER_ERR_OK;\r
+       }\r
+       else\r
+       {\r
+               addrip_get.s_addr=htonl( Get_NetworkInfo.ulIpAddress );\r
+               addrip_set.s_addr=htonl( pSetAdapterInfo->ulIpAddress );\r
+               addrMask_get.s_addr=htonl( Get_NetworkInfo.ulSubnetMask );\r
+               addrMask_set.s_addr=htonl( pSetAdapterInfo->ulSubnetMask );\r
+               addrdg_get.s_addr=htonl( Get_NetworkInfo.ulDefaultGatewayIPAddress );\r
+               addrdg_set.s_addr=htonl( pSetAdapterInfo->ulDefaultGatewayIPAddress );\r
+               printf( "Change the Network adapter setting ?\n" );\r
+               printf( "%s", User_Network[Interface_Number].USER_ifreq.ifr_name );\r
+               printf( "\tIP address: \t\t%s", inet_ntoa( addrip_get ));\r
+               printf( "--> %s\n",inet_ntoa( addrip_set ));\r
+               printf( "\tSubnet mask: \t\t%s",inet_ntoa( addrMask_get ));\r
+               printf( " --> %s\n",inet_ntoa( addrMask_set ));\r
+               printf( "\tDefault GW IP address: \t%s",inet_ntoa( addrdg_get ));\r
+               printf( " --> %s\n",inet_ntoa ( addrdg_set ));\r
+               while ( 1 )\r
+               {\r
+                       printf( "\nPlease Press Key if change the Network adapter setting Yes('Y') or No('N')\n" );\r
+                       iKey= ( char )getchar();\r
+                       if (( iKey == 'Y' ) || ( iKey == 'y' ))\r
+                       {\r
+                               break;\r
+                       }\r
+                       else if (( iKey == 'N' ) || ( iKey == 'n' ))\r
+                       {\r
+                               return USER_ERR_NG;\r
+                       }\r
+               }\r
+       }\r
+\r
+       /* Change the IP address */\r
+       s_in = (struct sockaddr_in *)&ifr_set.ifr_addr;\r
+       s_in->sin_family = AF_INET;\r
+       s_in->sin_addr.s_addr = htonl( pSetAdapterInfo->ulIpAddress );\r
+       strncpy( ifr_set.ifr_name,User_Network[Interface_Number].USER_ifreq.ifr_name,IFNAMSIZ-1 );\r
+       if ( ioctl( sock_network,SIOCSIFADDR,&ifr_set ) == -1 )\r
+       {\r
+               perror("Error can not set the IP address");\r
+               return USER_ERR_NG;\r
+       }\r
+       /* Change the address mask */\r
+       s_in->sin_addr.s_addr = htonl( pSetAdapterInfo->ulSubnetMask );\r
+       strncpy( ifr_set.ifr_name,User_Network[Interface_Number].USER_ifreq.ifr_name,IFNAMSIZ-1 );\r
+       if ( ioctl( sock_network,SIOCSIFNETMASK,&ifr_set ) == -1 )\r
+       {\r
+               perror("Error can not set the Mask address");\r
+               return USER_ERR_NG;\r
+       }\r
+       if( NotGateway == 1 )\r
+       {\r
+               /* Nothing */\r
+       }\r
+       else\r
+       {\r
+               /* Delete the default gateway */\r
+               sprintf( system_call,"route del default gw %s",inet_ntoa( addrdg_get ));\r
+               system(system_call);\r
+       }\r
+       /* add the default GW */\r
+       sprintf( system_call,"route add default gw %s",inet_ntoa( addrdg_set ));\r
+       system(system_call);\r
+       /* Wait for changing the ip address */\r
+       sleep(1);\r
+       return USER_ERR_OK;\r
+#endif\r
+}\r
diff --git a/CCIEF-BASIC_Slave/version.txt b/CCIEF-BASIC_Slave/version.txt
new file mode 100644 (file)
index 0000000..3e1c56a
--- /dev/null
@@ -0,0 +1 @@
+Version 1.02.4\r