Skip to content

Commit

Permalink
Merge pull request #1 from CMCRobotics/develop
Browse files Browse the repository at this point in the history
Integrate CMC robotics updates
  • Loading branch information
bcopy authored Jun 6, 2022
2 parents 75a863a + f1275c0 commit 08524a4
Show file tree
Hide file tree
Showing 210 changed files with 11,565 additions and 237 deletions.
52 changes: 52 additions & 0 deletions .github/workflows/build-action.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
name: build-action
on: [push]
defaults:
run:
working-directory: ./modules/web-ui
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- uses: actions/setup-node@v1

- name: Install npm dependencies
run: npm install

- name: Build & run
run: docker build .

# - name: SonarCloud Scan
# uses: sonarsource/sonarcloud-github-action@master
# env:
# GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
# SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}

- name: Start Mosquitto
uses: namoshek/mosquitto-github-action@v1
with:
version: '1.6'
ports: '1883:1883 9001:9001'
certificates: ${{ github.workspace }}/modules/web-ui/.ci/tls-certificates
config: ${{ github.workspace }}/modules/web-ui/.ci/mosquitto.conf
container-name: 'mqtt'

- name: Wait a bit until MQTT broker has started
run: sleep 30

# - name: Cypress Test
# run: npm run cytest

- name: Login to DockerHub
uses: docker/login-action@v1
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GHCR_PAT }}

- name: Push container to GHCR
uses: docker/build-push-action@v2
with:
context: ./modules/web-ui
push: true
tags: ghcr.io/cmcrobotics/microsquad-web-ui:latest
8 changes: 8 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -109,6 +109,10 @@ venv/
ENV/
env.bak/
venv.bak/
virtual-env/

# Bitio cache file
portscan.cache

# Spyder project settings
.spyderproject
Expand All @@ -131,3 +135,7 @@ dmypy.json
.vscode/
.vscode/cpx.json
modules/gateway/src/main/python/microsquad/portscan.cache

# ignore virtual environments
**/*-venv/*
node/
62 changes: 62 additions & 0 deletions .gitlab-ci.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@


.openshift_auth_setup: &openshift_auth_setup
image: gitlab-registry.cern.ch/paas-tools/openshift-client:latest
before_script:
- echo "Sourcing SCM branch environment at modules/web-ui/deployment/cern-oc/${CI_COMMIT_REF_NAME}.env"
- source modules/web-ui/deployment/cern-oc/deployment/${CI_COMMIT_REF_NAME}.env
- export ENV_FILE_VAR="${CI_COMMIT_REF_NAME^^}_ENV"
- echo "Sourcing ${ENV_FILE_VAR} into .env file "
- cat ${!ENV_FILE_VAR} > .env
- source .env
- echo "Authenticating with ${OPENSHIFT_SERVER}"
- oc login $OPENSHIFT_SERVER --token=$OPENSHIFT_TOKEN
- oc project $NAMESPACE


sonarqube-check:
image:
name: sonarsource/sonar-scanner-cli:latest
entrypoint: [""]
variables:
SONAR_USER_HOME: "${CI_PROJECT_DIR}/.sonar" # Defines the location of the analysis task cache
GIT_DEPTH: "0" # Tells git to fetch all the branches of the project, required by the analysis task
cache:
key: "${CI_JOB_NAME}"
paths:
- .sonar/cache
script:
- sonar-scanner
allow_failure: true
only:
- develop
- master



Build Web UI image:
stage: build
image:
name: gitlab-registry.cern.ch/ci-tools/docker-image-builder
entrypoint: [""]
script:
- echo "{\"auths\":{\"$CI_REGISTRY\":{\"username\":\"$CI_REGISTRY_USER\",\"password\":\"$CI_REGISTRY_PASSWORD\"}}}" > /kaniko/.docker/config.json
- echo Building latest Docker Image $CI_REGISTRY_IMAGE:$CI_COMMIT_REF_NAME
- /kaniko/executor --context $CI_PROJECT_DIR/modules/web-ui --dockerfile $CI_PROJECT_DIR/modules/web-ui/Dockerfile --destination $CI_REGISTRY_IMAGE:$CI_COMMIT_REF_NAME
only:
- master
- develop


Update deployment:
<<: *openshift_auth_setup
stage: deploy
script:
- echo "***** Updating instance deployment for ${CI_COMMIT_REF_NAME}"
- oc process --ignore-unknown-parameters -o json --param-file=deployment/${CI_COMMIT_REF_NAME}.env -f modules/web-ui/deployment/cern-oc/service.yml --local=true | jq '.items[] | select (.kind != "PersistentVolumeClaim")' | oc apply -f -
- oc process --ignore-unknown-parameters --param-file=deployment/${CI_COMMIT_REF_NAME}.env -f modules/web-ui/deployment/cern-oc/routes.yml --local=true | oc apply -f -
only:
refs: [develop, master]
changes:
- "modules/web-ui/deployment/cern-oc/**/*"

