Novo

Dependencies:   mbed

Fork of LukaIElmir by tim003 tim003

Revision:
6:dd675b967b60
Parent:
5:654e3398c1ef
--- a/DotMatrix.h	Mon May 26 18:28:21 2014 +0000
+++ b/DotMatrix.h	Mon Jun 02 15:35:11 2014 +0000
@@ -1,20 +1,89 @@
 #include "mbed.h"
 #include "MatrixSPI.h"
 #include <string>
-#include <vector>
-#include "Znak.h"
+
 #ifndef DOTMATRIX_H
 #define DOTMATRIX_H
 
 enum ModPrikazivanja{scroll, char_by_char, live_input};
+const char znakovi[66][6] =
+{
+    {0, 0x7e, 0x11, 0x11, 0x7e, 0},//A
+    {0, 0x7e, 0x49, 0x49, 0x36, 0}, //B
+    {0, 0x3e, 0x41, 0x41, 0x22, 0}, //C
+    {0, 0x7f, 0x41, 0x41, 0x3e, 0}, //D
+    {0, 0x7f, 0x49, 0x49, 0x41, 0}, //E
+    {0, 0x7f, 0x09, 0x09, 0x01, 0}, //F
+    {0x3e, 0x41, 0x51, 0x32, 0x70, 0}, //G
+    {0, 0x7f, 0x08, 0x08, 0x7f, 0}, //H
+    {0, 0x41, 0x7f, 0x41, 0, 0}, //I
+    {0, 0x21, 0x41, 0x41, 0x3f, 0}, //J
+    {0, 0x7f, 0x08, 0x14, 0x63, 0}, //K
+    {0, 0x7f, 0x40, 0x40, 0x40, 0}, //L
+    {0x7f, 0x02, 0x0c, 0x02, 0x7f, 0}, //M
+    {0x7f, 0x04, 0x08, 0x10, 0x7f, 0}, //N
+    {0, 0x3e, 0x41, 0x41, 0x3e, 0}, //O
+    {0, 0x7f, 0x09, 0x09, 0x06, 0}, //P
+    {0x3e, 0x41, 0x51, 0x3e, 0x40, 0}, //Q
+    {0, 0x7f, 0x09, 0x09, 0x76, 0}, //R
+    {0, 0x26, 0x89, 0x89, 0x32, 0}, //S
+    {0x03, 0x01, 0x7f, 0x01, 0x03, 0},  //T
+    {0x1f, 0x20, 0x40, 0x40, 0x20, 0x1f},  //U
+    {0x1f, 0x20, 0x40, 0x20, 0x1f, 0}, //V
+    {0x3f, 0x40, 0x38, 0x40, 0x3f, 0}, //W
+    {0x63, 0x14, 0x08, 0x14, 0x63, 0}, //X
+    {0x07, 0x08, 0x70, 0x08, 0x07, 0}, //Y
+    {0x61, 0x51, 0x49, 0x45, 0x43, 0}, //Z
+    {0, 0x20, 0x54, 0x54, 0x78, 0}, //a
+    {0, 0x7f, 0x44, 0x44, 0x38, 0}, //b
+    {0, 0x38, 0x44, 0x44, 0x28, 0}, //c
+    {0, 0x38, 0x44, 0x44, 0x7f, 0}, //d
+    {0, 0x38, 0x54, 0x54, 0x18, 0}, //e
+    {0, 0xf8, 0x24, 0x24, 0x08, 0}, //f
+    {0, 0x98, 0xa4, 0xa4, 0x78, 0}, //g
+    {0, 0x7f, 0x04, 0x04, 0x78, 0}, //h
+    {0, 0x44, 0x7d, 0x40, 0, 0}, //i
+    {0, 0x40, 0x80, 0x88, 0x7a, 0}, //j
+    {0, 0x7f, 0x10, 0x28, 0x44, 0}, //k
+    {0, 0x41, 0x7f, 0x40, 0, 0}, //l
+    {0x7c, 0x04, 0x7c, 0x04, 0x78, 0}, //m
+    {0, 0x7c, 0x04, 0x04, 0x78, 0}, //n
+    {0, 0x38, 0x44, 0x44, 0x38, 0}, //o
+    {0, 0xfc, 0x24, 0x24, 0x18, 0}, //p
+    {0, 0x18, 0x24, 0x24, 0xfc, 0}, //q
+    {0, 0x7c, 0x08, 0x04, 0x04, 0}, //r
+    {0, 0x48, 0x54, 0x54, 0x24, 0}, //s
+    {0, 0x04, 0x3f, 0x44, 0, 0}, //t
+    {0, 0x3c, 0x40, 0x40, 0x7c, 0}, //u
+    {0x1c, 0x20, 0x40, 0x20, 0x1c, 0}, //v
+    {0x1c, 0x20, 0x10, 0x20, 0x1c, 0}, //w
+    {0x44, 0x28, 0x10, 0x28, 0x44, 0}, //x
+    {0, 0x9c, 0xa0, 0xa0, 0x7c, 0}, //y
+    {0x44, 0x64, 0x54, 0x4c, 0x44, 0}, //z
+    {0x3e, 0x51, 0x49, 0x45, 0x3e, 0}, //0
+    {0, 0x42, 0x7f, 0x40, 0, 0}, //1
+    {0x42, 0x61, 0x51, 0x49, 0x46, 0}, //2
+    {0, 0x22, 0x41, 0x49, 0x36, 0}, //3
+    {0x08, 0x0c, 0x0a, 0x7c, 0x08, 0}, //4
+    {0, 0x27, 0x45, 0x45, 0x39, 0}, //5
+    {0, 0x3e, 0x49, 0x49, 0x32, 0}, //6
+    {0x63, 0x11, 0x09, 0x05, 0x03, 0}, //7
+    {0, 0x36, 0x49, 0x49, 0x36, 0}, //8
+    {0, 0x26, 0x49, 0x49, 0x3e, 0}, //9
+    {0, 0xb0, 0x70, 0, 0, 0}, //,
+    {0, 0x60, 0x60, 0, 0, 0}, //.
+    {0x10,0x27,0x40,0x40,0x27,0x10}, // :-)
+    {0,0,0,0,0,0} // prazno
+};
 
 class DotMatrix{
     
 public:
     DotMatrix(PinName data_input = dp2, PinName clock = dp6, PinName loadcs = dp24)
     :spi(data_input, clock, loadcs), turnedON(false), mod(scroll), char_trenutni(0),
-    char_offset(0), repeat(true), brzina_ms(1000)
-    {
+    char_offset(0), repeat(true), brzina_ms(1000), isAttached(false)
+    {    
+        recenica = "Kokolo moje jedino.";  
         for(int i = 0; i < 8; i++) buffer[i] = 0;
     }
     
@@ -24,7 +93,9 @@
     void turnON();
     void turnOFF();
     void PromijeniRecenicu(string recenica){
-        this->recenica =  recenica;
+        this->recenica =  " " + recenica;
+        char_trenutni = 0;
+        char_offset = 0;
     }
     void NadodajNaRecenicu(char c){
         recenica += c;   
@@ -49,65 +120,165 @@
         return repeat;   
     }
     
-    void inicijaliziraj(){
-        znakovi[0] = Znak(0x7e, 0x11, 0x11, 0x7e);
-        znakovi[1] = Znak(0x7e, 0x49, 0x49, 0x36);
-        znakovi[2] = Znak(0x3e, 0x41, 0x41, 0x22);
-        znakovi[3] = Znak(0x7f, 0x41, 0x41, 0x3e);
-        
-    }
     void setChar(char c, int offset)
     {
-        int index = c - 'A';
+        int index;
+        if(c >= 'A' && c <= 'Z')
+            index = c - 'A';
+        else if(c>= 'a' && c <='z')
+            index = c - 'a' + 26;
+        else if( c>= '0' && c <= '9')
+            index = c - '0' + 52;
+        else if (c== ',')
+            index = 62;
+        else if(c=='.')
+            index = 63;
+        else if(c==' ')
+            index = 65;
+        else
+            index = 64;
+        
         if(offset < 0)
         {
-            for(int i = 0; i < znakovi[index].vel + offset; i++)
+            for(int i = 0; i < 6 + offset; i++)
             {
-                buffer[i] = znakovi[index].niz[i - offset];   
+                buffer[i] = znakovi[index][i - offset];   
             }  
         }   
         else 
         {
-            for(int i = offset; i < 8 && i < znakovi[index].vel + offset; i++)
+            for(int i = offset; i < 8 && i < 6 + offset; i++)
             {
-                buffer[i] = znakovi[index].niz[i - offset];   
+                buffer[i] = znakovi[index][i - offset];   
             }
         }
-        
     }
     
     void displaySingleChar(char c){
-        setChar(c, 2);   
+        setChar(c, 1);   
         refresh();
     }
     
-    int buffer[8];
-    Znak znakovi[4];
-private:
-    void attach();
-    void prikaziScroll(){}
-    void prikaziCBC(){
+      
+    void prikaziScroll(){
         if(char_trenutni == recenica.size()) refresh();
         else {
+            setChar(recenica[char_trenutni], char_offset);
+            if(char_trenutni < recenica.size() - 1)
+                setChar(recenica[char_trenutni + 1], char_offset + 7);
+            
+            if(char_offset < -6){
+                char_offset = 1; // plus 7
+                char_trenutni++;
+            } 
+        }
+        
+        if(char_trenutni >= recenica.size() && repeat)
+            char_trenutni = 0;
+        
+    }
+    void prikaziCBC(){
+        if(char_trenutni == recenica.size()) refresh();
+        else {//ako ne bude valjao refresh ne bude prazno prikazivali... skloniti else i dole >= u > promijeniti
             displaySingleChar(recenica[char_trenutni]);
-            char_trenutni++;
-            if(char_trenutni ==  recenica.size() && repeat)
-            char_trenutni = 0; 
-            
+            char_trenutni++;       
         }
-    }    
+        
+         if(char_trenutni >= recenica.size() && repeat)
+            char_trenutni = 0;  
+    }
+        
+    int brzina_ms;    
+    string recenica;
+    int buffer[8];
+    
+private:
+    void attach();
+    void detach(){
+        if(isAttached) ticker.detach();
+        isAttached = false;   
+    }
+    
     
     MatrixSPI spi;
-    
     bool turnedON;
-    string recenica;
     ModPrikazivanja mod;
     int char_trenutni, char_offset;
     Ticker ticker;
-    //bool isAttached potrebno ako se ticker ne može 2. detachirati... 
+    bool isAttached; 
     bool repeat;
-    int brzina_ms;
 };
 
 
+
+void DotMatrix::refresh(){
+    for(int i = 0; i < 8; i++)
+    {
+        spi.sendCol(i, buffer[i]); 
+        buffer[i] = 0;  
+    }
+}
+
+void DotMatrix::setIntensity(float jacina){
+    if(jacina <= 0){
+        spi.turnOFF();
+        turnedON = false;   
+        
+        
+    } else if(jacina >= 0.98){
+        if(!turnedON){ 
+            spi.turnON();
+            turnedON = true;
+        }
+        
+        spi.sendSingle(MatrixSPI::intensity, 0x0f);
+    } else {
+        if(!turnedON){ 
+            spi.turnON();
+            turnedON = true;
+        }
+        
+        int temp =  jacina*0x0f;
+        spi.sendSingle(MatrixSPI::intensity, temp);
+    } 
+}
+
+void DotMatrix::attach()
+{
+    detach();
+    if(mod == scroll)
+    {
+        isAttached = true;
+        ticker.attach(this, &DotMatrix::prikaziScroll, brzina_ms/8);
+    } else if(mod == char_by_char){
+        isAttached = true;
+        ticker.attach(this, &DotMatrix::prikaziCBC, brzina_ms);
+    }
+}
+
+void DotMatrix::setSpeed_ms(int ms)
+{
+    brzina_ms = ms;
+    ticker.detach();
+    attach();   
+}
+
+void DotMatrix::turnON(){
+    if(!turnedON){
+        spi.turnON();
+        turnedON = true;
+        
+        attach();   
+    }
+}
+
+void DotMatrix::turnOFF(){
+    if(turnedON){
+        spi.turnOFF();
+        turnedON = false;
+        
+        ticker.detach();   
+    }   
+}
+
 #endif //DotMatrix_h
\ No newline at end of file