Luis Silvio Cordova Rivadeneira
/
Can_open_slavenode
Can_open_slavenode
Diff: source/main.cpp
- Revision:
- 0:6219434a0cb5
diff -r 000000000000 -r 6219434a0cb5 source/main.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/source/main.cpp Mon May 30 07:14:41 2011 +0000 @@ -0,0 +1,129 @@ +/************************************************************** + CAN OPEN SAMPLE - MBED SLAVE DS401 +**************************************************************/ +/* +This file is part of CanFestival, a library implementing CanOpen Stack. + +Copyright (C): Edouard TISSERANT and Francis DUPIN +mbed Port: sgrove + +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 +*/ +/****************************************************************************** +Project description: +Test project for a DS 401 slave, running on mbed +Short description: + + reads from the COM port and changes ID, input value, ect. + 57600 8-n-1 + "help" will print a list of available commands + prints rx'd messages to the console + CAN running at 125k + + +******************************************************************************/ + +#include "mbed.h" +#include "main.h" +#include "canfestival.h" +#include "can_mbed.h" +#include "mbed_slave.h" +#include "ds401.h" +#include "port_helper.h" + +// Set used for main program timing control +Ticker SysTimer; +// flag used by the main program timing control interrupt +volatile uint8_t timer_interrupt = 0; +volatile uint8_t change_node_id = 0; + +// CAN - put and take data from the stack +uint8_t nodeID; +uint8_t digital_input[1] = {0}; +uint8_t digital_output[1] = {0}; +uint8_t last_digital_output; + +// read a can message from the stack +static Message m = Message_Initializer; + +int main() +{ + // initialize the helper code - just for debugging + initHelper(); + // start the system timer + SysTimer.attach_us(&serviceSysTimer, CYCLE_TIME); + // start of CANfestival stack calls + canInit(CAN_BAUDRATE); // Initialize the CANopen bus + initTimer(); // Start timer for the CANopen stack + nodeID = 10; // node id can be anything (1-127) + setNodeId (&mbed_slave_Data, nodeID); + // Init the state + setState(&mbed_slave_Data, Initialisation); + + // just keep loopin' + while(1){ + // Cycle timer, invoke action on every time slice + if (sys_timer){ + // Reset timer + reset_sys_timer(); + + // look for host communication to change things + serviceCOMCommands(); + + // service ds401 digital inputs and outputs + digital_input_handler(&mbed_slave_Data, digital_input, sizeof(digital_input)); + digital_output_handler(&mbed_slave_Data, digital_output, sizeof(digital_output)); + + if (last_digital_output != digital_output[0]){ + // do something + printf("new output = %d", digital_output[0]); + } + // save the last value = IO can get continuously bashed + last_digital_output = digital_output[0]; + + // Check if CAN address has been changed + if(change_node_id == 1){ + reset_node_id(); + setState(&mbed_slave_Data, Stopped); // Stop the node, to change the node ID + setNodeId(&mbed_slave_Data, nodeID); // Now the CAN adress is changed + setState(&mbed_slave_Data, Initialisation); // Set to Pre_operational, master must boot it again + } + } + + // a message was received - pass it to the CANstack + if (canReceive(&m)){ + // interrupts need to be disabled here + __disable_irq(); + // process it + canDispatch(&mbed_slave_Data, &m); + // and re-enabled here + __enable_irq(); + // print it to the console for debugging + printMsg(m); + } + } +} + +// ISR for the Ticker +void serviceSysTimer() +{ + // just used for debugging purposes + serviceHelper(); + // set a flag cleared by the main loop + timer_interrupt = 1; +} +