P10
Diff: LED_P10.cpp
- Revision:
- 0:3d89509fadb7
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/LED_P10.cpp Mon Sep 16 15:02:05 2019 +0000 @@ -0,0 +1,651 @@ +#include "mbed.h" +#include "Aerial_black_16.h" +#include "double_font2.h" +#include "led_half_1.h" +#include "LED_P10.h" +#include <string.h> + + char * LedP10 :: msg=NULL; + char * LedP10 :: msg1=NULL; + char * LedP10 :: msg2=NULL; + const uint8_t * LedP10 :: font_lib; + uint8_t * LedP10 :: dislay[2]={NULL}; + int LedP10 :: speed=5; + int LedP10 :: font; + int LedP10 :: filled=0; + int LedP10 :: index=0; + int LedP10 :: filled1=0; + int LedP10 :: filled2=0; + int LedP10 :: index1=0; + int LedP10 :: index2=0; + int LedP10 :: numberofpanels=1; + int LedP10 :: buffersize=49; + int LedP10 :: storepin =8; + int LedP10 :: outputenablepin=9 ; + int LedP10 :: b =4; + int LedP10 :: a =3; + int LedP10 :: scroll=-1; + int LedP10 :: scroll1=-1; + int LedP10 :: scroll2=-1; + int LedP10 :: scrollcount=0; + int LedP10 :: scrollcount1=0; + int LedP10 :: scrollcount2=0; + int LedP10 :: x=0; + int LedP10 :: y=0; + int LedP10 :: speed1=5; + int LedP10 :: speed2=5; + int LedP10 :: speedcount=0; + int LedP10 :: speedcount1=0; + int LedP10 :: speedcount2=0; + int LedP10 :: always=1; + int LedP10 :: always1=0; + int LedP10 :: always2=1; + uint8_t LedP10 :: brightness=255; + LedP10 :: LedP10() +{} +void LedP10 :: init_internal() +{ + + /* + pinMode(outputenablepin,OUTPUT); + pinMode(a,OUTPUT); + pinMode(b,OUTPUT); + pinMode(10,OUTPUT); + + pinMode(storepin,OUTPUT); + digitalWrite(a, LOW); + digitalWrite(b, LOW); + SPI.beginTransaction(SPISettings(1152000, MSBFIRST, SPI_MODE0)); + SPI.begin(); + digitalWrite(outputenablepin,LOW); + scroll=-1; + scroll1=-1; + scroll2=-1; + + */ +} + +void LedP10 :: store() +{ + /* + digitalWrite(storepin, HIGH); + digitalWrite(storepin, LOW); + + */ +} + +void LedP10 :: init(int A, int B, int store_pin, int oe, int no_of_panels) +{ + a=A; + b=B; + storepin=store_pin; + outputenablepin=oe; + numberofpanels=no_of_panels; + buffersize=17+numberofpanels*32; + dislay[0]=(uint8_t *)malloc(buffersize*sizeof(uint8_t)); + dislay[1]=(uint8_t *)malloc(buffersize*sizeof(uint8_t)); + for(int i=0;i<buffersize;i++) + { + dislay[0][i]=0x00; + dislay[1][i]=0x00; + } + LedP10 ::init_internal(); +} +void LedP10 :: filldisplaysingle_static() +{ + filled=0; + index=0; + char nextchar; + int no_of_char = pgm_read_byte_near(font_lib+5); + int first_char = pgm_read_byte_near(font_lib+4); + uint16_t widthpos,width,datapos; + while(index!=strlen(msg)&&filled<32*numberofpanels) + { + nextchar=msg[index++]; + widthpos= 6+nextchar-first_char; + uint16_t sum=0; + for(int i=0;i<nextchar-first_char;i++) + { + sum+= 2*pgm_read_byte_near(font_lib+6+i); + } + datapos= 6+no_of_char+sum; + width=pgm_read_byte_near(font_lib+widthpos); + if(filled+width+1<=32*numberofpanels) + { + word count=0; + for(count=0;count<width;count++) + { + dislay[0][filled]=pgm_read_byte_near(font_lib+datapos+count); + dislay[1][filled]=pgm_read_byte_near(font_lib+datapos+count+width); + (filled)++; + } + dislay[0][filled]=0x00; + dislay[1][filled]=0x00; + (filled)++; + } + + } + while(filled<32*numberofpanels) + { + dislay[0][filled]=0x00; + dislay[1][filled]=0x00; + (filled)++; + } +} + +void LedP10 :: filldisplaysingle() +{ + char nextchar; + uint16_t widthpos,width,datapos; + int no_of_char=pgm_read_byte_near(font_lib+5); + int first_char = pgm_read_byte_near(font_lib+4); + while(filled<buffersize&&(scroll>0||always==1)) + { + if(index==strlen(msg)) + { + scroll--; + index=0; + nextchar=' '; + } + else + { + nextchar=msg[index++]; + } + widthpos= 6+nextchar-first_char; + uint16_t sum=0; + for(int i=0;i<nextchar-first_char;i++) + { + sum+= 2*pgm_read_byte_near(font_lib+6+i); + } + datapos= 6+no_of_char+sum; + width=pgm_read_byte_near(font_lib+widthpos); + if(filled+width+1<=buffersize) + { + word count=0; + for(count=0;count<width;count++) + { + dislay[0][filled]=pgm_read_byte_near(font_lib+datapos+count); + dislay[1][filled]=pgm_read_byte_near(font_lib+datapos+count+width); + (filled)++; + } + dislay[0][filled]=0x00; + dislay[1][filled]=0x00; + (filled)++; + } + else + { + if(index>0) + index--; + else + { + index=strlen(msg); + scroll++; + } + break; + } + } +} + +void LedP10 :: filldisplaydouble_static() +{ + filled1=0;filled2=0;index1=0;index2=0; + char nextchar1,nextchar2; + int no_of_char=pgm_read_byte_near(font_lib+5); + int first_char = pgm_read_byte_near(font_lib+4); + uint16_t widthpos1,width1,datapos1,widthpos2,width2,datapos2; + while(index1!=strlen(msg1)&&filled1<32*numberofpanels) + { + nextchar1=msg1[index1++]; + widthpos1= 6+nextchar1-first_char; + uint16_t sum1=0; + for(int i=0;i<nextchar1-first_char;i++) + { + sum1+= pgm_read_byte_near(font_lib+6+i); + } + datapos1= 6+no_of_char+sum1; + width1=pgm_read_byte_near(font_lib+widthpos1); + if(filled1+width1+1<=32*numberofpanels) + { + word count1=0; + for(count1=0;count1<width1;count1++) + { + dislay[0][filled1]=pgm_read_byte_near(font_lib+datapos1+count1); + (filled1)++; + } + dislay[0][filled1]=0x00; + } + + } + while(filled1<32*numberofpanels) + { + dislay[0][filled1++]=0x00; + } + while(index2!=strlen(msg2)&&filled2<32*numberofpanels) + { + nextchar2=msg2[index2++]; + widthpos2= 6+nextchar2-first_char; + uint16_t sum2=0; + for(int i=0;i<nextchar2-first_char;i++) + { + sum2+= pgm_read_byte_near(font_lib+6+i); + } + datapos2= 6+no_of_char+sum2; + width2=pgm_read_byte_near(font_lib+widthpos2); + if(filled2+width2+1<=32*numberofpanels) + { + word count2=0; + for(count2=0;count2<width2;count2++) + { + dislay[1][filled2]=pgm_read_byte_near(font_lib+datapos2+count2); + (filled2)++; + } + dislay[1][filled2++]=0x00; + } + + } + while(filled2<32*numberofpanels) + { + dislay[1][filled2++]=0x00; + } + +} + + +void LedP10 :: filldisplaydouble() +{ + char nextchar1,nextchar2; + uint16_t widthpos1,width1,datapos1,widthpos2,width2,datapos2; + int no_of_char=pgm_read_byte_near(font_lib+5); + int first_char = pgm_read_byte_near(font_lib+4); + while(filled1<buffersize&&(scroll1>0||always1==1)) + { + if(index1==strlen(msg1)) + { + scroll1--; + index1=0; + nextchar1=' '; + } + else + { + nextchar1=msg1[index1++]; + } + widthpos1= 6+nextchar1-first_char; + uint16_t sum1=0; + for(int i=0;i<nextchar1-first_char;i++) + { + sum1+= pgm_read_byte_near(font_lib+6+i); + } + datapos1= 6+no_of_char+sum1; + width1=pgm_read_byte_near(font_lib+widthpos1); + if(filled1+width1+1<=buffersize) + { + word count1=0; + for(count1=0;count1<width1;count1++) + { + dislay[0][filled1]=pgm_read_byte_near(font_lib+datapos1+count1); + (filled1)++; + } + dislay[0][filled1]=0x00; + (filled1)++; + } + else + { + if(index1>0) + index1--; + else + { + scroll1++; + index1=strlen(msg1); + } + break; + } + } + while(filled2<buffersize&&(scroll2>0||always2==1)) + { + if(index2==strlen(msg2)) + { + scroll2--; + index2=0; + nextchar2=' '; + } + else + { + nextchar2=msg2[index2++]; + } + widthpos2= 6+nextchar2-first_char; + uint16_t sum2=0; + for(int i=0;i<nextchar2-first_char;i++) + { + sum2+= pgm_read_byte_near(font_lib+6+i); + } + datapos2= 6+no_of_char+sum2; + width2=pgm_read_byte_near(font_lib+widthpos2); + if(filled2+width2+1<=buffersize) + { + word count2=0; + for(count2=0;count2<width2;count2++) + { + dislay[1][filled2]=pgm_read_byte_near(font_lib+datapos2+count2); + (filled2)++; + } + dislay[1][filled2]=0x00; + (filled2)++; + } + else + { + if(index2>0) + index2--; + else + { + index2=strlen(msg2); + scroll2++; + } + break; + } + } +} + +void LedP10 :: slide() +{ + int i; + if(speed1!=0) + { + speedcount1++; + if(speedcount1==30/speed1) + { + speedcount1=0; + for(i=0;i<buffersize-1 ;i++) + { + dislay[0][i]= dislay[0][i+1]; + } + filled1--; + } + } + if(speed2!=0) + { + speedcount2++; + if(speedcount2==30/speed2) + { + speedcount2=0; + for(i=0;i<buffersize-1 ;i++) + { + dislay[1][i]= dislay[1][i+1]; + } + filled2--; + } + } + + //if(speed1==speed2&&speed1!=0) + filled--; +} + +void LedP10 ::slidesingle() +{ + int i; + if(speed!=0) + { + speedcount++; + if(speedcount==30/speed) + { + speedcount=0; + for(i=0;i<buffersize-1 ;i++) + { + dislay[0][i]= dislay[0][i+1]; + dislay[1][i]= dislay[1][i+1]; + } + filled--; + } + } + else + { + speedcount++; + if(speedcount==30/speed) + { + speedcount=0; + for(i=0;i<buffersize-1 ;i++) + { + dislay[0][i]= dislay[0][i]; + dislay[1][i]= dislay[1][i]; + } + filled--; + } + } +} +void LedP10 :: showgroup(int p,int q) +{ + int i,j,k,row,col,byt; + byte temp,data=0x00; + for(col=0;col<4*numberofpanels;col++) + { + row=12+p+2*q; + byt=row/8; + for(i=0;i<4;i++) + { + data=0x00; + for(k=0;k<8;k++) + { + data=data<<1; + temp=0x01; + temp&=(dislay[row/8][8*col+k]>>(row%8)); + data|=temp; + } + row-=4; + byt=row/8; + SPI.transfer(~data); + } + } + digitalWrite(outputenablepin,LOW); + LedP10 ::store(); +} + +void LedP10 :: showmsg_single_scroll(char msg_[],int no_of_times, int speed_, int font_) +{ + if(font_==0) + font_lib=Arial_Black_16; + else if(font_==1) + font_lib=Arial_14; + scroll= no_of_times; + msg=msg_; + speed=speed_; + speed1=speed; + speed2=speed; + speedcount1=0; + speedcount2=0; + font=font_; + if(no_of_times<0) + always=1; + else + always=0; + Timer1.initialize(100); + Timer1.attachInterrupt(callback4); +} + + + + void LedP10 :: callback() +{ + digitalWrite(outputenablepin,LOW); + LedP10 ::filldisplaysingle_static(); + LedP10 ::showone(); + +} + void LedP10 :: callback2() +{ + digitalWrite(outputenablepin,LOW); + LedP10 ::filldisplaydouble_static(); + LedP10 ::showone(); + +} +void LedP10 :: showone() +{ + if(x==0&&y==0) + { + LedP10 ::showgroup(0,0); + digitalWrite(a,LOW); + digitalWrite(b,LOW); + analogWrite(outputenablepin, brightness); + x=1;y=0; + } + else if(x==1&&y==0) + { + LedP10 ::showgroup(1,0); + digitalWrite(a,HIGH); + digitalWrite(b,LOW); + analogWrite(outputenablepin,brightness); + x=0;y=1; + } + else if(x==0&&y==1) + { + LedP10 ::showgroup(0,1); + digitalWrite(a,LOW); + digitalWrite(b,HIGH); + analogWrite(outputenablepin,brightness); + x=1;y=1; + } + else if(x==1&&y==1) + { + LedP10 ::showgroup(1,1); + digitalWrite(a,HIGH); + digitalWrite(b,HIGH); + analogWrite(outputenablepin, brightness); + x=0;y=0; + } +} +void LedP10 :: showmsg_single_static(long int msg_,int font_) +{ + String thisString1 = String(msg_); + thisString1.toCharArray(sts_dis,thisString1.length()+1); + //free(&thisString1); + //showmsg_single_static(newmsg1,font_); + digitalWrite(outputenablepin,LOW); + Timer1.stop(); + if(font_==0) + font_lib=Arial_Black_16; + else if(font_==1) + font_lib=Arial_14; + msg=sts_dis; + font=font_; + filled=0; + Timer1.initialize(5500); + Timer1.attachInterrupt(callback); + LedP10 ::filldisplaysingle_static(); +} + + + +void LedP10 :: showmsg_single_static(char msg_[],int font_) +{ + digitalWrite(outputenablepin,LOW); + Timer1.stop(); + if(font_==0) + font_lib=Arial_Black_16; + else if(font_==1) + font_lib=Arial_14; + msg=msg_; + font=font_; + filled=0; + Timer1.initialize(5500); + Timer1.attachInterrupt(callback); + LedP10 ::filldisplaysingle_static(); +} +void LedP10 :: showmsg_double_static(long int msg1_,long int msg2_,int font_) +{ + String thisString1 = String(msg1_); + thisString1.toCharArray(sts_dis1,thisString1.length()+1); + String thisString2 = String(msg2_); + thisString2.toCharArray(sts_dis2,thisString2.length()+1); + showmsg_double_static(sts_dis1,sts_dis2, font_); +} + +void LedP10 :: showmsg_double_static(long int msg1_,char msg2_[],int font_) +{ + String thisString1 = String(msg1_); + thisString1.toCharArray(sts_dis1,thisString1.length()+1); + + showmsg_double_static(sts_dis1,msg2_, font_); +} + +void LedP10 :: showmsg_double_static(char msg1_[],long int msg2_,int font_) +{ + String thisString2 = String(msg2_); + thisString2.toCharArray(sts_dis2,thisString2.length()+1); + showmsg_double_static(msg1_,sts_dis2, font_); +} +void LedP10 :: showmsg_double_static(char msg1_[],char msg2_[],int font_) +{ + digitalWrite(outputenablepin,LOW); + Timer1.stop(); + if(font_==0) + font_lib=font_lib=Led_half_1; + else if(font_==1) + {} + msg1=msg1_; + msg2=msg2_; + font=font_; + filled1=0; + filled2=0; + Timer1.initialize(6500); + Timer1.attachInterrupt(callback2); + LedP10 ::filldisplaydouble_static(); +} +void LedP10 :: callback3() +{ + + LedP10 ::showone(); + if(x==1&&y==1) + LedP10 ::slide(); + LedP10 ::filldisplaydouble(); + + if(filled1==0&&filled2==0&&scroll1==0&&scroll2==0) + { + digitalWrite(outputenablepin,LOW); + Timer1.stop(); + } +} +void LedP10 :: callback4() +{ + + LedP10 ::showone(); + if(x==1&&y==1) + { + LedP10 ::slidesingle(); + } + + filldisplaysingle(); + + if(filled==0&&scroll==0) + { + digitalWrite(outputenablepin,LOW); + Timer1.stop(); + } +} +void LedP10 :: showmsg_double_scroll(char msg1_[],char msg2_[],int no_of_times1,int no_of_times2, int speed1_,int speed2_, int font_) +{ + if(font_==0) + font_lib=font_lib=Led_half_1; + else if(font_==1) + {} + msg1=msg1_; + msg2=msg2_; + speed1=speed1_; + speed2=speed2_; + font=font_; + scroll1= no_of_times1; + scroll2= no_of_times2; + if(scroll1<0) + always1=1; + else + always1=0; + if(scroll2<0) + always2=1; + else + always2=0; + LedP10 ::filldisplaydouble(); + Timer1.initialize(100); + Timer1.attachInterrupt(callback3); +} + +void LedP10 :: setbrightness(uint8_t brightness_) +{ + brightness=brightness_; +}