2016-06-24 23:16:14 +08:00
|
|
|
#include "MikuDuino.h"
|
|
|
|
|
#include "Wire.h"
|
|
|
|
|
#include "MikuOled.h"
|
2016-07-10 11:42:52 +08:00
|
|
|
#include <iconv.h>
|
|
|
|
|
#include <string.h>
|
2016-06-24 23:16:14 +08:00
|
|
|
|
2016-07-09 22:04:57 +08:00
|
|
|
/*
|
|
|
|
|
* MikuPi.cpp:
|
|
|
|
|
*
|
|
|
|
|
* Welcome to MikuQ.com! MikuDuino for BananaPi
|
|
|
|
|
*
|
|
|
|
|
* by MikuQ(i@mikuq.com)
|
|
|
|
|
*
|
|
|
|
|
* https://github.com/bpiq/MikuPi
|
|
|
|
|
*
|
|
|
|
|
*/
|
2016-06-24 23:16:14 +08:00
|
|
|
|
2016-07-10 11:42:52 +08:00
|
|
|
int UTF8toGB2312(char *sourcebuf,char *destbuf)
|
|
|
|
|
{
|
|
|
|
|
iconv_t cd;
|
|
|
|
|
size_t sourcelen,destlen;
|
|
|
|
|
sourcelen=strlen(sourcebuf)+1;
|
|
|
|
|
destlen=sourcelen*4;
|
|
|
|
|
if ((cd = iconv_open("gb2312","utf-8")) ==0)
|
|
|
|
|
return -1;
|
|
|
|
|
if(-1 == iconv(cd,&sourcebuf,&sourcelen,&destbuf,&destlen))
|
|
|
|
|
{
|
|
|
|
|
perror("iconv");
|
|
|
|
|
return -2;
|
|
|
|
|
}
|
|
|
|
|
iconv_close(cd);
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
2016-09-15 16:51:13 +08:00
|
|
|
uint8_t Miku_Oled::buf[OLED_BUFFER_LENGTH+1];
|
2016-06-24 23:16:14 +08:00
|
|
|
|
|
|
|
|
const char logo[]={
|
|
|
|
|
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
|
|
|
0x00,0x00,0xF0,0xFC,0xFC,0xF8,0x00,0x00,0xE0,0xFC,0xFC,0xF8,0x00,0x00,0x00,0x00,
|
|
|
|
|
0xDC,0x9C,0x00,0x84,0xFE,0xF8,0x00,0x00,0x80,0xC0,0x00,0x00,0xC0,0xC0,0x00,0x00,
|
|
|
|
|
0x00,0xC0,0xC0,0x00,0x00,0xFC,0xFC,0x18,0x18,0x38,0x30,0x70,0xE0,0xC0,0x00,0x00,
|
|
|
|
|
0xC0,0xC0,0x00,0x00,0x00,0xC0,0xC0,0x00,0x00,0xDC,0xDC,0x00,0x00,0xC0,0xC0,0x80,
|
|
|
|
|
0xC0,0xC0,0xC0,0x00,0x00,0x00,0x80,0xC0,0xC0,0xC0,0x80,0x80,0x00,0x00,0x04,0x0C,
|
|
|
|
|
0xFC,0x04,0x04,0x00,0xF8,0x3C,0xE0,0x78,0x3C,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
|
|
|
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
|
|
|
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
|
|
|
0x00,0x3E,0x3F,0x03,0x01,0x1F,0x3F,0x3F,0x0F,0x01,0x01,0x1F,0x3F,0x30,0x00,0x1F,
|
|
|
|
|
0x3F,0x01,0x00,0x3F,0x3F,0x0F,0x0E,0x0F,0x1D,0x38,0x30,0x00,0x1F,0x3F,0x38,0x38,
|
|
|
|
|
0x38,0x3F,0x3F,0x00,0x00,0x1F,0x3F,0x38,0x38,0x38,0x38,0x1C,0x1F,0x0F,0x00,0x03,
|
|
|
|
|
0x1F,0x3F,0x38,0x38,0x38,0x3F,0x3F,0x00,0x00,0x3F,0x3F,0x00,0x00,0x3F,0x3F,0x03,
|
|
|
|
|
0x01,0x01,0x3F,0x3F,0x00,0x1F,0x3F,0x39,0x39,0x39,0x1F,0x0F,0x00,0x00,0x00,0x00,
|
|
|
|
|
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
|
|
|
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
|
|
|
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
|
|
|
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
|
|
|
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
|
|
|
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
|
|
|
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
|
|
|
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
|
|
|
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
|
|
|
0x00,0x40,0xC0,0xC0,0x40,0x40,0x00,0x80,0xC0,0x00,0x80,0xC0,0x00,0x00,0x00,0x00,
|
|
|
|
|
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0xF8,0xFC,0xFC,0xFC,0xF8,0xC0,0x00,
|
|
|
|
|
0x00,0x00,0x00,0x00,0x00,0x00,0xF0,0xF8,0xFC,0xFC,0xFC,0xF8,0xC0,0x00,0x00,0x00,
|
|
|
|
|
0x00,0x00,0x00,0x00,0x00,0x38,0x7C,0x7C,0x7C,0x38,0x10,0x00,0x00,0x00,0xFC,0xFE,
|
|
|
|
|
0xFE,0xFE,0xFC,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
|
|
|
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
|
|
|
0x00,0x00,0x00,0x00,0xF8,0xF8,0xFC,0xFC,0x7C,0x7C,0x7C,0x7C,0x7C,0xF8,0xF8,0xF8,
|
|
|
|
|
0xF0,0xF0,0xE0,0x80,0x00,0x00,0x00,0x00,0x38,0x7C,0x7C,0x7C,0x38,0x10,0x00,0x00,
|
|
|
|
|
0x00,0x00,0x00,0x0F,0x00,0x00,0x00,0x0F,0x03,0x0E,0x07,0x03,0x0F,0x00,0x00,0x00,
|
|
|
|
|
0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xF8,
|
|
|
|
|
0x00,0x00,0x00,0x80,0xF0,0xFF,0xFF,0xFF,0x7F,0xFF,0xFF,0xFF,0xFF,0xE0,0x00,0x00,
|
|
|
|
|
0x00,0x00,0x00,0x00,0x00,0xF8,0xFC,0xFC,0xFC,0x30,0x00,0x00,0x00,0x00,0xFF,0xFF,
|
|
|
|
|
0xFF,0xFF,0xFF,0x00,0x00,0x80,0xC0,0xE0,0xF0,0xF8,0xF8,0xFC,0x7C,0x38,0x00,0x00,
|
|
|
|
|
0xF0,0xFC,0xFC,0xFC,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0xFC,0xFC,0xFC,0xFC,
|
|
|
|
|
0x00,0x00,0x00,0xC0,0xFF,0xFF,0xFF,0xFF,0xC0,0xC0,0xC0,0xC0,0xC0,0xE0,0xF0,0xF9,
|
|
|
|
|
0xFF,0xFF,0x7F,0x3F,0x00,0x00,0x00,0x00,0xF8,0xFC,0xFC,0xFC,0x30,0x00,0x00,0x00,
|
|
|
|
|
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
|
|
|
0x00,0x00,0x00,0x00,0xF0,0xFE,0xFF,0xFF,0xFF,0x3F,0x03,0x00,0x0F,0xFF,0xFF,0xFF,
|
|
|
|
|
0xFF,0xF8,0xFC,0xFF,0xFF,0xFF,0x1F,0x03,0x00,0x03,0x7F,0xFF,0xFF,0xFF,0xFC,0xC0,
|
|
|
|
|
0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,
|
|
|
|
|
0xFF,0xFF,0xFF,0x3E,0x3F,0x3F,0x7F,0xFF,0xFF,0xFB,0xE1,0xC0,0x80,0x00,0x00,0x00,
|
|
|
|
|
0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,
|
|
|
|
|
0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0x07,0x07,0x07,0x07,0x03,0x03,0x03,0x03,
|
|
|
|
|
0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,
|
|
|
|
|
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
|
|
|
0x00,0x00,0x00,0x1E,0x3F,0x3F,0x3F,0x1F,0x07,0x00,0x00,0x00,0x00,0x00,0x07,0x1F,
|
|
|
|
|
0x3F,0x3F,0x3F,0x1F,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x3F,0x7F,0x7F,0x7F,
|
|
|
|
|
0x3C,0x00,0x00,0x00,0x00,0x1F,0x3F,0x3F,0x1F,0x00,0x00,0x00,0x00,0x00,0x1F,0x3F,
|
|
|
|
|
0x3F,0x3F,0x0F,0x00,0x00,0x00,0x00,0x00,0x03,0x07,0x1F,0x3F,0x3F,0x3E,0x1C,0x00,
|
|
|
|
|
0x00,0x0F,0x1F,0x1F,0x3F,0x3E,0x3E,0x3E,0x3E,0x3E,0x1E,0x1F,0x3F,0x3F,0x3F,0x1F,
|
|
|
|
|
0x00,0x00,0x00,0x1F,0x3F,0x3F,0x3F,0x0F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
|
|
|
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0x3F,0x3F,0x1F,0x00,0x00,0x00,0x00,
|
|
|
|
|
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
|
|
|
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
|
|
|
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
|
|
|
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
|
|
|
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
|
|
|
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
|
|
|
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
|
|
|
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
|
|
|
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
unsigned char initcode[] = {
|
|
|
|
|
0x00, 0xAE, 0xA8, 0x3F, 0xD3, 0x00, 0x40, 0xA1, 0xC8,
|
|
|
|
|
0xA6, 0xD5, 0x80, 0xDA, 0x12, 0x81, 0x00, 0xB0,
|
|
|
|
|
0xA4, 0xDB, 0x40, 0x20, 0x00, 0x00, 0x10, 0x8D,
|
|
|
|
|
0x14, 0x2E, 0xA6, 0xAF
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
unsigned char poscode[] = {
|
|
|
|
|
0x00, 0x20, 0x00, 0xB0, 0x00, 0x10
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
Miku_Oled::Miku_Oled()
|
|
|
|
|
{
|
|
|
|
|
buffer=buf+1;
|
|
|
|
|
buf[0]=0x40;
|
2016-07-10 11:42:52 +08:00
|
|
|
encoding=GB2312;
|
2016-06-24 23:16:14 +08:00
|
|
|
showLogo();
|
|
|
|
|
}
|
|
|
|
|
|
2016-09-15 16:51:13 +08:00
|
|
|
void Miku_Oled::setEncoding(uint8_t code)
|
2016-07-10 11:42:52 +08:00
|
|
|
{
|
|
|
|
|
encoding=code;
|
|
|
|
|
}
|
|
|
|
|
|
2016-06-24 23:16:14 +08:00
|
|
|
void Miku_Oled::begin()
|
|
|
|
|
{
|
|
|
|
|
Wire.begin();
|
|
|
|
|
Wire.beginTransmission(0x3c);
|
|
|
|
|
Wire.write(initcode,29);
|
|
|
|
|
Wire.endTransmission();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void Miku_Oled::display()
|
|
|
|
|
{
|
2016-06-25 00:25:47 +08:00
|
|
|
Wire.beginTransmission(0x3c);
|
|
|
|
|
Wire.write(poscode,6);
|
2016-09-15 16:51:13 +08:00
|
|
|
Wire.endTransmission();
|
|
|
|
|
|
|
|
|
|
Wire.beginTransmission(0x3c);
|
2016-06-25 00:25:47 +08:00
|
|
|
Wire.write(buf,1025);
|
|
|
|
|
Wire.endTransmission();
|
2016-06-24 23:16:14 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void Miku_Oled::shift()
|
|
|
|
|
{
|
|
|
|
|
int i;
|
|
|
|
|
int j;
|
|
|
|
|
int t;
|
|
|
|
|
int m;
|
|
|
|
|
int buftemp;
|
|
|
|
|
for(i=0;i<1024;i+=128)
|
|
|
|
|
{
|
|
|
|
|
t=1;
|
|
|
|
|
if (i<256)
|
|
|
|
|
t=2;
|
|
|
|
|
for(m=0;m<t;m++)
|
|
|
|
|
{
|
|
|
|
|
buftemp=buffer[i];
|
|
|
|
|
for(j=0;j<127;j++)
|
|
|
|
|
buffer[i+j]=buffer[i+j+1];
|
|
|
|
|
buffer[i+127]=buftemp;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void Miku_Oled::clearDisplay(void)
|
|
|
|
|
{
|
2016-06-25 00:25:47 +08:00
|
|
|
memset(buffer, 0, 1024);
|
2016-07-02 11:52:59 +08:00
|
|
|
xpos=0;
|
|
|
|
|
ypos=0;
|
2016-06-24 23:16:14 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void Miku_Oled::showLogo(void)
|
|
|
|
|
{
|
2016-06-25 00:25:47 +08:00
|
|
|
memcpy(buffer, logo, 1024);
|
|
|
|
|
}
|
|
|
|
|
|
2016-09-15 16:51:13 +08:00
|
|
|
void Miku_Oled::showBMP(uint8_t *bmp)
|
2016-06-25 00:25:47 +08:00
|
|
|
{
|
|
|
|
|
memcpy(buffer, bmp, 1024);
|
2016-06-24 23:16:14 +08:00
|
|
|
}
|
2016-07-02 11:52:59 +08:00
|
|
|
|
2016-09-15 16:51:13 +08:00
|
|
|
void Miku_Oled::setPos(uint8_t x,uint8_t y)
|
2016-07-02 11:52:59 +08:00
|
|
|
{
|
|
|
|
|
if ((x>128)||(y>64))
|
|
|
|
|
return;
|
|
|
|
|
xpos=x;
|
|
|
|
|
ypos=y;
|
|
|
|
|
}
|
|
|
|
|
|
2016-09-15 16:51:13 +08:00
|
|
|
void Miku_Oled::drawPoint(uint8_t x,uint8_t y,uint8_t c)
|
2016-07-02 11:52:59 +08:00
|
|
|
{
|
|
|
|
|
if ((x>128)||(y>64))
|
|
|
|
|
return;
|
|
|
|
|
int p=y/8;
|
|
|
|
|
p=p*128+x;
|
|
|
|
|
int m=y%8;
|
|
|
|
|
|
|
|
|
|
if (c==0)
|
2016-09-15 16:51:13 +08:00
|
|
|
buffer[p]&=~(uint8_t)(1<<m);
|
2016-07-02 11:52:59 +08:00
|
|
|
else
|
2016-09-15 16:51:13 +08:00
|
|
|
buffer[p]|=(uint8_t)(1<<m);
|
2016-07-02 11:52:59 +08:00
|
|
|
}
|
|
|
|
|
|
2016-07-10 11:42:52 +08:00
|
|
|
void Miku_Oled::drawText(char* txt)
|
2016-07-02 11:52:59 +08:00
|
|
|
{
|
2016-07-10 11:42:52 +08:00
|
|
|
char mytxt[256];
|
|
|
|
|
|
|
|
|
|
if (encoding==UTF8)
|
|
|
|
|
UTF8toGB2312(txt,mytxt);
|
|
|
|
|
else
|
|
|
|
|
memcpy(mytxt, txt, strlen(txt)+1);
|
|
|
|
|
|
2016-07-02 11:52:59 +08:00
|
|
|
FILE *fphzk;
|
|
|
|
|
fphzk=fopen("/usr/share/fonts/mikupi.font","rb");
|
|
|
|
|
int i,r,rr;
|
2016-09-15 16:51:13 +08:00
|
|
|
uint8_t out[32];
|
2016-07-10 11:42:52 +08:00
|
|
|
for(i=0;i<strlen(mytxt);i++)
|
2016-07-02 11:52:59 +08:00
|
|
|
{
|
2016-09-15 16:51:13 +08:00
|
|
|
uint8_t x=*(mytxt+i);
|
2016-07-02 11:52:59 +08:00
|
|
|
if (x<161)
|
|
|
|
|
{
|
|
|
|
|
if (x==10)
|
|
|
|
|
{
|
|
|
|
|
xpos=0;
|
|
|
|
|
ypos+=16;
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
if (x==13)
|
|
|
|
|
{
|
|
|
|
|
xpos=0;
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
if (xpos+8>128)
|
|
|
|
|
{
|
|
|
|
|
xpos=0;
|
|
|
|
|
ypos+=16;
|
|
|
|
|
}
|
|
|
|
|
fseek(fphzk, x*16, SEEK_SET);
|
|
|
|
|
r=fread(out,1,16,fphzk);
|
|
|
|
|
|
|
|
|
|
for(r=0;r<16;r++)
|
|
|
|
|
{
|
2016-09-15 16:51:13 +08:00
|
|
|
uint8_t xxx=*(out+r);
|
2016-07-02 11:52:59 +08:00
|
|
|
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;
|
|
|
|
|
}
|
|
|
|
|
|
2016-07-10 11:42:52 +08:00
|
|
|
long p=(((*(mytxt+i))-161)*94+(*(mytxt+i+1))-161)*32+4096;
|
2016-07-02 11:52:59 +08:00
|
|
|
i++;
|
|
|
|
|
fseek(fphzk, p, SEEK_SET);
|
|
|
|
|
r=fread(out,1,32,fphzk);
|
|
|
|
|
|
|
|
|
|
for(r=0;r<16;r++)
|
|
|
|
|
{
|
2016-09-15 16:51:13 +08:00
|
|
|
uint8_t xxx=*(out+r*2);
|
2016-07-02 11:52:59 +08:00
|
|
|
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);
|
|
|
|
|
}
|