diff --git a/MikuOled.cpp b/MikuOled.cpp index febc898..79c5b3c 100755 --- a/MikuOled.cpp +++ b/MikuOled.cpp @@ -1,4 +1,4 @@ -#include +#include #include "MikuDuino.h" #include "Wire.h" @@ -103,7 +103,6 @@ Wire.begin(); Wire.beginTransmission(0x3c); Wire.write(initcode,29); Wire.endTransmission(); - } @@ -141,6 +140,8 @@ void Miku_Oled::shift() void Miku_Oled::clearDisplay(void) { memset(buffer, 0, 1024); + xpos=0; + ypos=0; } void Miku_Oled::showLogo(void) @@ -152,3 +153,90 @@ void Miku_Oled::showBMP(uint8 *bmp) { memcpy(buffer, bmp, 1024); } + +void Miku_Oled::setPos(uint8 x,uint8 y) +{ + if ((x>128)||(y>64)) + return; + xpos=x; + ypos=y; +} + +void Miku_Oled::drawPoint(uint8 x,uint8 y,uint8 c) +{ + if ((x>128)||(y>64)) + return; + int p=y/8; + p=p*128+x; + int m=y%8; + + if (c==0) + buffer[p]&=~(uint8)(1<128) + { + xpos=0; + ypos+=16; + } + fseek(fphzk, x*16, SEEK_SET); + r=fread(out,1,16,fphzk); + + for(r=0;r<16;r++) + { + uint8 xxx=*(out+r); + for(rr=0;rr<8;rr++) + drawPoint(xpos+rr,ypos+r,xxx&(1<<(7-rr))); + } + xpos+=8; + continue; + } + + if (xpos+16>128) + { + xpos=0; + ypos+=16; + } + + long p=(((*(txt+i))-161)*94+(*(txt+i+1))-161)*32+4096; + i++; + fseek(fphzk, p, SEEK_SET); + r=fread(out,1,32,fphzk); + + for(r=0;r<16;r++) + { + uint8 xxx=*(out+r*2); + for(rr=0;rr<8;rr++) + drawPoint(xpos+rr,ypos+r,xxx&(1<<(7-rr))); + xxx=*(out+r*2+1); + for(rr=0;rr<8;rr++) + drawPoint(xpos+8+rr,ypos+r,xxx&(1<<(7-rr))); + } + xpos+=16; + } + fclose(fphzk); +} diff --git a/MikuOled.h b/MikuOled.h index a7d19dc..2dd1f88 100755 --- a/MikuOled.h +++ b/MikuOled.h @@ -74,10 +74,14 @@ class Miku_Oled { void showLogo(void); void clearDisplay(void); void showBMP(uint8*); + void setPos(uint8,uint8); + void drawPoint(uint8,uint8,uint8); + void drawText(const char*); private: void oled_sendCommand(int); static uint8 buf[]; uint8 *buffer; + uint8 xpos,ypos; }; diff --git a/MikuPi.cpp b/MikuPi.cpp index b7289b6..6e833ff 100755 --- a/MikuPi.cpp +++ b/MikuPi.cpp @@ -21,6 +21,8 @@ char *i2cDevice; +int hasRoot = TRUE; + const char *i2cDevices[3] = { "/dev/i2c-0", @@ -217,8 +219,10 @@ void mikuPiSetup (void) unsigned int addr_start, addr_offset; unsigned int PageSize, PageMask; - if (geteuid () != 0) - piBoardRevOops("MikuPiSetup: Must be root. (Did you forget sudo?)"); + if (geteuid () != 0) { + hasRoot = FALSE; + //piBoardRevOops("MikuPiSetup: Must be root. (Did you forget sudo?)"); + } int model, mem; piBoardId (&model, &mem); @@ -246,6 +250,8 @@ void mikuPiSetup (void) i2cDevice=(char *)i2cDevices[2]; } + if (hasRoot) + { fd = open("/dev/mem", O_RDWR); PageSize = sysconf(_SC_PAGESIZE); @@ -266,10 +272,16 @@ void mikuPiSetup (void) SUNXI_PIO_LM_BASE += addr_offset; close(fd); + } } void pinMode(int pin, int mode) { + if (!hasRoot) + { + printf ("Warning! If u want control GPIO. Must be root. (Did you forget sudo?)\n") ; + return; + } pin=wPinToGpio[pin]; unsigned int val = mode; unsigned int cfg; @@ -295,6 +307,11 @@ void pinMode(int pin, int mode) void digitalWrite(int pin, int value) { + if (!hasRoot) + { + printf ("Warning! If u want control GPIO. Must be root. (Did you forget sudo?)\n") ; + return; + } pin=wPinToGpio[pin]; unsigned int val = value; unsigned int bank = GPIO_BANK(pin); diff --git a/MikuPi.h b/MikuPi.h index efa060c..8c1445a 100755 --- a/MikuPi.h +++ b/MikuPi.h @@ -30,7 +30,7 @@ extern char *i2cDevice; extern const int bPinTowPin[41]; -#define VERSION "0.25" +#define VERSION "0.30" extern const char *piModelNames [7] ; diff --git a/README.md b/README.md index 591a9d2..97b3c55 100755 --- a/README.md +++ b/README.md @@ -47,6 +47,7 @@ sudo ./blink 4.(2016-06-05) add Wire & SHT2x 5.(2016-06-24) add MikuOLED 6.(2016-06-25) modify Uncle Li's BadApple + 7.(2016-07-02) add oled.drawText support ascii & gb2312 upload diff --git a/examples/oled_text b/examples/oled_text new file mode 100755 index 0000000..f1faf0a Binary files /dev/null and b/examples/oled_text differ diff --git a/examples/oled_text.cpp b/examples/oled_text.cpp new file mode 100755 index 0000000..893d4e4 --- /dev/null +++ b/examples/oled_text.cpp @@ -0,0 +1,45 @@ +#include "MikuDuino.h" +#include "MikuOled.h" + +/* + * oled_test.cpp: + * + * Welcome to MikuQ.com! MikuDuino for BananaPi + * + * modify MikuQ(i@mikuq.com) 2016-7-2 + * + * https://github.com/bpiq/MikuPi + * + */ + +Miku_Oled oled; + +char buf[20]; +int c=0; + +void setup() +{ + sayHello(); + oled.begin(); + oled.display(); + delay(1000); +} + +void loop() +{ + oled.clearDisplay(); + oled.drawText(">>MikuOLED¼ÆÊý<<"); + sprintf(buf,"λÖãº%d",c+1); + oled.setPos(28,28); + oled.drawText(buf); + oled.drawPoint(c,60,1); + oled.drawPoint(c+2,60,1); + oled.drawPoint(c+1,61,1); + oled.drawPoint(c,62,1); + oled.drawPoint(c+2,62,1); + c++; + if (c>125) + c=0; + oled.display(); + delay(10); +} \ No newline at end of file diff --git a/fonts/mikupi.font b/fonts/mikupi.font new file mode 100755 index 0000000..68e73c6 Binary files /dev/null and b/fonts/mikupi.font differ diff --git a/makefile b/makefile index db78003..d3a56f7 100755 --- a/makefile +++ b/makefile @@ -2,6 +2,7 @@ libMikuDuino.so : MikuPi.cpp MikuDuino.cpp MikuRelay.cpp MikuSHT2x.cpp Wire.cpp @gcc $^ -fPIC -shared -o $@ @install $@ /usr/lib/ @install *.h /usr/include/ + @install fonts/mikupi.font /usr/share/fonts @rm -f *.so @echo 'install OK!' .PHONY : clean