117 changes: 117 additions & 0 deletions .mvn/wrapper/MavenWrapperDownloader.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,117 @@
/*
* Copyright 2007-present the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import java.net.*;
import java.io.*;
import java.nio.channels.*;
import java.util.Properties;

public class MavenWrapperDownloader {

private static final String WRAPPER_VERSION = "0.5.6";
/**
* Default URL to download the maven-wrapper.jar from, if no 'downloadUrl' is provided.
*/
private static final String DEFAULT_DOWNLOAD_URL = "https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/"
+ WRAPPER_VERSION + "/maven-wrapper-" + WRAPPER_VERSION + ".jar";

/**
* Path to the maven-wrapper.properties file, which might contain a downloadUrl property to
* use instead of the default one.
*/
private static final String MAVEN_WRAPPER_PROPERTIES_PATH =
".mvn/wrapper/maven-wrapper.properties";

/**
* Path where the maven-wrapper.jar will be saved to.
*/
private static final String MAVEN_WRAPPER_JAR_PATH =
".mvn/wrapper/maven-wrapper.jar";

/**
* Name of the property which should be used to override the default download url for the wrapper.
*/
private static final String PROPERTY_NAME_WRAPPER_URL = "wrapperUrl";

public static void main(String args[]) {
System.out.println("- Downloader started");
File baseDirectory = new File(args[0]);
System.out.println("- Using base directory: " + baseDirectory.getAbsolutePath());

// If the maven-wrapper.properties exists, read it and check if it contains a custom
// wrapperUrl parameter.
File mavenWrapperPropertyFile = new File(baseDirectory, MAVEN_WRAPPER_PROPERTIES_PATH);
String url = DEFAULT_DOWNLOAD_URL;
if(mavenWrapperPropertyFile.exists()) {
FileInputStream mavenWrapperPropertyFileInputStream = null;
try {
mavenWrapperPropertyFileInputStream = new FileInputStream(mavenWrapperPropertyFile);
Properties mavenWrapperProperties = new Properties();
mavenWrapperProperties.load(mavenWrapperPropertyFileInputStream);
url = mavenWrapperProperties.getProperty(PROPERTY_NAME_WRAPPER_URL, url);
} catch (IOException e) {
System.out.println("- ERROR loading '" + MAVEN_WRAPPER_PROPERTIES_PATH + "'");
} finally {
try {
if(mavenWrapperPropertyFileInputStream != null) {
mavenWrapperPropertyFileInputStream.close();
}
} catch (IOException e) {
// Ignore ...
}
}
}
System.out.println("- Downloading from: " + url);

File outputFile = new File(baseDirectory.getAbsolutePath(), MAVEN_WRAPPER_JAR_PATH);
if(!outputFile.getParentFile().exists()) {
if(!outputFile.getParentFile().mkdirs()) {
System.out.println(
"- ERROR creating output directory '" + outputFile.getParentFile().getAbsolutePath() + "'");
}
}
System.out.println("- Downloading to: " + outputFile.getAbsolutePath());
try {
downloadFileFromURL(url, outputFile);
System.out.println("Done");
System.exit(0);
} catch (Throwable e) {
System.out.println("- Error downloading");
e.printStackTrace();
System.exit(1);
}
}

private static void downloadFileFromURL(String urlString, File destination) throws Exception {
if (System.getenv("MVNW_USERNAME") != null && System.getenv("MVNW_PASSWORD") != null) {
String username = System.getenv("MVNW_USERNAME");
char[] password = System.getenv("MVNW_PASSWORD").toCharArray();
Authenticator.setDefault(new Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(username, password);
}
});
}
URL website = new URL(urlString);
ReadableByteChannel rbc;
rbc = Channels.newChannel(website.openStream());
FileOutputStream fos = new FileOutputStream(destination);
fos.getChannel().transferFrom(rbc, 0, Long.MAX_VALUE);
fos.close();
rbc.close();
}

}
Binary file added .mvn/wrapper/maven-wrapper.jar
Binary file not shown.
2 changes: 2 additions & 0 deletions .mvn/wrapper/maven-wrapper.properties
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.6.3/apache-maven-3.6.3-bin.zip
wrapperUrl=https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar
19 changes: 15 additions & 4 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,9 @@
# MicroSquad (a.k.a uSquad)

