Skip to content

Commit

Permalink
Use firmware store for default firmware
Browse files Browse the repository at this point in the history
  • Loading branch information
cibomahto committed Feb 26, 2017
1 parent d063ff3 commit f1b7b11
Show file tree
Hide file tree
Showing 23 changed files with 1,571 additions and 1,436 deletions.
1 change: 1 addition & 0 deletions .gitignore
Expand Up @@ -9,3 +9,4 @@ src/*.user
build-*
PatternPaint/*.user
windows-drivers/*
firmware/*
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
91 changes: 64 additions & 27 deletions buildArduinoFirmware.sh
@@ -1,41 +1,78 @@
#!/bin/bash

# Firmware builder for BlinkyTape devices in PatternPaint
#
# To use this, you'll need to install Arduino (1.8.1 is current as of writing).
#
# You'll also need to add the following board support packages:
# * Blinkinlabs32u4 boards
#
# And the following libraries:
# * FastLED (available through the library manager)
# * BlinkyTape (download from https://github.com/Blinkinlabs/BlinkyTape_Arduino/releases)
#
# Note for Windows: you'll also need MinGW to run this script, as described in the PatternPaint readme.



# Stop at any error
set -e

# Note: Use Arduino 1.6.12
ARDUINO="/Applications/Arduino-1.6.12.app/Contents/MacOS/Arduino"
BOARD="Blinkinlabs:avr:blinkytape"
HEX_CONVERTER="src/PatternPlayer_Sketch/hex_to_header.py"

SKETCH_NAME='PatternPlayer_Sketch'
SKETCH_DIR="$PWD/src/PatternPlayer_Sketch"
OUTPUT_DIR="src/libblinky/controllers"
OUTPUT_NAME="PATTERNPLAYER"
if [ -z ${ARDUINO+x} ]; then
echo "ARDUINO not defined- please set it to the full path to the Arduino executable. For example:"
echo "macOS: export ARDUINO=/Applications/Arduino-1.6.12.app/Contents/MacOS/Arduino"
echo "Windows: export ARDUINO=/c/Program\ Files\ \(x86\)/Arduino/arduino.exe"
exit 1
fi

BOARD="blinkinlabs:avr:blinkytape"
ARDUINO_FLAGS="--verify --verbose --preserve-temp-files --board ${BOARD}"

# Compile the sketch, and extract the .hex filename from the output, then convert it to a header
#
# | grep ${SKETCH_NAME}\.ino\.hex \ search for a line that contains the .hex filename
HEX=`${ARDUINO} ${ARDUINO_FLAGS} ${SKETCH_DIR}/${SKETCH_NAME}.ino \
| grep ${SKETCH_NAME}\.ino\.hex \
| sed 's/\"//g' \
| grep -oE "[^[:blank:]]+$"`
# Project root
BASEDIR=`pwd`

# Directory to place the compiled firmware
OUTPUT_DIR=${BASEDIR}/src/libblinky/firmware/blinkytape

# Temporary location to store firmware repos
FIRMWARE=${BASEDIR}/firmware

# BlinkyTape default firmware
BLINKYTAPE_FIRMWARE=${FIRMWARE}/BlinkyTape

################## Get device firmware repositories ##############
function getRepo {
# $1 is output directory
# $2 is repo location

if [ ! -d "$1" ]; then
git clone --depth 1 $2 $1
else
pushd $1
git pull
popd
fi
}

${HEX_CONVERTER} ${HEX} ${OUTPUT_NAME} > ${OUTPUT_DIR}/${SKETCH_NAME}.h
getRepo ${BLINKYTAPE_FIRMWARE} https://github.com/Blinkinlabs/BlinkyTape_Arduino.git


SKETCH_NAME='ProductionSketch'
SKETCH_DIR="$PWD/..//BlinkyTape_Arduino/examples/ProductionSketch"
OUTPUT_DIR="src/controllers"
OUTPUT_NAME="PRODUCTION"
################## Compile the firmware ##########################
function compileFirmware {
# $1 is the base sketch directory
# $2 is the sketch name
# $3 is the hex file output directory
# $4 is the hex filename

# Compile the sketch, and extract the .hex filename from the output, then convert it to a header
# Compile the sketch, and extract the .hex filename from the output, then convert it to a header
HEX=`"${ARDUINO}" ${ARDUINO_FLAGS} ${1}/${2}/${2}.ino \
| grep ${2}\.ino\.hex \
| sed 's/\"//g' \
| grep -oE "[^[:blank:]]+$"`
echo ${HEX}

HEX=`${ARDUINO} ${ARDUINO_FLAGS} ${SKETCH_DIR}/${SKETCH_NAME}.ino \
| grep ${SKETCH_NAME}\.ino\.hex \
| sed 's/\"//g' \
| grep -oE "[^[:blank:]]+$"`
mv "${HEX}" ${3}/${4}/${4}.hex
}

${HEX_CONVERTER} ${HEX} ${OUTPUT_NAME} > ${OUTPUT_DIR}/${SKETCH_NAME}.h
compileFirmware ${BASEDIR} "PatternPlayer_Sketch" ${OUTPUT_DIR} default
compileFirmware ${BLINKYTAPE_FIRMWARE}/examples "ProductionSketch" ${OUTPUT_DIR} factory
4 changes: 2 additions & 2 deletions src/app/gui/mainwindow.cpp
Expand Up @@ -211,7 +211,7 @@ MainWindow::MainWindow(QWidget *parent) :
QSize(DEFAULT_FIXTURE_WIDTH,
DEFAULT_FIXTURE_HEIGHT)).toSize();

scene.firmwareName = settings.value("BlinkyTape/firmwareName", DEFAULT_FIRMWARE_NAME).toString();
scene.firmwareName = settings.value("BlinkyTape/firmwareName", BLINKYTAPE_DEFAULT_FIRMWARE_NAME).toString();

scene.fixtureType = settings.value("Fixture/Type", DEFAULT_FIXTURE_TYPE).toString();
scene.colorMode = (ColorMode)settings.value("Fixture/ColorOrder", RGB).toInt();
Expand Down Expand Up @@ -1207,7 +1207,7 @@ void MainWindow::on_actionConfigure_Scene_triggered()
QSettings settings;

// TODO: roll this into the persistant sceneTemplate
sceneTemplate.firmwareName = settings.value("BlinkyTape/firmwareName", DEFAULT_FIRMWARE_NAME).toString();
sceneTemplate.firmwareName = settings.value("BlinkyTape/firmwareName", BLINKYTAPE_DEFAULT_FIRMWARE_NAME).toString();


sceneConfiguration.setSceneTemplate(sceneTemplate);
Expand Down
100 changes: 81 additions & 19 deletions src/libblinky-test/firmwarestoretests.cpp
Expand Up @@ -3,30 +3,18 @@

#include <QtTest>

void FirmwareStoreTests::listAvailableFirmwareHasDefaultTest()
void FirmwareStoreTests::listFirmwareSearchPathsTest()
{
QStringList availableFirmware = FirmwareStore::listAvailableFirmware();

QVERIFY(availableFirmware.contains(DEFAULT_FIRMWARE_NAME));
}

void FirmwareStoreTests::getFirmwareDescriptionHasDefaultTest()
{
QString description = FirmwareStore::getFirmwareDescription(DEFAULT_FIRMWARE_NAME);

QString expectedDescription;
expectedDescription.append("Default BlinkyTape Firmware\n");
expectedDescription.append("Use this for all standard functions");

QVERIFY(description == expectedDescription);
// There should be at least the BlinkyTape built-in and third-party locations
QVERIFY(FirmwareStore::listFirmwareSearchPaths().count() == 2);
}

void FirmwareStoreTests::addFirmwareBadSourceDirectoryTest()
{
FirmwareStore firmwareStore;
QString expectedError = "Source directory doesn't exist";

QVERIFY(firmwareStore.addFirmware("qrc:///does/not/exist") == false);
QVERIFY(firmwareStore.addFirmware(":/does/not/exist") == false);
QVERIFY(firmwareStore.getErrorString() == expectedError);
}

Expand All @@ -42,11 +30,85 @@ void FirmwareStoreTests::addFirmwareEmptyDirectoryTest()
QVERIFY(firmwareStore.getErrorString() == expectedError);
}

void FirmwareStoreTests::removeFirmwareDefaultFails()
void FirmwareStoreTests::addFirmwareAlreadyExistsTest()
{
FirmwareStore firmwareStore;
QString expectedError = "Firmware with this name already exists, please use a different name!";

QVERIFY(firmwareStore.addFirmware(BLINKYTAPE_DEFAULT_FIRMWARE_NAME) == false);
QVERIFY(firmwareStore.getErrorString() == expectedError);
}

void FirmwareStoreTests::removeFirmwareDoesntExitTest()
{
FirmwareStore firmwareStore;
QString expectedError = "No firmware with that name found";

QVERIFY(firmwareStore.removeFirmware("thisfirmwaredoesntexist") == false);
QVERIFY(firmwareStore.getErrorString() == expectedError);
}

void FirmwareStoreTests::removeFirmwareDefaultFailsTest()
{
FirmwareStore firmwareStore;
QString expectedError = "Cannot remove default firmware";
QString expectedError = "Cannot remove built-in firmware";

QVERIFY(firmwareStore.removeFirmware(DEFAULT_FIRMWARE_NAME) == false);
QVERIFY(firmwareStore.removeFirmware(BLINKYTAPE_DEFAULT_FIRMWARE_NAME) == false);
QVERIFY(firmwareStore.getErrorString() == expectedError);
}

void FirmwareStoreTests::listAvailableFirmwareBlinkyTapeFirmwaresTest_data()
{
// Test that we have all of the firmware needed for BlinkyTape functionality

QTest::addColumn<QString>("name");

QTest::newRow("defaut") << QString("default");
QTest::newRow("factory") << QString("factory");
}

void FirmwareStoreTests::listAvailableFirmwareBlinkyTapeFirmwaresTest()
{
QFETCH(QString, name);

QStringList availableFirmware = FirmwareStore::listAvailableFirmware();

QVERIFY(availableFirmware.contains(name));
}

void FirmwareStoreTests::getFirmwareDirectoryNameDoesntExistTest()
{
QVERIFY(FirmwareStore::getFirmwareDirectoryName("thisfirmwaredoesntexist").isNull());
}

void FirmwareStoreTests::getFirmwareDirectoryNameHasBlinkyTapeDefaultTest()
{
QString expectedDirectory(":/firmware/blinkytape/default");

QVERIFY(FirmwareStore::getFirmwareDirectoryName(BLINKYTAPE_DEFAULT_FIRMWARE_NAME) == expectedDirectory);
}

void FirmwareStoreTests::getFirmwareDescriptionDoesntExistTest()
{
QVERIFY(FirmwareStore::getFirmwareDescription("thisfirmwaredoesntexist").isNull());
}


void FirmwareStoreTests::getFirmwareDescriptionHasBlinkyTapeDefaultTest()
{
QString expectedDescription;
expectedDescription.append("Default BlinkyTape Firmware\n");
expectedDescription.append("Use this for all standard functions\n");

QVERIFY(FirmwareStore::getFirmwareDescription(BLINKYTAPE_DEFAULT_FIRMWARE_NAME) == expectedDescription);
}

void FirmwareStoreTests::getFirmwareDataDoesntExistTest()
{
QVERIFY(FirmwareStore::getFirmwareData("thisfirmwaredoesntexist").isNull());
}

void FirmwareStoreTests::getFirmwareDataHasBlinkyTapeDefaultTest()
{
QVERIFY(!FirmwareStore::getFirmwareData(BLINKYTAPE_DEFAULT_FIRMWARE_NAME).isNull());
}
21 changes: 17 additions & 4 deletions src/libblinky-test/firmwarestoretests.h
Expand Up @@ -6,14 +6,27 @@
class FirmwareStoreTests : public QObject
{
Q_OBJECT
private slots:
void listAvailableFirmwareHasDefaultTest();
void getFirmwareDescriptionHasDefaultTest();
private slots:
void listFirmwareSearchPathsTest();

void addFirmwareBadSourceDirectoryTest();
void addFirmwareEmptyDirectoryTest();
void addFirmwareAlreadyExistsTest();

void removeFirmwareDefaultFails();
void removeFirmwareDoesntExitTest();
void removeFirmwareDefaultFailsTest();

void listAvailableFirmwareBlinkyTapeFirmwaresTest_data();
void listAvailableFirmwareBlinkyTapeFirmwaresTest();

void getFirmwareDirectoryNameDoesntExistTest();
void getFirmwareDirectoryNameHasBlinkyTapeDefaultTest();

void getFirmwareDescriptionDoesntExistTest();
void getFirmwareDescriptionHasBlinkyTapeDefaultTest();

void getFirmwareDataDoesntExistTest();
void getFirmwareDataHasBlinkyTapeDefaultTest();
};

#endif // FIRMWARESTORETESTS_H
6 changes: 3 additions & 3 deletions src/libblinky-test/main.cpp
Expand Up @@ -58,11 +58,11 @@ int main(int argc, char *argv[])
LinearFixtureTests linearFixtureTests;
result |= QTest::qExec(&linearFixtureTests);

FirmwareStoreTests firmwareStoreTests;
result |= QTest::qExec(&firmwareStoreTests);

FirmwareReaderTests firmwareReaderTests;
result |= QTest::qExec(&firmwareReaderTests);

FirmwareStoreTests firmwareStoreTests;
result |= QTest::qExec(&firmwareStoreTests);

return result;
}

0 comments on commit f1b7b11

Please sign in to comment.