Luis Silvio Cordova Rivadeneira
/
Can_open_masternode
Can_open_masternode
source/main.cpp@0:9dd7c6129683, 2011-05-30 (annotated)
- Committer:
- sam_grove
- Date:
- Mon May 30 07:36:47 2011 +0000
- Revision:
- 0:9dd7c6129683
Initial public release of master node example
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
sam_grove |
0:9dd7c6129683 | 1 | /************************************************************** |
sam_grove |
0:9dd7c6129683 | 2 | CAN OPEN SAMPLE - MBED MASTER |
sam_grove |
0:9dd7c6129683 | 3 | **************************************************************/ |
sam_grove |
0:9dd7c6129683 | 4 | /* |
sam_grove |
0:9dd7c6129683 | 5 | This file is part of CanFestival, a library implementing CanOpen Stack. |
sam_grove |
0:9dd7c6129683 | 6 | |
sam_grove |
0:9dd7c6129683 | 7 | Copyright (C): Edouard TISSERANT and Francis DUPIN |
sam_grove |
0:9dd7c6129683 | 8 | mbed Port: sgrove |
sam_grove |
0:9dd7c6129683 | 9 | |
sam_grove |
0:9dd7c6129683 | 10 | See COPYING file for copyrights details. |
sam_grove |
0:9dd7c6129683 | 11 | |
sam_grove |
0:9dd7c6129683 | 12 | This library is free software; you can redistribute it and/or |
sam_grove |
0:9dd7c6129683 | 13 | modify it under the terms of the GNU Lesser General Public |
sam_grove |
0:9dd7c6129683 | 14 | License as published by the Free Software Foundation; either |
sam_grove |
0:9dd7c6129683 | 15 | version 2.1 of the License, or (at your option) any later version. |
sam_grove |
0:9dd7c6129683 | 16 | |
sam_grove |
0:9dd7c6129683 | 17 | This library is distributed in the hope that it will be useful, |
sam_grove |
0:9dd7c6129683 | 18 | but WITHOUT ANY WARRANTY; without even the implied warranty of |
sam_grove |
0:9dd7c6129683 | 19 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
sam_grove |
0:9dd7c6129683 | 20 | Lesser General Public License for more details. |
sam_grove |
0:9dd7c6129683 | 21 | |
sam_grove |
0:9dd7c6129683 | 22 | You should have received a copy of the GNU Lesser General Public |
sam_grove |
0:9dd7c6129683 | 23 | License along with this library; if not, write to the Free Software |
sam_grove |
0:9dd7c6129683 | 24 | Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
sam_grove |
0:9dd7c6129683 | 25 | */ |
sam_grove |
0:9dd7c6129683 | 26 | /****************************************************************************** |
sam_grove |
0:9dd7c6129683 | 27 | Project description: |
sam_grove |
0:9dd7c6129683 | 28 | |
sam_grove |
0:9dd7c6129683 | 29 | Allow a user to change the bus state by sending COM messages to the device |
sam_grove |
0:9dd7c6129683 | 30 | 57600 baud 8-n-1 send "help" for a list of options and formating info |
sam_grove |
0:9dd7c6129683 | 31 | CAN speed - 125k |
sam_grove |
0:9dd7c6129683 | 32 | |
sam_grove |
0:9dd7c6129683 | 33 | ******************************************************************************/ |
sam_grove |
0:9dd7c6129683 | 34 | |
sam_grove |
0:9dd7c6129683 | 35 | #include "mbed.h" |
sam_grove |
0:9dd7c6129683 | 36 | #include "main.h" |
sam_grove |
0:9dd7c6129683 | 37 | #include "canfestival.h" |
sam_grove |
0:9dd7c6129683 | 38 | #include "can_mbed.h" |
sam_grove |
0:9dd7c6129683 | 39 | #include "mbed_master.h" |
sam_grove |
0:9dd7c6129683 | 40 | #include "port_helper.h" |
sam_grove |
0:9dd7c6129683 | 41 | |
sam_grove |
0:9dd7c6129683 | 42 | // Set used for main program timing control |
sam_grove |
0:9dd7c6129683 | 43 | Ticker SysTimer; |
sam_grove |
0:9dd7c6129683 | 44 | // flag used by the main program timing control interrupt |
sam_grove |
0:9dd7c6129683 | 45 | uint8_t timer_interrupt = 0; |
sam_grove |
0:9dd7c6129683 | 46 | |
sam_grove |
0:9dd7c6129683 | 47 | // CAN - put and take data from the stack |
sam_grove |
0:9dd7c6129683 | 48 | uint8_t nodeID; |
sam_grove |
0:9dd7c6129683 | 49 | uint8_t change_node_id; |
sam_grove |
0:9dd7c6129683 | 50 | NMTStateAdjustment stack_state = reset; |
sam_grove |
0:9dd7c6129683 | 51 | |
sam_grove |
0:9dd7c6129683 | 52 | // read a can message from the stack |
sam_grove |
0:9dd7c6129683 | 53 | static Message m = Message_Initializer; |
sam_grove |
0:9dd7c6129683 | 54 | const Message empty_msg = Message_Initializer; |
sam_grove |
0:9dd7c6129683 | 55 | |
sam_grove |
0:9dd7c6129683 | 56 | int main() |
sam_grove |
0:9dd7c6129683 | 57 | { |
sam_grove |
0:9dd7c6129683 | 58 | // start the debug helper |
sam_grove |
0:9dd7c6129683 | 59 | initHelper(); |
sam_grove |
0:9dd7c6129683 | 60 | // start the system timer |
sam_grove |
0:9dd7c6129683 | 61 | SysTimer.attach_us(&serviceSysTimer, CYCLE_TIME*10); |
sam_grove |
0:9dd7c6129683 | 62 | // Initialize the CANopen bus |
sam_grove |
0:9dd7c6129683 | 63 | canInit(CAN_BAUDRATE); |
sam_grove |
0:9dd7c6129683 | 64 | // Start timer for the CANopen stack |
sam_grove |
0:9dd7c6129683 | 65 | initTimer(); |
sam_grove |
0:9dd7c6129683 | 66 | // set the default node id (1-127) |
sam_grove |
0:9dd7c6129683 | 67 | nodeID = 0x7f; |
sam_grove |
0:9dd7c6129683 | 68 | // Init the state |
sam_grove |
0:9dd7c6129683 | 69 | setState(&mbed_master_Data, Initialisation); |
sam_grove |
0:9dd7c6129683 | 70 | setNodeId (&mbed_master_Data, nodeID); |
sam_grove |
0:9dd7c6129683 | 71 | // Put the master in operational mode |
sam_grove |
0:9dd7c6129683 | 72 | setState(&mbed_master_Data, Operational); |
sam_grove |
0:9dd7c6129683 | 73 | |
sam_grove |
0:9dd7c6129683 | 74 | // keep on loopin' |
sam_grove |
0:9dd7c6129683 | 75 | while(1){ |
sam_grove |
0:9dd7c6129683 | 76 | |
sam_grove |
0:9dd7c6129683 | 77 | // just testing the rx functionality |
sam_grove |
0:9dd7c6129683 | 78 | if (canReceive(&m)){ |
sam_grove |
0:9dd7c6129683 | 79 | // the stack can crash with interrupts enabled |
sam_grove |
0:9dd7c6129683 | 80 | __disable_irq(); |
sam_grove |
0:9dd7c6129683 | 81 | // pass the message on and process it |
sam_grove |
0:9dd7c6129683 | 82 | canDispatch(&mbed_master_Data, &m); |
sam_grove |
0:9dd7c6129683 | 83 | // get back to work |
sam_grove |
0:9dd7c6129683 | 84 | __enable_irq(); |
sam_grove |
0:9dd7c6129683 | 85 | // and print the message for debugging |
sam_grove |
0:9dd7c6129683 | 86 | printMsg(m); |
sam_grove |
0:9dd7c6129683 | 87 | // empty it for the next use |
sam_grove |
0:9dd7c6129683 | 88 | m = empty_msg; |
sam_grove |
0:9dd7c6129683 | 89 | } |
sam_grove |
0:9dd7c6129683 | 90 | |
sam_grove |
0:9dd7c6129683 | 91 | // set the main loop exectuion speed at 10mS |
sam_grove |
0:9dd7c6129683 | 92 | if (sys_timer){ |
sam_grove |
0:9dd7c6129683 | 93 | // Reset timer |
sam_grove |
0:9dd7c6129683 | 94 | reset_sys_timer(); |
sam_grove |
0:9dd7c6129683 | 95 | |
sam_grove |
0:9dd7c6129683 | 96 | // look for COM requests |
sam_grove |
0:9dd7c6129683 | 97 | serviceCOMCommands(); |
sam_grove |
0:9dd7c6129683 | 98 | |
sam_grove |
0:9dd7c6129683 | 99 | // change operational state?? |
sam_grove |
0:9dd7c6129683 | 100 | switch(stack_state){ |
sam_grove |
0:9dd7c6129683 | 101 | |
sam_grove |
0:9dd7c6129683 | 102 | case start: |
sam_grove |
0:9dd7c6129683 | 103 | masterSendNMTstateChange (&mbed_master_Data, 0x00, NMT_Start_Node); |
sam_grove |
0:9dd7c6129683 | 104 | startSYNC(&mbed_master_Data); |
sam_grove |
0:9dd7c6129683 | 105 | stack_state = undefined; |
sam_grove |
0:9dd7c6129683 | 106 | break; |
sam_grove |
0:9dd7c6129683 | 107 | |
sam_grove |
0:9dd7c6129683 | 108 | case reset: |
sam_grove |
0:9dd7c6129683 | 109 | masterSendNMTstateChange (&mbed_master_Data, 0x00, NMT_Reset_Node); |
sam_grove |
0:9dd7c6129683 | 110 | startSYNC(&mbed_master_Data); |
sam_grove |
0:9dd7c6129683 | 111 | stack_state = undefined; |
sam_grove |
0:9dd7c6129683 | 112 | break; |
sam_grove |
0:9dd7c6129683 | 113 | |
sam_grove |
0:9dd7c6129683 | 114 | case stop: |
sam_grove |
0:9dd7c6129683 | 115 | masterSendNMTstateChange (&mbed_master_Data, 0x00, NMT_Stop_Node ); |
sam_grove |
0:9dd7c6129683 | 116 | stopSYNC(&mbed_master_Data); |
sam_grove |
0:9dd7c6129683 | 117 | stack_state = undefined; |
sam_grove |
0:9dd7c6129683 | 118 | break; |
sam_grove |
0:9dd7c6129683 | 119 | |
sam_grove |
0:9dd7c6129683 | 120 | default: |
sam_grove |
0:9dd7c6129683 | 121 | break; |
sam_grove |
0:9dd7c6129683 | 122 | } |
sam_grove |
0:9dd7c6129683 | 123 | |
sam_grove |
0:9dd7c6129683 | 124 | // Check if CAN address has been changed |
sam_grove |
0:9dd7c6129683 | 125 | if(change_node_id == 1){ |
sam_grove |
0:9dd7c6129683 | 126 | reset_node_id(); |
sam_grove |
0:9dd7c6129683 | 127 | setState(&mbed_master_Data, Stopped); // Stop the node, to change the node ID |
sam_grove |
0:9dd7c6129683 | 128 | setNodeId(&mbed_master_Data, nodeID); // Now the CAN adress is changed |
sam_grove |
0:9dd7c6129683 | 129 | setState(&mbed_master_Data, Initialisation); // Set to Pre_operational, master must boot it again |
sam_grove |
0:9dd7c6129683 | 130 | setState(&mbed_master_Data, Operational); |
sam_grove |
0:9dd7c6129683 | 131 | stack_state = reset; |
sam_grove |
0:9dd7c6129683 | 132 | } |
sam_grove |
0:9dd7c6129683 | 133 | |
sam_grove |
0:9dd7c6129683 | 134 | // other events |
sam_grove |
0:9dd7c6129683 | 135 | //sendPDOevent (&mbed_master_Data); |
sam_grove |
0:9dd7c6129683 | 136 | } |
sam_grove |
0:9dd7c6129683 | 137 | } |
sam_grove |
0:9dd7c6129683 | 138 | } |
sam_grove |
0:9dd7c6129683 | 139 | |
sam_grove |
0:9dd7c6129683 | 140 | // ISR for the Ticker |
sam_grove |
0:9dd7c6129683 | 141 | void serviceSysTimer() |
sam_grove |
0:9dd7c6129683 | 142 | { |
sam_grove |
0:9dd7c6129683 | 143 | // just used for debugging purposes |
sam_grove |
0:9dd7c6129683 | 144 | serviceHelper(); |
sam_grove |
0:9dd7c6129683 | 145 | // set a flag cleared by the main loop |
sam_grove |
0:9dd7c6129683 | 146 | timer_interrupt = 1; |
sam_grove |
0:9dd7c6129683 | 147 | } |
sam_grove |
0:9dd7c6129683 | 148 |