* TODO FL-3497: impossible to fix with current memory allocator * TODO FL-3497: removed, requires radically different settings approach * TODO FL-3514: removed, yes we should * TODO FL-3498: implemented, guarding view port access with mutex. * TODO FL-3515: removed, questionable but ok * TODO FL-3510: removed, comment added * TODO FL-3500: refactored, store pin numbers in GpioPinRecord, fix gpio app crash caused by incorrect gpio_pins traversal. * Format Sources * TODO FL-3505: removed, mutex alone is not going to fix issue with WPAN architecture * TODO FL-3506: removed, change ownership by copy is good * TODO FL-3519: documentation and link to source added * Lib: remove unneded total sum from comment in bq27220 --------- Co-authored-by: hedger <hedger@users.noreply.github.com>
		
			
				
	
	
		
			72 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			72 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
#include "gpio_items.h"
 | 
						|
 | 
						|
#include <furi_hal_resources.h>
 | 
						|
 | 
						|
struct GPIOItems {
 | 
						|
    GpioPinRecord* pins;
 | 
						|
    size_t count;
 | 
						|
};
 | 
						|
 | 
						|
GPIOItems* gpio_items_alloc() {
 | 
						|
    GPIOItems* items = malloc(sizeof(GPIOItems));
 | 
						|
 | 
						|
    items->count = 0;
 | 
						|
    for(size_t i = 0; i < gpio_pins_count; i++) {
 | 
						|
        if(!gpio_pins[i].debug) {
 | 
						|
            items->count++;
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
    items->pins = malloc(sizeof(GpioPinRecord) * items->count);
 | 
						|
    size_t index = 0;
 | 
						|
    for(size_t i = 0; i < gpio_pins_count; i++) {
 | 
						|
        if(!gpio_pins[i].debug) {
 | 
						|
            items->pins[index].pin = gpio_pins[i].pin;
 | 
						|
            items->pins[index].name = gpio_pins[i].name;
 | 
						|
            index++;
 | 
						|
        }
 | 
						|
    }
 | 
						|
    return items;
 | 
						|
}
 | 
						|
 | 
						|
void gpio_items_free(GPIOItems* items) {
 | 
						|
    free(items->pins);
 | 
						|
    free(items);
 | 
						|
}
 | 
						|
 | 
						|
uint8_t gpio_items_get_count(GPIOItems* items) {
 | 
						|
    return items->count;
 | 
						|
}
 | 
						|
 | 
						|
void gpio_items_configure_pin(GPIOItems* items, uint8_t index, GpioMode mode) {
 | 
						|
    furi_assert(index < items->count);
 | 
						|
    furi_hal_gpio_write(items->pins[index].pin, false);
 | 
						|
    furi_hal_gpio_init(items->pins[index].pin, mode, GpioPullNo, GpioSpeedVeryHigh);
 | 
						|
}
 | 
						|
 | 
						|
void gpio_items_configure_all_pins(GPIOItems* items, GpioMode mode) {
 | 
						|
    for(uint8_t i = 0; i < items->count; i++) {
 | 
						|
        gpio_items_configure_pin(items, i, mode);
 | 
						|
    }
 | 
						|
}
 | 
						|
 | 
						|
void gpio_items_set_pin(GPIOItems* items, uint8_t index, bool level) {
 | 
						|
    furi_assert(index < items->count);
 | 
						|
    furi_hal_gpio_write(items->pins[index].pin, level);
 | 
						|
}
 | 
						|
 | 
						|
void gpio_items_set_all_pins(GPIOItems* items, bool level) {
 | 
						|
    for(uint8_t i = 0; i < items->count; i++) {
 | 
						|
        gpio_items_set_pin(items, i, level);
 | 
						|
    }
 | 
						|
}
 | 
						|
 | 
						|
const char* gpio_items_get_pin_name(GPIOItems* items, uint8_t index) {
 | 
						|
    furi_assert(index < items->count + 1);
 | 
						|
    if(index == items->count) {
 | 
						|
        return "ALL";
 | 
						|
    } else {
 | 
						|
        return items->pins[index].name;
 | 
						|
    }
 | 
						|
}
 |