Skip to content

Commit

Permalink
Programmatic PDOs and integration of platforms (#42)
Browse files Browse the repository at this point in the history
* compiler is changed for Linux pc

* small fix on Readme. Executable is named EXO_APP not EXO_ROBOT

* Adapted M1 platfrom from Tim, to be modified...

* Compile and run the code to display joint status in real-time in command line; State transition (e.g., from idle state to demo state) is not working yet

* M1 moves with position control. But the actual angle is not tranformed correctly.

* M1 can track sin wave trajectory. Still need to figure out the conversion between device unit (encoder count) and joint unit (degree or radian).

* Position tracking without posControlConfirmSP; CANOPEN communication crashes occasionally.

* Basic velocity and torque/current control, i.e., tracking sine wave target or constant target, were tested.

* Correct conversion between joint unit and device unit

* before merge with ROS implementation

* Segmentation fault!

* M1 moves

* cleaned up debug outputs

* Added safety checks against NaN/Inf at Joint level

* enable torque sensor on the axis

* add zero calibration

* for calibration, move joint to 90 degree, then put weight on the link

* Addition of network communication and minimal use demo in M3DemoMachine

* Updated M3 to publish endeffector states on network communication

* Comments and format of FLNLHelper

* demo machine cyclic move between 0 and 90 degree with position, velocity, and torque control

* work on system identification and compensation strategy

* Updated libFLNL and default time registered in state for network communication

* FLNL connection management

* Typo

* Network communication documentation

* Update NetworkCommunication.md

* Makefle update for merging

* working on demonstration functions

* Minimal untested, uncalibrated M2 implementatio

* Improved M2 demomachine and Arc Circle state - Not tested

* Peak can dedicated initscriipt and some M2 calibration (only torque control)

* model compensation and virtual spring piloting

* PD torque feedback control and feedforward friction compensation

* Created (empty) M2 spasticity test app

* Inverted hwUpdate and update in application for delay. Switch to 1kHz.

* Testing for Programmatic PDOs (#38)

* test: Programmatic OD - not working

* Still not working.

* Not Working

* Programmatic OD: TPDO backend

* Programmatic OD - created CO_setRPDO, not functional

* Calibration Working. Sit worked once, not completely good still.

* setRPDO function working

* Working Programmatic RPDO. Two Sensors good.

* Programmatic TPDO! Working with sensor

* Not functional. Possibly issue with timing of state machine creation.

* Logging crutch sensors and calibration operational

* Calibration works. Problem with first pos always 0

* Removed Segfault with deleting crutch sensors

* RPDO object created and working

* Added Continuous Position Control commands

* Programmatic TPDOs implemented.

* Tidy up and comments on Programmatic PDOs

* Programmatic PDOs on Drives... partially working

* Improved uploadBB.sh script using rsync (faster)

* Improved uploadBB script using rsync (faster) and config files

* Fix bug missing header in FLNLHelper

* Programmatic PDOs - All Demo Test (#39)

* test: Programmatic OD - not working

* Still not working.

* Not Working

* Programmatic OD: TPDO backend

* Programmatic OD - created CO_setRPDO, not functional

* Calibration Working. Sit worked once, not completely good still.

* setRPDO function working

* Working Programmatic RPDO. Two Sensors good.

* Programmatic TPDO! Working with sensor

* Not functional. Possibly issue with timing of state machine creation.

* Logging crutch sensors and calibration operational

* Calibration works. Problem with first pos always 0

* Removed Segfault with deleting crutch sensors

* RPDO object created and working

* Added Continuous Position Control commands

* Programmatic TPDOs implemented.

* Tidy up and comments on Programmatic PDOs

* Programmatic PDOs on Drives... partially working

* Working Programmatic PDOs - Demo Machines updated

* Optimised (a bit) the can PDOs setup

* Update Drive.cpp

Failed at merging.

* Update KincoDrive.cpp

Didn't update properly to new generateRPDOConfigSDO/generateTPDOConfigSDO formats

* Switched to Velocity control mode 3 (was -3)

* Swaped hwUpdate and update and faster control loop

* Added drive reset error function and call from init()

* change object dictionary for M2 sensors

* Ros Node created at DemoMachine Constructor (#40)

* fix variable name and tab

* ROS Node is created at DemoMachine constructor

* Cleanup init scripts (no candump, no increase queulength)

* Remove spasticity app for merge

* Tidy up for Programmatic PDO

* Removed some unncessary entries in the OD

* Documentation changes for programmatic PDOs

* Tidy up

* merging...

* Fixed Eigen problem w/ state dynamic creation. M1, M2, M3 running

* Added privilege management to avoid logging and running as root

* Updated contributors list

* Slight cleanup of M1 code

* Slight cleanup of M2 code

* Merged force sensor versions. X2 force sensor ids to be checked.

* Improved M2 (and comments) and fix libFLNL destruction segfault

* Check for state machine name in CMake

* Updated ROS documentation

* application.cpp cleanup

* Blame vscode files from repo

* Removed f64 in M_PIf64 definitions as they aren't available on Windows Compiler

* Correct Simulation bug with ROS X2DemoMachine

* Updated ROS documentation

* Added code snippet to list can socket parameters

* Added code snippet to list can socket parameters

* Corrected FourierSensor sensorID/COBID

* Changed FourierForceSensor Calibration to no longer need SDO Message. Small tidy up of M1.

Co-authored-by: emekB <[email protected]>
Co-authored-by: Yue <[email protected]>
Co-authored-by: Yue <[email protected]>
Co-authored-by: justinfong-unimelb <[email protected]>
Co-authored-by: xinlianggunimelb <[email protected]>
Co-authored-by: Emek Barış Küçüktabak <[email protected]>
Co-authored-by: justinfong-unimelb <[email protected]>
  • Loading branch information
8 people authored Mar 4, 2021
1 parent 7110243 commit d79c8cf
Show file tree
Hide file tree
Showing 100 changed files with 5,971 additions and 5,764 deletions.
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
CANopenSocket/canopend/X2_log.txt
*.o
.vs/
.vscode/
/.devcontainer/Dockerfile
/.devcontainer/devcontainer.json
/build/*
Expand Down
5 changes: 0 additions & 5 deletions .vscode/settings.json

This file was deleted.

27 changes: 19 additions & 8 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -11,11 +11,15 @@ project(CORC C CXX)
## Select the application by setting the state machine to use
#(it should be the class name and have corresponding header naming in a corresponding folder)
# If your application use ROS, don't forget to change the flag bellow too.

set (STATE_MACHINE_NAME "ExoTestMachine")
#set (STATE_MACHINE_NAME "M3DemoMachine")
#set (STATE_MACHINE_NAME "M2DemoMachine")
#set (STATE_MACHINE_NAME "M3Machining")
#set (STATE_MACHINE_NAME "M3Chai")
set (STATE_MACHINE_NAME "ExoTestMachine")
#set (STATE_MACHINE_NAME "X2DemoMachine")
#set (STATE_MACHINE_NAME "M1DemoMachine")
#set (STATE_MACHINE_NAME "LoggingDevice")

# Comment to use actual hardware, uncomment for a nor robot (virtual) app
set(NO_ROBOT ON)
Expand All @@ -25,11 +29,9 @@ set(USE_ROS OFF)

# Select desired logging level (Options: TRACE, DEBUG, INFO, WARN, ERROR, CRITICAL OFF)
# INFO is the recommended level in normal operation
set(CORC_LOGGING_LEVEL INFO)
################################################################################

add_definitions(-DBASE_DIRECTORY=${CMAKE_SOURCE_DIR})
set(CORC_LOGGING_LEVEL INFO)

################################################################################
if(USE_ROS)
add_definitions(-DUSEROS)
endif()
Expand Down Expand Up @@ -62,13 +64,16 @@ set(CMAKE_CXX_FLAGS_DEBUG "-g")
set(CMAKE_CXX_FLAGS_RELEASE "-O3")

## Current state machine (APP) to be build
add_definitions(-DSTATE_MACHINE_TYPE=${STATE_MACHINE_NAME})
add_definitions(-DSTATE_MACHINE_INCLUDE="${STATE_MACHINE_NAME}.h")
if(NOT STATE_MACHINE_NAME)
message(FATAL_ERROR "ERROR: No state machine (APP) selected: Abort.")
else()
add_definitions(-DSTATE_MACHINE_TYPE=${STATE_MACHINE_NAME})
add_definitions(-DSTATE_MACHINE_INCLUDE="${STATE_MACHINE_NAME}.h")
endif()
if(NO_ROBOT)
add_definitions(-DNOROBOT=1)
endif()


## Get all source and header files (only the target app folder is included)
file(GLOB_RECURSE SOURCES "src/core/*.cpp" "src/core/*.c" "src/hardware/*.cpp" "src/hardware/*.c" "src/apps/${STATE_MACHINE_NAME}/*.c" "src/apps/${STATE_MACHINE_NAME}/*.cpp" "lib/FLNL/*.cpp")
file(GLOB_RECURSE HEADERS "src/core/*.h" "src/hardware/*.h" "src/apps/${STATE_MACHINE_NAME}/*.h")
Expand All @@ -86,6 +91,12 @@ list (APPEND INCLUDE_DIRS lib/)
add_subdirectory(lib/yaml-cpp/)


## Hack for Yaml files path (absolute path required for ROS use, see X2Robot::initializeRobotParams)
if(CMAKE_CROSSCOMPILING)
add_definitions(-DBASE_DIRECTORY=.)
else()
add_definitions(-DBASE_DIRECTORY=${CMAKE_SOURCE_DIR})
endif()

## Add ROS dependencies
if(USE_ROS)
Expand Down
2 changes: 1 addition & 1 deletion LICENSE
Original file line number Diff line number Diff line change
Expand Up @@ -186,7 +186,7 @@
same "printed page" as the copyright notice for easier
identification within third-party archives.

Copyright [yyyy] [name of copyright owner]
Copyright 2020-2021 CORC contributors

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
Expand Down
15 changes: 10 additions & 5 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -87,13 +87,15 @@ Using an FTP Client on the Host (if you do not have one - or a preferred client,
- **Username:** debian
- **Password:** temppwd

On the host, using the FTP client, transfer the build executable in `build/ExoTestMachine_APP`, along with the contents of the `initRobot` folder, to the Beaglebone.
On the host, using the FTP client, transfer the build executable in `build/ExoTestMachine_APP`, along with the contents of the `script` folder, to the Beaglebone.

Alternatively, you can use the [script/uploadBB.sh](script/uploadBB.sh) to automatically upload the content of the script folder and the build/\*APP to the BeagleBone through ssh.

> Note: The `initRobot` folder contains scripts for setting up the CAN interfaces that CORC uses for communication
> Note: The `script` folder contains scripts for setting up the CAN interfaces that CORC uses for communication. In case you use a PEAK CAN USB device, make sure to either use the `initPCAN` script or to manually setup the CAN queue length to 1000 (`ifconfig can0 txqueuelen 1000`).
**[DEPLOY-LOCAL]** This entire step is not required if you are running on your development machine - just note the location of your `ExoTestMachine_APP` and `initRobot` folder.
In addition, copy the `config` folder to the same directory as the executable - this is used to set some parameters in the X2Robot.

**[DEPLOY-LOCAL]** This entire step is not required if you are running on your development machine - just note the location of your `ExoTestMachine_APP` and `script` folder.

## Run Virtual ExoTestMachine

Expand All @@ -118,12 +120,12 @@ This must be repeated for the `.sh` scripts as well.
The CORC Application requires the a CAN device to send commands to. For this test, we create a virtual CAN device (so no hardware is required). To do this, initialise the Virtual CAN device to set up, bind to and run candump ([candump manpage](https://manpages.debian.org/testing/can-utils/candump.1.en.html)) on the VCAN interface using the `initVCAN` script.

```bash
$ cd initRobot
$ cd script
$ ./initVCAN.sh
```
This initialises a virtual CAN interface, and prints the contents of the bus to the terminal window.

> Note: This can be changed to use a non-virtual CAN interface, but this requires some minor changes to the code before compilation, and the use of the `X2_startCAN.sh` script instead.
> Note: This can be changed to use a non-virtual CAN interface, but this requires some minor changes to the code before compilation, and the use of the `initCAN0.sh` script (or `initPCAN.sh` if you use a PEAK CAN USB device) instead.
SSH into the BeagleBone in a second terminal window (**[DEPLOY-LOCAL]** or launch a second terminal) to launch the application:

Expand Down Expand Up @@ -200,6 +202,9 @@ The following individuals have made contributions to CORC:
- Vincent Crocher
- Emek Barış Küçüktabak
- Justin Fong
- Yue Wen
- Tim Haswell
- Xinliang Guo

Please contact fong.j[at]unimelb.edu.au with questions or suggestions for continuing development, or if you wish to be more involved in the planning/organisation of CORC.

Expand Down
4 changes: 3 additions & 1 deletion doc/ObjectDictionary.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
# Modifying the Object Dictionary for PDO Messages
# Modifying the Object Dictionary for PDO Messages (DEPRECIATED)

> Note: This has changed. The PDOs are now programmatic. To create a PDO, one needs to create an RPDO or TPDO object with the appropriate parameters. The PDO is linked directly to a variable in the constructor of the object.
The CORC implementation uses the CANOpenNode Stack, and their implementation of the object dictionary.

Expand Down
11 changes: 8 additions & 3 deletions doc/Simulation.md
Original file line number Diff line number Diff line change
Expand Up @@ -53,9 +53,9 @@ $ catkin build
Clone CORC and the required packages into your workspace:
```bash
$ cd ~/catkin_ws/src
$ git clone github.com/UniMelbHumanRoboticsLab/CANOpenRobotController.git
$ git clone github.com/emekBaris/x2_description.git
$ git clone github.com/emekBaris/cob_gazebo_plugins.git
$ git clone https://github.com/UniMelbHumanRoboticsLab/CANOpenRobotController.git
$ git clone https://github.com/emekBaris/x2_description.git
$ git clone https://github.com/emekBaris/cob_gazebo_plugins.git
```

Make sure `USE_ROS` flag is set to `ON` in CMakeLists.txt:
Expand All @@ -70,6 +70,11 @@ If you would like to do a simulation:
Set your state machine that uses ROS (e.g., X2DemoMachine):
```set (STATE_MACHINE_NAME "X2DemoMachine")```

Select your robot model in the launch file `launch\x2_sim.launch` to match a model defined in `config\x2_params.xml`, for example:
```<arg name="robot_name" default="X2_SRA_A"/>```



Build CORC:
```bash
$ cd ~/catkin_ws
Expand Down
5 changes: 4 additions & 1 deletion launch/x2_sim.launch
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,10 @@
<node name="rviz" pkg="rviz" type="rviz" args="-d $(find x2_description)/rviz/view_robot.rviz"/>

<!-- CORC -->
<node name="$(arg robot_name)" pkg="CORC" type="X2DemoMachine_APP_NOROBOT" output="screen"/>
<node name="$(arg robot_name)" pkg="CORC" type="X2DemoMachine_APP_NOROBOT" output="screen" args="-can vcan0"/>

<!-- rqt gui for dynamic params -->
<node name="rqt_gui" pkg="rqt_gui" type="rqt_gui"/>

</launch>

68 changes: 2 additions & 66 deletions lib/FLNL/baseSocket.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,8 @@ baseSocket::baseSocket():

//! Destructor releasing memory and closing the socket
baseSocket::~baseSocket() {
Disconnect();
if(Connected)
Disconnect();
pthread_mutex_destroy(&ReceivedMutex);
pthread_mutex_destroy(&ReceivedCmdMutex);
delete[] ReceivedValues;
Expand Down Expand Up @@ -253,8 +254,6 @@ void unlock_mutex(void * m) {
void * receiving(void * c) {
baseSocket * local=(baseSocket*)c;

short int remainingtoprocess_n=0;

while(local->Connected) {
//Read a full frame
int ret=recv(local->Socket, (char *)local->FullMessageIn, MESSAGE_SIZE, 0);
Expand Down Expand Up @@ -287,8 +286,6 @@ void * receiving(void * c) {
printf("FLNL::Error receiving (wrong number of params).\n");
}
#endif
//discard any previous remaining data
remainingtoprocess_n=0;
}
//Is it values?
else if(local->FullMessageIn[0]==local->InitValueCode && cksum_ok) {
Expand All @@ -309,68 +306,7 @@ void * receiving(void * c) {
printf("FLNL::Error receiving (wrong number of values).\n");
}
#endif
remainingtoprocess_n=0;
}
// else if() {
// //If just recv msg looks ok (init code and checksum)
// if(local->FullMessageIn[0]==local->InitValueCode && cksum_ok) {
// //then use it as it is
// unsigned short int nb_values = local->FullMessageIn[1];
//
// memcpy(local->ToProcess, local->FullMessageIn, MESSAGE_SIZE);
// //discard any previous remaining data
// remainingtoprocess_n=0;
// }
// else {
// //Use stored init part of message in buffer if any
// memcpy(local->ToProcess, local->MessageRemainingToProcess, remainingtoprocess_n);
// //concatenate with the begining of received sequence and use that
// memcpy(&local->ToProcess[remainingtoprocess_n], local->FullMessageIn, MESSAGE_SIZE-remainingtoprocess_n);
//
// /*printf("Pre:");
// for(int k=0; k<remainingtoprocess_n; k++)
// printf("%02X", local->MessageRemainingToProcess[k]);
// printf(" + ");
// for(int k=0; k<ret; k++)
// printf("%02X", local->FullMessageIn[k]);
// printf(" = \nPre:");
// for(int k=0; k<MESSAGE_SIZE; k++)
// printf("%02X", local->ToProcess[k]);
// printf(" (%d+%d=?%d)\n", remainingtoprocess_n, ret, MESSAGE_SIZE);*/
//
// //Store end of message for later use in buffer
// unsigned int i;
// for(i=MESSAGE_SIZE-1; i>=0; i--) {
// remainingtoprocess_n=MESSAGE_SIZE-i;
// if(local->FullMessageIn[i]==local->InitValueCode)
// break;
// }
// memcpy(local->MessageRemainingToProcess, &local->FullMessageIn[i], remainingtoprocess_n);
//
// /*for(int k=0; k<remainingtoprocess_n; k++)
// printf("%02X", local->MessageRemainingToProcess[k]);
// printf(" = \n");
// for(int k=0; k<remainingtoprocess_n; k++)
// printf("%02X", local->FullMessageIn[i+k]);
// printf(" (%d)\n\n", remainingtoprocess_n);*/
// }
//
// //Check init code and checksum
// if(local->ToProcess[0]==local->InitValueCode && Checksum(local->ToProcess)==local->ToProcess[MESSAGE_SIZE-1]) {
// //Copy received values
// pthread_mutex_lock(&local->received_mutex);
// pthread_cleanup_push(unlock_mutex, (void *)&local->received_mutex); //Ensure that mutex will be unlock on thread cancelation (disconnect)
// memcpy(local->ReceivedValues, &local->ToProcess[2], local->NbValuesToReceive*sizeof(double)); //TODO!!!!!!!!!!!!!!!!!!!!!
// pthread_cleanup_pop(1); //unlock mutex
// local->IsValues=true;
// }
// #ifdef VERBOSE
// else {
// //Incorrect values
// printf("FLNL::Error receiving (wrong code or checksum).\n");
// }
// #endif
// }
}
else if(ret<0) {
#ifdef VERBOSE
Expand Down
7 changes: 4 additions & 3 deletions script/initCAN0.sh
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,10 @@
#initialisation of CAN interface on BBAI
#assumes proper configuration on CAN0 (see https://stackoverflow.com/questions/62207737/beaglebone-ai-how-to-setup-can-bus)

echo "Enabling CAN0"
sudo ip link set can0 up type can bitrate 1000000
sudo ifconfig can0 up
#sudo ifconfig can0 txqueuelen 1000

echo "can0 up. Dumping (ctrl+c to close):"

candump -c -t z can0,080~111111 #Filter out 080 sync messages
#echo "can0 up. Dumping (ctrl+c to close):"
#candump -c -t z can0,080~111111 #Filter out 080 sync messages
10 changes: 7 additions & 3 deletions script/initCAN0CAN1.sh
100755 → 100644
Original file line number Diff line number Diff line change
@@ -1,10 +1,14 @@
#Initializes can0 and can1. Set the queue length top 1000
#!/bin/bash

#initialisation of CAN interfaces on BB

echo "Enabling CAN0"
sudo ip link set can0 up type can bitrate 1000000
sudo ifconfig can0 up

echo "Enabling CAN1"
sudo ip link set can1 up type can bitrate 1000000
sudo ifconfig can1 up

sudo ifconfig can0 txqueuelen 1000
sudo ifconfig can1 txqueuelen 1000
#echo "can0 up. Dumping (ctrl+c to close):"
#candump -c -t z can0,080~111111 #Filter out 080 sync messages
8 changes: 5 additions & 3 deletions script/initVCAN.sh
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
echo "enabling VCAN device on vcan0"
#!/bin/bash

echo "Enabling VCAN on vcan0"
sudo modprobe vcan
sudo ip link add dev vcan0 type vcan
sudo ip link set up vcan0
echo "starting candump of vcan0"
candump vcan0
#echo "starting candump of vcan0"
#candump vcan0
50 changes: 23 additions & 27 deletions script/uploadBB.sh
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ SSH_USER="debian"
BUILD_FOLDER="build/"
INIT_SCRIPTS="*.sh"
SCRIPT_FOLDER="script/"
CONFIG_FOLDER="config/"

#use default BB address (dependent on OS used)
if [[ "$OSTYPE" == "cygwin" ]] || [[ "$OSTYPE" == "msys" ]] || [[ "$OSTYPE" == "win32" ]]; then
Expand All @@ -17,42 +18,37 @@ else
SSH_IP_ADDR="192.168.6.2"
fi

#Check if BB is connected
ping -W 1 -c 1 $SSH_IP_ADDR >/dev/null 2>&1
if [ $? -ne 0 ] ; then
echo "Nothing connected on ${SSH_IP_ADDR}. Exiting."
exit
fi

#set in root folder
parent_path=$( cd "$(dirname "${BASH_SOURCE[0]}")" ; pwd -P )
cd "$parent_path"/..


echo "---------------------------------------------------"
echo "Create remote folders (~/CANOpenRobotController/)"
echo "---------------------------------------------------"
echo "## Create remote folder (~/CANOpenRobotController/):"
echo -n "ssh -q $SSH_USER@$SSH_IP_ADDR "mkdir -p ~/CANOpenRobotController/" ... "
ssh -q $SSH_USER@$SSH_IP_ADDR "mkdir -p ~/CANOpenRobotController/"
ssh -q $SSH_USER@$SSH_IP_ADDR "mkdir -p ~/CANOpenRobotController/$SCRIPT_FOLDER"
ssh -q $SSH_USER@$SSH_IP_ADDR "mkdir -p ~/CANOpenRobotController/$BUILD_FOLDER"
echo "done."

echo ""
echo "---------------------------------------------------"
echo "Copy scripts"
echo "---------------------------------------------------"
for SCRIPT in "$SCRIPT_FOLDER"*.sh
do
echo ${SCRIPT}
scp -q ${SCRIPT} $SSH_USER@$SSH_IP_ADDR:~/CANOpenRobotController/${SCRIPT}
done
echo "## Copy scripts:"
echo -n "rsync -chaz -e 'ssh -q' ${SCRIPT_FOLDER} $SSH_USER@$SSH_IP_ADDR:~/CANOpenRobotController/${SCRIPT_FOLDER} ... "
rsync -chaz -e 'ssh -q' ${SCRIPT_FOLDER} $SSH_USER@$SSH_IP_ADDR:~/CANOpenRobotController/${SCRIPT_FOLDER}
echo "done."

echo ""
echo "## Copy config files:"
echo -n "rsync -chaz -e 'ssh -q' ${CONFIG_FOLDER} $SSH_USER@$SSH_IP_ADDR:~/CANOpenRobotController/${CONFIG_FOLDER} ... "
rsync -chaz -e 'ssh -q' ${CONFIG_FOLDER} $SSH_USER@$SSH_IP_ADDR:~/CANOpenRobotController/${CONFIG_FOLDER}
echo "done."

echo ""
echo "---------------------------------------------------"
echo "Copy APP(s):"
echo "---------------------------------------------------"
for APP in "$BUILD_FOLDER"*APP
do
echo ${APP}
scp -q ${APP} $SSH_USER@$SSH_IP_ADDR:~/CANOpenRobotController/${APP}
done
for APP in "$BUILD_FOLDER"*APP_NOROBOT
do
echo ${APP}
scp -q ${APP} $SSH_USER@$SSH_IP_ADDR:~/CANOpenRobotController/${APP}
done
echo "done."
echo "## Copy APP(s):"
echo -n "rsync -chaz -e 'ssh -q' --include='*APP' --include='*APP_NOROBOT' --exclude='*' ${BUILD_FOLDER} $SSH_USER@$SSH_IP_ADDR:~/CANOpenRobotController/${BUILD_FOLDER} ... "
rsync -chaz -e 'ssh -q' --include='*APP' --include='*APP_NOROBOT' --exclude='*' ${BUILD_FOLDER} $SSH_USER@$SSH_IP_ADDR:~/CANOpenRobotController/${BUILD_FOLDER}
echo "done."
Loading

0 comments on commit d79c8cf

Please sign in to comment.