Skip to content
Snippets Groups Projects
Commit 598ef160 authored by dawehr's avatar dawehr
Browse files
parents c0f4b9c2 c16cdd5a
No related branches found
No related tags found
No related merge requests found
Showing
with 98 additions and 453 deletions
......@@ -26,13 +26,14 @@ MicroCART has 3 areas of development:
## Sections
[Quadcopter](quad/README.md)
[Ground Station](groundStation/README.md)
[Controls](controls/README.md)
[Controls](controls/README.md)
## Documentation
[How to demo the quadcopter](documentation/how_to_demo.md)
[How to charge the LiPo batteries](documentation/how_to_charge_lipo.md)
[Continuous Integration (automatic build process) FAQ](documentation/ci_faq.md)
[How to document things on Gitlab](documentation/how_to_document_things_on_gitlab.md)
[How to update the website](website/README.md)
# Stable Releases
To browse stable releases from previous teams, view the [Tags](/../tags).
\ No newline at end of file
# Controls
_TODO_
\ No newline at end of file
This folder contains the files used in developing the model of the quadcopter.
## Documentation
[Measuring Motor Resistance](documentation/MeasuringMotorResistance.pdf)
\ No newline at end of file
File added
......@@ -21,7 +21,7 @@ Follow this How-To to get the quadcopter up and running in Coover 3050.
7. Now you should be able to move the quadcopter trackable around in the tracking area, and see it update in real-time on the screen.
## Setup Ground Station
On the ground station computer (Co3050-09), log in with the following credentials.
On the ground station computer (Co3050-microcart), log in with the following credentials.
username: `ucart`<br>
password: `microcart`
......@@ -39,11 +39,6 @@ make vrpn
make
```
And set the wifi environment variable if you want to connect to the quad over wifi.
```bash
$ UCART_USE_WIFI=true
```
## Setup Transmitter
The RC transmitter is used to manually control the quad.
1. Ensure the transmitter has the following state before turning it on:
......@@ -76,18 +71,12 @@ Execute the following on the ground station from the root of the ground station
In one terminal, run the backend:
```bash
UCART_SOCKET=./ucart.socket ./BackEnd
```
In another terminal, run the monitor:
```bash
UCART_SOCKET=./ucart.socket ./Cli monitor -f
./BackEnd
```
Finally, in another terminal, export the socket path, and then execute any CLI commands that you like:
```bash
export UCART_SOCKET=./ucart.socket
./Cli setpid --pitch -p 1.000
./Cli setparam 'X pos PID' 'Setpoint' 1.000
# ... other CLI commands
```
......
......@@ -4,34 +4,39 @@
First, if submodules were not recursevly added through git. Run this command if you have made any attempt to make vrpn manually.
run
'git submodule update --init --recursive'
```bash
git submodule update --init --recursive
```
Now that you have all of the files necissary.
cd into the groundstation folder.
```bash
cd groundStation
make vrpn
make
```
run the program with sudo privledges
run the program with privledges
```bash
./BackEnd
```
If you wish to change the way the backend communicates to the quad and vice versa, look at src/config.h.
This provides a list of environment variables which you can set and use for your computer or time of use.
## Changing Defaults
If you wish to change the way the backend communicates to the quad and vice versa, look at `src/config.h`.
This provides a list of environment variables which you can set and use for your computer or time of use.
## Modifying
See MODIFYING for the software architecture/organization and how to add new functionality.
## Using
First, the backend daemon must be running. Run the backend with ./BackEnd. Note
the environment variables in config.h, especially the backend socket path. The backend
requires root for bluetooth, but can run as a normal user with TCP, as long as the
First, the backend daemon must be running. Run the backend with
```bash
./BackEnd
```
**Note:** The backend requires root for bluetooth, but can run as a normal user with TCP, as long as the
socket path is writable by the user.
Once the backend is running, various CLI tools can be used to view the state of the
quad and send commands. Each of these tools is given as the first argument
to the CLI program, for example, to get a node output the quad, use `cli getoutput`. Note that
to the CLI program, for example, to get a node output from the quad, use `cli getoutput`. Note that
the backend socket environment variable must be set to the same value as it
was for the backend. The CLI program also supports busybox-style symbolic links.
For example, if there is a symlink named `getoutput` that points to the `cli` binary,
......@@ -39,48 +44,41 @@ running the `getoutput` program will effectively run `cli getoutput`.
The names of the binaries is subject to change.
For a list of cli commands and more in depth usage explainations, use the --help flag.
'./Cli --help'
For a list of cli commands and more in depth usage explainations, use the `--help` flag.
```bash
./Cli --help
```
For help with the specific cli command you are running, use the --help flag once again.
'./Cli getoutput --help'
For help with the specific cli command you are running, use the `--help` flag once again.
```bash
./Cli getoutput --help
```
### Example
In one terminal or screen, run the backend:
`./BackEnd`
```bash
./BackEnd
```
This will activate the quad and the backend, and the backend will be available for
connections from the frontend tools. One useful tool is the getnodes. In another
connections from the frontend tools. One useful tool is the `getnodes`. In another
terminal window, run
`./Cli getnodes`
```bash
./Cli getnodes
```
or alternatively with symlinks
`./getnodes`
This will fetch the block_id, type_id and name of every node in the current graph
You can run any number of any combination of frontend tools at the same time.
### Batch Update of PID constants
The CLI only supports setting one PID constant at a time using the following command.
From the `groundStation` folder:
```
./Cli setpid --pitch -p 1.000
```bash
./getnodes
```
This can get tedious for 27 PID constants.
This will fetch the `block_id`, `type_id` and name of every node in the current graph
To help, we made a batch script that allows you to easily set all 27 PID constants at once and save your progress as you go.
First, edit the `parameters.txt` file in the `groundStation/scripts` folder to specify the values you want to set. The script will parse this file and pass them to the `Cli` program.
Then simply run the script from the `groundStation` folder:
```
scripts/setpid_batch.sh
```
You can run any number of any combination of frontend tools at the same time.
If you find it helpful, with this setup you can create a bash script that simply
runs the same commands. This has been found to be of use when we are tuning.
Remember to commit your changes in the `parameters.txt` file if you believe you have found a better default state for the quad.
\ No newline at end of file
There are a couple of already written bash scripts in the `scripts/` folder.
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE QtCreatorProject>
<!-- Written by QtCreator 4.1.0, 2017-04-19T23:57:31. -->
<!-- Written by QtCreator 4.0.1, 2017-04-21T10:58:17. -->
<qtcreator>
<data>
<variable>EnvironmentId</variable>
<value type="QByteArray">{f7736f41-610d-4989-a7d9-6e994afe94ba}</value>
<value type="QByteArray">{ec588c71-c0cc-43f4-8233-a07fa24de8ad}</value>
</data>
<data>
<variable>ProjectExplorer.Project.ActiveTarget</variable>
......@@ -61,7 +61,7 @@
<valuemap type="QVariantMap">
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Desktop</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Desktop</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">{94de1029-defb-4d1d-a0ac-6d51aba06ea3}</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">{c6f8ca21-0eb9-4188-b2e8-fae8725afa1b}</value>
<value type="int" key="ProjectExplorer.Target.ActiveBuildConfiguration">0</value>
<value type="int" key="ProjectExplorer.Target.ActiveDeployConfiguration">0</value>
<value type="int" key="ProjectExplorer.Target.ActiveRunConfiguration">0</value>
......@@ -184,13 +184,13 @@
<valuelist type="QVariantList" key="PE.EnvironmentAspect.Changes"/>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">MicroCART</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.Qt4RunConfiguration:/local/ucart/Documents/MicroCART_17-18/groundStation/gui/MicroCART/MicroCART.pro</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.Qt4RunConfiguration:/home/jake/Microcart_17-18/groundStation/gui/MicroCART/MicroCART.pro</value>
<value type="bool" key="QmakeProjectManager.QmakeRunConfiguration.UseLibrarySearchPath">true</value>
<value type="QString" key="Qt4ProjectManager.Qt4RunConfiguration.CommandLineArguments"></value>
<value type="QString" key="Qt4ProjectManager.Qt4RunConfiguration.ProFile">MicroCART.pro</value>
<value type="bool" key="Qt4ProjectManager.Qt4RunConfiguration.UseDyldImageSuffix">false</value>
<value type="QString" key="Qt4ProjectManager.Qt4RunConfiguration.UserWorkingDirectory"></value>
<value type="QString" key="Qt4ProjectManager.Qt4RunConfiguration.UserWorkingDirectory.default">/local/ucart/Documents/MicroCART_17-18/groundStation/gui/MicroCART</value>
<value type="QString" key="Qt4ProjectManager.Qt4RunConfiguration.UserWorkingDirectory.default">/home/jake/Microcart_17-18/groundStation/gui/MicroCART</value>
<value type="uint" key="RunConfiguration.QmlDebugServerPort">3768</value>
<value type="bool" key="RunConfiguration.UseCppDebugger">false</value>
<value type="bool" key="RunConfiguration.UseCppDebuggerAuto">true</value>
......
......@@ -97,10 +97,6 @@ MainWindow::MainWindow(QWidget *parent) :
/* Connect various things that can result in sending setpoints */
connect(ui->pbSendSetpoint, SIGNAL (clicked()), this, SLOT (sendSetpoints()));
connect(ui->xSetpoint, SIGNAL (returnPressed()), this, SLOT (sendSetpoints()));
connect(ui->ySetpoint, SIGNAL (returnPressed()), this, SLOT (sendSetpoints()));
connect(ui->zSetpoint, SIGNAL (returnPressed()), this, SLOT (sendSetpoints()));
connect(ui->setpointList, SIGNAL (doubleClicked(QModelIndex)), this, SLOT (sendSelectedSetpoint()));
}
......@@ -400,3 +396,24 @@ void MainWindow::on_socketPath_returnPressed()
{
QProcessEnvironment::systemEnvironment().insert("UCART_SOCKET", ui->socketPath->text());
}
void MainWindow::on_xSetpoint_returnPressed()
{
sp_x = ui->xSetpoint->text().toFloat();
emit (setParamValue(ui->xSetpointSelect->currentText(),
blockDefs[BLOCK_CONSTANT]->param_names[0], sp_x));
}
void MainWindow::on_ySetpoint_returnPressed()
{
sp_y = ui->ySetpoint->text().toFloat();
emit (setParamValue(ui->ySetpointSelect->currentText(),
blockDefs[BLOCK_CONSTANT]->param_names[0], sp_y));
}
void MainWindow::on_zSetpoint_returnPressed()
{
sp_z = ui->zSetpoint->text().toFloat();
emit (setParamValue(ui->zSetpointSelect->currentText(),
blockDefs[BLOCK_CONSTANT]->param_names[0], sp_z));
}
# CLI
## Usage
The Cli has been designed to function similarly to command line programs. Run the program using ./Cli
To run a specific command in the
test_uart_buff
\ No newline at end of file
# QUAD_ROOT is obtained from environment
SRC = $(QUAD_ROOT)/sw/modular_quad_pid/src
LIB = $(QUAD_ROOT)/lib/test
test_uart_buff: test_uart_buff.c
gcc -o test_uart_buff -I. -I$(SRC) -I$(LIB) $(LIB)/test.o test_uart_buff.c $(SRC)/uart_buff.c
.PHONY: clean
clean:
rm test_uart_buff
#include <stdio.h>
#include "uart_buff.h"
#include <math.h>
#include <string.h>
#include "test.h"
int float_equals(float x1, float x2) {
return fabs(x1 - x2) < 10e-5;
}
void print_test_result(int success, float exp, float act) {
if (success) printf("passed\n");
else printf("FAILED: expected %f but got %f\n", exp, act);
}
int failed(char *msg) {
printf("%s\n", msg);
return 1;
}
void add_packet(u16 type, unsigned short id, unsigned short length, unsigned char *data) {
uart_buff_add_u8(0xBE);
uart_buff_add_u8(type);
uart_buff_add_u8(type >> 8);
uart_buff_add_u8(id);
uart_buff_add_u8(id >> 8);
uart_buff_add_u8(length);
uart_buff_add_u8(length >> 8);
int i;
for (i = 0; i < length; i += 1) {
uart_buff_add_u8(data[i]);
}
// fake checksum
uart_buff_add_u8(1);
}
void add_VRPN_packet() {
float arr[6] = {1.0, 1.2, 1.4, -1.5, -0.5, -1.1};
unsigned char *data = (unsigned char *) &arr;
add_packet(4, 0, 24, data);
}
void add_basic_packet() {
unsigned char data[6] = {0xAA, 0xBB, 0xCC, 0xDD, 0xEE, 0xFF};
add_packet(4, 0, 6, data);
}
void add_garbage_data() {
int i;
for (i = 0; i < 32; i += 1) {
uart_buff_add_u8(i);
}
}
int setup_VRPN_packet() {
add_VRPN_packet();
if (!uart_buff_packet_ready()) {
return 0;
}
}
int setup_basic_packet() {
add_basic_packet();
if (!uart_buff_packet_ready()) {
return 0;
}
}
int test_empty_when_empty() {
uart_buff_reset();
int exp = 1;
int act = uart_buff_empty();
int success = exp == act;
return !success;
}
int test_empty_after_receiving_some_data() {
uart_buff_reset();
add_garbage_data();
int exp = 0;
int act = uart_buff_empty();
int success = exp == act;
return !success;
}
int test_full_is_false_at_start() {
uart_buff_reset();
int exp = 0;
int act = uart_buff_full();
int success = exp == act;
return !success;
}
int test_full_after_receiving_some_data() {
uart_buff_reset();
add_garbage_data();
int exp = 0;
int act = uart_buff_full();
int success = exp == act;
return !success;
}
int test_buffer_size_empty() {
uart_buff_reset();
int exp = 0;
int act = uart_buff_size();
int success = exp == act;
return !success;
}
int test_buffer_size_after_garbage_data() {
uart_buff_reset();
add_garbage_data();
int exp = 32;
int act = uart_buff_size();
int success = exp == act;
return !success;
}
int test_buffer_size_after_garbage_data_scanned() {
uart_buff_reset();
add_garbage_data();
uart_buff_packet_ready();
int exp = 0;
int act = uart_buff_size();
int success = exp == act;
return !success;
}
int test_buffer_size_after_VRPN_packet() {
uart_buff_reset();
if(!setup_VRPN_packet()) return failed("FAILED: setup failed");
int exp = 32;
int act = uart_buff_size();
int success = exp == act;
return !success;
}
int test_packet_get_u8() {
uart_buff_reset();
if(!setup_basic_packet()) return failed("FAILED: setup failed");
int exp = 0xAA;
int act = uart_buff_data_get_u8(0);
int success = exp == act;
return !success;
}
int test_packet_get_u8_with_offset() {
uart_buff_reset();
if(!setup_basic_packet()) return failed("FAILED: setup failed");
int exp = 0xBB;
int act = uart_buff_data_get_u8(1);
int success = exp == act;
return !success;
}
int test_packet_get_u16() {
uart_buff_reset();
if(!setup_basic_packet()) return failed("FAILED: setup failed");
int exp = 0xBBAA;
int act = uart_buff_data_get_u16(0);
int success = exp == act;
return !success;
}
int test_packet_get_u16_with_offset() {
uart_buff_reset();
if(!setup_basic_packet()) return failed("FAILED: setup failed");
int exp = 0xDDCC;
int act = uart_buff_data_get_u16(2);
int success = exp == act;
return !success;
}
int test_packet_get_u16_wrapped() {
uart_buff_reset();
int i;
for (i = 0; i < 1000; i += 1) uart_buff_add_u8(0);
uart_buff_packet_ready();
for (i = 0; i < 1040; i += 1) uart_buff_add_u8(0);
if(!setup_basic_packet()) return failed("FAILED: setup failed");
int exp = 0xBBAA;
int act = uart_buff_data_get_u16(0);
int success = exp == act;
return !success;
}
int test_packet_get_u32() {
uart_buff_reset();
if(!setup_basic_packet()) return failed("FAILED: setup failed");
unsigned int exp = 0xDDCCBBAA;
unsigned int act = uart_buff_data_get_u32(0);
int success = exp == act;
return !success;
}
int test_packet_get_u32_with_offset() {
uart_buff_reset();
if(!setup_basic_packet()) return failed("FAILED: setup failed");
unsigned int exp = 0xFFEEDDCC;
unsigned int act = uart_buff_data_get_u32(2);
int success = exp == act;
return !success;
}
int test_packet_get_u32_wrapped_1_4() {
uart_buff_reset();
int i;
for (i = 0; i < 1000; i += 1) uart_buff_add_u8(0);
uart_buff_packet_ready();
for (i = 0; i < 1040; i += 1) uart_buff_add_u8(0);
if(!setup_basic_packet()) return failed("FAILED: setup failed");
int exp = 0xDDCCBBAA;
int act = uart_buff_data_get_u32(0);
int success = exp == act;
return !success;
}
int test_packet_get_u32_wrapped_2_4() {
uart_buff_reset();
int i;
for (i = 0; i < 1000; i += 1) uart_buff_add_u8(0);
uart_buff_packet_ready();
for (i = 0; i < 1039; i += 1) uart_buff_add_u8(0);
if(!setup_basic_packet()) return failed("FAILED: setup failed");
int exp = 0xDDCCBBAA;
int act = uart_buff_data_get_u32(0);
int success = exp == act;
return !success;
}
int test_packet_get_u32_wrapped_3_4() {
uart_buff_reset();
int i;
for (i = 0; i < 1000; i += 1) uart_buff_add_u8(0);
uart_buff_packet_ready();
for (i = 0; i < 1038; i += 1) uart_buff_add_u8(0);
if(!setup_basic_packet()) return failed("FAILED: setup failed");
int exp = 0xDDCCBBAA;
int act = uart_buff_data_get_u32(0);
int success = exp == act;
return !success;
}
int test_packet_get_float() {
uart_buff_reset();
if(!setup_VRPN_packet()) return failed("FAILED: setup failed");
float exp = 1.0;
float act = uart_buff_data_get_float(0);
int success = float_equals(exp, act);
return !success;
}
int test_packet_get_float_with_offset() {
uart_buff_reset();
if(!setup_VRPN_packet()) return failed("FAILED: setup failed");
float exp = 1.2;
float act = uart_buff_data_get_float(4);
int success = float_equals(exp, act);
return !success;
}
int test_packet_ready_at_start() {
uart_buff_reset();
int exp = 0;
int act = uart_buff_packet_ready();
int success = act == exp;
return !success;
}
int test_packet_ready_after_receiving_packet() {
uart_buff_reset();
if(!setup_basic_packet()) return failed("FAILED: setup failed");
int exp = 1;
int act = uart_buff_packet_ready();
int success = act == exp;
return !success;
}
int test_packet_ready_after_consuming_packet() {
uart_buff_reset();
if(!setup_basic_packet()) return failed("FAILED: setup failed");
uart_buff_consume_packet();
int exp = 0;
int act = uart_buff_packet_ready();
int success = act == exp;
return !success;
}
int test_size_when_data_lenth_too_large() {
uart_buff_reset();
unsigned char data[UART_MAX_PACKET_SIZE + 1];
add_packet(4, 0, UART_MAX_PACKET_SIZE + 1, data);
uart_buff_packet_ready();
int exp = 0;
int act = uart_buff_size();
int success = act == exp;
return !success;
}
int test_get_raw() {
uart_buff_reset();
if(!setup_basic_packet()) return failed("FAILED: setup failed");
unsigned char exp[15] =
{0xBE, 0x04, 0x00, 0x00, 0x00, 0x06, 0x00, 0xAA, 0xBB, 0xCC, 0xDD, 0xEE, 0xFF, 0x01};
size_t length;
unsigned char *act = (unsigned char *) uart_buff_get_raw(&length);
int success = 1;
int i;
for (i = 0; i < length; i += 1) {
success = success && (exp[i] == act[i]);
if (!success) {
break;
}
}
return !success;
}
int main() {
test(test_empty_when_empty, "test empty when empty");
test(test_empty_after_receiving_some_data, "test empty after recieving soem data");
test(test_full_is_false_at_start, "test full is false at start");
test(test_full_after_receiving_some_data, "test full after receiving some data");
test(test_packet_get_u8, "test packet get u8");
test(test_packet_get_u8_with_offset, "test packet get u8 with offset");
test(test_packet_get_u16, "test packet get u16");
test(test_packet_get_u16_with_offset, "test packet get u16 wrapped");
test(test_packet_get_u16_wrapped, "test packet get u16 wrapped");
test(test_packet_get_u32, "test packet get u32");
test(test_packet_get_u32_with_offset, "test packet get u32 with offset");
test(test_packet_get_u32_wrapped_1_4, "test packet get u32 wrapped 1/4");
test(test_packet_get_u32_wrapped_2_4, "test packet get u32 warpped 2/4");
test(test_packet_get_u32_wrapped_3_4, "test packet get u32 wrapped 3/4");
test(test_packet_get_float, "test packet get u32 wrapped 3/4");
test(test_packet_get_float_with_offset, "test packet get float with offset");
test(test_buffer_size_after_VRPN_packet, "test buffer size after VRPN packet");
test(test_buffer_size_empty, "test buffer size empty");
test(test_buffer_size_after_garbage_data, "test buffer size after garbage data");
test(test_buffer_size_after_garbage_data_scanned, "test buffer size after garbage data scanned");
test(test_packet_ready_at_start, "test packet ready at start");
test(test_packet_ready_after_receiving_packet, "test packet ready after receiving packet");
test(test_packet_ready_after_consuming_packet, "test packet ready after consuming packet");
test(test_size_when_data_lenth_too_large, "test size when data length too large");
return test_summary();
}
#ifndef XIL_TYPES_H
#define XIL_TYPES_H
#include <stddef.h>
typedef unsigned char u8;
typedef unsigned short u16;
typedef unsigned int u32;
#endif
output/
PASSWORD
TEAM
lib/python2.7/site-packages/
pelicanconf.pyc
*.pyc
......
Contributing
----
# Making Changes to the Website
## Setup Environment
......@@ -32,8 +31,14 @@ make build
## Deploying the website
To deploy the website to our domain `may1716.sd.ece.iastate.edu`:
Before deploying, ensure you have 2 files in the website root directory: the
`PASSWORD` file and the `TEAM` file. The `PASSWORD` file should contain the sftp
password that was emailed to you for your website. The `TEAM` file should contain
the team name, something like `mayXXXX` or `decXXXX`.
The `PASSWORD` and `TEAM` files should contain NO SPACES and NO NEWLINES.
When ready to deploy:
```
make deploy
```
......@@ -4,7 +4,7 @@ Authors: Brendan
Category: Highlights
thumbnail: "/images/computation_graph.png"
The controls team wants to start tuning the controller on the quadcopter, they also want to have the modify the controller in order to better characterize each part. Currently, there is no way to do that except re-write the code on the quad, which bleeds into their development cycle. David took the challenge to solve this issue, and developed the idea of a computation graph.
The controls team wants to start tuning the controller on the quadcopter; they also want to have the ability to modify the controller in order to better characterize each part. Currently, there is no way to do that except to re-write the code on the quad, which bleeds into their development cycle. David took the challenge to solve this issue, and developed the idea of a computation graph.
<a href="/images/computation_graph.png">
<figure>
......
File added
......@@ -13,6 +13,10 @@ sortorder: 005
[Design Document 1](/files/DesignDocument1.docx.pdf)
[Design Document 2](/files/DesignDocument2.pdf)
## Final Report
[Final Report](/files/492FinalReport.pdf)
## Weekly Reports
<iframe src="https://drive.google.com/embeddedfolderview?id=0BywzM7Q_7PUSeF8tdWpmMVN0eG8#list" width="100%" height="500" frameborder="0"></iframe>
......
#!/bin/bash
HOST=may1716.sd.ece.iastate.edu
USERNAME=may1716
if [ ! -e PASSWORD ]; then
if [ ! -e PASSWORD ] || [ ! -e TEAM ]; then
echo "
*****
ERROR: File PASSWORD is missing.
Create a file called PASSWORD in the website root directory, and put the sftp
password in that file. No spaces. No newlines.
ERROR: File PASSWORD or file TEAM is missing.
Create 2 files in the website root directory, one named PASSWORD and another
named TEAM, and put the sftp password and senior design team name in these
files, respectively. No spaces. No newlines.
(The SFTP password was given to us in an email. Just search 'sftp password' in
your CyMail and it will probably be first result.)
your CyMail and it will probably be first result. The senior design team
name is something like mayXXXX or decXXXX)
*****
"
exit 1
fi
TEAM=$(cat TEAM)
PASSWORD=$(cat PASSWORD)
HOST=$TEAM.sd.ece.iastate.edu
USERNAME=$TEAM
chmod -R 755 output || exit 1
#cd output || exit 1
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment