OSCR
Open Source Cartridge Reader
Loading...
Searching...
No Matches
OSCR.h
1/********************************************************************
2* Open Source Cartridge Reader *
3********************************************************************/
4#pragma once
5#ifndef OSCR_H_
6#define OSCR_H_
7
8#include "config.h"
9#include "syslibinc.h"
10#include "ui/l10n.h"
11
12#include "common/specializations.h"
13#include "common/Types.h"
14#include "common/crc32.h"
15
16#if defined(ARDUINO_ARCH_AVR)
17# include <EEPROM.h>
18#endif
19
23namespace OSCR
24{
25 inline constexpr HW const kHardwareVersion = OSCR_HARDWARE_VERSION;
26
27#if defined(ENABLE_ADVANCED_CONFIGURATION)
28 inline constexpr bool const kAdvancedConfiguration = true;
29#else
30 inline constexpr bool const kAdvancedConfiguration = false;
31#endif
32
33 inline constexpr OutputInterfaceID const kHardwareOutput =
34#if (HARDWARE_OUTPUT_TYPE == OUTPUT_OS12864)
36#elif defined(ENABLE_OLED)
38#else
40#endif
41 ;
42
43 inline constexpr InputInterfaceID const kHardwareInput =
44#if defined(ENABLE_ROTARY) || (defined(ENABLE_ADVANCED_CONFIGURATION) && (HARDWARE_INPUT_TYPE == 3))
46#elif defined(ENABLE_BUTTON2) || (defined(ENABLE_ADVANCED_CONFIGURATION) && (HARDWARE_INPUT_TYPE == 2))
48#elif defined(ENABLE_ADVANCED_CONFIGURATION) && (HARDWARE_INPUT_TYPE == 0)
50#else
52#endif
53 ;
54
55 inline constexpr uint16_t const kFirmwareFeatures =
56 OSCR_FEATURE_FLAG(HAS_UPDATER, FeatureID::Updater ) |
57 OSCR_FEATURE_FLAG(HAS_CONFIG, FeatureID::Config ) |
58 OSCR_FEATURE_FLAG(HAS_CLOCKGEN, FeatureID::ClockGen ) |
59 OSCR_FEATURE_FLAG(HAS_CLOCKGEN_CALIBRATED, FeatureID::ClockGenCalibrated ) |
60 OSCR_FEATURE_FLAG(HAS_CLOCKGEN_CALIBRATION, FeatureID::ClockGenCalibration ) |
61 OSCR_FEATURE_FLAG(HAS_VSELECT, FeatureID::VSelect ) |
62 OSCR_FEATURE_FLAG(HAS_RTC, FeatureID::RealTimeClock ) |
63 OSCR_FEATURE_FLAG(HAS_ONBOARD_ATMEGA, FeatureID::OnBoardMega ) |
64 OSCR_FEATURE_FLAG(HAS_STABILITYFIX, FeatureID::StabilityFix ) |
65 OSCR_FEATURE_FLAG(HAS_POWERSAVING, FeatureID::PowerSaving ) |
66 0;
67
68 inline constexpr LanguageID const kFirmwareLanguage =
69# if (OSCR_LANGUAGE == LANG_EN)
70 LanguageID::EN
71# endif
72 ;
73
74 inline constexpr RegionID const kFirmwareRegion =
75# if (OSCR_REGION == REGN_AF) /* Africa */
77# elif (OSCR_REGION == REGN_AN) /* Antarctica (for completeness) */
79# elif (OSCR_REGION == REGN_AS) /* Asia */
81# elif (OSCR_REGION == REGN_EU) /* Europe */
83# elif (OSCR_REGION == REGN_NA) /* North America */
85# elif (OSCR_REGION == REGN_OC) /* Oceania */
87# elif (OSCR_REGION == REGN_SA) /* South America */
89# else
91# endif
92 ;
93
97 namespace Strings
98 {
99 // Version
100 __constinit extern char const PROGMEM Version[];
101
105 namespace Cores
106 {
107 // ...
108 }
109 }
110
114 namespace Menus
115 {
122 __constinit extern CoreDefinition const MainMenuOptions[];
123
124 __constinit extern uint8_t const kMainMenuOptionCount;
125 __constinit extern uint8_t const kMainMenuNonCoreCount;
126 __constinit extern uint8_t const kMainMenuCoreCount;
127
131 extern void main();
132 } /* namespace Menus */
133
134 extern void tick();
135 extern void idle();
136 extern void busy();
137
138# if defined(ENABLE_POWERSAVING)
139 extern bool wakeEvent();
140#else
141 inline constexpr bool wakeEvent()
142 {
143 return false;
144 }
145# endif
146
147 extern void aboutMenu();
148
149 [[ noreturn ]] extern void resetArduino();
150 [[ noreturn ]] extern void resetMenu();
151}
152
153// CRDB
154#define CRDB_RECORD_SIZE_BASIC 104
155#define CRDB_RECORD_SIZE_STANDARD 112
156#define CRDB_RECORD_SIZE_EXTENDED 116
157#define CRDB_RECORD_SIZE_BASIC_MAPPER 116
158#define CRDB_RECORD_SIZE_NES 138
159#define CRDB_RECORD_SIZE_NES_MAPPER 100
160#define CRDB_RECORD_SIZE_SNES 116
161#define CRDB_RECORD_SIZE_GBA 112
162#define CRDB_RECORD_SIZE_N64 111
163#define CRDB_RECORD_SIZE_A2600 106
164#define CRDB_RECORD_SIZE_A5200 108
165#define CRDB_RECORD_SIZE_JAG 108
166#define CRDB_RECORD_SIZE_TI99 112
167
168enum PIXEL: uint8_t
169{
170#if OPTION_NEOPIXEL_ORDER == 1
171 PIXEL_BG,
172 PIXEL_BTN1,
173 PIXEL_BTN2,
174#elif OPTION_NEOPIXEL_ORDER == 2
175 PIXEL_BTN1,
176 PIXEL_BTN2,
177 PIXEL_BG,
178#endif
179};
180
181#if defined(ENABLE_GLOBAL_LOG)
182extern FsFile myLog;
183#endif
184
185template<class T>
186int EEPROM_writeAnything(int ee, T const & value)
187{
188#if defined(ARDUINO_ARCH_AVR)
189 uint8_t const * p = (uint8_t const *)(void const *)&value;
190 uint16_t i;
191
192 for (i = 0; i < sizeof(value); i++)
193 EEPROM.write(ee++, *p++);
194
195 return i;
196#else
197 return 0;
198#endif
199}
200
201template<class T>
202int EEPROM_readAnything(size_t ee, T & value)
203{
204#if defined(ARDUINO_ARCH_AVR)
205 uint8_t* p = (uint8_t*)(void*)&value;
206 uint16_t i;
207
208 for (i = 0; i < sizeof(value); i++)
209 {
210 *p++ = EEPROM.read(ee++);
211 }
212
213 return i;
214#else
215 return 0;
216#endif
217}
218
219#include "Cart_Reader.h"
220
221#endif /* OSCR_H_ */
Menu options for internal features.
Definition OSCR.h:115
uint8_t const kMainMenuOptionCount
Definition cores.cpp:379
CoreDefinition const MainMenuOptions[]
List of cores shown on the main menu screen.
Definition cores.cpp:26
void main()
Definition cores.cpp:396
uint8_t const kMainMenuNonCoreCount
Definition cores.cpp:384
uint8_t const kMainMenuCoreCount
Definition cores.cpp:389
Core-specific string constants.
Definition OSCR.h:106
String constants.
Definition OSCR.h:98
Main program.
Definition Storage.h:13
InputInterfaceID
Input Interface IDs.
Definition core-types.h:187
@ TwoButtons
2-button interface (HW3)
Definition core-types.h:191
@ Serial
ASCII Serial.
Definition core-types.h:188
@ OneButton
1-button interface (HW1-2)
Definition core-types.h:190
@ RotaryButton
Rotary-button interface (HW4-5)
Definition core-types.h:192
void tick()
Definition OSCR.cpp:60
void idle()
Definition OSCR.cpp:84
@ ClockGenCalibrated
Support for calibrating the clock generator.
Definition core-types.h:151
@ OnBoardMega
Enable on-board ATmega2560 options.
Definition core-types.h:153
@ VSelect
Automatic Voltage Select (VSELECT) via TPS211x.
Definition core-types.h:149
@ StabilityFix
Fix for ATmega2560s with stability issues at 3.3V.
Definition core-types.h:154
@ ClockGen
Clock Generator.
Definition core-types.h:148
@ Updater
Support updating via the OSCR.Tools Firmware Updater.
Definition core-types.h:146
@ PowerSaving
Power Saving.
Definition core-types.h:155
@ RealTimeClock
RTC Support.
Definition core-types.h:150
@ ClockGenCalibration
Load clock generator calibration data.
Definition core-types.h:152
@ Config
Allow the use of config.txt.
Definition core-types.h:147
OutputInterfaceID
Output Interface IDs.
Definition core-types.h:169
@ Serial
ASCII Serial.
Definition core-types.h:170
@ SSD1306
OLED.
Definition core-types.h:172
@ OS12864
LCD (a.k.a. MKS/BTT MINI12864, ST7567, etc)
Definition core-types.h:173
void busy()
Definition OSCR.cpp:107
LanguageID
Language IDs.
Definition core-types.h:114
void resetArduino()
Definition OSCR.cpp:126
RegionID
Region IDs.
Definition core-types.h:123
@ AF
Africa.
Definition core-types.h:125
@ SA
South America.
Definition core-types.h:131
@ Global
All/World/Global.
Definition core-types.h:124
@ OC
Oceania.
Definition core-types.h:130
@ AS
Asia.
Definition core-types.h:127
@ NA
North America.
Definition core-types.h:129
@ AN
Antarctica (for completeness)
Definition core-types.h:126
@ EU
Europe.
Definition core-types.h:128
Metadata for OSCR system cores and main menu options.
Definition Types.h:32