using platformio

This commit is contained in:
oloturia 2024-05-23 17:24:24 +02:00
parent 493d051bcf
commit d2cd5c73cb
8 changed files with 223 additions and 0 deletions

1
.gitignore vendored
View file

@ -1,3 +1,4 @@
console/leonardo/console-backups/*
console/leonardo/console-rescue*
console/leonardo/fp-info-cache
.pio/*

46
lib/README Normal file
View file

@ -0,0 +1,46 @@
This directory is intended for project specific (private) libraries.
PlatformIO will compile them to static libraries and link into executable file.
The source code of each library should be placed in a an own separate directory
("lib/your_library_name/[here are source files]").
For example, see a structure of the following two libraries `Foo` and `Bar`:
|--lib
| |
| |--Bar
| | |--docs
| | |--examples
| | |--src
| | |- Bar.c
| | |- Bar.h
| | |- library.json (optional, custom build options, etc) https://docs.platformio.org/page/librarymanager/config.html
| |
| |--Foo
| | |- Foo.c
| | |- Foo.h
| |
| |- README --> THIS FILE
|
|- platformio.ini
|--src
|- main.c
and a contents of `src/main.c`:
```
#include <Foo.h>
#include <Bar.h>
int main (void)
{
...
}
```
PlatformIO Library Dependency Finder will find automatically dependent
libraries scanning project source files.
More information about PlatformIO Library Dependency Finder
- https://docs.platformio.org/page/librarymanager/ldf.html

17
platformio.ini Normal file
View file

@ -0,0 +1,17 @@
; PlatformIO Project Configuration File
;
; Build options: build flags, source filter
; Upload options: custom upload port, speed and extra flags
; Library options: dependencies, extra library storages
; Advanced options: extra scripting
;
; Please visit documentation for the other options and examples
; https://docs.platformio.org/page/projectconf.html
[env:leonardo]
platform = atmelavr
board = leonardo
framework = arduino
lib_deps =
stutchbury/EncoderButton@^1.0.6
arduino-libraries/MIDIUSB@^1.0.5

View file

@ -0,0 +1,147 @@
#include <Arduino.h>
#include <Controllers.h>
/* This is a sketch that it transforms your Arduino Leonardo or Leonardo like (i.e. boards with atmega32u4) in a MIDI console for interfacing
* with Mixxx (https://mixxx.org). Perhaps you can also use an UNO but you have to sacrifice some pins in order to add a MIDI interface to your Arduino.
* Once you have flashed the board, you have to train Mixxx in Preferences/Controllers menu.
* Remember to plug the Arduino before launching Mixxx, otherwise it won't be detected.
*
* This software is released under the Unlicense (see LICENSE for more info).
*
* This version allow the use of multiplexers for analog inputs, this feature is not tested yet.
* If you have doubts, use mixxx_controller.ino instead.
*
* Last revision 27-mar-2024
*/
/* You can alter some library wide parameters in Controllers.h
* DEBUG enables serial printing of MIDI messages
* DEAD_ZONE contains the smallest increment that the control must have to trigger the effect.
* STICKYNESS is a deazone that lies around extreme positions (0-1023) and the middle of readings.
* TIME_INTERVAL is the time, in ms, needed for a long press
*/
// Pin definition
// Analog knobs and sliders
/* Connect linear potentiometers (sliders and knobs) to Analog Inputs on your board.
* On Leonardo, from A0 to A5 are on the left (with USB on top)
* A6, A7, A8, A9, A10, A11 are digital pins:
* 4, 6, 8, 9, 10, 12.
*
* Change the first value accordingly, the last one is the MIDI effect that is sent to
* Mixxx, every control needs to have a unique number.
*
* MID-DEADZONE is the middle of the controller. Usually is 511, but it's trimmable.
*/
// Define every control as AnalogControl(PIN,EFFECT,MID-DEADZONE)
AnalogControl analog_controls[] = {
// AnalogControl(A0,7,520),
};
int active_analog_controls = sizeof(analog_controls)/sizeof(analog_controls[0]);
// Rotary encoders
/* Rotary Encorders need two pins.
* clk should be an interrupt. On Leonardo interrupts are on pin 0, 1, 2, 3 and 7.
* dt are digital pins
* effect and effect+1 must be unique
* the +1 is reserved for anticlockwise
*/
// Define every control as {EncoderButton(CLK,DT), EFFECT}
RotaryEncoderControl rotary_encoders[] = {
//{EncoderButton(2,4),10},
};
const int active_encoders = sizeof(rotary_encoders)/sizeof(rotary_encoders[1]);
// Digital buttons
/* Digital buttons are connected to a digital pin. If you use toggle, long press or long press toggle rembember that the MIDI message byte has to be unique.
* toggle effect and long toggle effect (for long presses) send two different messages for odd and even strokes.
* If effect is 0 the toggle, long press or long press toggle is disabled.
*/
// Define every control as DigitalButton(PIN,PRESS EFFECT, PRESS TOGGLE EFFECT (0=disabled), LONG PRESS EFFECT, LONG PRESS TOGGLE EFFECT (0=disabled)
DigitalButton buttons[] = {
// DigitalButton( 9,14,0, 0, 0),
};
const int active_buttons = sizeof(buttons)/sizeof(buttons[0]);
//Callback function for the encoders
void eb_Encoder(EncoderButton& eb) {
int inc = eb.increment();
if (inc > 0) {
controlChange(1,eb.userId()+1,1);
} else {
controlChange(1,eb.userId(),1);
}
MidiUSB.flush();
}
/* Multiplexers allow multiple analog inputs using only 1 analog input and 4 digital outputs.
* pinSIG is the input pin for the signal, pinS0 to pinS3 are the digital outputs that select
* the analog channel that will be connected with SIG.
*
*/
// Define every Multiplexer as
// (SIGNAL PIN, EFFECT (array of 16), MIDDLE DEADZONE (array of 16) )
int mux0[16] = { 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25};
int midzones0[16] = {520,520,520,520,520,520,520,520,520,520,520,520,520,520,520,520};
// Define the pin that control the mux
int Mux::pinS0 = 4;
int Mux::pinS1 = 5;
int Mux::pinS2 = 6;
int Mux::pinS3 = 7;
Mux mux_inputs[] = {
Mux(A0, mux0, midzones0)
};
const int active_mux_inputs = sizeof(mux_inputs)/sizeof(mux_inputs[0]);
void setup() {
#ifdef DEBUG
while(!Serial);
Serial.begin(115200);
Serial.println("RDY");
#endif
for (int i = 0; i < active_encoders; i++) {
rotary_encoders[i].rotary_encoder.setUserId(rotary_encoders[i].effect);
rotary_encoders[i].rotary_encoder.setEncoderHandler(eb_Encoder);
}
}
void loop() {
// Analog controls check
for (int i = 0; i < active_analog_controls; i++) {
analog_controls[i].checkStatus();
}
// Buttons check
for (int i = 0; i < active_buttons; i++) {
buttons[i].checkStatus();
}
// Rotary encoders check
for (int i = 0; i < active_encoders; i++) {
rotary_encoders[i].rotary_encoder.update();
}
// Analog signal from multiplexer check.
for (int act = 0; act < 16; act++) {
for (int i = 0; i < active_mux_inputs; i++) {
mux_inputs[i].checkStatus(act);
}
}
}

View file

@ -1,3 +1,4 @@
#include <Arduino.h>
#include <Controllers.h>
/* This is a sketch that it transforms your Arduino Leonardo or Leonardo like (i.e. boards with atmega32u4) in a MIDI console for interfacing

11
test/README Normal file
View file

@ -0,0 +1,11 @@
This directory is intended for PlatformIO Test Runner and project tests.
Unit Testing is a software testing method by which individual units of
source code, sets of one or more MCU program modules together with associated
control data, usage procedures, and operating procedures, are tested to
determine whether they are fit for use. Unit testing finds problems early
in the development cycle.
More information about PlatformIO Unit Testing:
- https://docs.platformio.org/en/latest/advanced/unit-testing/index.html