svanted skrev: ↑22 juni 2021, 13:47:31
eller kanske använda int16 istf uint16?
Jag har funderat på detta också. Det ligger på min lista faktiskt. Orsaken varför jag har valt som ovan har med att jag vill göra likadant på övriga funktionerna. Jag skriver nämligen ut värden igenom denna funktion.
Alla funktioner så som dessa returnerar uint16_t. Men detta sätt att skriva ut siffror på en ILI9341 LCD tar lång tid, så jag måste nog titta mer på det förslag du namnger.
Målet är att jag ska skriva ut en komplett sträng på LCD:n med mätvärden. Inte som jag gör nedan. Tar för lång tid.
Kod: Markera allt
STM32_PLC_Analog_Input_GetADC
STM32_PLC_Analog_Input_GetDADC
STM32_PLC_Digital_Input_Get
STM32_PLC_Input_Capture_Get
Kod: Markera allt
void display_values(uint8_t values_to_display, char text[], uint8_t shift_upper, uint8_t shift_lower, uint16_t (*getValue)(uint8_t));
void STM32_PLC_LCD_Show_Values() {
// Set rotation
ILI9341_setRotation(2);
/* Print title */
ILI9341_printText("Measurement values", 55, 10, COLOR_YELLOW, COLOR_NAVY, 2);
display_values(12, "ADC%i:", 0, 20,STM32_PLC_Analog_Input_GetADC);
display_values(5, "DADC%i:", 40, 60, STM32_PLC_Analog_Input_GetDADC);
display_values(8, "DI%i:", 60, 80, STM32_PLC_Digital_Input_Get);
display_values(2, "E%i:", 90, 100, STM32_PLC_Encoder_Get);
display_values(3, "IC%i:", 100, 100, STM32_PLC_Input_Capture_Get);
}
void display_values(uint8_t values_to_display, char text[], uint8_t shift_upper, uint8_t shift_lower, uint16_t (*getValue)(uint8_t)){
/* Initial arrays */
char label[20];
char float_value[10];
uint16_t colors[6] = {(uint16_t) COLOR_RED, (uint16_t) COLOR_CYAN, (uint16_t) COLOR_ORANGE, (uint16_t) COLOR_MAGENTA, (uint16_t) COLOR_GREEN, (uint16_t) COLOR_WHITE};
uint8_t x[6] = {55, 140, 230, 55, 140, 230};
uint8_t y[6] = {35, 35, 35, 45, 45, 45};
for(uint8_t i = 0; i < values_to_display; i++){
//sprintf_(float_value, "%0.2f", getValue(i));
sprintf(float_value, "%i", getValue(i));
sprintf(label, text, i);
strcat(label, float_value);
if(i >= 0 && i <= 5)
ILI9341_printText(label, x[i], y[i] + shift_upper, colors[i], COLOR_NAVY, 1);
else if(i >= 6 && i <= 11)
ILI9341_printText(label, x[i - 6], y[i - 6] + shift_lower, colors[i - 6], COLOR_NAVY, 1);
}
}
sodjan skrev: ↑22 juni 2021, 13:53:49
> Här börjar jag alltså på 0x8000 och stegar mig nedåt eller uppåt.
Men då handlar det ju inte om "åt vilket håll som encodern roterar"
utan om var den befinner sig utifrån en tänkt centrumposition. Det
spelar alltså ingen roll *hur* encodern kom till sin aktuella position.
Det är ju två helt olika saker...
Så centrum är alltid 0x8000 oavsett om föregående läge var 0x7FFF eller 0x8001?
Det var inte så som jag tolkade din fråga.
Centrum är 0x8000. Men jag tror att jag ska titta mer på förslaget som svanted föreslog. Jag har tänkt på detta förut. Men ändrat mig lite.
Om C kunde ha generics så skulle det vara möjligt för mig att välja int16 direkt.