[![Known Vulnerabilities](https://snyk.io/test/github/lucasvanmol/usquad-web-ui/badge.svg)](https://snyk.io/test/github/lucasvanmol/usquad-web-ui)
![Build](https://github.com/cmcrobotics/microsquad/workflows/build-action/badge.svg)
[![Quality Gate Status](https://sonarcloud.io/api/project_badges/measure?project=lucasvanmol_usquad-web-ui&metric=alert_status)](https://sonarcloud.io/dashboard?id=lucasvanmol_usquad-web-ui)

A Microbit orchestration library based on [Bitio](https://github.com/AdventuresInMinecraft/bitio) : Using a single Microbit as a gateway, control remote Microbits via the radio.
Messages are exchanged using the Influx line protocol (with a small custom parser implemented in micropython)

Expand All @@ -15,14 +19,21 @@ Messages are exchanged using the Influx line protocol (with a small custom parse
# Dependencies

For the **uSquad** Gateway :
* Python3
* Python 3.8+
* [https://github.com/AdventuresInMinecraft/Bitio](https://github.com/AdventuresInMinecraft/bitio)
* A Microbit running the bitio firmware
* [Line Protocol parser for Python](https://pypi.org/project/influx-line-protocol/)

For the **uSquad** clients :
* The provided **uSquad** firmware to upload on each Microbit.

For the **uSquad** Web Interface :
* The spectacular [Kenney Character Assets](https://kenney.itch.io/kenney-character-assets) under Creative Commons Zero

# How to use it

# How to develop
## Flash the Microbits

## Start the Gateway

## Connect to the administration web interface

# How to develop
60 changes: 60 additions & 0 deletions docs/plantuml/game-management.puml
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
@startuml


actor "Game Organiser" as Organiser
actor Player

participant "Game Manager" as Manager
control Gateway
database "Game Session" as Game
queue Broker
participant "Web Display" as Web

activate Organiser


Organiser -> Gateway : Start session
activate Gateway

activate Broker

Gateway -> Game : Declare Game
activate Game
Gateway -> Broker : Declare namespace

Gateway --> Organiser : Admin Code

Organiser -> Manager : Run Game
activate Manager
Manager --> Organiser : Audience Code
Manager --> Gateway : Audience Code

Manager -> Gateway : Send Game Logic

Organiser -> Web : Join Game Admin Display
activate Web
Player --> Web : Join Game Audience Display

Web -> Broker : Subscribe
Organiser -> Player : Start
activate Player
Player -> Gateway : Initiate connection
Gateway -> Broker : Declare device

loop Game phase
Organiser -> Gateway : Start Phase
loop Player interactions
Player -> Gateway : Interact
Gateway -> Game : Update State
Gateway -> Broker : Broadcast update
Broker -> Web : Update Display
end
Organiser -> Gateway : End Phase
end
deactivate Player
Organiser -> Gateway : End Game
Gateway -> Game : Close Session
Gateway -> Broker : Release namespace
deactivate Game
Broker -> Web : Display Game Stats
@enduml
Binary file added docs/plantuml/game-management/game-management.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
23 changes: 23 additions & 0 deletions docs/plantuml/gateway-components.puml
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
@startuml Gateway components

title Gateway components
frame "Connector Scheduler"{
[Connector] <<bitio>>
[Gateway] <<microbit>>
[Terminal] <<microbit>>
USB -left-> Gateway
USB --> Connector
Radio <-> Gateway
Radio <--> Terminal
}
[MQTT Client] <<paho>> as mqtt

frame "Mapper scheduler"{
[Mapper]
RxPy -right-> Mapper
RxPy -up-> Connector
Mapper -> Homie
}
Homie --> mqtt

@enduml
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
4 changes: 4 additions & 0 deletions modules/client-micropython/src/main/micropython/heart.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
from microbit import display, Image


display.show(Image.HEART)
Loading

0 comments on commit 08524a4

Please sign in to comment.