- Removed strcpy_P from print_STR, not necessary as print*_Msg supports __FlashStringHelper strings, so pass those through. - Change RTCStamp signature, don't return String as that allocates on the heap, require caller to allocate a buffer however they want of at least 21 bytes in size. Updated call-sites to follow this new convention. String output is now no longer completely uppercase. - delete print_right(). This function doesn't quite do what it claims to do, at least on HW5, as the font isn't monospace. - Fix number literal types for clkcal. No need to use ULL, as the variables in use are int32_t, and on AVR these are just L. Unsure of how to make it more cross-platform for now. - delete atoi32_signed, as we can just use atol() and save progmem. - cleanup readClockOffset(), and use atol also. - minor cleanups in initializeClockOffset that actually reduced progmem. - rewrote void print_Msg(const char myString[]) wrapping implementation to reduce progmem. call print_Msg in println_Msg (not sure why it wasn't called). This actually fixes a bug where only the first line would wrap. - checkButton(), rotaryDir doesn't need to be more than int8_t. - delete large switch-case in fileBrowser, unnecessary, just index the fileNames string directly. - buildRom, loop size doesn't need to be more than byte as length is a byte. - In total, progmem usage went from 181634 bytes to 180484 (over 1KB saved).
This Arduino sketch is licensed under the GNU GENERAL PUBLIC LICENSE Version 3 (GPL v3)
This means that you are free to:
- use, modify and distribute this software, even commercially
Under the following terms:
- state changes
- disclose source
- same license
Limitations:
- Liability
- Warranty
More details: https://www.gnu.org/licenses/gpl-3.0.en.html
Every submodule has it's own setup_XX() function that configures the needed pins and a submenu that lets you choose what you want to do.
The code directly addresses the pins via the DDR, PIN and PORT registers.
Please also refer to the pinout Open Office sheet.
void setup_N64_Controller() {
// Output a low signal
PORTH &= ~(1 << 4);
// Set Controller Data Pin(PH4) to Input
DDRH &= ~(1 << 4);
}
Would be the same as this in a more traditional Arduino sketch:
int dataPin = 7;
void setup(){
// Output a low signal
digitalWrite(dataPin, LOW);
// Set controller data pin to input
pinMode(dataPin, INPUT);
}
To preserve memory every string is saved into the flash of the Arduino, also called progmem. This is done by using the F() macro.
println_Msg(F("Press Button."));
Also all the menus are stored in progmem and are only recalled to sram when needed.
// N64 controller menu items
const char N64ContMenuItem1[] PROGMEM = "Test Controller";
const char N64ContMenuItem2[] PROGMEM = "Read ControllerPak";
const char N64ContMenuItem3[] PROGMEM = "Write ControllerPak";
const char* const menuOptionsN64Controller[] PROGMEM = {N64ContMenuItem1, N64ContMenuItem2, N64ContMenuItem3, FSTRING_RESET};
In an effort to keep the codebase as portable as possible instead of using the functions supplied by the OLED library directly to print out text, auxiliary functions like println_Msg
are being used. So if you want to change to another display library you don't need to change all the code but only the helper functions.
void print_Msg(long unsigned int message) {
if (ENABLE_OLED)
display.print(message);
if (ENABLE_SERIAL)
Serial.print(message);
}
Before uploading the code to your Arduino you need to select your hardware version in Cart_Reader.ino
//******************************************
// !!! CHOOSE HARDWARE VERSION !!!
//******************************************
// Remove // in front of the line with your hardware version
// #define HW5
// #define HW4
#define HW3
// #define HW2
// #define HW1
// #define SERIAL_MONITOR
For more info please have a look at this wiki article.
Needed libraries(already included in the portable Arduino IDE under Releases)
SD lib: https://github.com/greiman/SdFat
LCD lib: https://github.com/olikraus/U8g2_Arduino
Neopixel lib: https://github.com/adafruit/Adafruit_NeoPixel
Rotary Enc lib: https://github.com/mathertel/RotaryEncoder
SI5351 lib: https://github.com/etherkit/Si5351Arduino
RTC lib: https://github.com/adafruit/RTClib (needs BusIO lib: https://github.com/adafruit/Adafruit_BusIO)
Frequency Counter lib: https://github.com/PaulStoffregen/FreqCount