Files
WiiUPluginSystem/pages/dev/dev_inherit_features.md
2018-07-24 14:11:27 +02:00

142 lines
5.6 KiB
Markdown

---
title: Inherit features from the loader
tags: [features]
keywords: features, filesystem, fat32, access, overlay, kernel,
last_updated: July 24, 2018
sidebar: dev_sidebar
permalink: dev_inherit_features.html
folder: dev
topnav: topnav
---
To use extra functions on the plugins, you can add macros. The following list give a short overiew about all existing macros:
| macro | Description |
|-------|-------------|
|WUPS_FS_ACCESS() | Allows plugin access the sd card |
|WUPS_ALLOW_KERNEL() | Used to request access to kernel functions |
|WUPS_ALLOW_OVERLAY() | Needed to able to open an overlay |
--------
## WUPS_FS_ACCESS()
**Description:**
This macro will inherit the fs functions from the loader (open, close, read, opendir etc.). This allows the plugin to access the sd card (`sd:/`) or fat32 usb device (`usb:/`) if connected.
The [ON_APPLICATION_START](https://github.com/Maschell/WiiUPluginSystem/wiki/Using-hooks#on_application_startmyargs) macro holds information if a sdcard or usb device was mounted and can be used.
Example:
```C++
WUPS_FS_ACCESS()
// Called whenever an application was started.
ON_APPLICATION_START(args){
socket_lib_init();
log_init();
DEBUG_FUNCTION_LINE("SD mounted? %d\n",args.sd_mounted);
DEBUG_FUNCTION_LINE("USB mounted? %d\n",args.usb_mounted);
}
```
--------
## WUPS_ALLOW_KERNEL()
--------
**Description:**
This macro requests the access to function PPC kernel functions. The loader may restrict the access.
The [ON_APPLICATION_START](https://github.com/Maschell/WiiUPluginSystem/wiki/Using-hooks#on_application_startmyargs) macro holds information if the kernel function are actually usable.
Example:
```C++
WUPS_ALLOW_KERNEL()
// Called whenever an application was started.
ON_APPLICATION_START(args){
if(!args.kernel_access){
OSFatal("The diibugger plugin needs kernel access!");
}
// Normal code
}
```
When the plugin has access, the following functios can be used:
```C++
/**
Reads a 32bit value from a given address with kernel rights.
This function only has an effect if the plugin has the "WUPS_ALLOW_KERNEL" hook and the loader is NOT blocking the kernel access.
The argument of the ON_APPLICATION_START hook provides the information if the plugin has kernel access which should be checked before using/relying on this function.
**/
uint32_t WUPS_KernelRead(const void *addr);
/**
Write a 32bit value from a given address with kernel rights.
This function only has an effect if the plugin has the "WUPS_ALLOW_KERNEL" hook and the loader is NOT blocking the kernel access.
The argument of the ON_APPLICATION_START hook provides the information if the plugin has kernel access which should be checked before using/relying on this function.
**/
void WUPS_KernelWrite(void *addr, uint32_t value);
/**
Copies data from a source address to a destination address for a given lenght with kernel rights.
This function only has an effect if the plugin has the "WUPS_ALLOW_KERNEL" hook and the loader is NOT blocking the kernel access.
The argument of the ON_APPLICATION_START hook provides the information if the plugin has kernel access which should be checked before using/relying on this function.
**/
void WUPS_KernelCopyDataFunction(uint32_t addr, uint32_t src, uint32_t len);
```
If the plugin doesn't have the required access, calling the functions has no effect.
## WUPS_ALLOW_OVERLAY()
**Description:**
This macro allows you to use the overlay functions. It's possible to open a simple OSScreen whenever the home menu is allowed.
WUPS provide to a convinient way to open and use such a menu using the following functions:
```C++
// Callback used when opening the overlay.
// The first wups_overlay_options_type_t tell your which screen are actually used.
// Use this as input for the other overlay function.
//
// The void* can used for user data.
typedef void (*overlay_callback)(wups_overlay_options_type_t, void*);
// Open an overlay on a given screen (see the enum below for possible values)
void WUPS_OpenOverlay(wups_overlay_options_type_t screen, overlay_callback callback, void* args);
// Clears the screen for a given sceentype
void WUPS_Overlay_OSScreenClear(wups_overlay_options_type_t screen);
// Prints text on a given sceentype
void WUPS_Overlay_PrintTextOnScreen(wups_overlay_options_type_t screen, int x,int y, const char * msg, ...);
// Flips the buffer for a given screentype.
void WUPS_Overlay_FlipBuffers(wups_overlay_options_type_t screen);
```
Possible screentype options that can be passed to `WUPS_OpenOverlay`:
```C++
typedef enum wups_overlay_options_type_t {
WUPS_OVERLAY_NONE,
WUPS_OVERLAY_DRC_ONLY, /* Tries to display only on gamepad screen */
WUPS_OVERLAY_TV_ONLY, /* Tries to display only on tv screen */
WUPS_OVERLAY_DRC_AND_TV, /* Tries to display on both screens. Prioritizes the TV screen if memory is low. */
WUPS_OVERLAY_DRC_AND_TV_WITH_DRC_PRIO /* Tries to display on both screens. But if memory is low, prioritize the DRC screen.*/
}
wups_overlay_options_type_t;
```
Short usage example:
```C++
WUPS_ALLOW_OVERLAY()
void SplashScreen_callback(wups_overlay_options_type_t screen, void * args){
int32_t i=0;
while(i<100){
WUPS_Overlay_OSScreenClear(screen);
WUPS_Overlay_PrintTextOnScreen(screen, 0,0,"This could be something cool.");
WUPS_Overlay_FlipBuffers(screen);
i++;
}
}
INITIALIZE_PLUGIN(){
WUPS_OpenOverlay(WUPS_OVERLAY_DRC_AND_TV ,SplashScreen_callback, NULL);
}
```
A full usage example can be found here:
https://github.com/Maschell/WUPSPluginPlayground/blob/master/overlay_test
{% include links.html %}