WS2822S

Committer:
zgtk_r
Date:
Tue Mar 13 14:25:02 2018 +0000
Revision:
0:2fc093733833
for WS2822S

Who changed what in which revision?

UserRevisionLine numberNew contents of line
zgtk_r 0:2fc093733833 1 #include "WS2822S.h"
zgtk_r 0:2fc093733833 2
zgtk_r 0:2fc093733833 3 // 送信データの先頭
zgtk_r 0:2fc093733833 4 void WS2822S_Ctrl::PutDataHeader(int MTBP, int BREAK, int MAB, DigitalOut* pin, bool AddressHigh/* = false*/)
zgtk_r 0:2fc093733833 5 {
zgtk_r 0:2fc093733833 6 *pin = 1;
zgtk_r 0:2fc093733833 7 wait_us(MTBP);
zgtk_r 0:2fc093733833 8 *pin = 0;
zgtk_r 0:2fc093733833 9 wait_us(BREAK);
zgtk_r 0:2fc093733833 10 *pin = 1;
zgtk_r 0:2fc093733833 11 wait_us(MAB);
zgtk_r 0:2fc093733833 12
zgtk_r 0:2fc093733833 13 if(AddressHigh){
zgtk_r 0:2fc093733833 14 AddressPin = 1;
zgtk_r 0:2fc093733833 15 }
zgtk_r 0:2fc093733833 16 // SC
zgtk_r 0:2fc093733833 17 DataPut8(0, pin);
zgtk_r 0:2fc093733833 18 }
zgtk_r 0:2fc093733833 19
zgtk_r 0:2fc093733833 20 // 色情報かアドレス情報の先頭を出力する
zgtk_r 0:2fc093733833 21 void WS2822S_Ctrl::PutDataHeader(bool AddressHeader/*=false*/)
zgtk_r 0:2fc093733833 22 {
zgtk_r 0:2fc093733833 23 if(!AddressHeader)
zgtk_r 0:2fc093733833 24 {
zgtk_r 0:2fc093733833 25 PutDataHeader(C_MTBP, C_BREAK, C_MAB, &ColorPin,true);
zgtk_r 0:2fc093733833 26 }
zgtk_r 0:2fc093733833 27 else
zgtk_r 0:2fc093733833 28 {
zgtk_r 0:2fc093733833 29 PutDataHeader(A_MTBP, A_BREAK, A_MAB, &AddressPin);
zgtk_r 0:2fc093733833 30 }
zgtk_r 0:2fc093733833 31 }
zgtk_r 0:2fc093733833 32
zgtk_r 0:2fc093733833 33 // 8bitのデータを出力する
zgtk_r 0:2fc093733833 34 void WS2822S_Ctrl::DataPut8(uint8_t data, DigitalOut* pin)
zgtk_r 0:2fc093733833 35 {
zgtk_r 0:2fc093733833 36 // MTBF
zgtk_r 0:2fc093733833 37 *pin = 0;
zgtk_r 0:2fc093733833 38 wait_us(2);
zgtk_r 0:2fc093733833 39 for(int i = 0; i < 8; i++)
zgtk_r 0:2fc093733833 40 {
zgtk_r 0:2fc093733833 41 if(((data & (1 << i)) != 0x00)){
zgtk_r 0:2fc093733833 42 *pin = 1;
zgtk_r 0:2fc093733833 43 }else{
zgtk_r 0:2fc093733833 44 *pin = 0;
zgtk_r 0:2fc093733833 45 }
zgtk_r 0:2fc093733833 46
zgtk_r 0:2fc093733833 47 wait_us(1);
zgtk_r 0:2fc093733833 48 }
zgtk_r 0:2fc093733833 49 *pin = 1;
zgtk_r 0:2fc093733833 50 wait_us(STOP_BIT);
zgtk_r 0:2fc093733833 51 }
zgtk_r 0:2fc093733833 52
zgtk_r 0:2fc093733833 53 // コンストラクタ
zgtk_r 0:2fc093733833 54 WS2822S_Ctrl::WS2822S_Ctrl(PinName ColorPinName, PinName AddressPinName, int PixcelNum)
zgtk_r 0:2fc093733833 55 : ColorPin(ColorPinName)
zgtk_r 0:2fc093733833 56 , AddressPin(AddressPinName)
zgtk_r 0:2fc093733833 57 , PixcelNum(PixcelNum)
zgtk_r 0:2fc093733833 58 {
zgtk_r 0:2fc093733833 59 Display = new uint8_t*[PixcelNum];
zgtk_r 0:2fc093733833 60 for(int i = 0; i < PixcelNum; i++)
zgtk_r 0:2fc093733833 61 {
zgtk_r 0:2fc093733833 62 Display[i] = new uint8_t[3];
zgtk_r 0:2fc093733833 63 }
zgtk_r 0:2fc093733833 64 }
zgtk_r 0:2fc093733833 65 // デストラクタ
zgtk_r 0:2fc093733833 66 WS2822S_Ctrl::~WS2822S_Ctrl()
zgtk_r 0:2fc093733833 67 {
zgtk_r 0:2fc093733833 68 for(int i = 0; i < PixcelNum; i++)
zgtk_r 0:2fc093733833 69 {
zgtk_r 0:2fc093733833 70 delete[] Display[i];
zgtk_r 0:2fc093733833 71 }
zgtk_r 0:2fc093733833 72 delete[] Display;
zgtk_r 0:2fc093733833 73 }
zgtk_r 0:2fc093733833 74
zgtk_r 0:2fc093733833 75 // 色を設定する
zgtk_r 0:2fc093733833 76 void WS2822S_Ctrl::SetColor(int pos, uint8_t R, uint8_t G, uint8_t B)
zgtk_r 0:2fc093733833 77 {
zgtk_r 0:2fc093733833 78 if(pos >= PixcelNum || pos < 0)
zgtk_r 0:2fc093733833 79 {
zgtk_r 0:2fc093733833 80 return;
zgtk_r 0:2fc093733833 81 }
zgtk_r 0:2fc093733833 82
zgtk_r 0:2fc093733833 83 Display[pos][0] = B;
zgtk_r 0:2fc093733833 84 Display[pos][1] = G;
zgtk_r 0:2fc093733833 85 Display[pos][2] = R;
zgtk_r 0:2fc093733833 86 }
zgtk_r 0:2fc093733833 87 // 設定された色を削除する
zgtk_r 0:2fc093733833 88 void WS2822S_Ctrl::ClearColor(uint8_t R, uint8_t G, uint8_t B)
zgtk_r 0:2fc093733833 89 {
zgtk_r 0:2fc093733833 90 for(int i = 0; i < PixcelNum; i++)
zgtk_r 0:2fc093733833 91 {
zgtk_r 0:2fc093733833 92 SetColor(i,R,G,B);
zgtk_r 0:2fc093733833 93 }
zgtk_r 0:2fc093733833 94 }
zgtk_r 0:2fc093733833 95
zgtk_r 0:2fc093733833 96 // 設定したデータを出力する
zgtk_r 0:2fc093733833 97 void WS2822S_Ctrl::OutputData()
zgtk_r 0:2fc093733833 98 {
zgtk_r 0:2fc093733833 99 // B > G > R
zgtk_r 0:2fc093733833 100 PutDataHeader();
zgtk_r 0:2fc093733833 101 AddressPin = 1;
zgtk_r 0:2fc093733833 102 for(int i = 0; i < PixcelNum; i++){
zgtk_r 0:2fc093733833 103 DataPut8(Display[i][0], &ColorPin);
zgtk_r 0:2fc093733833 104 DataPut8(Display[i][1], &ColorPin);
zgtk_r 0:2fc093733833 105 DataPut8(Display[i][2], &ColorPin);
zgtk_r 0:2fc093733833 106 }
zgtk_r 0:2fc093733833 107 }
zgtk_r 0:2fc093733833 108
zgtk_r 0:2fc093733833 109 void WS2822S_Ctrl::OutputAddress()
zgtk_r 0:2fc093733833 110 {
zgtk_r 0:2fc093733833 111 ColorPin = 1;
zgtk_r 0:2fc093733833 112 PutDataHeader(true);
zgtk_r 0:2fc093733833 113 for(int tmp1 = 1; tmp1 < PixcelNum * 3; tmp1+=3){
zgtk_r 0:2fc093733833 114
zgtk_r 0:2fc093733833 115 //セットするアドレスを用意 32uS
zgtk_r 0:2fc093733833 116 uint8_t tmp_data = tmp1;
zgtk_r 0:2fc093733833 117 DataPut8(tmp_data, &AddressPin);
zgtk_r 0:2fc093733833 118
zgtk_r 0:2fc093733833 119 //セットするアドレスによってブロック番号を変える
zgtk_r 0:2fc093733833 120 int temp = 0;
zgtk_r 0:2fc093733833 121 int channel = tmp1;
zgtk_r 0:2fc093733833 122 if (channel >= 0 && channel < 256)
zgtk_r 0:2fc093733833 123 temp = 0xF0;//0x0F; //0xF0 -> 0b11110000 -reverse order-> 0b00001111 -> 0x0F
zgtk_r 0:2fc093733833 124 else if (channel >= 256 && channel < 512)
zgtk_r 0:2fc093733833 125 temp = 0xE1;//0x87; //0xE1 -> 0b11100001 -reverse order-> 0b10000111 -> 0x87
zgtk_r 0:2fc093733833 126 else if (channel >= 512 && channel < 768)
zgtk_r 0:2fc093733833 127 temp = 0xD2;//0x4B; //0xD2 -> 0b11010010 -reverse order-> 0b01001011 -> 0x4B
zgtk_r 0:2fc093733833 128 else if (channel >= 768 && channel < 1024)
zgtk_r 0:2fc093733833 129 temp = 0xC3;//0xC3; //0xC3 -> 0b11000011 -reverse order-> 0b11000011 -> 0xC3
zgtk_r 0:2fc093733833 130 else if (channel >= 1024 && channel < 1280)
zgtk_r 0:2fc093733833 131 temp = 0xB4;//0x2D; //0xB4 -> 0b10110100 -reverse order-> 0b00101101 -> 0x2D
zgtk_r 0:2fc093733833 132 else if (channel >= 1280 && channel < 1536)
zgtk_r 0:2fc093733833 133 temp = 0xA5;//0xA5; //0xA5 -> 0b10100101 -reverse order-> 0b10100101 -> 0xA5
zgtk_r 0:2fc093733833 134 else if (channel >= 1536 && channel < 1792)
zgtk_r 0:2fc093733833 135 temp = 0x96;//0x69; //0x96 -> 0b10010110 -reverse order-> 0b01101001 -> 0x69
zgtk_r 0:2fc093733833 136 else if (channel >= 1792 && channel < 2048)
zgtk_r 0:2fc093733833 137 temp = 0x87;//0xE1; //0x87 -> 0b10000111 -reverse order-> 0b11100001 -> 0xE1
zgtk_r 0:2fc093733833 138 else if (channel >= 2048 && channel < 2304)
zgtk_r 0:2fc093733833 139 temp = 0x78;//0x1E; //0x78 -> 0b01111000 -reverse order-> 0b00011110 -> 0x1E
zgtk_r 0:2fc093733833 140 else if (channel >= 2304 && channel < 2560)
zgtk_r 0:2fc093733833 141 temp = 0x69;//0x96; //0x69 -> 0b01101001 -reverse order-> 0b10010110 -> 0x96
zgtk_r 0:2fc093733833 142 else if (channel >= 2560 && channel < 2816)
zgtk_r 0:2fc093733833 143 temp = 0x5A;//0x5A; //0x5A -> 0b01011010 -reverse order-> 0b01011010 -> 0x5A
zgtk_r 0:2fc093733833 144 else if (channel >= 2816 && channel < 3072)
zgtk_r 0:2fc093733833 145 temp = 0x4B;//0xD2; //0x4B -> 0b01001011 -reverse order-> 0b11010010 -> 0xD2
zgtk_r 0:2fc093733833 146 DataPut8(temp, &AddressPin);
zgtk_r 0:2fc093733833 147
zgtk_r 0:2fc093733833 148 //アドレス書込み時の定数
zgtk_r 0:2fc093733833 149 tmp_data = 0xD2;
zgtk_r 0:2fc093733833 150 DataPut8(tmp_data, &AddressPin);
zgtk_r 0:2fc093733833 151 }
zgtk_r 0:2fc093733833 152
zgtk_r 0:2fc093733833 153 }