48 Commits

Author SHA1 Message Date
Priec
6b10d13695 polished like a polish plates 2025-12-14 23:04:32 +01:00
Priec
74dca27c06 button scuffed 2025-12-14 22:57:04 +01:00
Priec
786ead2ffa working restart button 2025-12-14 17:29:33 +01:00
Priec
e5091a33e7 restart button on the game over is now wokring properly well 2025-12-14 17:15:50 +01:00
Priec
3cef68142d game over 2025-12-14 16:38:50 +01:00
Filipriec
17c53ace99 speed bug fixed now properly well 2025-12-11 17:10:55 +01:00
Filipriec
50f523b52d unified speed properly 2025-12-11 16:25:12 +01:00
Priec
42d07e9715 multithreading done 2025-12-11 12:15:20 +01:00
Priec
8382d1caec button press and blinking led on a button press 2025-12-11 11:30:56 +01:00
Priec
165540588f physical button press 2025-12-11 09:29:13 +01:00
Priec
0083fff73a fixed crawling 2025-12-11 08:31:39 +01:00
Filipriec
ca7eac70e4 movement class 2025-11-20 17:37:27 +01:00
Filipriec
3e47f855ed cleaning 2025-11-20 16:45:50 +01:00
Priec
dd410c6f6c collisions happen properly now 2025-11-18 01:02:13 +01:00
Priec
967b377e76 proper placement of the obstacles 2025-11-18 00:19:17 +01:00
Priec
cf30946c0d obstacles comming properly well 2025-11-17 21:24:10 +01:00
Priec
2af725bfe7 starting outside of the view and bringing that bad boy in 2025-11-17 19:28:06 +01:00
Priec
c56dac3b6a obstacles finally spawning 2025-11-17 18:59:14 +01:00
Priec
ae2b8b91aa obstacles added fully now 2025-11-17 16:37:34 +01:00
Priec
34c9d76389 collisions of character 2025-11-17 13:06:53 +01:00
Priec
09454e3ab4 crawl trigger bug fixed 2025-11-17 11:30:52 +01:00
Priec
07e295f2d9 crawl command fixed 2025-11-17 00:20:41 +01:00
Filipriec
42ad5ee7a2 crawl was redesigned to crwal1 and crawl2 2025-11-16 22:40:09 +01:00
Filipriec
cf07c9c47a now properly walking and running, fully fixed 2025-11-16 16:53:55 +01:00
Filipriec
ace0e2d706 changes to either walk, run or crawl calculations 2025-11-16 10:03:06 +01:00
Filipriec
8cb6892d30 now the movement of the player is working properly well and being calculated based on the speed of the player 2025-11-15 22:40:23 +01:00
Filipriec
de6facff03 sinus speed is displaying frames of the animation now 2025-11-15 22:07:15 +01:00
Filipriec
2753aed573 speed control of player and the ground 2025-11-15 20:55:29 +01:00
Filipriec
0ff2be6564 speed control of player and the ground 2025-11-15 20:44:05 +01:00
Priec
11f5eb7fd1 multiple frames now added and working 2025-11-14 23:53:45 +01:00
Priec
285840b521 characters added 2025-11-14 23:11:57 +01:00
Priec
761b86585a removed legacy LED blinking 2025-11-14 21:03:06 +01:00
Priec
528e38b428 another movement done 2025-11-14 20:39:58 +01:00
Priec
a59192cf05 pitch perfect movement 2025-11-14 20:07:38 +01:00
Priec
fa7e18e4d5 BIG MOVES 2025-11-14 19:59:04 +01:00
Priec
4ed4452fae some renames, nothing much 2025-11-14 19:39:19 +01:00
Priec
b9ca8df59b small syntax change 2025-11-14 19:25:25 +01:00
Priec
8fa8bf392b usage of enums for frames 2025-11-14 19:20:14 +01:00
Priec
9170524d33 proper positioning works now 2025-11-14 18:50:57 +01:00
Priec
cda395d6b9 calculations 2025-11-14 17:31:37 +01:00
Priec
d8da84cffc added positioning 2025-11-14 16:42:16 +01:00
Priec
f6a13309f7 refactoring 2 2025-11-14 15:20:05 +01:00
Priec
9c93179bf0 refactoring 2025-11-14 15:15:20 +01:00
Priec
38b8bb0657 crawl for 300ms 2025-11-14 14:24:34 +01:00
Priec
b147d92423 walking stickman is now also crawling 2025-11-14 14:12:40 +01:00
Priec
13f01d13f8 player rendered 2025-11-14 12:35:22 +01:00
Priec
ebe03f42b6 render speed 2025-11-14 11:08:33 +01:00
Priec
a1c742c1cd vycistenou 2025-11-14 10:20:11 +01:00
88 changed files with 1499 additions and 840 deletions

View File

@@ -55,6 +55,7 @@
pkgs.probe-rs-tools
pkgs.bear
pkgs.chafa
pkgs.imagemagick
mbedTools
pyOcd
];

View File

@@ -21,3 +21,5 @@ mbed-os/
*.pyc
__pycache__/
.cache/
compile_commands.json

View File

