diff -r 84867470a60c -r 57c7a451c671 examples/AVR/Slave/ds401.c --- /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; +} + + +