c - error: invalid types 'uint16_t {aka short unsigned int}[uint8_t {aka unsigned char}]' for array subscript -
background: i'm working on gutting adafruit program 'uncanny eyes." intention able have couple of momentary switches draw static images pair of 1.5" oleds.
this program uses teensy 3.1 or 3.2.
i'm stuck after receiving error
in function 'void draweye(uint8_t, uint16_t)': uncannyeyes:146: error: invalid types 'uint16_t {aka short unsigned int}[uint8_t {aka unsigned char}]' array subscript p = img[screeny][screenx];
i'm new the stack exchange community, apologize if i've done incorrectly!
#include <spi.h> #include <adafruit_gfx.h> // core graphics lib adafruit displays // enable 1 of these #includes -- huge graphics tables various eyes: //#include "defaulteye.h" // standard human-ish hazel eye //#include "noscleraeye.h" // large iris, no sclera //#include "dragoneye.h" // slit pupil fiery dragon/demon eye #include "goateye.h" // horizontal pupil goat/krampus eye // tweak settings below, e.g. change iris_min/max or disable tracking. // display hardware config ------------------------------------------------- #include <adafruit_ssd1351.h> // oled display library -or- //#include <adafruit_st7735.h> // tft display library (enable 1 only) #ifdef _adafruit_st7735h_ typedef adafruit_st7735 displaytype; // using tft display(s) #else typedef adafruit_ssd1351 displaytype; // using oled display(s) #endif #define display_dc 7 // data/command pin both displays #define display_reset 8 // reset pin both displays #define select_l_pin 9 // left eye chip select pin #define select_r_pin 10 // right eye chip select pin // input config (for eye motion -- enable or comment out needed) -------- #define wink_l_pin 0 // pin left eye wink button #define blink_pin 1 // pin blink button (both eyes) #define wink_r_pin 2 // pin right eye wink button #define image_4 3 // pin right eye wink button #define image_5 4 // pin right eye wink button //#define autoblink // if enabled, eyes blink autonomously // don't need edit config below line, ----------------- // unless building single-eye project (pendant, etc.), in case 1 // of 2 elements in eye[] array further down can commented out. // eye blinks tiny 3-state machine. per-eye allows winks + blinks. #define noblink 0 // not engaged in blink #define enblink 1 // eyelid closing #define deblink 2 // eyelid opening typedef struct { int8_t pin; // optional button here indiv. wink uint8_t state; // noblink/enblink/deblink int32_t duration; // duration of blink state (micros) uint32_t starttime; // time (micros) of last state change } eyeblink; struct { displaytype display; // oled/tft object uint8_t cs; // chip select pin eyeblink blink; // current blink state } eye[] = { // ok comment out 1 of these single-eye display: displaytype(select_l_pin,display_dc,0),select_l_pin,{wink_l_pin,noblink}, displaytype(select_r_pin,display_dc,0),select_r_pin,{wink_r_pin,noblink}, }; #define num_eyes (sizeof(eye) / sizeof(eye[0])) uint8_t prevbtn = 99, // button # pressed on last loop() iteration btncount = 0; // number of iterations same button has been held // initialization -- runs once @ startup ---------------------------------- void setup(void) { uint8_t e; serial.begin(115200); randomseed(analogread(a3)); // seed random() floating analog input // both displays share common reset line; 0 passed display // constructor (so no reset in begin()) -- must reset manually here: pinmode(display_reset, output); digitalwrite(display_reset, low); delay(1); digitalwrite(display_reset, high); delay(50); for(e=0; e<num_eyes; e++) { // deselect pinmode(eye[e].cs, output); digitalwrite(eye[e].cs, high); } for(e=0; e<num_eyes; e++) { digitalwrite(eye[e].cs, low); // select 1 eye init #ifdef _adafruit_st7735h_ // tft eye[e].display.initr(initr_144greentab); #else // oled eye[e].display.begin(); #endif if(eye[e].blink.pin >= 0) pinmode(eye[e].blink.pin, input_pullup); digitalwrite(eye[e].cs, high); // deselect } #ifdef blink_pin pinmode(blink_pin, input_pullup); #endif for(uint8_t i=0; i<=6; i++) { pinmode(i, input); digitalwrite(i, high); // enable pullup } } // eye-rendering function -------------------------------------------------- spisettings settings(24000000, msbfirst, spi_mode3); // teensy 3.1 max spi void draweye( // renders 1 eye. uint8_t e, // eye array index; 0 or 1 left/right uint16_t img) { // pointer image data uint8_t screenx, screeny; uint16_t p; // set raw pixel dump entire screen. although such writes can wrap // around automatically end of rect beginning, region // reset on each frame here in case of spi glitch. spi.begintransaction(settings); #ifdef _adafruit_st7735h_ // tft eye[e].display.setaddrwindow(0, 0, 127, 127); #else // oled eye[e].display.writecommand(ssd1351_cmd_setrow); // y range eye[e].display.writedata(0); eye[e].display.writedata(screen_height - 1); eye[e].display.writecommand(ssd1351_cmd_setcolumn); // x range eye[e].display.writedata(0); eye[e].display.writedata(screen_width - 1); eye[e].display.writecommand(ssd1351_cmd_writeram); // begin write #endif digitalwrite(eye[e].cs, low); // chip select digitalwrite(display_dc, high); // data mode // issue raw 16-bit values every pixel... for(screeny=0; screeny<screen_height; screeny++) { for(screenx=0; screenx<screen_width; screenx++) { p = img[screeny][screenx]; // spi fifo technique paul stoffregen's ili9341_t3 library: while(kinetisk_spi0.sr & 0xc000); // wait space in fifo kinetisk_spi0.pushr = p | spi_pushr_ctas(1) | spi_pushr_cont; } } kinetisk_spi0.sr |= spi_sr_tcf; // clear transfer flag while((kinetisk_spi0.sr & 0xf000) || // wait spi fifo drain !(kinetisk_spi0.sr & spi_sr_tcf)); // wait last bit out digitalwrite(eye[e].cs, high); // deselect spi.endtransaction(); } // main loop -- runs continuously after setup() ---------------------------- void loop() { uint8_t i; // scan buttons 2-6 looking first button pressed... for(i=0; (i<2) && (digitalread(i+2) == high); i++); if(i < 2) { // pressed? yes! if(i == prevbtn) { // same last time checked? good! if(++btncount == 3) { // 3 passes 'debounce' button input if(digitalread(2) == low) { draweye(0, sclera[0][0]); draweye(1, sclera[0][0]); } // if(digitalread(3) == low) { // draweye(0, polar); // draweye(1, polar); // } // if(digitalread(4) == low) { // draweye(0, sclera[0][0]); // draweye(1, polar[0][0]); // } // if(digitalread(5) == low) { // draweye(0, polar[0][0]); // draweye(1, sclera[0][0]); // } // if(digitalread(6) == low) { // draweye(0, eyeimage[3]); // draweye(1, eyeimage[3]); // } } } else btncount = 0; // different button before - start count on prevbtn = i; } else prevbtn = 99; // no buttons pressed } and header goateye.h sans array data post massive
#define screen_height 128 #define screen_width 128 const uint16_t sclera[screen_height][screen_width] = {}; const uint16_t polar[screen_height][screen_width] = {}; thank help!
the problem here:
void draweye( // renders 1 eye. uint8_t e, // eye array index; 0 or 1 left/right uint16_t img) { // pointer image data the function draweye expecting single uint16_t, not two-dimensional array. when try take array index of it, error because it's not array.
you need define function this:
void draweye( // renders 1 eye. uint8_t e, // eye array index; 0 or 1 left/right const uint16_t img[screen_height][screen_width]) { // pointer image data and call this:
if(digitalread(2) == low) { draweye(0, sclera); draweye(1, sclera); }
Comments
Post a Comment