@@ -1,5 +0,0 @@
# Contributing to Mbed OS
Mbed OS is an open-source, device software platform for the Internet of Things. Contributions are an important part of the platform, and our goal is to make it as simple as possible to become a contributor.
To encourage productive collaboration, as well as robust, consistent and maintainable code, we have a set of guidelines for [contributing to Mbed OS](https://os.mbed.com/docs/mbed-os/latest/contributing/index.html).

View File

@@ -1,165 +0,0 @@
Apache License
Version 2.0, January 2004
http://www.apache.org/licenses/
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
1. Definitions.
"License" shall mean the terms and conditions for use, reproduction, and
distribution as defined by Sections 1 through 9 of this document.
"Licensor" shall mean the copyright owner or entity authorized by the copyright
owner that is granting the License.
"Legal Entity" shall mean the union of the acting entity and all other entities
that control, are controlled by, or are under common control with that entity.
For the purposes of this definition, "control" means (i) the power, direct or
indirect, to cause the direction or management of such entity, whether by
contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the
outstanding shares, or (iii) beneficial ownership of such entity.
"You" (or "Your") shall mean an individual or Legal Entity exercising
permissions granted by this License.
"Source" form shall mean the preferred form for making modifications, including
but not limited to software source code, documentation source, and configuration
files.
"Object" form shall mean any form resulting from mechanical transformation or
translation of a Source form, including but not limited to compiled object code,
generated documentation, and conversions to other media types.
"Work" shall mean the work of authorship, whether in Source or Object form, made
available under the License, as indicated by a copyright notice that is included
in or attached to the work (an example is provided in the Appendix below).
"Derivative Works" shall mean any work, whether in Source or Object form, that
is based on (or derived from) the Work and for which the editorial revisions,
annotations, elaborations, or other modifications represent, as a whole, an
original work of authorship. For the purposes of this License, Derivative Works
shall not include works that remain separable from, or merely link (or bind by
name) to the interfaces of, the Work and Derivative Works thereof.
"Contribution" shall mean any work of authorship, including the original version
of the Work and any modifications or additions to that Work or Derivative Works
thereof, that is intentionally submitted to Licensor for inclusion in the Work
by the copyright owner or by an individual or Legal Entity authorized to submit
on behalf of the copyright owner. For the purposes of this definition,
"submitted" means any form of electronic, verbal, or written communication sent
to the Licensor or its representatives, including but not limited to
communication on electronic mailing lists, source code control systems, and
issue tracking systems that are managed by, or on behalf of, the Licensor for
the purpose of discussing and improving the Work, but excluding communication
that is conspicuously marked or otherwise designated in writing by the copyright
owner as "Not a Contribution."
"Contributor" shall mean Licensor and any individual or Legal Entity on behalf
of whom a Contribution has been received by Licensor and subsequently
incorporated within the Work.
2. Grant of Copyright License.
Subject to the terms and conditions of this License, each Contributor hereby
grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free,
irrevocable copyright license to reproduce, prepare Derivative Works of,
publicly display, publicly perform, sublicense, and distribute the Work and such
Derivative Works in Source or Object form.
3. Grant of Patent License.
Subject to the terms and conditions of this License, each Contributor hereby
grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free,
irrevocable (except as stated in this section) patent license to make, have
made, use, offer to sell, sell, import, and otherwise transfer the Work, where
such license applies only to those patent claims licensable by such Contributor
that are necessarily infringed by their Contribution(s) alone or by combination
of their Contribution(s) with the Work to which such Contribution(s) was
submitted. If You institute patent litigation against any entity (including a
cross-claim or counterclaim in a lawsuit) alleging that the Work or a
Contribution incorporated within the Work constitutes direct or contributory
patent infringement, then any patent licenses granted to You under this License
for that Work shall terminate as of the date such litigation is filed.
4. Redistribution.
You may reproduce and distribute copies of the Work or Derivative Works thereof
in any medium, with or without modifications, and in Source or Object form,
provided that You meet the following conditions:
You must give any other recipients of the Work or Derivative Works a copy of
this License; and
You must cause any modified files to carry prominent notices stating that You
changed the files; and
You must retain, in the Source form of any Derivative Works that You distribute,
all copyright, patent, trademark, and attribution notices from the Source form
of the Work, excluding those notices that do not pertain to any part of the
Derivative Works; and
If the Work includes a "NOTICE" text file as part of its distribution, then any
Derivative Works that You distribute must include a readable copy of the
attribution notices contained within such NOTICE file, excluding those notices
that do not pertain to any part of the Derivative Works, in at least one of the
following places: within a NOTICE text file distributed as part of the
Derivative Works; within the Source form or documentation, if provided along
with the Derivative Works; or, within a display generated by the Derivative
Works, if and wherever such third-party notices normally appear. The contents of
the NOTICE file are for informational purposes only and do not modify the
License. You may add Your own attribution notices within Derivative Works that
You distribute, alongside or as an addendum to the NOTICE text from the Work,
provided that such additional attribution notices cannot be construed as
modifying the License.
You may add Your own copyright statement to Your modifications and may provide
additional or different license terms and conditions for use, reproduction, or
distribution of Your modifications, or for any such Derivative Works as a whole,
provided Your use, reproduction, and distribution of the Work otherwise complies
with the conditions stated in this License.
5. Submission of Contributions.
Unless You explicitly state otherwise, any Contribution intentionally submitted
for inclusion in the Work by You to the Licensor shall be under the terms and
conditions of this License, without any additional terms or conditions.
Notwithstanding the above, nothing herein shall supersede or modify the terms of
any separate license agreement you may have executed with Licensor regarding
such Contributions.
6. Trademarks.
This License does not grant permission to use the trade names, trademarks,
service marks, or product names of the Licensor, except as required for
reasonable and customary use in describing the origin of the Work and
reproducing the content of the NOTICE file.
7. Disclaimer of Warranty.
Unless required by applicable law or agreed to in writing, Licensor provides the
Work (and each Contributor provides its Contributions) on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied,
including, without limitation, any warranties or conditions of TITLE,
NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are
solely responsible for determining the appropriateness of using or
redistributing the Work and assume any risks associated with Your exercise of
permissions under this License.
8. Limitation of Liability.
In no event and under no legal theory, whether in tort (including negligence),
contract, or otherwise, unless required by applicable law (such as deliberate
and grossly negligent acts) or agreed to in writing, shall any Contributor be
liable to You for damages, including any direct, indirect, special, incidental,
or consequential damages of any character arising as a result of this License or
out of the use or inability to use the Work (including but not limited to
damages for loss of goodwill, work stoppage, computer failure or malfunction, or
any and all other commercial damages or losses), even if such Contributor has
been advised of the possibility of such damages.
9. Accepting Warranty or Additional Liability.
While redistributing the Work or Derivative Works thereof, You may choose to
offer, and charge a fee for, acceptance of support, warranty, indemnity, or
other liability obligations and/or rights consistent with this License. However,
in accepting such obligations, You may act only on Your own behalf and on Your
sole responsibility, not on behalf of any other Contributor, and only if You
agree to indemnify, defend, and hold each Contributor harmless for any liability
incurred by, or claims asserted against, such Contributor by reason of your
accepting any such warranty or additional liability.

View File

@@ -1,73 +1,5 @@
![](./resources/official_armmbed_example_badge.png)
# Blinky Mbed OS example
# Semestralka na VPS
The example project is part of the [Arm Mbed OS Official Examples](https://os.mbed.com/code/) and is the [getting started example for Mbed OS](https://os.mbed.com/docs/mbed-os/latest/quick-start/index.html). It contains an application that repeatedly blinks an LED on supported [Mbed boards](https://os.mbed.com/platforms/).
Tato hra je najsamlepsejsia na celom svete.
Iba si treba matchnut baudrate a moze sa gamesit.
You can build the project with all supported [Mbed OS build tools](https://os.mbed.com/docs/mbed-os/latest/tools/index.html). However, this example project specifically refers to the command-line interface tools, [Arm Mbed CLI 1](https://github.com/ARMmbed/mbed-cli#installing-mbed-cli) and [Mbed CLI 2](https://github.com/ARMmbed/mbed-tools#installation).
(Note: To see a rendered example you can import into the Arm Online Compiler, please see our [import quick start](https://os.mbed.com/docs/mbed-os/latest/quick-start/online-with-the-online-compiler.html#importing-the-code).)
## Mbed OS build tools
### Mbed CLI 2
Starting with version 6.5, Mbed OS uses Mbed CLI 2. It uses Ninja as a build system, and CMake to generate the build environment and manage the build process in a compiler-independent manner. If you are working with Mbed OS version prior to 6.5 then check the section [Mbed CLI 1](#mbed-cli-1).
1. [Install Mbed CLI 2](https://os.mbed.com/docs/mbed-os/latest/build-tools/install-or-upgrade.html).
1. From the command-line, import the example: `mbed-tools import mbed-os-example-blinky`
1. Change the current directory to where the project was imported.
### Mbed CLI 1
1. [Install Mbed CLI 1](https://os.mbed.com/docs/mbed-os/latest/quick-start/offline-with-mbed-cli.html).
1. From the command-line, import the example: `mbed import mbed-os-example-blinky`
1. Change the current directory to where the project was imported.
## Application functionality
The `main()` function is the single thread in the application. It toggles the state of a digital output connected to an LED on the board.
**Note**: This example requires a target with RTOS support, i.e. one with `rtos` declared in `supported_application_profiles` in `targets/targets.json` in [mbed-os](https://github.com/ARMmbed/mbed-os). For non-RTOS targets (usually with small memory sizes), please use [mbed-os-example-blinky-baremetal](https://github.com/ARMmbed/mbed-os-example-blinky-baremetal) instead.
## Building and running
1. Connect a USB cable between the USB port on the board and the host computer.
1. Run the following command to build the example project and program the microcontroller flash memory:
* Mbed CLI 2
```bash
$ mbed-tools compile -m <TARGET> -t <TOOLCHAIN> --flash
```
* Mbed CLI 1
```bash
$ mbed compile -m <TARGET> -t <TOOLCHAIN> --flash
```
Your PC may take a few minutes to compile your code.
The binary is located at:
* **Mbed CLI 2** - `./cmake_build/<TARGET>/develop/<TOOLCHAIN>/mbed-os-example-blinky.bin`
* **Mbed CLI 1** - `./BUILD/<TARGET>/<TOOLCHAIN>/mbed-os-example-blinky.bin`
Alternatively, you can manually copy the binary to the board, which you mount on the host computer over USB.
## Expected output
The LED on your target turns on and off every 500 milliseconds.
## Troubleshooting
If you have problems, you can review the [documentation](https://os.mbed.com/docs/latest/tutorials/debugging.html) for suggestions on what could be wrong and how to fix it.
## Related Links
* [Mbed OS Stats API](https://os.mbed.com/docs/latest/apis/mbed-statistics.html).
* [Mbed OS Configuration](https://os.mbed.com/docs/latest/reference/configuration.html).
* [Mbed OS Serial Communication](https://os.mbed.com/docs/latest/tutorials/serial-communication.html).
* [Mbed OS bare metal](https://os.mbed.com/docs/mbed-os/latest/reference/mbed-os-bare-metal.html).
* [Mbed boards](https://os.mbed.com/platforms/).
### License and contributions
The software is provided under Apache-2.0 license. Contributions to this project are accepted under the same license. Please see [CONTRIBUTING.md](./CONTRIBUTING.md) for more info.
This project contains code from other projects. The original license text is included in those source files. They must comply with our license guide.

View File

Before

Width:  |  Height:  |  Size: 1.4 MiB

After

Width:  |  Height:  |  Size: 1.4 MiB

View File

Before

Width:  |  Height:  |  Size: 1.6 MiB

After

Width:  |  Height:  |  Size: 1.6 MiB

View File

@@ -0,0 +1,7 @@
.....a@$..
.....7PF..
..yaM@@__y
..@.y@FFF~
..._$M@_..
yaa@~.`@y.
........@r

View File

@@ -0,0 +1,7 @@
.g@$
.7PF
y@$.
0@F.
4@$.
y$@.
u@..

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.2 KiB

View File

@@ -0,0 +1,6 @@
........
........
...y4@W.
..a@a`..
..@@R@=.
.aa@s@..

View File

@@ -0,0 +1,6 @@
........
........
........
.____...
.@@@@yg,
.a@@PR@L

View File

@@ -0,0 +1,9 @@
......_g@$w..
......4@@@F..
.....yyyy`...
...g@~@@@y_ys
..4F..@@FTF~.
.....g@@g,...
..._a@^.4@_..
4R@F~....7@y.
..........~@.

View File

@@ -0,0 +1,4 @@
.._$@.
.$By`.
4@$@@a
aa@W@.

View File

@@ -0,0 +1,3 @@
a@@Bw_,
7@@Db@$
4@@PF#@

Binary file not shown.

After

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.6 KiB

View File

@@ -0,0 +1,6 @@
....g@w.
..._ZF~.
..@~@@y=
.".g@_`.
_ygF.Ry.
`~`...4L

View File

@@ -0,0 +1,6 @@
....g@w.
..._Z~~.
..aM@$y,
..~a@_`.
.yy@`$..
..`..@..

View File

@@ -0,0 +1,6 @@
...a@$..
..._Z~..
..a@@...
..R@@=..
.yy@@...
.``u@...

View File

@@ -0,0 +1,6 @@
..g@$...
..yT`...
.g@F....
.4@L....
._$$....
.`@~....

View File

@@ -0,0 +1,6 @@
...@@...
.._Z~...
..@@....
..$@#...
..g@L...
.yFP....

View File

@@ -0,0 +1,6 @@
....@@..
..._Z~..
..y@@,_.
..@$@~~.
..y@~$..
.aF~.4L.

View File

@@ -0,0 +1,6 @@
....a@e.
..._ZF`.
..a~@@y=
..'y@L`.
_yyP.4y.
`~`...4L

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

View File

@@ -0,0 +1,5 @@
chafa --symbols ascii-block -c none --fill none --invert --size=13x20 predloha_run_a.jpg > out.txt
a = 78x111
b = 34x111
walk = 60x111

View File

@@ -0,0 +1,6 @@
..a@w.
.._T`.
.s@@y.
.^$$~T
.y@`$.
=F..?K

View File

@@ -0,0 +1,6 @@
..y@$.
.._Z~.
.y@@L.
.4W@Z!
._$~$.
~~`.0.

View File

@@ -0,0 +1,6 @@
..g@L.
.._T~.
.g@$..
.J@@..
_y$4L.
~~.4~.

View File

@@ -0,0 +1,6 @@
..a@w.
..~T~.
..@$..
..@$..
..y@..
."~@..

View File

@@ -0,0 +1,6 @@
..@@..
..Z~..
..@L..
..@L..
..$%..
.4F...

View File

@@ -0,0 +1,6 @@
.u@$..
..Z~..
.g@_..
.$@5+.
._BL..
uP.@..

View File

@@ -0,0 +1,6 @@
..a@w.
.._T`.
.s@@y.
.^$$~T
.yE`$.
=F..JK

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

View File

@@ -1,523 +0,0 @@
[
{
"arguments": [
"/nix/store/ih9psjpxn2pbbzw4klr9s6hmmngc52n8-gcc-arm-embedded-14.3.rel1/bin/arm-none-eabi-g++",
"-DARM_MATH_ARMV8MML",
"-DCLOCK_SOURCE=USE_PLL_MSI",
"-DCOMPONENT_FLASHIAP=1",
"-DDEVICE_ANALOGIN=1",
"-DDEVICE_ANALOGOUT=1",
"-DDEVICE_CAN=1",
"-DDEVICE_CRC=1",
"-DDEVICE_FLASH=1",
"-DDEVICE_I2C=1",
"-DDEVICE_I2CSLAVE=1",
"-DDEVICE_I2C_ASYNCH=1",
"-DDEVICE_INTERRUPTIN=1",
"-DDEVICE_LPTICKER=1",
"-DDEVICE_MPU=1",
"-DDEVICE_PORTIN=1",
"-DDEVICE_PORTINOUT=1",
"-DDEVICE_PORTOUT=1",
"-DDEVICE_PWMOUT=1",
"-DDEVICE_RESET_REASON=1",
"-DDEVICE_RTC=1",
"-DDEVICE_SERIAL=1",
"-DDEVICE_SERIAL_ASYNCH=1",
"-DDEVICE_SERIAL_FC=1",
"-DDEVICE_SLEEP=1",
"-DDEVICE_SPI=1",
"-DDEVICE_SPISLAVE=1",
"-DDEVICE_SPI_ASYNCH=1",
"-DDEVICE_STDIO_MESSAGES=1",
"-DDEVICE_TRNG=1",
"-DDEVICE_USTICKER=1",
"-DDEVICE_WATCHDOG=1",
"-DEXTRA_IDLE_STACK_REQUIRED",
"-DLPTICKER_DELAY_TICKS=0",
"-DMBEDTLS_CIPHER_MODE_CTR",
"-DMBED_CONF_ALT1250_PPP_BAUDRATE=115200",
"-DMBED_CONF_ALT1250_PPP_PROVIDE_DEFAULT=0",
"-DMBED_CONF_ATMEL_RF_ASSUME_SPACED_SPI=1",
"-DMBED_CONF_ATMEL_RF_FULL_SPI_SPEED=7500000",
"-DMBED_CONF_ATMEL_RF_FULL_SPI_SPEED_BYTE_SPACING=250",
"-DMBED_CONF_ATMEL_RF_IRQ_THREAD_STACK_SIZE=1024",
"-DMBED_CONF_ATMEL_RF_LOW_SPI_SPEED=3750000",
"-DMBED_CONF_ATMEL_RF_PROVIDE_DEFAULT=0",
"-DMBED_CONF_ATMEL_RF_USE_SPI_SPACING_API=0",
"-DMBED_CONF_CELLULAR_AT_HANDLER_BUFFER_SIZE=32",
"-DMBED_CONF_CELLULAR_CONTROL_PLANE_OPT=0",
"-DMBED_CONF_CELLULAR_DEBUG_AT=0",
"-DMBED_CONF_CELLULAR_MAX_CP_DATA_RECV_LEN=1358",
"-DMBED_CONF_CELLULAR_RANDOM_MAX_START_DELAY=0",
"-DMBED_CONF_CELLULAR_USE_APN_LOOKUP=0",
"-DMBED_CONF_CELLULAR_USE_SMS=0",
"-DMBED_CONF_DRIVERS_OSPI_CSN=OSPI_FLASH1_CSN",
"-DMBED_CONF_DRIVERS_OSPI_DQS=OSPI_FLASH1_DQS",
"-DMBED_CONF_DRIVERS_OSPI_IO0=OSPI_FLASH1_IO0",
"-DMBED_CONF_DRIVERS_OSPI_IO1=OSPI_FLASH1_IO1",
"-DMBED_CONF_DRIVERS_OSPI_IO2=OSPI_FLASH1_IO2",
"-DMBED_CONF_DRIVERS_OSPI_IO3=OSPI_FLASH1_IO3",
"-DMBED_CONF_DRIVERS_OSPI_IO4=OSPI_FLASH1_IO4",
"-DMBED_CONF_DRIVERS_OSPI_IO5=OSPI_FLASH1_IO5",
"-DMBED_CONF_DRIVERS_OSPI_IO6=OSPI_FLASH1_IO6",
"-DMBED_CONF_DRIVERS_OSPI_IO7=OSPI_FLASH1_IO7",
"-DMBED_CONF_DRIVERS_OSPI_SCK=OSPI_FLASH1_SCK",
"-DMBED_CONF_DRIVERS_QSPI_CSN=QSPI_FLASH1_CSN",
"-DMBED_CONF_DRIVERS_QSPI_IO0=QSPI_FLASH1_IO0",
"-DMBED_CONF_DRIVERS_QSPI_IO1=QSPI_FLASH1_IO1",
"-DMBED_CONF_DRIVERS_QSPI_IO2=QSPI_FLASH1_IO2",
"-DMBED_CONF_DRIVERS_QSPI_IO3=QSPI_FLASH1_IO3",
"-DMBED_CONF_DRIVERS_QSPI_SCK=QSPI_FLASH1_SCK",
"-DMBED_CONF_DRIVERS_UART_SERIAL_RXBUF_SIZE=256",
"-DMBED_CONF_DRIVERS_UART_SERIAL_TXBUF_SIZE=256",
"-DMBED_CONF_ESP8266_BUILT_IN_DNS=0",
"-DMBED_CONF_ESP8266_DEBUG=0",
"-DMBED_CONF_ESP8266_POWER_OFF_TIME_MS=3",
"-DMBED_CONF_ESP8266_POWER_ON_POLARITY=0",
"-DMBED_CONF_ESP8266_POWER_ON_TIME_MS=3",
"-DMBED_CONF_ESP8266_PROVIDE_DEFAULT=0",
"-DMBED_CONF_ESP8266_SERIAL_BAUDRATE=115200",
"-DMBED_CONF_ESP8266_SNTP_ENABLE=0",
"-DMBED_CONF_ESP8266_SNTP_SERVER0=\"\"",
"-DMBED_CONF_ESP8266_SNTP_SERVER1=\"\"",
"-DMBED_CONF_ESP8266_SNTP_SERVER2=\"\"",
"-DMBED_CONF_ESP8266_SNTP_TIMEZONE=0",
"-DMBED_CONF_ESP8266_SOCKET_BUFSIZE=8192",
"-DMBED_CONF_EVENTS_SHARED_DISPATCH_FROM_APPLICATION=0",
"-DMBED_CONF_EVENTS_SHARED_EVENTSIZE=768",
"-DMBED_CONF_EVENTS_SHARED_HIGHPRIO_EVENTSIZE=256",
"-DMBED_CONF_EVENTS_SHARED_HIGHPRIO_STACKSIZE=1024",
"-DMBED_CONF_EVENTS_SHARED_STACKSIZE=2048",
"-DMBED_CONF_EVENTS_USE_LOWPOWER_TIMER_TICKER=0",
"-DMBED_CONF_FAT_CHAN_FFS_DBG=0",
"-DMBED_CONF_FAT_CHAN_FF_CODE_PAGE=437",
"-DMBED_CONF_FAT_CHAN_FF_FS_EXFAT=0",
"-DMBED_CONF_FAT_CHAN_FF_FS_HEAPBUF=1",
"-DMBED_CONF_FAT_CHAN_FF_FS_LOCK=0",
"-DMBED_CONF_FAT_CHAN_FF_FS_MINIMIZE=0",
"-DMBED_CONF_FAT_CHAN_FF_FS_NOFSINFO=0",
"-DMBED_CONF_FAT_CHAN_FF_FS_NORTC=0",
"-DMBED_CONF_FAT_CHAN_FF_FS_READONLY=0",
"-DMBED_CONF_FAT_CHAN_FF_FS_REENTRANT=0",
"-DMBED_CONF_FAT_CHAN_FF_FS_RPATH=1",
"-DMBED_CONF_FAT_CHAN_FF_FS_TIMEOUT=1000",
"-DMBED_CONF_FAT_CHAN_FF_FS_TINY=1",
"-DMBED_CONF_FAT_CHAN_FF_LFN_BUF=255",
"-DMBED_CONF_FAT_CHAN_FF_LFN_UNICODE=0",
"-DMBED_CONF_FAT_CHAN_FF_MAX_LFN=255",
"-DMBED_CONF_FAT_CHAN_FF_MAX_SS=4096",
"-DMBED_CONF_FAT_CHAN_FF_MIN_SS=512",
"-DMBED_CONF_FAT_CHAN_FF_MULTI_PARTITION=0",
"-DMBED_CONF_FAT_CHAN_FF_NORTC_MDAY=1",
"-DMBED_CONF_FAT_CHAN_FF_NORTC_MON=1",
"-DMBED_CONF_FAT_CHAN_FF_NORTC_YEAR=2017",
"-DMBED_CONF_FAT_CHAN_FF_PRINT_FLOAT=0",
"-DMBED_CONF_FAT_CHAN_FF_PRINT_LLI=0",
"-DMBED_CONF_FAT_CHAN_FF_SFN_BUF=12",
"-DMBED_CONF_FAT_CHAN_FF_STRF_ENCODE=3",
"-DMBED_CONF_FAT_CHAN_FF_STR_VOLUME_ID=0",
"-DMBED_CONF_FAT_CHAN_FF_SYNC_T=HANDLE",
"-DMBED_CONF_FAT_CHAN_FF_USE_CHMOD=0",
"-DMBED_CONF_FAT_CHAN_FF_USE_EXPAND=0",
"-DMBED_CONF_FAT_CHAN_FF_USE_FASTSEEK=0",
"-DMBED_CONF_FAT_CHAN_FF_USE_FIND=0",
"-DMBED_CONF_FAT_CHAN_FF_USE_FORWARD=0",
"-DMBED_CONF_FAT_CHAN_FF_USE_LABEL=0",
"-DMBED_CONF_FAT_CHAN_FF_USE_LFN=3",
"-DMBED_CONF_FAT_CHAN_FF_USE_MKFS=1",
"-DMBED_CONF_FAT_CHAN_FF_USE_STRFUNC=0",
"-DMBED_CONF_FAT_CHAN_FF_USE_TRIM=1",
"-DMBED_CONF_FAT_CHAN_FF_VOLUMES=4",
"-DMBED_CONF_FAT_CHAN_FF_VOLUME_STRS=\"RAM\",\"NAND\",\"CF\",\"SD\",\"SD2\",\"USB\",\"USB2\",\"USB3\"",
"-DMBED_CONF_FAT_CHAN_FLUSH_ON_NEW_CLUSTER=0",
"-DMBED_CONF_FAT_CHAN_FLUSH_ON_NEW_SECTOR=1",
"-DMBED_CONF_FLASHIAP_BLOCK_DEVICE_BASE_ADDRESS=0xFFFFFFFF",
"-DMBED_CONF_FLASHIAP_BLOCK_DEVICE_SIZE=0",
"-DMBED_CONF_GEMALTO_CINTERION_BAUDRATE=115200",
"-DMBED_CONF_GEMALTO_CINTERION_PROVIDE_DEFAULT=0",
"-DMBED_CONF_GENERIC_AT3GPP_BAUDRATE=115200",
"-DMBED_CONF_GENERIC_AT3GPP_PROVIDE_DEFAULT=0",
"-DMBED_CONF_LORA_ADR_ON=1",
"-DMBED_CONF_LORA_APPLICATION_EUI={0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}",
"-DMBED_CONF_LORA_APPLICATION_KEY={0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}",
"-DMBED_CONF_LORA_APPSKEY={0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}",
"-DMBED_CONF_LORA_APP_PORT=15",
"-DMBED_CONF_LORA_AUTOMATIC_UPLINK_MESSAGE=1",
"-DMBED_CONF_LORA_DEVICE_ADDRESS=0x00000000",
"-DMBED_CONF_LORA_DEVICE_EUI={0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}",
"-DMBED_CONF_LORA_DOWNLINK_PREAMBLE_LENGTH=5",
"-DMBED_CONF_LORA_DUTY_CYCLE_ON=1",
"-DMBED_CONF_LORA_DUTY_CYCLE_ON_JOIN=1",
"-DMBED_CONF_LORA_FSB_MASK={0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x00FF}",
"-DMBED_CONF_LORA_FSB_MASK_CHINA={0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF}",
"-DMBED_CONF_LORA_LBT_ON=0",
"-DMBED_CONF_LORA_MAX_SYS_RX_ERROR=5",
"-DMBED_CONF_LORA_NB_TRIALS=12",
"-DMBED_CONF_LORA_NWKSKEY={0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}",
"-DMBED_CONF_LORA_OVER_THE_AIR_ACTIVATION=1",
"-DMBED_CONF_LORA_PHY=EU868",
"-DMBED_CONF_LORA_PHY_AS923_SUB_REGION=AS1",
"-DMBED_CONF_LORA_PUBLIC_NETWORK=1",
"-DMBED_CONF_LORA_TX_MAX_SIZE=64",
"-DMBED_CONF_LORA_UPLINK_PREAMBLE_LENGTH=8",
"-DMBED_CONF_LORA_WAKEUP_TIME=5",
"-DMBED_CONF_LWIP_ADDR_TIMEOUT=5",
"-DMBED_CONF_LWIP_ADDR_TIMEOUT_MODE=1",
"-DMBED_CONF_LWIP_DEBUG_ENABLED=0",
"-DMBED_CONF_LWIP_DEFAULT_THREAD_STACKSIZE=512",
"-DMBED_CONF_LWIP_DHCP_TIMEOUT=60",
"-DMBED_CONF_LWIP_ENABLE_PPP_TRACE=0",
"-DMBED_CONF_LWIP_ETHERNET_ENABLED=1",
"-DMBED_CONF_LWIP_IPV4_ENABLED=1",
"-DMBED_CONF_LWIP_IPV6_ENABLED=0",
"-DMBED_CONF_LWIP_IP_VER_PREF=4",
"-DMBED_CONF_LWIP_L3IP_ENABLED=0",
"-DMBED_CONF_LWIP_MBOX_SIZE=8",
"-DMBED_CONF_LWIP_MEMP_NUM_TCPIP_MSG_INPKT=8",
"-DMBED_CONF_LWIP_MEMP_NUM_TCP_SEG=16",
"-DMBED_CONF_LWIP_MEM_SIZE=2310",
"-DMBED_CONF_LWIP_ND6_QUEUEING=0",
"-DMBED_CONF_LWIP_ND6_RDNSS_MAX_DNS_SERVERS=0",
"-DMBED_CONF_LWIP_NETBUF_RECVINFO_ENABLED=0",
"-DMBED_CONF_LWIP_NUM_NETBUF=8",
"-DMBED_CONF_LWIP_NUM_PBUF=8",
"-DMBED_CONF_LWIP_PBUF_POOL_SIZE=5",
"-DMBED_CONF_LWIP_PPP_ENABLED=0",
"-DMBED_CONF_LWIP_PPP_IPV4_ENABLED=0",
"-DMBED_CONF_LWIP_PPP_IPV6_ENABLED=0",
"-DMBED_CONF_LWIP_PPP_THREAD_STACKSIZE=768",
"-DMBED_CONF_LWIP_RAW_SOCKET_ENABLED=0",
"-DMBED_CONF_LWIP_SOCKET_MAX=4",
"-DMBED_CONF_LWIP_TCPIP_THREAD_PRIORITY=osPriorityNormal",
"-DMBED_CONF_LWIP_TCPIP_THREAD_STACKSIZE=1200",
"-DMBED_CONF_LWIP_TCP_CLOSE_TIMEOUT=1000",
"-DMBED_CONF_LWIP_TCP_ENABLED=1",
"-DMBED_CONF_LWIP_TCP_MAXRTX=6",
"-DMBED_CONF_LWIP_TCP_MSS=536",
"-DMBED_CONF_LWIP_TCP_SERVER_MAX=4",
"-DMBED_CONF_LWIP_TCP_SND_BUF=(2 * TCP_MSS)",
"-DMBED_CONF_LWIP_TCP_SOCKET_MAX=4",
"-DMBED_CONF_LWIP_TCP_SYNMAXRTX=6",
"-DMBED_CONF_LWIP_TCP_WND=(4 * TCP_MSS)",
"-DMBED_CONF_LWIP_UDP_SOCKET_MAX=4",
"-DMBED_CONF_LWIP_USE_MBED_TRACE=0",
"-DMBED_CONF_MBED_MESH_API_6LOWPAN_ND_CHANNEL=0",
"-DMBED_CONF_MBED_MESH_API_6LOWPAN_ND_CHANNEL_MASK=0x7fff800",
"-DMBED_CONF_MBED_MESH_API_6LOWPAN_ND_CHANNEL_PAGE=0",
"-DMBED_CONF_MBED_MESH_API_6LOWPAN_ND_DEVICE_TYPE=NET_6LOWPAN_ROUTER",
"-DMBED_CONF_MBED_MESH_API_6LOWPAN_ND_PANID_FILTER=0xffff",
"-DMBED_CONF_MBED_MESH_API_6LOWPAN_ND_PSK_KEY={0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf}",
"-DMBED_CONF_MBED_MESH_API_6LOWPAN_ND_PSK_KEY_ID=1",
"-DMBED_CONF_MBED_MESH_API_6LOWPAN_ND_SECURITY_MODE=NONE",
"-DMBED_CONF_MBED_MESH_API_6LOWPAN_ND_SEC_LEVEL=5",
"-DMBED_CONF_MBED_MESH_API_HEAP_SIZE=32500",
"-DMBED_CONF_MBED_MESH_API_HEAP_STAT_INFO=NULL",
"-DMBED_CONF_MBED_MESH_API_MAC_NEIGH_TABLE_SIZE=32",
"-DMBED_CONF_MBED_MESH_API_RADIUS_RETRY_COUNT=3",
"-DMBED_CONF_MBED_MESH_API_RADIUS_RETRY_IMAX=30",
"-DMBED_CONF_MBED_MESH_API_RADIUS_RETRY_IMIN=20",
"-DMBED_CONF_MBED_MESH_API_SYSTEM_TIME_UPDATE_FROM_NANOSTACK=1",
"-DMBED_CONF_MBED_MESH_API_THREAD_CONFIG_CHANNEL=22",
"-DMBED_CONF_MBED_MESH_API_THREAD_CONFIG_CHANNEL_MASK=0x7fff800",
"-DMBED_CONF_MBED_MESH_API_THREAD_CONFIG_CHANNEL_PAGE=0",
"-DMBED_CONF_MBED_MESH_API_THREAD_CONFIG_COMMISSIONING_DATASET_TIMESTAMP=0x10000",
"-DMBED_CONF_MBED_MESH_API_THREAD_CONFIG_EXTENDED_PANID={0xf1, 0xb5, 0xa1, 0xb2,0xc4, 0xd5, 0xa1, 0xbd }",
"-DMBED_CONF_MBED_MESH_API_THREAD_CONFIG_ML_PREFIX={0xfd, 0x0, 0x0d, 0xb8, 0x0, 0x0, 0x0, 0x0}",
"-DMBED_CONF_MBED_MESH_API_THREAD_CONFIG_NETWORK_NAME=\"Thread Network\"",
"-DMBED_CONF_MBED_MESH_API_THREAD_CONFIG_PANID=0x0700",
"-DMBED_CONF_MBED_MESH_API_THREAD_CONFIG_PSKC={0xc8, 0xa6, 0x2e, 0xae, 0xf3, 0x68, 0xf3, 0x46, 0xa9, 0x9e, 0x57, 0x85, 0x98, 0x9d, 0x1c, 0xd0}",
"-DMBED_CONF_MBED_MESH_API_THREAD_DEVICE_TYPE=MESH_DEVICE_TYPE_THREAD_ROUTER",
"-DMBED_CONF_MBED_MESH_API_THREAD_MASTER_KEY={0x10, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff}",
"-DMBED_CONF_MBED_MESH_API_THREAD_PSKD=\"ABCDEFGH\"",
"-DMBED_CONF_MBED_MESH_API_THREAD_SECURITY_POLICY=255",
"-DMBED_CONF_MBED_MESH_API_THREAD_USE_STATIC_LINK_CONFIG=1",
"-DMBED_CONF_MBED_MESH_API_USE_MALLOC_FOR_HEAP=0",
"-DMBED_CONF_MBED_MESH_API_WISUN_BC_CHANNEL_FUNCTION=255",
"-DMBED_CONF_MBED_MESH_API_WISUN_BC_DWELL_INTERVAL=0",
"-DMBED_CONF_MBED_MESH_API_WISUN_BC_FIXED_CHANNEL=65535",
"-DMBED_CONF_MBED_MESH_API_WISUN_BC_INTERVAL=0",
"-DMBED_CONF_MBED_MESH_API_WISUN_CHANNEL_PLAN_ID=255",
"-DMBED_CONF_MBED_MESH_API_WISUN_DEVICE_TYPE=MESH_DEVICE_TYPE_WISUN_ROUTER",
"-DMBED_CONF_MBED_MESH_API_WISUN_NETWORK_NAME=\"Wi-SUN Network\"",
"-DMBED_CONF_MBED_MESH_API_WISUN_OPERATING_CLASS=255",
"-DMBED_CONF_MBED_MESH_API_WISUN_OPERATING_MODE=255",
"-DMBED_CONF_MBED_MESH_API_WISUN_PHY_MODE_ID=255",
"-DMBED_CONF_MBED_MESH_API_WISUN_REGULATORY_DOMAIN=3",
"-DMBED_CONF_MBED_MESH_API_WISUN_UC_CHANNEL_FUNCTION=255",
"-DMBED_CONF_MBED_MESH_API_WISUN_UC_DWELL_INTERVAL=255",
"-DMBED_CONF_MBED_MESH_API_WISUN_UC_FIXED_CHANNEL=65535",
"-DMBED_CONF_MCR20A_PROVIDE_DEFAULT=0",
"-DMBED_CONF_NANOSTACK_CONFIGURATION=nanostack_full",
"-DMBED_CONF_NANOSTACK_HAL_CRITICAL_SECTION_USABLE_FROM_INTERRUPT=0",
"-DMBED_CONF_NANOSTACK_HAL_EVENT_LOOP_DISPATCH_FROM_APPLICATION=0",
"-DMBED_CONF_NANOSTACK_HAL_EVENT_LOOP_THREAD_STACK_SIZE=6144",
"-DMBED_CONF_NANOSTACK_HAL_EVENT_LOOP_USE_MBED_EVENTS=0",
"-DMBED_CONF_NANOSTACK_HAL_KVSTORE_PATH=\"/kv/\"",
"-DMBED_CONF_NANOSTACK_HAL_USE_KVSTORE=0",
"-DMBED_CONF_NANOSTACK_LIBSERVICE_NSDYNMEM_TRACKER_ENABLED=0",
"-DMBED_CONF_NANOSTACK_LIBSERVICE_PRESENT=1",
"-DMBED_CONF_NSAPI_ADD_EVENT_LISTENER_RETURN_CHANGE=0",
"-DMBED_CONF_NSAPI_DEFAULT_MESH_TYPE=THREAD",
"-DMBED_CONF_NSAPI_DEFAULT_STACK=LWIP",
"-DMBED_CONF_NSAPI_DEFAULT_WIFI_SECURITY=NONE",
"-DMBED_CONF_NSAPI_DNS_ADDRESSES_LIMIT=10",
"-DMBED_CONF_NSAPI_DNS_CACHE_SIZE=3",
"-DMBED_CONF_NSAPI_DNS_RESPONSE_WAIT_TIME=10000",
"-DMBED_CONF_NSAPI_DNS_RETRIES=1",
"-DMBED_CONF_NSAPI_DNS_TOTAL_ATTEMPTS=10",
"-DMBED_CONF_NSAPI_SOCKET_STATS_ENABLED=0",
"-DMBED_CONF_NSAPI_SOCKET_STATS_MAX_COUNT=10",
"-DMBED_CONF_PLATFORM_CALLBACK_COMPARABLE=1",
"-DMBED_CONF_PLATFORM_CALLBACK_NONTRIVIAL=0",
"-DMBED_CONF_PLATFORM_CRASH_CAPTURE_ENABLED=0",
"-DMBED_CONF_PLATFORM_CTHUNK_COUNT_MAX=8",
"-DMBED_CONF_PLATFORM_DEEPSLEEP_STATS_VERBOSE=0",
"-DMBED_CONF_PLATFORM_DEFAULT_SERIAL_BAUD_RATE=9600",
"-DMBED_CONF_PLATFORM_ERROR_ALL_THREADS_INFO=0",
"-DMBED_CONF_PLATFORM_ERROR_FILENAME_CAPTURE_ENABLED=0",
"-DMBED_CONF_PLATFORM_ERROR_HIST_ENABLED=0",
"-DMBED_CONF_PLATFORM_ERROR_HIST_SIZE=4",
"-DMBED_CONF_PLATFORM_ERROR_REBOOT_MAX=1",
"-DMBED_CONF_PLATFORM_FATAL_ERROR_AUTO_REBOOT_ENABLED=0",
"-DMBED_CONF_PLATFORM_MAX_ERROR_FILENAME_LEN=16",
"-DMBED_CONF_PLATFORM_MINIMAL_PRINTF_ENABLE_64_BIT=1",
"-DMBED_CONF_PLATFORM_MINIMAL_PRINTF_ENABLE_FLOATING_POINT=0",
"-DMBED_CONF_PLATFORM_MINIMAL_PRINTF_SET_FLOATING_POINT_MAX_DECIMALS=6",
"-DMBED_CONF_PLATFORM_POLL_USE_LOWPOWER_TIMER=0",
"-DMBED_CONF_PLATFORM_STDIO_BAUD_RATE=9600",
"-DMBED_CONF_PLATFORM_STDIO_BUFFERED_SERIAL=0",
"-DMBED_CONF_PLATFORM_STDIO_CONVERT_NEWLINES=1",
"-DMBED_CONF_PLATFORM_STDIO_CONVERT_TTY_NEWLINES=1",
"-DMBED_CONF_PLATFORM_STDIO_FLUSH_AT_EXIT=1",
"-DMBED_CONF_PLATFORM_STDIO_MINIMAL_CONSOLE_ONLY=0",
"-DMBED_CONF_PLATFORM_USE_MPU=1",
"-DMBED_CONF_PPP_ENABLED=0",
"-DMBED_CONF_PPP_ENABLE_TRACE=0",
"-DMBED_CONF_PPP_IPV4_ENABLED=1",
"-DMBED_CONF_PPP_IPV6_ENABLED=0",
"-DMBED_CONF_PPP_MBED_EVENT_QUEUE=0",
"-DMBED_CONF_PPP_THREAD_STACKSIZE=816",
"-DMBED_CONF_QUECTEL_BC95_BAUDRATE=9600",
"-DMBED_CONF_QUECTEL_BC95_PROVIDE_DEFAULT=0",
"-DMBED_CONF_QUECTEL_BG96_BAUDRATE=115200",
"-DMBED_CONF_QUECTEL_BG96_PROVIDE_DEFAULT=0",
"-DMBED_CONF_QUECTEL_EC2X_BAUDRATE=115200",
"-DMBED_CONF_QUECTEL_EC2X_PROVIDE_DEFAULT=0",
"-DMBED_CONF_QUECTEL_EC2X_START_TIMEOUT=15000",
"-DMBED_CONF_QUECTEL_M26_BAUDRATE=115200",
"-DMBED_CONF_QUECTEL_M26_PROVIDE_DEFAULT=0",
"-DMBED_CONF_QUECTEL_UG96_BAUDRATE=115200",
"-DMBED_CONF_QUECTEL_UG96_PROVIDE_DEFAULT=0",
"-DMBED_CONF_RM1000_AT_BAUDRATE=230400",
"-DMBED_CONF_RM1000_AT_PROVIDE_DEFAULT=0",
"-DMBED_CONF_RTOS_API_PRESENT=1",
"-DMBED_CONF_RTOS_ENABLE_ALL_RTX_EVENTS=0",
"-DMBED_CONF_RTOS_EVFLAGS_NUM=0",
"-DMBED_CONF_RTOS_IDLE_THREAD_STACK_SIZE=512",
"-DMBED_CONF_RTOS_IDLE_THREAD_STACK_SIZE_DEBUG_EXTRA=128",
"-DMBED_CONF_RTOS_IDLE_THREAD_STACK_SIZE_TICKLESS_EXTRA=256",
"-DMBED_CONF_RTOS_MAIN_THREAD_STACK_SIZE=4096",
"-DMBED_CONF_RTOS_MSGQUEUE_DATA_SIZE=0",
"-DMBED_CONF_RTOS_MSGQUEUE_NUM=0",
"-DMBED_CONF_RTOS_MUTEX_NUM=0",
"-DMBED_CONF_RTOS_PRESENT=1",
"-DMBED_CONF_RTOS_SEMAPHORE_NUM=0",
"-DMBED_CONF_RTOS_THREAD_NUM=0",
"-DMBED_CONF_RTOS_THREAD_STACK_SIZE=4096",
"-DMBED_CONF_RTOS_THREAD_USER_STACK_SIZE=0",
"-DMBED_CONF_RTOS_TIMER_NUM=0",
"-DMBED_CONF_RTOS_TIMER_THREAD_STACK_SIZE=768",
"-DMBED_CONF_S2LP_PROVIDE_DEFAULT=0",
"-DMBED_CONF_SARA4_PPP_BAUDRATE=115200",
"-DMBED_CONF_SARA4_PPP_PROVIDE_DEFAULT=0",
"-DMBED_CONF_STM32_EMAC_ETH_PHY_ADDRESS=0",
"-DMBED_CONF_STM32_EMAC_ETH_PHY_AUTONEGOTIATION=ETH_AUTONEGOTIATION_ENABLE",
"-DMBED_CONF_STM32_EMAC_ETH_PHY_DUPLEXMODE=ETH_MODE_FULLDUPLEX",
"-DMBED_CONF_STM32_EMAC_ETH_PHY_DUPLEX_STATUS=0x0010",
"-DMBED_CONF_STM32_EMAC_ETH_PHY_MEDIA_INTERFACE=ETH_MEDIA_INTERFACE_RMII",
"-DMBED_CONF_STM32_EMAC_ETH_PHY_RESET_DELAY=500",
"-DMBED_CONF_STM32_EMAC_ETH_PHY_SPEED=ETH_SPEED_100M",
"-DMBED_CONF_STM32_EMAC_ETH_PHY_SPEED_STATUS=0x0004",
"-DMBED_CONF_STM32_EMAC_ETH_PHY_STATUS_REGISTER=31",
"-DMBED_CONF_STM32_EMAC_ETH_RXBUFNB=4",
"-DMBED_CONF_STM32_EMAC_ETH_TXBUFNB=4",
"-DMBED_CONF_STM32_EMAC_THREAD_STACKSIZE=1024",
"-DMBED_CONF_STORAGE_DEFAULT_KV=kv",
"-DMBED_CONF_STORAGE_FILESYSTEM_BLOCKDEVICE=default",
"-DMBED_CONF_STORAGE_FILESYSTEM_EXTERNAL_BASE_ADDRESS=0",
"-DMBED_CONF_STORAGE_FILESYSTEM_EXTERNAL_SIZE=0",
"-DMBED_CONF_STORAGE_FILESYSTEM_FILESYSTEM=default",
"-DMBED_CONF_STORAGE_FILESYSTEM_FOLDER_PATH=kvstore",
"-DMBED_CONF_STORAGE_FILESYSTEM_INTERNAL_BASE_ADDRESS=0",
"-DMBED_CONF_STORAGE_FILESYSTEM_MOUNT_POINT=kv",
"-DMBED_CONF_STORAGE_FILESYSTEM_NO_RBP_BLOCKDEVICE=default",
"-DMBED_CONF_STORAGE_FILESYSTEM_NO_RBP_EXTERNAL_BASE_ADDRESS=0",
"-DMBED_CONF_STORAGE_FILESYSTEM_NO_RBP_EXTERNAL_SIZE=0",
"-DMBED_CONF_STORAGE_FILESYSTEM_NO_RBP_FILESYSTEM=default",
"-DMBED_CONF_STORAGE_FILESYSTEM_NO_RBP_FOLDER_PATH=kvstore",
"-DMBED_CONF_STORAGE_FILESYSTEM_NO_RBP_MOUNT_POINT=kv",
"-DMBED_CONF_STORAGE_FILESYSTEM_RBP_INTERNAL_SIZE=0",
"-DMBED_CONF_STORAGE_STORAGE_TYPE=default",
"-DMBED_CONF_STORAGE_TDB_EXTERNAL_BLOCKDEVICE=default",
"-DMBED_CONF_STORAGE_TDB_EXTERNAL_EXTERNAL_BASE_ADDRESS=0",
"-DMBED_CONF_STORAGE_TDB_EXTERNAL_EXTERNAL_SIZE=0",
"-DMBED_CONF_STORAGE_TDB_EXTERNAL_INTERNAL_BASE_ADDRESS=0",
"-DMBED_CONF_STORAGE_TDB_EXTERNAL_NO_RBP_BLOCKDEVICE=default",
"-DMBED_CONF_STORAGE_TDB_EXTERNAL_NO_RBP_EXTERNAL_BASE_ADDRESS=0",
"-DMBED_CONF_STORAGE_TDB_EXTERNAL_NO_RBP_EXTERNAL_SIZE=0",
"-DMBED_CONF_STORAGE_TDB_EXTERNAL_RBP_INTERNAL_SIZE=0",
"-DMBED_CONF_STORAGE_TDB_INTERNAL_INTERNAL_BASE_ADDRESS=0",
"-DMBED_CONF_STORAGE_TDB_INTERNAL_INTERNAL_SIZE=0",
"-DMBED_CONF_TARGET_BOOT_STACK_SIZE=0x400",
"-DMBED_CONF_TARGET_CONSOLE_UART=1",
"-DMBED_CONF_TARGET_CUSTOM_TICKERS=1",
"-DMBED_CONF_TARGET_DEEP_SLEEP_LATENCY=4",
"-DMBED_CONF_TARGET_DEFAULT_ADC_VREF=NAN",
"-DMBED_CONF_TARGET_GPIO_RESET_AT_INIT=0",
"-DMBED_CONF_TARGET_I2C_TIMING_VALUE_ALGO=0",
"-DMBED_CONF_TARGET_INIT_US_TICKER_AT_BOOT=1",
"-DMBED_CONF_TARGET_INTERNAL_FLASH_UNIFORM_SECTORS=1",
"-DMBED_CONF_TARGET_LPTICKER_LPTIM=1",
"-DMBED_CONF_TARGET_LPTICKER_LPTIM_CLOCK=1",
"-DMBED_CONF_TARGET_LPUART_CLOCK_SOURCE=USE_LPUART_CLK_HSI",
"-DMBED_CONF_TARGET_LSE_AVAILABLE=1",
"-DMBED_CONF_TARGET_LSE_DRIVE_LOAD_LEVEL=RCC_LSEDRIVE_LOW",
"-DMBED_CONF_TARGET_MPU_ROM_END=0x0fffffff",
"-DMBED_CONF_TARGET_RTC_CLOCK_SOURCE=USE_RTC_CLK_LSE_OR_LSI",
"-DMBED_CONF_TARGET_TICKLESS_FROM_US_TICKER=0",
"-DMBED_CONF_TARGET_XIP_ENABLE=0",
"-DMBED_CONF_TELIT_HE910_BAUDRATE=115200",
"-DMBED_CONF_TELIT_HE910_PROVIDE_DEFAULT=0",
"-DMBED_CONF_TELIT_ME310_BAUDRATE=115200",
"-DMBED_CONF_TELIT_ME310_PROVIDE_DEFAULT=0",
"-DMBED_CONF_TELIT_ME910_BAUDRATE=115200",
"-DMBED_CONF_TELIT_ME910_PROVIDE_DEFAULT=0",
"-DMBED_CONF_UBLOX_AT_BAUDRATE=115200",
"-DMBED_CONF_UBLOX_AT_PROVIDE_DEFAULT=0",
"-DMBED_CONF_UBLOX_N2XX_BAUDRATE=9600",
"-DMBED_CONF_UBLOX_N2XX_PROVIDE_DEFAULT=0",
"-DMBED_CONF_UBLOX_PPP_BAUDRATE=115200",
"-DMBED_CONF_UBLOX_PPP_PROVIDE_DEFAULT=0",
"-DMBED_CRC_TABLE_SIZE=16",
"-DMBED_LFS2_BLOCK_CYCLES=1024",
"-DMBED_LFS2_BLOCK_SIZE=512",
"-DMBED_LFS2_CACHE_SIZE=64",
"-DMBED_LFS2_ENABLE_INFO=0",
"-DMBED_LFS2_INTRINSICS=1",
"-DMBED_LFS2_LOOKAHEAD_SIZE=64",
"-DMBED_LFS_BLOCK_SIZE=512",
"-DMBED_LFS_ENABLE_INFO=0",
"-DMBED_LFS_INTRINSICS=1",
"-DMBED_LFS_LOOKAHEAD=512",
"-DMBED_LFS_PROG_SIZE=64",
"-DMBED_LFS_READ_SIZE=64",
"-DMBED_MINIMAL_PRINTF",
"-DMBED_STACK_DUMP_ENABLED=0",
"-DMBED_TICKLESS",
"-DMBED_TRACE_COLOR_THEME=0",
"-DMBED_TRAP_ERRORS_ENABLED=1",
"-DMEM_ALLOC=malloc",
"-DMEM_FREE=free",
"-DNSAPI_PPP_AVAILABLE=(MBED_CONF_PPP_ENABLED || MBED_CONF_LWIP_PPP_ENABLED)",
"-DNSDYNMEM_TRACKER_ENABLED=MBED_CONF_NANOSTACK_LIBSERVICE_NSDYNMEM_TRACKER_ENABLED",
"-DNS_USE_EXTERNAL_MBED_TLS",
"-DPPP_DEBUG=0",
"-DSTM32U575xx",
"-DTARGET_CORTEX",
"-DTARGET_CORTEX_M",
"-DTARGET_FF_ARDUINO_UNO",
"-DTARGET_LIKE_CORTEX_M33",
"-DTARGET_LIKE_MBED",
"-DTARGET_M33",
"-DTARGET_MCU_STM32",
"-DTARGET_MCU_STM32U5",
"-DTARGET_MCU_STM32U575xI",
"-DTARGET_NAME=NUCLEO_U575ZI_Q",
"-DTARGET_NUCLEO_U575ZI_Q",
"-DTARGET_STM",
"-DTARGET_STM32U5",
"-DTARGET_STM32U575xI",
"-DTARGET_Target",
"-DTOOLCHAIN_GCC",
"-DTOOLCHAIN_GCC_ARM",
"-DTRANSACTION_QUEUE_SIZE_SPI=2",
"-DUNITY_INCLUDE_CONFIG_H",
"-DUSE_FULL_LL_DRIVER",
"-DUSE_HAL_DRIVER",
"-D_RTE_",
"-D__CMSIS_RTOS",
"-D__CORTEX_M33",
"-D__DSP_PRESENT=1U",
"-D__FPU_PRESENT=1U",
"-D__MBED__=1",
"-I/home/filip/Documents/programming/uni/pvs/semestralka1/src",
"-I/home/filip/Documents/programming/uni/pvs/semestralka1/mbed-os/cmsis/CMSIS_5/CMSIS/RTOS2/RTX/Config",
"-I/home/filip/Documents/programming/uni/pvs/semestralka1/mbed-os/cmsis/CMSIS_5/CMSIS/RTOS2/RTX/Include",
"-I/home/filip/Documents/programming/uni/pvs/semestralka1/mbed-os/cmsis/CMSIS_5/CMSIS/RTOS2/RTX/Include1",
"-I/home/filip/Documents/programming/uni/pvs/semestralka1/mbed-os/cmsis/CMSIS_5/CMSIS/RTOS2/RTX/Source",
"-I/home/filip/Documents/programming/uni/pvs/semestralka1/mbed-os/cmsis/CMSIS_5/CMSIS/RTOS2/Include",
"-I/home/filip/Documents/programming/uni/pvs/semestralka1/mbed-os/cmsis/device/rtos/include",
"-I/home/filip/Documents/programming/uni/pvs/semestralka1/mbed-os",
"-I/home/filip/Documents/programming/uni/pvs/semestralka1/mbed-os/cmsis/device/RTE/include",
"-I/home/filip/Documents/programming/uni/pvs/semestralka1/mbed-os/cmsis/device/.",
"-I/home/filip/Documents/programming/uni/pvs/semestralka1/mbed-os/drivers/.",
"-I/home/filip/Documents/programming/uni/pvs/semestralka1/mbed-os/drivers/./include",
"-I/home/filip/Documents/programming/uni/pvs/semestralka1/mbed-os/drivers/./include/drivers",
"-I/home/filip/Documents/programming/uni/pvs/semestralka1/mbed-os/drivers/./include/drivers/internal",
"-I/home/filip/Documents/programming/uni/pvs/semestralka1/mbed-os/hal/usb/include",
"-I/home/filip/Documents/programming/uni/pvs/semestralka1/mbed-os/hal/usb/include/usb",
"-I/home/filip/Documents/programming/uni/pvs/semestralka1/mbed-os/hal/include",
"-I/home/filip/Documents/programming/uni/pvs/semestralka1/mbed-os/hal/include/hal",
"-I/home/filip/Documents/programming/uni/pvs/semestralka1/mbed-os/platform/cxxsupport/.",
"-I/home/filip/Documents/programming/uni/pvs/semestralka1/mbed-os/platform/mbed-trace/include",
"-I/home/filip/Documents/programming/uni/pvs/semestralka1/mbed-os/platform/mbed-trace/include/mbed-trace",
"-I/home/filip/Documents/programming/uni/pvs/semestralka1/mbed-os/platform/source/minimal-printf/.",
"-I/home/filip/Documents/programming/uni/pvs/semestralka1/mbed-os/platform/source/.",
"-I/home/filip/Documents/programming/uni/pvs/semestralka1/mbed-os/platform/include",
"-I/home/filip/Documents/programming/uni/pvs/semestralka1/mbed-os/platform/include/platform",
"-I/home/filip/Documents/programming/uni/pvs/semestralka1/mbed-os/platform/include/platform/internal",
"-I/home/filip/Documents/programming/uni/pvs/semestralka1/mbed-os/rtos/.",
"-I/home/filip/Documents/programming/uni/pvs/semestralka1/mbed-os/rtos/./include",
"-I/home/filip/Documents/programming/uni/pvs/semestralka1/mbed-os/rtos/./include/rtos",
"-I/home/filip/Documents/programming/uni/pvs/semestralka1/mbed-os/rtos/./include/rtos/internal",
"-I/home/filip/Documents/programming/uni/pvs/semestralka1/mbed-os/rtos/./source",
"-I/home/filip/Documents/programming/uni/pvs/semestralka1/mbed-os/connectivity/libraries/nanostack-libservice/.",
"-I/home/filip/Documents/programming/uni/pvs/semestralka1/mbed-os/connectivity/libraries/nanostack-libservice/./mbed-client-libservice",
"-I/home/filip/Documents/programming/uni/pvs/semestralka1/mbed-os/targets/TARGET_STM/TARGET_STM32U5/TARGET_STM32U575xI/TARGET_NUCLEO_U575ZI_Q/.",
"-I/home/filip/Documents/programming/uni/pvs/semestralka1/mbed-os/targets/TARGET_STM/TARGET_STM32U5/TARGET_STM32U575xI/.",
"-I/home/filip/Documents/programming/uni/pvs/semestralka1/mbed-os/targets/TARGET_STM/TARGET_STM32U5/.",
"-I/home/filip/Documents/programming/uni/pvs/semestralka1/mbed-os/targets/TARGET_STM/.",
"-I/home/filip/Documents/programming/uni/pvs/semestralka1/mbed-os/cmsis/CMSIS_5/CMSIS/TARGET_CORTEX_M/Include",
"-I/home/filip/Documents/programming/uni/pvs/semestralka1/mbed-os/targets/TARGET_STM/TARGET_STM32U5/STM32Cube_FW/.",
"-I/home/filip/Documents/programming/uni/pvs/semestralka1/mbed-os/targets/TARGET_STM/TARGET_STM32U5/STM32Cube_FW/CMSIS",
"-I/home/filip/Documents/programming/uni/pvs/semestralka1/mbed-os/targets/TARGET_STM/TARGET_STM32U5/STM32Cube_FW/STM32U5xx_HAL_Driver",
"-I/home/filip/Documents/programming/uni/pvs/semestralka1/mbed-os/targets/TARGET_STM/TARGET_STM32U5/STM32Cube_FW/STM32U5xx_HAL_Driver/Legacy",
"-Wall",
"-Wextra",
"-Wno-unused-parameter",
"-Wno-missing-field-initializers",
"-fmessage-length=0",
"-fno-exceptions",
"-ffunction-sections",
"-fdata-sections",
"-funsigned-char",
"-fomit-frame-pointer",
"-g3",
"-mthumb",
"-mfpu=fpv5-sp-d16",
"-mfloat-abi=softfp",
"-mcpu=cortex-m33",
"-fno-rtti",
"-Wvla",
"-Os",
"-c",
"-o",
"CMakeFiles/mbed-os-example-blinky.dir/src/render/background.cpp.obj",
"/home/filip/Documents/programming/uni/pvs/semestralka1/src/render/background.cpp"
],
"directory": "/home/filip/Documents/programming/uni/pvs/semestralka1/cmake_build/NUCLEO_U575ZI_Q/develop/GCC_ARM",
"file": "/home/filip/Documents/programming/uni/pvs/semestralka1/src/render/background.cpp",
"output": "/home/filip/Documents/programming/uni/pvs/semestralka1/cmake_build/NUCLEO_U575ZI_Q/develop/GCC_ARM/CMakeFiles/mbed-os-example-blinky.dir/src/render/background.cpp.obj"
}
]

View File

@@ -1,7 +1,7 @@
// background_dark_inverted.h
// src/assets/background_frame.h
#pragma once
static const char *BACKGROUND_DARK_INVERTED[] = {
static const char *BACKGROUND_MASK[] = {
"~`````````````````````````````````````````````````````````````````````````````````````\"````````````````````````````````~```````````````````````````````````````````````````````````````````````````````````````````````````````````````````````+````````````````````~````````````````````````````````~```````````````````````````````````````````````````````",
"...................................................................,.......................:..........................................'.........`..:.....................................................................................................+...................................:...........:..,................................................",
"...........................\"............................................._................................+...........................................................................................................,..............................................`..............................................................!........................",
@@ -18,9 +18,5 @@ static const char *BACKGROUND_DARK_INVERTED[] = {
"...,,,:::::4@@@@@@~...,,,,,,,,,,$@$:_@@@@@_ggaggg@@F~.::::,,,,,,,,,,,yyyyyy,_yggg@@@@@@@@MF#$ggagggyww::$@M@@@@..~$.,,:3@@@$A::::,\"@@g$_:d@@..~~@~`,,,,,,,,,,yyyx,,,,,,,ggg_......,,::::::@@@@@@$....:,,,,,,,,,@@:_$@@@@yg$g$ggg@@~`::::,,,,,,,,,,,yyyyyy_,yygg$@@@@@@@@F5aagggggyyw,:d@P@@@@L.`5r,,,:@@@@UL`:::,N@@gy.:@@F.>~5F~,,,,,,,,,,,yyy,,,,,,,,ggy...",
"...,,,,,,,,4@@@$g@....,7^=sa@@$a@@@@@@@@@@@@@@@@@@~``.`,,,,,,,,:::`,g@R@BZa$TTTTF5PM@@@@^:`'`~T5#@@y_`,u@~$@$@@g_,F,,,,`@@@@'':^na$g@@@=_:@@.`,.4__,,,,,,,,,g@@K:,,,,,,g@@@@w....,,,,,,,,,$@@$g@F...,,^=#aa@$gg@@@@@@@@@@@@@@@@@F``.`,,,,,,,,,::`,:@@P@R5$T~TTFFPP5@@@$:'``~~7P@@y_``,$E4@W@$@y,4::,,`3@@@[`:,raagg@@Fk`@@L.,.`g_,,,,,,,,,,g@@~:,,,,,,g@@@$..",
"..,:''``a$gg@$@@ZF...:,,,,,,:`~T@@@@@@@@@@@@@A@@^``...:,,,,,`,,::,.,@@@@@@@@,`.`````@@@[',,,,,,,,,,`TR@@@@@@@$@@@`'''':,A@MP.,,,,,\"~TT@,`3@@*g'.`4@':,,,,,,:EDT,,,,,,,_@@@@@$....:':':H$$g@$@@$@....,,,,,`:`~7R@@@@@@@@@@@@AR@@```..,',,,'``,,::,,d@0@@@@@y`.`````g@@@`',,,,,,,,,:79@$@@@@@@@@@'\"``':,!$FP~:,,,,,~~7@y.~A@mg@'.\"@F::,,,,,,4ER~,,,,,,,g@@@@@..",
"..:`::':''~F@@@@@....:````:`:,``\"FB@P~5@@@$~~3@@L....::``',:``,:::,`g@@@@@@@@.```.:7@@@F:`````````::,:`@Fy@@$@@@F.::`:::`$@@L`````````~%.`$F.B`..`B::::````4PF````````@@@@@@B...,:,,:::``TM@@@@$...:````:,`````7M$@F~@@@@~~\"@@@.....:,`',:'`':::,,x@@@@@@@@,....`:@@@@:``````````:::,g@ya@@@@@@.,'`'::`4@@g,```,`````4..\"@.$^...4~`::````_RP~```````g@@@@@@L.",
".,,`,```,,``@@@@@,,.``````````,,4@~,,,\"$@@$,,$@@m',..,,,``,,````,``g@@@@@@@@@,'`,..,\"Z@F``````````````_a@@@@@@@@'.`,,````~@@F``,````,,,,,,4(``....`'```,,,g@~,,``````g@@@@@@@,,.,,,```,,,`4@@@@~,.,```````'`,,`B$,,,,$gZ$r,:@@@',...,,,``,````,``:@@@@$@@@@@.',...`~@@```````````````D$@@@@@@@E,``:`````@@R``,````,,,,,,`R'['.,..,````,,`@B,,``````g@@@@@@@L,",
".',,,,,,,,,,4@@@E,,,,,,,,,,,,,,,,@,,,,,5@@@,,$@@@,,..,,,,,,,,,,,,,,@@@@@@@@@@@,,,..`,,@F,,,,,,,,,,,,,,@@@@@@@@@@,,',,,,,,,~,,,,,,,,,,,,,,,,L,..,,.':,,,,,y@~,,,,,,,,g@@@@@@@@,,.',,,,,,,,,,@@@@,,.:,,,,,,,,,,,,$F,,,,\"@@@F,d@@@,,,..,,,,,,,,,,,,,d@@@@@@@@@@L,,,..,,4@,,,,,,,,,,,,,,g@@@@@@@@@F,,',,,,,,~^,,,,,,,,,,,,,,,T,...,..,,,,,,,$E,,,,,,,,y@@@@@@@@$,",
};
static const int BACKGROUND_DARK_INVERTED_LINES =
sizeof(BACKGROUND_DARK_INVERTED) / sizeof(BACKGROUND_DARK_INVERTED[0]);
static const int VIEW_HEIGHT = sizeof(BACKGROUND_MASK) / sizeof(BACKGROUND_MASK[0]);

View File

@@ -0,0 +1,57 @@
// src/assets/character_crawl_frames.h
#pragma once
// Crawl1 frame 1
static const char *CRAWL1_FRAME_1[] = {
"........",
"........",
"...y4@W.",
"..a@a`..",
"..@@R@=.",
".aa@s@.."
};
// Crawl2 frame 1
static const char *CRAWL2_FRAME_1[] = {
"........",
"........",
"........",
".____...",
".@@@@yg,",
".a@@PR@L"
};
enum class CrawlType {
Crawl1 = 0,
Crawl2,
COUNT
};
static const char **CHARACTER_CRAWL1_FRAMES[] = {
CRAWL1_FRAME_1,
};
static const char **CHARACTER_CRAWL2_FRAMES[] = {
CRAWL2_FRAME_1,
};
static const int CHARACTER_CRAWL1_FRAME_COUNT = sizeof(CHARACTER_CRAWL1_FRAMES) / sizeof(CHARACTER_CRAWL1_FRAMES[0]);
static const int CHARACTER_CRAWL2_FRAME_COUNT = sizeof(CHARACTER_CRAWL2_FRAMES) / sizeof(CHARACTER_CRAWL2_FRAMES[0]);
// Height (rows per crawl frame)
static const int CHARACTER_CRAWL1_FRAME_HEIGHT = sizeof(CRAWL1_FRAME_1) / sizeof(CRAWL1_FRAME_1[0]);
static const int CHARACTER_CRAWL2_FRAME_HEIGHT = sizeof(CRAWL2_FRAME_1) / sizeof(CRAWL2_FRAME_1[0]);
// Crawl1 collision box
static const int CHARACTER_CRAWL1_FRAME_WIDTH = 8;
static const int CHARACTER_CRAWL1_COLLISION_LEFT_OFFSET = 1;
static const int CHARACTER_CRAWL1_COLLISION_RIGHT_OFFSET = 1;
static const int CHARACTER_CRAWL1_COLLISION_WIDTH = CHARACTER_CRAWL1_FRAME_WIDTH - (CHARACTER_CRAWL1_COLLISION_LEFT_OFFSET + CHARACTER_CRAWL1_COLLISION_RIGHT_OFFSET);
static const int CHARACTER_CRAWL1_COLLISION_HEIGHT = CHARACTER_CRAWL1_FRAME_HEIGHT - 2;
// Crawl2 collision box (lower posture - smaller collision height)
static const int CHARACTER_CRAWL2_FRAME_WIDTH = 8;
static const int CHARACTER_CRAWL2_COLLISION_LEFT_OFFSET = 1;
static const int CHARACTER_CRAWL2_COLLISION_RIGHT_OFFSET = 0;
static const int CHARACTER_CRAWL2_COLLISION_WIDTH = CHARACTER_CRAWL2_FRAME_WIDTH - (CHARACTER_CRAWL2_COLLISION_LEFT_OFFSET + CHARACTER_CRAWL2_COLLISION_RIGHT_OFFSET);
static const int CHARACTER_CRAWL2_COLLISION_HEIGHT = CHARACTER_CRAWL2_FRAME_HEIGHT - 4;

View File

@@ -0,0 +1,106 @@
// src/assets/character_run_frames.h
#pragma once
// Run frame 1
static const char *RUN_FRAME_1[] = {
"....g@w.",
"..._ZF~.",
"..@~@@y=",
"\".g@_`.",
"_ygF.Ry.",
"`~`...4L",
};
// Run frame 2
static const char *RUN_FRAME_2[] = {
"....g@w.",
"..._Z~~.",
"..aM@$y,",
"..~a@_`.",
".yy@`$..",
"..`..@..",
};
// Run frame 3
static const char *RUN_FRAME_3[] = {
"...a@$..",
"..._Z~..",
"..a@@...",
"..R@@=..",
".yy@@...",
".``u@...",
};
// Run frame 4
static const char *RUN_FRAME_4[] = {
"..g@$...",
"..yT`...",
".g@F....",
".4@L....",
"._$$....",
".`@~....",
};
// Run frame 5
static const char *RUN_FRAME_5[] = {
"...@@...",
".._Z~...",
"..@@....",
"..$@#...",
"..g@L...",
".yFP....",
};
// Run frame 6
static const char *RUN_FRAME_6[] = {
"....@@..",
"..._Z~..",
"..y@@,_.",
"..@$@~~.",
"..y@~$..",
".aF~.4L.",
};
// Run frame 7
static const char *RUN_FRAME_7[] = {
"....a@e.",
"..._ZF`.",
"..a~@@y=",
"..'y@L`.",
"_yyP.4y.",
"`~`...4L",
};
enum class RunFrame {
Run1 = 0,
Run2,
Run3,
Run4,
Run5,
Run6,
Run7,
COUNT
};
static const char **CHARACTER_RUN_FRAMES[] = {
RUN_FRAME_1,
RUN_FRAME_2,
RUN_FRAME_3,
RUN_FRAME_4,
RUN_FRAME_5,
RUN_FRAME_6,
RUN_FRAME_7,
};
static const int CHARACTER_RUN_FRAME_COUNT = sizeof(CHARACTER_RUN_FRAMES) / sizeof(CHARACTER_RUN_FRAMES[0]);
// Height (rows per run frame)
static const int CHARACTER_RUN_FRAME_HEIGHT = sizeof(RUN_FRAME_1) / sizeof(RUN_FRAME_1[0]);
static const int CHARACTER_RUN_COLLISION_HEIGHT = CHARACTER_RUN_FRAME_HEIGHT;
static const int CHARACTER_RUN_FRAME_WIDTH = 8;
static const int CHARACTER_RUN_COLLISION_LEFT_OFFSET = 2;
static const int CHARACTER_RUN_COLLISION_RIGHT_OFFSET = 2;
// 8 je width a 2 zlava a 2 zprava
static const int CHARACTER_RUN_COLLISION_WIDTH = CHARACTER_RUN_FRAME_WIDTH - (CHARACTER_RUN_COLLISION_LEFT_OFFSET + CHARACTER_RUN_COLLISION_RIGHT_OFFSET);

View File

@@ -0,0 +1,104 @@
// src/assets/character_walk_frames.h
#pragma once
// Walk frame 1
static const char *WALK_FRAME_1[] = {
"..a@w.",
".._T`.",
".s@@y.",
".^$$~T",
".y@`$.",
"=F..?K",
};
// Walk frame 2
static const char *WALK_FRAME_2[] = {
"..y@$.",
".._Z~.",
".y@@L.",
".4W@Z!",
"._$~$.",
"~~`.0.",
};
// Walk frame 3
static const char *WALK_FRAME_3[] = {
"..g@L.",
".._T~.",
".g@$..",
".J@@..",
"_y$4L.",
"~~.4~.",
};
// Walk frame 4
static const char *WALK_FRAME_4[] = {
"..a@w.",
"..~T~.",
"..@$..",
"..@$..",
"..y@..",
".\"~@..",
};
// Walk frame 5
static const char *WALK_FRAME_5[] = {
"..@@..",
"..Z~..",
"..@L..",
"..@L..",
"..$%..",
".4F...",
};
// Walk frame 6
static const char *WALK_FRAME_6[] = {
".u@$..",
"..Z~..",
".g@_..",
".$@5+.",
"._BL..",
"uP.@..",
};
// Walk frame 7
static const char *WALK_FRAME_7[] = {
"..a@w.",
".._T`.",
".s@@y.",
".^$$~T",
".yE`$.",
"=F..JK",
};
enum class WalkFrame {
Walk1 = 0,
Walk2,
Walk3,
Walk4,
Walk5,
Walk6,
Walk7,
COUNT
};
static const char **CHARACTER_WALK_FRAMES[] = {
WALK_FRAME_1,
WALK_FRAME_2,
WALK_FRAME_3,
WALK_FRAME_4,
WALK_FRAME_5,
WALK_FRAME_6,
WALK_FRAME_7,
};
static const int CHARACTER_WALK_FRAME_COUNT = sizeof(CHARACTER_WALK_FRAMES) / sizeof(CHARACTER_WALK_FRAMES[0]);
// Height (rows per walk frame)
static const int CHARACTER_WALK_FRAME_HEIGHT = sizeof(WALK_FRAME_1) / sizeof(WALK_FRAME_1[0]);
static const int CHARACTER_WALK_FRAME_WIDTH = 6;
static const int CHARACTER_WALK_COLLISION_LEFT_OFFSET = 1;
static const int CHARACTER_WALK_COLLISION_RIGHT_OFFSET = 1;
// 8 je width a 2 zlava a 2 zprava
static const int CHARACTER_WALK_COLLISION_WIDTH = CHARACTER_WALK_FRAME_WIDTH - (CHARACTER_WALK_COLLISION_LEFT_OFFSET + CHARACTER_WALK_COLLISION_RIGHT_OFFSET);

View File

@@ -0,0 +1,47 @@
// src/assets/obstacle_crawl_frames.h
#pragma once
#include <cstring>
// Crawl obstacle for CRAWL1 (2 lines tall)
static const char *OBSTACLE_CRAWL1_FRAME[] = {
"#########",
".######",
"..#####",
"..####",
"...###",
"...###"
};
// Crawl obstacle for CRAWL2 (4 lines tall)
static const char *OBSTACLE_CRAWL2_FRAME[] = {
"###",
"###",
"###",
"###",
"###",
"###",
"###",
"###"
};
enum class CrawlObstacleType { Crawl1 = 0, Crawl2, COUNT };
static const char **OBSTACLE_CRAWL_FRAMES[] = { OBSTACLE_CRAWL1_FRAME, OBSTACLE_CRAWL2_FRAME };
// Crawl1 dimensions and collision
static const int OBSTACLE_CRAWL1_FRAME_HEIGHT = sizeof(OBSTACLE_CRAWL1_FRAME) / sizeof(OBSTACLE_CRAWL1_FRAME[0]);
static const int OBSTACLE_CRAWL1_FRAME_WIDTH = std::strlen(OBSTACLE_CRAWL1_FRAME[0]);
static const int OBSTACLE_CRAWL1_COLLISION_LEFT_OFFSET = 3;
static const int OBSTACLE_CRAWL1_COLLISION_RIGHT_OFFSET = 3;
static const int OBSTACLE_CRAWL1_COLLISION_WIDTH = OBSTACLE_CRAWL1_FRAME_WIDTH - (OBSTACLE_CRAWL1_COLLISION_LEFT_OFFSET + OBSTACLE_CRAWL1_COLLISION_RIGHT_OFFSET);
static const int OBSTACLE_CRAWL1_COLLISION_TOP_OFFSET = 4; // first 4 rows are just empty ('.')
// collision box height = bottom 2 rows
static const int OBSTACLE_CRAWL1_COLLISION_HEIGHT = 2;
// Crawl2 dimensions and collision
static const int OBSTACLE_CRAWL2_FRAME_HEIGHT = sizeof(OBSTACLE_CRAWL2_FRAME) / sizeof(OBSTACLE_CRAWL2_FRAME[0]);
static const int OBSTACLE_CRAWL2_FRAME_WIDTH = std::strlen(OBSTACLE_CRAWL2_FRAME[0]);
static const int OBSTACLE_CRAWL2_COLLISION_LEFT_OFFSET = 0;
static const int OBSTACLE_CRAWL2_COLLISION_RIGHT_OFFSET = 0;
static const int OBSTACLE_CRAWL2_COLLISION_WIDTH = OBSTACLE_CRAWL2_FRAME_WIDTH - (OBSTACLE_CRAWL2_COLLISION_LEFT_OFFSET + OBSTACLE_CRAWL2_COLLISION_RIGHT_OFFSET);
static const int OBSTACLE_CRAWL2_COLLISION_HEIGHT = OBSTACLE_CRAWL2_FRAME_HEIGHT;

View File

@@ -0,0 +1,16 @@
// src/game/animation.cpp
#include "animation.h"
AnimationController::AnimationController() {
anim_timer.start();
}
bool AnimationController::tick(int speed) {
if (anim_timer.elapsed_time() >= ANIMATION_TICK) {
// speed determines scroll steps per tick
shift += speed;
anim_timer.reset();
return true;
}
return false;
}

View File

@@ -0,0 +1,18 @@
// src/game/animation.h
#pragma once
#include "mbed.h"
constexpr auto ANIMATION_TICK = 170ms;
class AnimationController {
private:
Timer anim_timer;
int shift = 0;
public:
AnimationController();
// Update animation, returns true if redraw needed
bool tick(int speed);
int get_shift() const { return shift; }
};

View File

@@ -0,0 +1,64 @@
// src/game/collision.h
#pragma once
#include "../render/player_positioning.h"
#include "../assets/character_walk_frames.h"
#include "../assets/character_run_frames.h"
#include "../assets/character_crawl_frames.h"
struct Obstacle {
int x;
int y;
int width;
int height;
};
inline bool check_collision(const CharacterPosition& player,
MovementType movement,
const Obstacle& obs) {
// Player is given in bottom-based world coordinates (0 = bottom line)
const int player_x = player.x;
const int player_bottom = player.y;
int box_x = 0;
int box_w = 0;
int box_h = 0;
switch (movement) {
case MovementType::Walk:
box_x = player_x + CHARACTER_WALK_COLLISION_LEFT_OFFSET;
box_w = CHARACTER_WALK_COLLISION_WIDTH;
box_h = CHARACTER_WALK_FRAME_HEIGHT;
break;
case MovementType::Run:
box_x = player_x + CHARACTER_RUN_COLLISION_LEFT_OFFSET;
box_w = CHARACTER_RUN_COLLISION_WIDTH;
box_h = CHARACTER_RUN_COLLISION_HEIGHT;
break;
case MovementType::Crawl1:
box_x = player_x + CHARACTER_CRAWL1_COLLISION_LEFT_OFFSET;
box_w = CHARACTER_CRAWL1_COLLISION_WIDTH;
box_h = CHARACTER_CRAWL1_COLLISION_HEIGHT;
break;
case MovementType::Crawl2:
box_x = player_x + CHARACTER_CRAWL2_COLLISION_LEFT_OFFSET;
box_w = CHARACTER_CRAWL2_COLLISION_WIDTH;
box_h = CHARACTER_CRAWL2_COLLISION_HEIGHT;
break;
}
// Player bounding box
const int player_left = box_x;
const int player_right = player_left + box_w;
const int player_top = player_bottom + box_h;
// Obstacle bounding box
const int obs_left = obs.x;
const int obs_right = obs.x + obs.width;
const int obs_bottom = obs.y;
const int obs_top = obs_bottom + obs.height;
// Overlap check
bool horizontal = player_left < obs_right && player_right > obs_left;
bool vertical = player_bottom < obs_top && player_top > obs_bottom;
return horizontal && vertical;
}

View File

@@ -0,0 +1,48 @@
// src/game/game_over.cpp
#include "game_over.h"
#include "mbed.h"
#include "../render/background.h"
#include "../assets/background_frame.h"
#include "../hardware/button.h"
#include <cstdio>
void show_game_over_screen(int seconds, ButtonHandler& button) {
printf("\033[2J\033[H");
// 34 znakov vo vypise
const int box_width = 34;
const int start_col = (VIEW_WIDTH - box_width) / 2;
const int box_height = 6;
const int top_padding = (VIEW_HEIGHT - box_height) / 2;
// Empty rows
for (int i = 0; i < top_padding; i++) {
printf("\r\n");
}
for (int i = 0; i < start_col; i++) printf(" ");
printf("==================================\r\n");
for (int i = 0; i < start_col; i++) printf(" ");
printf(" G A M E O V E R \r\n");
for (int i = 0; i < start_col; i++) printf(" ");
printf("==================================\r\n");
for (int i = 0; i < start_col; i++) printf(" ");
printf(" Doba hry %d sekund. \r\n", seconds);
for (int i = 0; i < start_col; i++) printf(" ");
printf("==================================\r\n");
for (int i = 0; i < start_col; i++) printf(" ");
printf("Stlacte 2x po sebe tlacidlo pre restart\r\n");
fflush(stdout);
while (button.poll() != ButtonEvent::Pressed)
ThisThread::sleep_for(25ms);
printf("\033[2J\033[H");
fflush(stdout);
}

View File

@@ -0,0 +1,8 @@
// src/game/game_over.h
#pragma once
#include "mbed.h"
#include "../hardware/button.h"
// Displays GAME OVER message with elapsed time.
// Takes a Timer that was measuring game duration.
void show_game_over_screen(int seconds, ButtonHandler& button);

View File

@@ -0,0 +1,6 @@
// src/game/game_state.cpp
#include "game_state.h"
GameState g_state;
Mutex g_state_mutex;

View File

@@ -0,0 +1,36 @@
// src/game/game_state.h
#pragma once
#include "mbed.h"
#include "../render/player.h"
#include "../render/player_positioning.h"
#include "../assets/obstacle_crawl_frames.h"
// POZOR JE Z OBSTACLE MANAGERA
constexpr int MAX_RENDER_OBSTACLES = 6;
struct ObstacleRenderData {
int x;
int y;
CrawlObstacleType type;
bool active;
};
// All data needed to render one frame
struct GameState {
CharacterPosition player_pos;
MovementType movement;
int frame_index;
int background_shift;
int current_speed;
ObstacleRenderData obstacles[MAX_RENDER_OBSTACLES];
int elapsed_seconds;
bool game_over;
bool need_redraw;
};
// Global shared
extern GameState g_state;
extern Mutex g_state_mutex;

View File

@@ -0,0 +1,54 @@
// src/game/obstacle_manager.h
#pragma once
#include "../game/collision.h"
#include "../assets/obstacle_crawl_frames.h"
#include "../assets/background_frame.h"
struct MovingObstacle {
Obstacle data;
CrawlObstacleType type;
bool active;
};
constexpr int MAX_OBSTACLES = 6;
static MovingObstacle obstacle_pool[MAX_OBSTACLES];
// Create/reset obstacle
inline int spawn_obstacle(CrawlObstacleType type, int x_start) {
for (int i = 0; i < MAX_OBSTACLES; i++) {
if (!obstacle_pool[i].active) {
obstacle_pool[i].active = true;
obstacle_pool[i].type = type;
obstacle_pool[i].data.x = x_start;
obstacle_pool[i].data.width = (type == CrawlObstacleType::Crawl1) ? OBSTACLE_CRAWL1_COLLISION_WIDTH : OBSTACLE_CRAWL2_COLLISION_WIDTH;
obstacle_pool[i].data.height = (type == CrawlObstacleType::Crawl1) ? OBSTACLE_CRAWL1_COLLISION_HEIGHT : OBSTACLE_CRAWL2_COLLISION_HEIGHT;
// Default Y so that the character touches the top of the screen.
// We store Y as the bottom of the COLLISION BOX in bottom-based world coords.
int top_offset = 0;
if (type == CrawlObstacleType::Crawl1) {
top_offset = OBSTACLE_CRAWL1_COLLISION_TOP_OFFSET;
} else {
top_offset = 0;
}
const int i_bottom_of_collision = top_offset + obstacle_pool[i].data.height - 1;
// Top of screen in world coords is VIEW_HEIGHT - 1
const int collision_bottom_world_y = (VIEW_HEIGHT - 1) - i_bottom_of_collision;
obstacle_pool[i].data.y = collision_bottom_world_y;
return i;
}
}
return -1;
}
// Update X positions, mark inactive if offscreen
inline void update_obstacles(int shift_speed) {
for (int i = 0; i < MAX_OBSTACLES; i++) {
if (!obstacle_pool[i].active) continue;
obstacle_pool[i].data.x -= shift_speed;
if (obstacle_pool[i].data.x + obstacle_pool[i].data.width < 0)
obstacle_pool[i].active = false;
}
}

View File

@@ -0,0 +1,71 @@
// src/game/obstacle_system.h
#pragma once
#include "obstacle_manager.h"
#include "../render/player_positioning.h"
#include "../assets/obstacle_crawl_frames.h"
#include "collision.h"
#include "mbed.h"
inline int clamp_min(int a, int b) { return (a > b) ? a : b; }
inline int clamp_max(int a, int b) { return (a < b) ? a : b; }
// Handles spawning, movement, rendering, and collision of obstacles
class ObstacleSystem {
public:
ObstacleSystem() : tick_counter_(0), spawn_index_(0) {}
bool update_and_draw(const CharacterPosition &player_pos,
MovementType player_movement) {
// Update timers, move existing obstacles
tick_counter_++;
if (tick_counter_ % UPDATE_INTERVAL == 0) {
update_obstacles(1);
}
// Periodically spawn new obstacle
if (tick_counter_ % SPAWN_EVERY_TICKS == 0) {
auto type = (spawn_index_++ % 2 == 0) ? CrawlObstacleType::Crawl1 : CrawlObstacleType::Crawl2;
const int w = (type == CrawlObstacleType::Crawl1) ? OBSTACLE_CRAWL1_FRAME_WIDTH : OBSTACLE_CRAWL2_FRAME_WIDTH;
spawn_obstacle(type, VIEW_WIDTH - w - 1);
}
// Draw n collision check
for (int i = 0; i < MAX_OBSTACLES; i++) {
if (!obstacle_pool[i].active)
continue;
const char **frame = nullptr;
int height = 0;
if (obstacle_pool[i].type == CrawlObstacleType::Crawl1) {
frame = OBSTACLE_CRAWL1_FRAME;
height = OBSTACLE_CRAWL1_FRAME_HEIGHT;
} else {
frame = OBSTACLE_CRAWL2_FRAME;
height = OBSTACLE_CRAWL2_FRAME_HEIGHT;
}
draw_clipped_obstacle(obstacle_pool[i], frame, height);
if (check_collision(player_pos, player_movement,
obstacle_pool[i].data)) {
printf("\033[2J\033[H");
printf("GAME OVER\r\n");
return true;
}
}
return false;
}
private:
static constexpr int SPAWN_EVERY_TICKS = 35;
static constexpr int UPDATE_INTERVAL = 1; // move obstacles each frame
int tick_counter_;
int spawn_index_;
static void draw_clipped_obstacle(const MovingObstacle &obs,
const char ** /*frame*/,
int /*frame_height*/) {
draw_obstacle(obs.data.x, obs.data.y, obs.type);
}
};

View File

@@ -0,0 +1,168 @@
// src/game/state.cpp
#include "state.h"
#include "../render/player.h"
#include "../timing/speed_controller.h"
#include "../assets/character_run_frames.h"
#include "../assets/character_walk_frames.h"
#include "../assets/character_crawl_frames.h"
#include <cmath>
namespace {
// Vygenerovane AI, proste to nahodne vymiena obrazky - assests
// Frame selector with two regimes:
// 1) Normal (speed <= 6): pingpong with holds at both ends
// 2) Highspeed (speed >= 7): 0, random(1..last-1), last, random(1..last-1)...
static inline int compute_frame_index(int frame_count,
float player_speed,
int tick_counter) {
if (frame_count <= 1) return 0;
if (player_speed <= 0.0f) return 0;
const int last = frame_count - 1;
// High-speed pattern: 0, rand(1..last-1), last, rand(1..last-1), ...
if (player_speed >= 7.0f) {
// Special-case 2-frame animations
if (frame_count <= 2) {
return (tick_counter & 1) ? 1 : 0;
}
// Even ticks → extremes (0 or last), alternating each time.
// Odd ticks → pseudo-random mid in [1..last-1].
if ((tick_counter & 1) == 0) {
// Alternate 0 and last on even ticks
bool choose_zero = ((tick_counter >> 1) & 1) == 0;
return choose_zero ? 0 : last;
} else {
// Simple deterministic PRNG from tick_counter and speed
unsigned int seed =
static_cast<unsigned int>(tick_counter) * 1664525u + 1013904223u;
seed ^= static_cast<unsigned int>(frame_count) * 2654435761u;
seed ^= static_cast<unsigned int>(player_speed * 997.0f);
int range = last - 1; // size of 1..last-1
if (range <= 0) return 0; // safety
int mid = 1 + static_cast<int>(seed % static_cast<unsigned int>(range));
return mid;
}
}
// Normal-speed regime: discrete pingpong with holds at both ends.
// - speed 1 => 0,1,2,...,last, last, ..., 2,1, 0,0 ...
// - speed 2 => advances 2 steps per tick (skipping every second timeline entry)
// - holds at ends make 0 and last appear more frequently
const int hold = 2; // how many extra steps to hold at each end
// One full pingpong cycle length:
// [hold at 0] + [ascend 1..last] + [hold at last] + [descend last-1..0]
const int ascend_len = last; // produces 1..last (length = last)
const int descend_len = last; // produces last-1..0 (length = last)
const int cycle_len = hold + ascend_len + hold + descend_len;
// Advance by an integer number of steps per tick based on speed
int step = static_cast<int>(floorf(player_speed + 0.5f));
if (step < 1) step = 1;
// Use 64-bit for safety, then fold into cycle length
const long long pos64 =
(static_cast<long long>(tick_counter) *
static_cast<long long>(step)) %
static_cast<long long>(cycle_len);
int pos = static_cast<int>(pos64);
// Map timeline position to frame index
if (pos < hold) {
return 0; // hold at 0
}
pos -= hold;
if (pos < ascend_len) {
// ascend: 1..last
return (pos + 1);
}
pos -= ascend_len;
if (pos < hold) {
return last; // hold at last
}
pos -= hold;
// descend: last-1 .. 0
return last - 1 - pos;
}
} // namespace
void MovementState::update() {
// stop crawling after duration
if ((current_state == PlayerState::Crawl1 ||
current_state == PlayerState::Crawl2) &&
state_timer.elapsed_time() >= CRAWL_DURATION) {
current_state = previous_state;
state_timer.stop();
}
}
void MovementState::start_crawl(PlayerState crawl_type) {
if (current_state != PlayerState::Crawl1 && current_state != PlayerState::Crawl2) {
previous_state = current_state;
}
current_state = crawl_type;
state_timer.stop();
state_timer.reset();
state_timer.start();
}
void MovementState::set_state(PlayerState s) {
if (current_state != s) {
walk_index = run_index = crawl1_index = crawl2_index = 0;
phase = 0.0f;
}
current_state = s;
}
void MovementState::toggle_walk_frame(float player_speed, int tick_counter) {
switch (current_state) {
case PlayerState::Run:
run_index = compute_frame_index(CHARACTER_RUN_FRAME_COUNT, player_speed, tick_counter);
break;
case PlayerState::Walk:
walk_index = compute_frame_index(CHARACTER_WALK_FRAME_COUNT, player_speed, tick_counter);
break;
case PlayerState::Crawl1:
crawl1_index = compute_frame_index(CHARACTER_CRAWL1_FRAME_COUNT, player_speed, tick_counter);
break;
case PlayerState::Crawl2:
crawl2_index = compute_frame_index(CHARACTER_CRAWL2_FRAME_COUNT, player_speed, tick_counter);
break;
}
}
FrameSelection MovementState::get_frame_selection() const {
FrameSelection f{};
switch (current_state) {
case PlayerState::Walk:
f.movement = MovementType::Walk;
f.frame_index = walk_index;
break;
case PlayerState::Run:
f.movement = MovementType::Run;
f.frame_index = run_index;
break;
case PlayerState::Crawl1:
f.movement = MovementType::Crawl1;
f.frame_index = crawl1_index;
break;
case PlayerState::Crawl2:
f.movement = MovementType::Crawl2;
f.frame_index = crawl2_index;
break;
default:
f.movement = MovementType::Walk;
f.frame_index = walk_index;
break;
}
return f;
}

View File

@@ -0,0 +1,36 @@
// src/game/state.h
#pragma once
#include "mbed.h"
#include "../render/player.h"
constexpr auto CRAWL_DURATION = 300ms;
enum class PlayerState { Walk, Run, Crawl1, Crawl2 };
struct FrameSelection {
MovementType movement;
int frame_index;
};
class MovementState {
private:
PlayerState current_state = PlayerState::Walk;
PlayerState previous_state = PlayerState::Walk;
Timer state_timer;
int walk_index = 0; // cycles 06
int run_index = 0; // cycles 06
int crawl1_index = 0; // cycles 01
int crawl2_index = 0; // cycles 01
float phase = 0.0f;
public:
void update();
void start_crawl(PlayerState crawl_type);
void toggle_walk_frame(float player_speed, int tick_counter);
FrameSelection get_frame_selection() const;
PlayerState get_state() const { return current_state; }
void set_state(PlayerState s);
};

View File

@@ -0,0 +1,33 @@
// src/hardware/button.cpp
#include "button.h"
ButtonHandler::ButtonHandler(PinName pin, PinName led_pin) : button(pin), led(led_pin, 0) {
// ISR for button press (falling edge)
button.fall(callback(this, &ButtonHandler::on_pressed));
}
void ButtonHandler::on_pressed() {
pressed_flag = true;
}
ButtonEvent ButtonHandler::poll() {
static Timer blink_timer;
static bool blinking = false;
if (pressed_flag) {
pressed_flag = false;
led = 1;
blink_timer.reset();
blink_timer.start();
blinking = true;
return ButtonEvent::Pressed;
}
if (blinking && blink_timer.elapsed_time() >= 500ms) {
led = 0;
blink_timer.stop();
blinking = false;
}
return ButtonEvent::None;
}

View File

@@ -0,0 +1,23 @@
// src/hardware/button.h
#pragma once
#include "mbed.h"
enum class ButtonEvent {
None = 0,
Pressed = 1,
};
class ButtonHandler {
private:
InterruptIn button;
DigitalOut led;
volatile bool pressed_flag = false;
volatile bool blink_flag = false;
void on_pressed();
public:
ButtonHandler(PinName pin = BUTTON1, PinName led_pin = LED1);
ButtonEvent poll();
};

View File

@@ -1,7 +1,7 @@
// main.cpp
#include "mbed.h"
#include "background_dark_inverted.h"
#include "assets/background_frame.h"
#include "render/loop.h"
#define TARGET_TX_PIN USBTX
@@ -21,6 +21,7 @@ int main(void) {
serial_port.set_format(8, BufferedSerial::None, 1);
printf("Baud: %d, Format: 8-N-1\r\n", BAUD_RATE);
// Just call into render feature
render_loop();
while (true) {
render_loop(4);
}
}

View File

@@ -1,18 +1,16 @@
// src/render/background.cpp
#include "../background_dark_inverted.h"
#include "background.h"
#include "../assets/background_frame.h"
#include <cstdio>
#include <cstring>
void draw_mask(const char *unused_filename, int shift, const char *text) {
const int view_width = 50;
const int view_height = 19;
void draw_mask(const char *unused_filename, int shift) {
// Terminal clear + home
printf("\033[2J\033[H");
for (int i = 0; i < view_height && i < BACKGROUND_DARK_INVERTED_LINES; i++) {
const char *row = BACKGROUND_DARK_INVERTED[i];
for (int i = 0; i < VIEW_HEIGHT && i < VIEW_HEIGHT; i++) {
const char *row = BACKGROUND_MASK[i];
int width = strlen(row);
if (width == 0) {
printf("\r\n");
@@ -21,15 +19,11 @@ void draw_mask(const char *unused_filename, int shift, const char *text) {
int start = shift % width;
for (int j = 0; j < view_width; j++) {
for (int j = 0; j < VIEW_WIDTH; j++) {
printf("%c", row[(start + j) % width]);
}
printf("\r\n");
}
if (text && text[0] != '\0') {
printf("\r\n[RX] %s\r\n", text);
}
fflush(stdout);
}

View File

@@ -1,6 +1,7 @@
// src/render/background.h
#pragma once
constexpr int VIEW_WIDTH = 90;
// Draws the ASCII art background with optional message
void draw_mask(const char *unused_filename, int shift, const char *text = nullptr);
void draw_mask(const char *unused_filename, int shift);

View File

@@ -1,67 +1,220 @@
// src/render/loop.c
// src/render/loop.cpp
#include "loop.h"
#include "../assets/background_frame.h"
#include "player_positioning.h"
#include "background.h"
#include "mbed.h"
#include "../background_dark_inverted.h"
#include "player.h"
#include "background.h"
#include "../game/game_over.h"
#include "../game/game_state.h"
#include "../game/state.h"
#include "../game/animation.h"
#include "../game/collision.h"
#include "../hardware/button.h"
#include "../render/player.h"
#include "../render/obstacle.h"
#include "../timing/speed_controller.h"
#include "../timing/movement_controller.h"
#include "../game/obstacle_system.h"
extern BufferedSerial serial_port;
extern DigitalOut led;
ButtonHandler button(BUTTON1, LED1);
#define BUFFER_SIZE 64
// Constants
// constexpr int PLAYER_X = 9;
constexpr int PLAYER_X = 29;
constexpr int PLAYER_Y = 6;
constexpr int STACK_SIZE = 4096;
static char rx_buffer[BUFFER_SIZE];
static char message[BUFFER_SIZE];
static bool message_active = false;
void logic_loop(void *arg) {
int speed = *(int *)arg;
MovementState player_state;
AnimationController animation;
MovementController mover(PLAYER_X, VIEW_WIDTH);
SpeedController timing;
timing.set_ground_speed(speed);
void draw_mask(const char *unused_filename, int shift, const char *text = nullptr);
CharacterPosition pos = {PLAYER_X, PLAYER_Y};
void render_loop() {
Timer msg_timer;
Timer anim_timer;
msg_timer.start();
anim_timer.start();
Timer spawn_timer;
spawn_timer.start();
Timer speed_timer;
speed_timer.start();
int shift = 0;
const char *bg_file = "background_dark_inverted.txt";
bool need_redraw = false;
int anim_tick_counter = 0;
int tick_counter = 0;
bool game_over = false;
Timer game_timer;
game_timer.start();
while (true) {
// Read from UART if available
if (serial_port.readable()) {
memset(rx_buffer, 0, sizeof(rx_buffer));
ssize_t num = serial_port.read(rx_buffer, sizeof(rx_buffer) - 1);
if (num > 0) {
led = !led;
// Spawn first obstacle
if (speed >= 5)
spawn_obstacle(CrawlObstacleType::Crawl1, VIEW_WIDTH + 10);
strncpy(message, rx_buffer, sizeof(message) - 1);
message_active = true;
msg_timer.reset();
while (!game_over) {
tick_counter++;
need_redraw = true;
}
}
if (speed_timer.elapsed_time() >= 6s) {
speed++;
timing.set_ground_speed(speed);
speed_timer.reset();
// Message lifetime
if (message_active && msg_timer.elapsed_time() > 1s) {
message_active = false;
memset(message, 0, sizeof(message));
need_redraw = true;
}
// Animation tick
if (anim_timer.elapsed_time() >= 80ms) {
shift++;
anim_timer.reset();
need_redraw = true;
}
// Draw
if (need_redraw) {
draw_mask(bg_file, shift, message_active ? message : nullptr);
need_redraw = false;
ThisThread::sleep_for(60ms);
}
ThisThread::sleep_for(20ms);
// update players animation mode
if (speed < 4)
player_state.set_state(PlayerState::Walk);
else
player_state.set_state(PlayerState::Run);
}
mover.update_position(speed, timing.get_ground_speed());
pos.x = mover.get_position();
// Spawn periodically
if (speed >= 5 && spawn_timer.elapsed_time() > 6s) {
spawn_timer.reset();
spawn_obstacle(CrawlObstacleType::Crawl1, VIEW_WIDTH);
}
// Handle input
if (button.poll() == ButtonEvent::Pressed) {
PlayerState current = player_state.get_state();
if (current == PlayerState::Walk || current == PlayerState::Run)
player_state.start_crawl(PlayerState::Crawl1);
else if (current == PlayerState::Crawl1)
player_state.start_crawl(PlayerState::Crawl2);
}
player_state.update();
bool anim_tick = animation.tick(speed);
if (anim_tick) {
anim_tick_counter++;
player_state.toggle_walk_frame(speed, anim_tick_counter);
FrameSelection frame = player_state.get_frame_selection();
CharacterPosition draw_pos = get_aligned_frame_position(pos, frame.movement, frame.frame_index);
int ground_speed = timing.get_ground_speed();
bool collision = false;
for (int i = 0; i < MAX_OBSTACLES; i++) {
if (!obstacle_pool[i].active)
continue;
// Keep original position
int old_x = obstacle_pool[i].data.x;
int new_x = old_x - ground_speed;
// Remove if fully offscreen after movement
if (new_x + obstacle_pool[i].data.width < 0) {
obstacle_pool[i].active = false;
continue;
}
// Swept for collision detections at speeds > 1
int left_swept = (new_x < old_x) ? new_x : old_x;
int right_swept = ((new_x + obstacle_pool[i].data.width) >
(old_x + obstacle_pool[i].data.width))
? (new_x + obstacle_pool[i].data.width)
: (old_x + obstacle_pool[i].data.width);
// Temporarily create a synthetic obstacle covering the swept range
Obstacle swept_obs{};
swept_obs.x = left_swept;
swept_obs.y = obstacle_pool[i].data.y;
swept_obs.width = right_swept - left_swept;
swept_obs.height = obstacle_pool[i].data.height;
if (check_collision(pos, frame.movement, swept_obs)) {
collision = true;
break;
}
obstacle_pool[i].data.x = new_x;
}
g_state_mutex.lock();
g_state.player_pos = draw_pos;
g_state.current_speed = speed;
g_state.movement = frame.movement;
g_state.frame_index = frame.frame_index;
g_state.background_shift = animation.get_shift();
g_state.need_redraw = true;
g_state.game_over = collision;
for (int i = 0; i < MAX_OBSTACLES; i++) {
g_state.obstacles[i].x = obstacle_pool[i].data.x;
g_state.obstacles[i].y = obstacle_pool[i].data.y;
g_state.obstacles[i].type = obstacle_pool[i].type;
g_state.obstacles[i].active = obstacle_pool[i].active;
}
g_state_mutex.unlock();
if (collision)
game_over = true;
}
ThisThread::sleep_for(25ms);
}
game_timer.stop();
int seconds = static_cast<int>(game_timer.elapsed_time().count() / 1000000);
g_state_mutex.lock();
g_state.elapsed_seconds = seconds;
g_state.game_over = true;
g_state_mutex.unlock();
}
void render_loop_thread() {
while (true) {
g_state_mutex.lock();
bool need = g_state.need_redraw;
bool over = g_state.game_over;
GameState local = g_state;
g_state.need_redraw = false;
g_state_mutex.unlock();
if (over) {
show_game_over_screen(local.elapsed_seconds, button);
break;
}
if (need) {
draw_mask("background", local.background_shift);
draw_character(local.player_pos.x, local.player_pos.y, local.movement,
local.frame_index);
if (local.current_speed >= 5) {
for (int i = 0; i < MAX_RENDER_OBSTACLES; i++) {
if (local.obstacles[i].active)
draw_obstacle(local.obstacles[i].x, local.obstacles[i].y,
local.obstacles[i].type);
}
}
}
ThisThread::sleep_for(50ms);
}
}
void render_loop(int speed) {
g_state_mutex.lock();
g_state.need_redraw = false;
g_state.game_over = false;
g_state_mutex.unlock();
int *speed_ptr = new int(speed);
Thread logic_thread(osPriorityNormal, STACK_SIZE);
Thread render_thread(osPriorityNormal, STACK_SIZE);
logic_thread.start(callback(logic_loop, (void *)speed_ptr));
render_thread.start(render_loop_thread);
logic_thread.join();
render_thread.join();
delete speed_ptr;
}

View File

@@ -3,4 +3,4 @@
#pragma once
// Runs the render loop: reads UART, animates, and draws output
void render_loop();
void render_loop(int speed);

View File

@@ -0,0 +1,51 @@
// src/render/obstacle.cpp
#include "obstacle.h"
#include "../assets/obstacle_crawl_frames.h"
#include "../assets/background_frame.h"
#include <cstdio>
// Draws an obstacle using bottombased world coordinates.
void draw_obstacle(int x, int y, CrawlObstacleType type) {
const char **obstacle_frame = nullptr;
int frame_total_height = 0;
int collision_top_offset = 0;
int collision_height = 0;
int collision_left_offset = 0;
switch (type) {
case CrawlObstacleType::Crawl1:
obstacle_frame = OBSTACLE_CRAWL1_FRAME;
frame_total_height = OBSTACLE_CRAWL1_FRAME_HEIGHT;
collision_top_offset = OBSTACLE_CRAWL1_COLLISION_TOP_OFFSET;
collision_height = OBSTACLE_CRAWL1_COLLISION_HEIGHT;
collision_left_offset = OBSTACLE_CRAWL1_COLLISION_LEFT_OFFSET;
break;
case CrawlObstacleType::Crawl2:
obstacle_frame = OBSTACLE_CRAWL2_FRAME;
frame_total_height = OBSTACLE_CRAWL2_FRAME_HEIGHT;
collision_top_offset = 0;
collision_height = OBSTACLE_CRAWL2_COLLISION_HEIGHT;
collision_left_offset = OBSTACLE_CRAWL2_COLLISION_LEFT_OFFSET;
break;
default:
return; // no rendering for invalid type
}
// Convert bottombased coordinates to screen coordinates.
const int frame_row_index_bottom = collision_top_offset + collision_height - 1;
const int frame_top_world_y = y + frame_row_index_bottom;
const int frame_top_screen_row = VIEW_HEIGHT - frame_top_world_y;
const int frame_screen_x = x - collision_left_offset;
for (int i = 0; i < frame_total_height; i++) {
const int screen_row = frame_top_screen_row + i;
if (screen_row < 1 || screen_row > VIEW_HEIGHT) continue;
printf("\033[%d;%dH%s", screen_row, frame_screen_x + 1, obstacle_frame[i]);
}
fflush(stdout);
}

View File

@@ -0,0 +1,7 @@
// src/render/obstacle.h
#pragma once
#include "../assets/obstacle_crawl_frames.h"
// Draw the obstacle ASCII block starting at given (x, y)
void draw_obstacle(int x, int y, CrawlObstacleType type);

View File

@@ -0,0 +1,51 @@
// src/render/player.cpp
#include "player.h"
#include "../assets/character_walk_frames.h"
#include "../assets/character_run_frames.h"
#include "../assets/character_crawl_frames.h"
#include <cstdio>
void draw_character(int x, int y, MovementType movement, int frame_index) {
const char **character = nullptr;
int character_height = 0;
int total_frames = 0;
switch (movement) {
case MovementType::Walk:
total_frames = CHARACTER_WALK_FRAME_COUNT;
if (frame_index < 0 || frame_index >= total_frames)
frame_index = 0;
character = CHARACTER_WALK_FRAMES[frame_index];
character_height = CHARACTER_WALK_FRAME_HEIGHT;
break;
case MovementType::Run:
total_frames = CHARACTER_RUN_FRAME_COUNT;
if (frame_index < 0 || frame_index >= total_frames)
frame_index = 0;
character = CHARACTER_RUN_FRAMES[frame_index];
character_height = CHARACTER_RUN_FRAME_HEIGHT;
break;
case MovementType::Crawl1:
total_frames = CHARACTER_CRAWL1_FRAME_COUNT;
if (frame_index < 0 || frame_index >= total_frames)
frame_index = 0;
character = CHARACTER_CRAWL1_FRAMES[frame_index];
character_height = CHARACTER_CRAWL1_FRAME_HEIGHT;
break;
case MovementType::Crawl2:
total_frames = CHARACTER_CRAWL2_FRAME_COUNT;
if (frame_index < 0 || frame_index >= total_frames)
frame_index = 0;
character = CHARACTER_CRAWL2_FRAMES[frame_index];
character_height = CHARACTER_CRAWL2_FRAME_HEIGHT;
break;
}
for (int i = 0; i < character_height; i++) {
printf("\033[%d;%dH%s", y + i + 1, x + 1, character[i]);
}
fflush(stdout);
}

View File

@@ -0,0 +1,12 @@
// src/render/player.h
#pragma once
enum class MovementType {
Walk,
Run,
Crawl1,
Crawl2
};
// Draw the player object starting at given (x, y)
void draw_character(int x, int y, MovementType movement, int frame_index);

View File

@@ -0,0 +1,33 @@
// src/render/player_positioning.cpp
#include "player_positioning.h"
#include "../assets/background_frame.h"
#include "../assets/character_walk_frames.h"
#include "../assets/character_run_frames.h"
#include "../assets/character_crawl_frames.h"
#include <cstdio>
CharacterPosition get_aligned_frame_position(CharacterPosition base,
MovementType movement,
int /*frame_index*/) {
int character_height = 0;
switch (movement) {
case MovementType::Walk:
character_height = CHARACTER_WALK_FRAME_HEIGHT;
break;
case MovementType::Run:
character_height = CHARACTER_RUN_FRAME_HEIGHT;
break;
case MovementType::Crawl1:
character_height = CHARACTER_CRAWL1_FRAME_HEIGHT;
break;
case MovementType::Crawl2:
character_height = CHARACTER_CRAWL2_FRAME_HEIGHT;
break;
}
CharacterPosition draw_pos{};
draw_pos.x = base.x;
draw_pos.y = (VIEW_HEIGHT - base.y) - character_height;
return draw_pos;
}

View File

@@ -0,0 +1,12 @@
// src/render/player_positioning.h
#pragma once
#include "../assets/background_frame.h"
#include "player.h"
struct CharacterPosition {
int x;
int y;
};
// Calculates drawing position relative to bottom-left pivot
CharacterPosition get_aligned_frame_position(CharacterPosition base, MovementType movement,int frame_index);

View File

@@ -0,0 +1,29 @@
// src/timing/movement_controller.h
#pragma once
#include "mbed.h"
// Handles position of the player relative to ground movement
class MovementController {
private:
float x_pos;
const int view_width;
// Scale factor for translating speed difference to pixel movement
const float motion_scale = 0.2f;
public:
MovementController(int start_x, int width) : x_pos(static_cast<float>(start_x)), view_width(width) {}
void reset(int start_x) { x_pos = static_cast<float>(start_x); }
void update_position(int player_speed, int ground_speed) {
int delta = player_speed - ground_speed;
x_pos += static_cast<float>(delta) * motion_scale;
if (x_pos < 0) x_pos = 0;
if (x_pos > (VIEW_WIDTH - 10)) x_pos = static_cast<float>(VIEW_WIDTH - 10);
}
int get_position() const { return static_cast<int>(x_pos); }
};

View File

@@ -0,0 +1,34 @@
// src/timing/speed_controller.cpp
#include "speed_controller.h"
void SpeedController::set_ground_speed(int spd) {
if (spd < 0) spd = 0;
if (spd > 30) spd = 30;
ground_speed = spd;
}
int SpeedController::frame_advance_for(int object_speed, int tick_counter) const {
if (object_speed <= 0) {
return 0;
}
if (ground_speed == 0) {
return 1 + object_speed;
}
const int delta = object_speed - ground_speed;
if (delta > 0) {
return 1 + delta;
}
if (delta == 0) {
return 1;
}
float ratio_f = static_cast<float>(ground_speed) / object_speed;
int ratio = static_cast<int>(ratio_f + 0.3f);
if (ratio < 1) ratio = 1;
return (tick_counter % ratio == 0) ? 1 : 0;
}

View File

@@ -0,0 +1,17 @@
// src/timing/speed_controller.h
#pragma once
#include "mbed.h"
class SpeedController {
private:
int ground_speed = 1;
public:
SpeedController() = default;
void set_ground_speed(int spd);
int get_ground_speed() const { return ground_speed; }
// Calculates how many frames to advance for current tick.
int frame_advance_for(int object_speed, int tick_counter) const;
};