diff --git a/.github/workflows/build-firmware.yml b/.github/workflows/build-firmware.yml index 835f8567..f726be76 100644 --- a/.github/workflows/build-firmware.yml +++ b/.github/workflows/build-firmware.yml @@ -82,6 +82,11 @@ jobs: cd /src/firmware/src pio run -e Head_Tracker-XIAOSense + - name: Build XIAO 52840 Firmware + run: | + cd /src/firmware/src + pio run -e Head_Tracker-XIAO52840 + # Runs a set of commands using the runners shell - name: Package Firmware uses: 'actions/upload-artifact@v2' diff --git a/.github/workflows/build-gui_win.yml b/.github/workflows/build-gui_win.yml index 7f309be7..e55ac4d0 100644 --- a/.github/workflows/build-gui_win.yml +++ b/.github/workflows/build-gui_win.yml @@ -48,9 +48,11 @@ jobs: cached: ${{ steps.cache-qt.outputs.cache-hit }} - name: Set up MinGW - uses: gcmcnutt/setup-mingw@v3 + uses: egor-tensin/setup-mingw@v2 with: platform: x64 + static: 0 + - name: Build working-directory: ${{github.workspace}} diff --git a/firmware/src/platformio.ini b/firmware/src/platformio.ini index 8abbc0db..a92f5a85 100644 --- a/firmware/src/platformio.ini +++ b/firmware/src/platformio.ini @@ -23,6 +23,7 @@ # default_envs = Head_Tracker-DTQSys # default_envs = Head_Tracker-Nano33_BLE_Sense2 # default_envs = Head_Tracker-XIAOSense +# default_envs = Head_Tracker-XIAO52840 [common] build_flags = @@ -100,3 +101,21 @@ -DPCB_XIAOSENSE=y -DFNAME=XIA -DSEEED_BOOTLOADER=y + + [env:Head_Tracker-XIAO52840] + #build_type = debug + extends = nrf52common + board_upload.offset_address = 0x27000 + extra_scripts = + ${env.extra_scripts} + post:tools/make_uf2.py + platform = nordicnrf52@9.4 + board = xiao_sense + framework = zephyr + lib_deps = bblanchon/ArduinoJson@6.20 + debug_tool = jlink + build_flags = + ${common.build_flags} + -DPCB_XIAO52840=y + -DFNAME=XIA + -DSEEED_BOOTLOADER=y diff --git a/firmware/src/src/boards/xiaosense.h b/firmware/src/src/boards/xiaosense.h index 9374057e..2321259e 100644 --- a/firmware/src/src/boards/xiaosense.h +++ b/firmware/src/src/boards/xiaosense.h @@ -10,7 +10,11 @@ // Board Features #define HAS_3DIODE_RGB #define HAS_NOTIFYLED +#if defined(PCB_XIAOSENSE) #define HAS_LSM6DS3 +#else // Otherwise it's the XIAO52840 +#define HAS_NOIMU +#endif #define HAS_CENTERBTN #define HAS_PPMIN #define HAS_PPMOUT diff --git a/firmware/src/src/defines.h b/firmware/src/src/defines.h index 1f5c0a43..8453d85f 100644 --- a/firmware/src/src/defines.h +++ b/firmware/src/src/defines.h @@ -8,20 +8,22 @@ #define FW_GIT_REV "-------" #endif -// The majority of features are the same on Sense2 -#if defined(PCB_NANO33BLE_SENSE2) -#define PCB_NANO33BLE -#endif - #if defined(PCB_NANO33BLE) #define FW_BOARD "NANO33BLE" #include "boards/nano33board.h" +#elif defined(PCB_NANO33BLE_SENSE2) +#define PCB_NANO33BLE // Most items +#define FW_BOARD "NANO33BLESR2" +#include "boards/nano33board.h" #elif defined(PCB_DTQSYS) #define FW_BOARD "DTQSYS" #include "boards/dtqsys_ht.h" #elif defined(PCB_XIAOSENSE) #define FW_BOARD "XIAOSENSE" #include "boards/xiaosense.h" +#elif defined(PCB_XIAO52840) +#define FW_BOARD "XIAO52840" +#include "boards/xiaosense.h" #else #error NO PCB DEFINED #endif diff --git a/firmware/src/src/io.cpp b/firmware/src/src/io.cpp index 858bd46e..b755a7a9 100644 --- a/firmware/src/src/io.cpp +++ b/firmware/src/src/io.cpp @@ -98,7 +98,7 @@ void io_Thread() digitalWrite(IO_LED, led_is_on); } #endif - // Unrecoverable error, Solid Red + // Unrecoverable sensor error, Solid Red if(_ledmode & LED_HARDFAULT) { led_sequence[0].RGB = RGB_RED; led_sequence[0].time = 10; @@ -322,7 +322,9 @@ void io_init() pinMode(IO_AN3, GPIO_INPUT); #endif +#if !defined(HAS_NOIMU) setLEDFlag(LED_GYROCAL); +#endif k_poll_signal_raise(&ioThreadRunSignal, 1); } diff --git a/firmware/src/src/sense.cpp b/firmware/src/src/sense.cpp index 5753b7e9..d5d1b9af 100644 --- a/firmware/src/src/sense.cpp +++ b/firmware/src/src/sense.cpp @@ -74,9 +74,11 @@ static float magx = 0, magy = 0, magz = 0; static float gyrx = 0, gyry = 0, gyrz = 0; static float tilt = 0, roll = 0, pan = 0; static float rolloffset = 0, panoffset = 0, tiltoffset = 0; +#if !defined(HAS_NOIMU) static float magxoff = 0, magyoff = 0, magzoff = 0; static float accxoff = 0, accyoff = 0, acczoff = 0; static float gyrxoff = 0, gyryoff = 0, gyrzoff = 0; +#endif static bool trpOutputEnabled = false; // Default to disabled T/R/P output static bool gyroCalibrated = false; @@ -760,6 +762,8 @@ void sensor_Thread() } #endif +// Below is all IMU Related, if no IMU don't compile it in +#if !defined(HAS_NOIMU) // Setup Rotations float rotation[3] = {trkset.getRotX(), trkset.getRotY(), trkset.getRotZ()}; @@ -1017,6 +1021,8 @@ void sensor_Thread() k_mutex_unlock(&sensor_mutex); +#endif // If no sensor + // Adjust sleep for a more accurate period senseUsDuration = micros64() - senseUsDuration; if (SENSOR_PERIOD - senseUsDuration < @@ -1042,6 +1048,7 @@ void sensor_Thread() void gyroCalibrate() { +#if !defined(HAS_NOIMU) static float last_gyro_mag = 0; static float last_acc_mag = 0; static float filt_gyrx = 0; @@ -1110,6 +1117,7 @@ void gyroCalibrate() // Output in CSV format for determining limits // printk("%.4f,%.2f,%.2f\n", (float)time / 1000000.0f, gyro_dif, acc_dif); +#endif } // FROM https://stackoverflow.com/questions/1628386/normalise-orientation-between-0-and-360 diff --git a/firmware/src/tools/make_uf2.py b/firmware/src/tools/make_uf2.py index 522bcbc7..5969d6ba 100644 --- a/firmware/src/tools/make_uf2.py +++ b/firmware/src/tools/make_uf2.py @@ -5,7 +5,7 @@ def after_hex_build(source, target, env): firmware_path = str(target[0]) firmware_name = os.path.splitext(firmware_path)[0] - command = "python ./tools/uf2conv.py " + firmware_path + " -o " + firmware_name + ".UF2 -f 0xADA52840 -c -b 0x27000" + command = "python ./tools/uf2conv.py " + firmware_path + " -o " + firmware_name + ".uf2 -f 0xADA52840 -c -b 0x27000" print("Converting .bin to .uf2 file") os.system(command) diff --git a/gui/src/mainwindow.cpp b/gui/src/mainwindow.cpp index b1512626..bd5881c6 100644 --- a/gui/src/mainwindow.cpp +++ b/gui/src/mainwindow.cpp @@ -1417,7 +1417,8 @@ void MainWindow::boardDiscovered(BoardType *brd) // GUI changes info depending on board type if(brd->boardName() == "NANO33BLE" || brd->boardName() == "DTQSYS" || - brd->boardName() == "XIAOSENSE" ) { + brd->boardName() == "XIAOSENSE" || + brd->boardName() == "XIAO52840" ) { addToLog(tr("Connected to a ") + brd->boardName() + "\n"); ui->cmdStartGraph->setVisible(false); ui->cmdStopGraph->setVisible(false); @@ -1434,9 +1435,14 @@ void MainWindow::boardDiscovered(BoardType *brd) ui->cmdReboot->setEnabled(true); ui->stackedWidget->setCurrentIndex(3); ui->cmdChannelViewer->setEnabled(true); + ui->grpLocalGraph->setVisible(true); + ui->grpRangeSel->setVisible(true); + ui->lblGyroCal->setVisible(true); + ui->gyroLed->setVisible(true); if(brd->boardName() == "DTQSYS" || - brd->boardName() == "XIAOSENSE") { // Pins are all fixed + brd->boardName() == "XIAOSENSE" || + brd->boardName() == "XIAO52840" ) { // Pins are all fixed ui->cmbPpmInPin->setVisible(false); ui->lblPPMInPin->setVisible(false); ui->cmbPpmOutPin->setVisible(false); @@ -1448,6 +1454,14 @@ void MainWindow::boardDiscovered(BoardType *brd) ui->lblAn5->setText(tr("Analog 1 (0.29)")); ui->lblAn6->setText(tr("Analog 2 (0.02)")); ui->lblAn7->setText(tr("Analog 3 (0.28)")); + if(brd->boardName() == "XIAO52840") { + ui->grpLocalGraph->setVisible(false); + ui->grpRangeSel->setVisible(false); + ui->cmdResetCenter->setVisible(false); + ui->cmdCalibrate->setVisible(false); + ui->lblGyroCal->setVisible(false); + ui->gyroLed->setVisible(false); + } } else { ui->cmbPpmInPin->setVisible(true); ui->lblPPMInPin->setVisible(true); diff --git a/gui/src/mainwindow.ui b/gui/src/mainwindow.ui index 522ed3d9..db61902a 100644 --- a/gui/src/mainwindow.ui +++ b/gui/src/mainwindow.ui @@ -452,7 +452,7 @@ - + @@ -3239,7 +3239,7 @@ - + 0 @@ -4060,7 +4060,7 @@ - + 0