P10
Diff: LED_P10.cpp
- Revision:
- 0:3d89509fadb7
diff -r 000000000000 -r 3d89509fadb7 LED_P10.cpp
--- /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_;
+}