diff --git a/examples/CMakeLists.txt b/examples/CMakeLists.txt index 0f6318048c..22826a1788 100644 --- a/examples/CMakeLists.txt +++ b/examples/CMakeLists.txt @@ -154,6 +154,7 @@ add_sdl_example_executable(input-gamepad-events SOURCES input/04-gamepad-events/ add_sdl_example_executable(camera-read-and-draw SOURCES camera/01-read-and-draw/read-and-draw.c) add_sdl_example_executable(pen-drawing-lines SOURCES pen/01-drawing-lines/drawing-lines.c) add_sdl_example_executable(asyncio-load-bitmaps SOURCES asyncio/01-load-bitmaps/load-bitmaps.c DATAFILES ${CMAKE_CURRENT_SOURCE_DIR}/../test/sample.bmp ${CMAKE_CURRENT_SOURCE_DIR}/../test/gamepad_front.bmp ${CMAKE_CURRENT_SOURCE_DIR}/../test/speaker.bmp ${CMAKE_CURRENT_SOURCE_DIR}/../test/icon2x.bmp) +add_sdl_example_executable(misc-power SOURCES misc/01-power/power.c) add_sdl_example_executable(demo-snake SOURCES demo/01-snake/snake.c) add_sdl_example_executable(demo-woodeneye-008 SOURCES demo/02-woodeneye-008/woodeneye-008.c) add_sdl_example_executable(demo-infinite-monkeys SOURCES demo/03-infinite-monkeys/infinite-monkeys.c) diff --git a/examples/misc/01-power/README.txt b/examples/misc/01-power/README.txt new file mode 100644 index 0000000000..2617ff8ad3 --- /dev/null +++ b/examples/misc/01-power/README.txt @@ -0,0 +1 @@ +This example code reports power status (plugged in, battery level, etc). diff --git a/examples/misc/01-power/onmouseover.webp b/examples/misc/01-power/onmouseover.webp new file mode 100644 index 0000000000..a99b8d6f81 Binary files /dev/null and b/examples/misc/01-power/onmouseover.webp differ diff --git a/examples/misc/01-power/power.c b/examples/misc/01-power/power.c new file mode 100644 index 0000000000..fb3ef5d8ef --- /dev/null +++ b/examples/misc/01-power/power.c @@ -0,0 +1,174 @@ +/* + * This example code reports power status (plugged in, battery level, etc). + * + * This code is public domain. Feel free to use it for any purpose! + */ + +#define SDL_MAIN_USE_CALLBACKS 1 /* use the callbacks instead of main() */ +#include +#include + +#include "../../save-rendering-to-bitmaps.h" + +/* We will use this renderer to draw into this window every frame. */ +static SDL_Window *window = NULL; +static SDL_Renderer *renderer = NULL; + +/* This function runs once at startup. */ +SDL_AppResult SDL_AppInit(void **appstate, int argc, char *argv[]) +{ + SDL_SetAppMetadata("Example Misc Power", "1.0", "com.example.misc-power"); + + if (!SDL_Init(SDL_INIT_VIDEO)) { + SDL_Log("Couldn't initialize SDL: %s", SDL_GetError()); + return SDL_APP_FAILURE; + } + + if (!SDL_CreateWindowAndRenderer("examples/misc/power", 640, 480, 0, &window, &renderer)) { + SDL_Log("Couldn't create window/renderer: %s", SDL_GetError()); + return SDL_APP_FAILURE; + } + + return SDL_APP_CONTINUE; /* carry on with the program! */ +} + +/* This function runs when a new event (mouse input, keypresses, etc) occurs. */ +SDL_AppResult SDL_AppEvent(void *appstate, SDL_Event *event) +{ + if (event->type == SDL_EVENT_QUIT) { + return SDL_APP_SUCCESS; /* end the program, reporting success to the OS. */ + } + return SDL_APP_CONTINUE; /* carry on with the program! */ +} + +/* This function runs once per frame, and is the heart of the program. */ +SDL_AppResult SDL_AppIterate(void *appstate) +{ + const SDL_FRect frame = { 100, 200, 440, 80 }; /* the percentage bar dimensions. */ + +static Uint64 start = 0; +Uint64 now = SDL_GetTicks(); +if (!start) { + start = now; +} +now -= start; + + /* Query for battery info */ + int seconds = 0, percent = 0; + //const SDL_PowerState state = SDL_GetPowerInfo(&seconds, &percent); + +SDL_PowerState state; +if (now < 500) { + state = SDL_POWERSTATE_ON_BATTERY; + seconds = 8088 + ((500 / 1000) * 300); + percent = ((int) ((500 / 1500.0f) * 100.0f)); +} else { + state = (now < 1500) ? SDL_POWERSTATE_CHARGING : SDL_POWERSTATE_CHARGED; + seconds = 8088 + ((int) ((SDL_min(now, 1500) / 1500.0) * 10000)); + percent = (now < 1500) ? ((int) ((now / 1500.0f) * 100.0f)) : 100; +} + + /* We set up different drawing details for each power state, then + run it all through the same drawing code. */ + int clearr = 0, clearg = 0, clearb = 0; /* clear window to this color. */ + int textr = 255, textg = 255, textb = 255; /* draw messages in this color. */ + int framer = 255, frameg = 255, frameb = 255; /* draw a percentage bar frame in this color. */ + int barr = 0, barg = 0, barb = 0; /* draw a percentage bar in this color. */ + const char *msg = NULL; + const char *msg2 = NULL; + + switch (state) { + case SDL_POWERSTATE_ERROR: + msg2 = "ERROR GETTING POWER STATE"; + msg = SDL_GetError(); + clearr = 255; /* red background */ + break; + + default: /* in case this does something unexpected later, treat it as unknown. */ + case SDL_POWERSTATE_UNKNOWN: + msg = "Power state is unknown."; + clearr = clearb = clearg = 50; /* grey background */ + break; + + case SDL_POWERSTATE_ON_BATTERY: + msg = "Running on battery."; + barr = 255; /* draw in red */ + break; + + case SDL_POWERSTATE_NO_BATTERY: + msg = "Plugged in, no battery available."; + clearg = 50; /* green background */ + break; + + case SDL_POWERSTATE_CHARGING: + msg = "Charging."; + barb = barg = 255; /* draw in cyan */ + break; + + case SDL_POWERSTATE_CHARGED: + msg = "Charged."; + barg = 255; /* draw in green */ + break; + } + + SDL_SetRenderDrawColor(renderer, clearr, clearg, clearb, 255); + SDL_RenderClear(renderer); + + if (percent >= 0) { + float x, y; + SDL_FRect pctrect; + char remainstr[64]; + char msgbuf[128]; + + SDL_copyp(&pctrect, &frame); + pctrect.w *= percent / 100.0f; + + if (seconds < 0) { + SDL_strlcpy(remainstr, "unknown time", sizeof (remainstr)); + } else { + int hours, minutes; + hours = seconds / (60 * 60); + seconds -= hours * (60 * 60); + minutes = seconds / 60; + seconds -= minutes * 60; + SDL_snprintf(remainstr, sizeof (remainstr), "%02d:%02d:%02d", hours, minutes, seconds); + } + + SDL_snprintf(msgbuf, sizeof (msgbuf), "Battery: %3d percent, %s remaining", percent, remainstr); + x = frame.x + ((frame.w - (SDL_DEBUG_TEXT_FONT_CHARACTER_SIZE * SDL_strlen(msgbuf))) / 2.0f); + y = frame.y + frame.h + SDL_DEBUG_TEXT_FONT_CHARACTER_SIZE; + + SDL_SetRenderDrawColor(renderer, barr, barg, barb, 255); /* draw percent bar. */ + SDL_RenderFillRect(renderer, &pctrect); + SDL_SetRenderDrawColor(renderer, framer, frameg, frameb, 255); /* draw frame on top of bar. */ + SDL_RenderRect(renderer, &frame); + SDL_SetRenderDrawColor(renderer, textr, textg, textb, 255); + SDL_RenderDebugText(renderer, x, y, msgbuf); /* draw text about battery level */ + } + + if (msg) { + const float x = frame.x + ((frame.w - (SDL_DEBUG_TEXT_FONT_CHARACTER_SIZE * SDL_strlen(msg))) / 2.0f); + const float y = frame.y - (SDL_DEBUG_TEXT_FONT_CHARACTER_SIZE * 2); + SDL_SetRenderDrawColor(renderer, textr, textg, textb, 255); + SDL_RenderDebugText(renderer, x, y, msg); + } + + if (msg2) { + const float x = frame.x + ((frame.w - (SDL_DEBUG_TEXT_FONT_CHARACTER_SIZE * SDL_strlen(msg2))) / 2.0f); + const float y = frame.y - (SDL_DEBUG_TEXT_FONT_CHARACTER_SIZE * 4); + SDL_SetRenderDrawColor(renderer, textr, textg, textb, 255); + SDL_RenderDebugText(renderer, x, y, msg2); + } + + /* put the new rendering on the screen. */ + SDL_RenderPresent(renderer); + + return SDL_APP_CONTINUE; /* carry on with the program! */ +} + +/* This function runs once at shutdown. */ +void SDL_AppQuit(void *appstate, SDL_AppResult result) +{ + /* SDL will clean up the window/renderer for us. */ +} + diff --git a/examples/misc/01-power/thumbnail.png b/examples/misc/01-power/thumbnail.png new file mode 100644 index 0000000000..970bdff6b0 Binary files /dev/null and b/examples/misc/01-power/thumbnail.png differ diff --git a/examples/misc/description.txt b/examples/misc/description.txt new file mode 100644 index 0000000000..bd99b89d18 --- /dev/null +++ b/examples/misc/description.txt @@ -0,0 +1 @@ +Various examples from smaller subsystems \ No newline at end of file