examples/AVR/Slave/ds401.c
changeset 413 57c7a451c671
child 417 ae068232859c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/examples/AVR/Slave/ds401.c	Fri Mar 07 15:47:28 2008 +0100
@@ -0,0 +1,89 @@
+/*
+This file is part of CanFestival, a library implementing CanOpen Stack.
+
+Copyright (C): Andreas GLAUSER
+
+See COPYING file for copyrights details.
+
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+This library is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+Lesser General Public License for more details.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+*/
+
+// DS 401 Digital IO handling according DS 401 V2.1 "Device Profile for Generic I/O Modules"
+
+// Includes for the Canfestival
+#include "ds401.h"
+
+unsigned char digital_input_handler(CO_Data* d, unsigned char *newInput, unsigned char size)
+{
+  unsigned char loops, i, input, transmission = 0;
+
+  loops = (sizeof(Read_Inputs_8_Bit) <= size) ? sizeof(Read_Inputs_8_Bit) : size;
+
+  for (i=0; i < loops; i++)
+  {
+    input = *newInput ^ Polarity_Input_8_Bit[i];
+    if (Read_Inputs_8_Bit[i] != input)
+    {
+      if (Global_Interrupt_Enable_Digital)
+      {
+        if ((Interrupt_Mask_Any_Change_8_Bit[i] & (Read_Inputs_8_Bit[i] ^ input)) 
+	 || (Interrupt_Mask_Low_to_High_8_Bit[i] & ~Read_Inputs_8_Bit[i] & input)
+	 || (Interrupt_Mask_High_to_Low_8_Bit[i] & Read_Inputs_8_Bit[i] & ~input))
+	   transmission = 1;
+      }
+      // update object dict
+      Read_Inputs_8_Bit[i] = input;
+    }
+    newInput++;
+  }
+  if (transmission)
+    sendPDOevent(d);
+
+  return 1;
+}
+
+unsigned char digital_output_handler(CO_Data* d, unsigned char *newOutput, unsigned char size)
+{
+  unsigned char loops, i, error, type;
+  unsigned char varsize = 1;
+
+  loops = (sizeof(Write_Outputs_8_Bit) <= size) ? sizeof(Write_Outputs_8_Bit) : size;
+
+  for (i=0; i < loops; i++)
+  {
+    getODentry(d, 0x1001, 0x0, &error, &varsize, &type, RO);
+    if ((getState(d) == Stopped) || (error != 0))	// node stopped or error
+    {
+      Write_Outputs_8_Bit[i] &= (~Error_Mode_Outputs_8_Bit[i] | Error_Value_Outputs_8_Bit[i]);
+      Write_Outputs_8_Bit[i] |= (Error_Mode_Outputs_8_Bit[i] & Error_Value_Outputs_8_Bit[i]);
+    }
+    *newOutput = Write_Outputs_8_Bit[i] ^ Change_Polarity_Outputs_8_Bit[i];
+    newOutput++;
+  }
+  return 1;
+}
+
+unsigned char analog_input_handler(CO_Data* d, unsigned int *newInput, unsigned char size)
+{
+  return 0;
+}
+
+unsigned char analog_output_handler(CO_Data* d, unsigned int *newOutput, unsigned char size)
+{
+  return 0;
+}
+
+
+