This library is for the control of NJE-105/106. (which is the digital signage device made by Nagano Japan Radio Co., Ltd.)

Dependents:   NJE10XCtrlSample TrainInfoSample

Committer:
rinosh2
Date:
Sun Nov 14 15:56:52 2010 +0000
Revision:
0:3aa62049d1de
Child:
1:fb1109a73ce9

        

Who changed what in which revision?

UserRevisionLine numberNew contents of line
rinosh2 0:3aa62049d1de 1 #include "NJE10XCtrl.h"
rinosh2 0:3aa62049d1de 2
rinosh2 0:3aa62049d1de 3 ////////////////////////////////////////////////////////////////////////////////
rinosh2 0:3aa62049d1de 4 // Local funcs
rinosh2 0:3aa62049d1de 5
rinosh2 0:3aa62049d1de 6 static bool myputc(Serial& port, int ch){
rinosh2 0:3aa62049d1de 7 while(!port.writeable());
rinosh2 0:3aa62049d1de 8 return port.putc(ch) != EOF;
rinosh2 0:3aa62049d1de 9 }
rinosh2 0:3aa62049d1de 10
rinosh2 0:3aa62049d1de 11 static bool myputs(Serial& port, const char* str, size_t len){
rinosh2 0:3aa62049d1de 12 while(len--){
rinosh2 0:3aa62049d1de 13 if(!myputc(port, *str++)) return false;
rinosh2 0:3aa62049d1de 14 }
rinosh2 0:3aa62049d1de 15 return true;
rinosh2 0:3aa62049d1de 16 }
rinosh2 0:3aa62049d1de 17
rinosh2 0:3aa62049d1de 18 static int myCheckMsg(const char*& msg, const char* buf, int size){
rinosh2 0:3aa62049d1de 19 if(msg) return strlen(msg);
rinosh2 0:3aa62049d1de 20 msg = buf;
rinosh2 0:3aa62049d1de 21 return size;
rinosh2 0:3aa62049d1de 22 }
rinosh2 0:3aa62049d1de 23
rinosh2 0:3aa62049d1de 24 static char GetAttr1Char(NJE10XCtrl::Attr1 a1){
rinosh2 0:3aa62049d1de 25 return (char(a1) & 3) + 'A';
rinosh2 0:3aa62049d1de 26
rinosh2 0:3aa62049d1de 27 }
rinosh2 0:3aa62049d1de 28
rinosh2 0:3aa62049d1de 29 static char GetAttr2Char(NJE10XCtrl::Attr2 a2, NJE10XCtrl::Attr3 a3){
rinosh2 0:3aa62049d1de 30 const char A2[4] = {'A', 'E', 'I', 'W'};
rinosh2 0:3aa62049d1de 31 return A2[a2 & 3] + (a3 & 3);
rinosh2 0:3aa62049d1de 32 }
rinosh2 0:3aa62049d1de 33
rinosh2 0:3aa62049d1de 34 ////////////////////////////////////////////////////////////////////////////////
rinosh2 0:3aa62049d1de 35 // NJE10XCtrl class
rinosh2 0:3aa62049d1de 36 NJE10XCtrl::NJE10XCtrl(PinName tx_pin, PinName rx_pin) : m_port(tx_pin, rx_pin), m_size(0) {
rinosh2 0:3aa62049d1de 37 m_port.baud(9600);
rinosh2 0:3aa62049d1de 38 m_port.format(8, Serial::None, 1);
rinosh2 0:3aa62049d1de 39 m_buf[0] = 0;
rinosh2 0:3aa62049d1de 40 }
rinosh2 0:3aa62049d1de 41
rinosh2 0:3aa62049d1de 42 NJE10XCtrl::~NJE10XCtrl(){
rinosh2 0:3aa62049d1de 43 }
rinosh2 0:3aa62049d1de 44
rinosh2 0:3aa62049d1de 45 ////////////////////////////////////////////////////////////////////////////////
rinosh2 0:3aa62049d1de 46 // NJE10XCtrl private funcs
rinosh2 0:3aa62049d1de 47
rinosh2 0:3aa62049d1de 48 const char NJE_DATA_HEAD[10] = {
rinosh2 0:3aa62049d1de 49 0x0d, 0x0a, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01
rinosh2 0:3aa62049d1de 50 };
rinosh2 0:3aa62049d1de 51
rinosh2 0:3aa62049d1de 52 NJE10XCtrl::Status NJE10XCtrl::sendCmd(const char * str, int size){
rinosh2 0:3aa62049d1de 53
rinosh2 0:3aa62049d1de 54 char buf[128];
rinosh2 0:3aa62049d1de 55 memcpy(buf, str, size);
rinosh2 0:3aa62049d1de 56 buf[size] = 0;
rinosh2 0:3aa62049d1de 57 printf("Send '%s'\n", buf);
rinosh2 0:3aa62049d1de 58
rinosh2 0:3aa62049d1de 59 if( myputs(m_port, NJE_DATA_HEAD, sizeof(NJE_DATA_HEAD)) &&
rinosh2 0:3aa62049d1de 60 myputs(m_port, str, size) &&
rinosh2 0:3aa62049d1de 61 myputs(m_port, NJE_DATA_HEAD, 2)){
rinosh2 0:3aa62049d1de 62 return S_OK;
rinosh2 0:3aa62049d1de 63 }
rinosh2 0:3aa62049d1de 64 return S_WRITE_FAILED;
rinosh2 0:3aa62049d1de 65 }
rinosh2 0:3aa62049d1de 66
rinosh2 0:3aa62049d1de 67 NJE10XCtrl::Status NJE10XCtrl::sendCmd(const char * str){
rinosh2 0:3aa62049d1de 68 return sendCmd(str, strlen(str));
rinosh2 0:3aa62049d1de 69 };
rinosh2 0:3aa62049d1de 70
rinosh2 0:3aa62049d1de 71
rinosh2 0:3aa62049d1de 72 // Append Str/Attr to the internal buffer ///////////////////////////////////////
rinosh2 0:3aa62049d1de 73
rinosh2 0:3aa62049d1de 74 NJE10XCtrl::Status NJE10XCtrl::add(char ch){
rinosh2 0:3aa62049d1de 75 // TODO: Escape command ( '~', "NJE...")
rinosh2 0:3aa62049d1de 76 if(m_size >= MAX_DATA_BUF) return S_BUFFER_OVERFLOW;
rinosh2 0:3aa62049d1de 77 m_buf[m_size++] = ch;
rinosh2 0:3aa62049d1de 78 m_buf[m_size] = 0;
rinosh2 0:3aa62049d1de 79 return S_OK;
rinosh2 0:3aa62049d1de 80 }
rinosh2 0:3aa62049d1de 81
rinosh2 0:3aa62049d1de 82 NJE10XCtrl::Status NJE10XCtrl::add(const char* str){
rinosh2 0:3aa62049d1de 83 while(*str) if(add(*str++)) return S_BUFFER_OVERFLOW;
rinosh2 0:3aa62049d1de 84 return S_OK;
rinosh2 0:3aa62049d1de 85 }
rinosh2 0:3aa62049d1de 86
rinosh2 0:3aa62049d1de 87 NJE10XCtrl::Status NJE10XCtrl::addAttr(Attr1 a1, Attr2 a2, Attr3 a3){
rinosh2 0:3aa62049d1de 88 if( add('~') == S_OK &&
rinosh2 0:3aa62049d1de 89 add(GetAttr1Char(a1)) == S_OK &&
rinosh2 0:3aa62049d1de 90 add(GetAttr2Char(a2, a3)) == S_OK &&
rinosh2 0:3aa62049d1de 91 add('~') == S_OK) return S_OK;
rinosh2 0:3aa62049d1de 92
rinosh2 0:3aa62049d1de 93 return S_BUFFER_OVERFLOW; // faile
rinosh2 0:3aa62049d1de 94 }
rinosh2 0:3aa62049d1de 95 NJE10XCtrl::Status NJE10XCtrl::clear(){
rinosh2 0:3aa62049d1de 96 m_size = 0;
rinosh2 0:3aa62049d1de 97 m_buf[0] = 0;
rinosh2 0:3aa62049d1de 98 return S_OK;
rinosh2 0:3aa62049d1de 99 }
rinosh2 0:3aa62049d1de 100
rinosh2 0:3aa62049d1de 101
rinosh2 0:3aa62049d1de 102 // Set/Del Normal message (01-99) //////////////////////////////////////////////
rinosh2 0:3aa62049d1de 103 NJE10XCtrl::Status NJE10XCtrl::setMessage(int id, const char* msg, Attr1 a1, Attr2 a2, Attr3 a3){
rinosh2 0:3aa62049d1de 104 if(id < 1 || 99 < id) return S_INVALID_ID;
rinosh2 0:3aa62049d1de 105 int len = myCheckMsg(msg, m_buf, m_size);
rinosh2 0:3aa62049d1de 106
rinosh2 0:3aa62049d1de 107 const char CMD[] = "]011A110%02d01010000%c%c%s";
rinosh2 0:3aa62049d1de 108 const int CMD_SIZE = 8 + 2 + 8 + 2;
rinosh2 0:3aa62049d1de 109 if(len > MAX_DATA_BUF - CMD_SIZE) return S_BUFFER_OVERFLOW;
rinosh2 0:3aa62049d1de 110
rinosh2 0:3aa62049d1de 111 char buf[MAX_DATA_BUF];
rinosh2 0:3aa62049d1de 112 char c1 = GetAttr1Char(a1);
rinosh2 0:3aa62049d1de 113 char c2 = GetAttr2Char(a2, a3);
rinosh2 0:3aa62049d1de 114
rinosh2 0:3aa62049d1de 115 return sendCmd(buf, sprintf(buf, CMD, id, c1, c2, msg));
rinosh2 0:3aa62049d1de 116 }
rinosh2 0:3aa62049d1de 117 NJE10XCtrl::Status NJE10XCtrl::delMessage(int id){
rinosh2 0:3aa62049d1de 118 if(id < 1 || 99 < id) return S_INVALID_ID;
rinosh2 0:3aa62049d1de 119
rinosh2 0:3aa62049d1de 120 char buf[MAX_DATA_BUF];
rinosh2 0:3aa62049d1de 121 return sendCmd(buf, sprintf(buf, "]011A210%02d", id));
rinosh2 0:3aa62049d1de 122 }
rinosh2 0:3aa62049d1de 123
rinosh2 0:3aa62049d1de 124 NJE10XCtrl::Status NJE10XCtrl::setTitle(const char* msg){
rinosh2 0:3aa62049d1de 125 int len = myCheckMsg(msg, m_buf, m_size);
rinosh2 0:3aa62049d1de 126
rinosh2 0:3aa62049d1de 127 const char CMD[] = "]011A11000%s";
rinosh2 0:3aa62049d1de 128 const int CMD_SIZE = 8 + 2;
rinosh2 0:3aa62049d1de 129 if(len > MAX_DATA_BUF - CMD_SIZE) return S_BUFFER_OVERFLOW;
rinosh2 0:3aa62049d1de 130
rinosh2 0:3aa62049d1de 131 char buf[MAX_DATA_BUF];
rinosh2 0:3aa62049d1de 132 return sendCmd(buf, sprintf(buf, CMD, msg));
rinosh2 0:3aa62049d1de 133 }
rinosh2 0:3aa62049d1de 134 NJE10XCtrl::Status NJE10XCtrl::delTitle(){
rinosh2 0:3aa62049d1de 135 return sendCmd("]011A210");
rinosh2 0:3aa62049d1de 136 }
rinosh2 0:3aa62049d1de 137
rinosh2 0:3aa62049d1de 138 // Add/Clear free message //////////////////////////////////////////////////////
rinosh2 0:3aa62049d1de 139 NJE10XCtrl::Status NJE10XCtrl::addFreeMessage(const char* msg){
rinosh2 0:3aa62049d1de 140 int len = myCheckMsg(msg, m_buf, m_size);
rinosh2 0:3aa62049d1de 141 return sendCmd(msg, len);
rinosh2 0:3aa62049d1de 142 }
rinosh2 0:3aa62049d1de 143 NJE10XCtrl::Status NJE10XCtrl::clearFreeMessage(){
rinosh2 0:3aa62049d1de 144 return sendCmd("NJEM2");
rinosh2 0:3aa62049d1de 145 }
rinosh2 0:3aa62049d1de 146
rinosh2 0:3aa62049d1de 147 NJE10XCtrl::Status NJE10XCtrl::addFreeCredit(const char* msg){
rinosh2 0:3aa62049d1de 148 int len = myCheckMsg(msg, m_buf, m_size);
rinosh2 0:3aa62049d1de 149
rinosh2 0:3aa62049d1de 150 const char CMD[] = "NJEC1%s";
rinosh2 0:3aa62049d1de 151 const int CMD_SIZE = 5;
rinosh2 0:3aa62049d1de 152
rinosh2 0:3aa62049d1de 153 if(len > MAX_DATA_BUF - CMD_SIZE) return S_BUFFER_OVERFLOW;
rinosh2 0:3aa62049d1de 154
rinosh2 0:3aa62049d1de 155 char buf[MAX_DATA_BUF];
rinosh2 0:3aa62049d1de 156 return sendCmd(buf, sprintf(buf, CMD, msg));
rinosh2 0:3aa62049d1de 157 }
rinosh2 0:3aa62049d1de 158 NJE10XCtrl::Status NJE10XCtrl::clearFreeCredit(){
rinosh2 0:3aa62049d1de 159 return sendCmd("NJEC2");
rinosh2 0:3aa62049d1de 160 }
rinosh2 0:3aa62049d1de 161
rinosh2 0:3aa62049d1de 162 // NJE control commands ////////////////////////////////////////////////////////
rinosh2 0:3aa62049d1de 163
rinosh2 0:3aa62049d1de 164 NJE10XCtrl::Status NJE10XCtrl::reset(){
rinosh2 0:3aa62049d1de 165 return sendCmd("NJER");
rinosh2 0:3aa62049d1de 166 }
rinosh2 0:3aa62049d1de 167
rinosh2 0:3aa62049d1de 168 // NJE show status /////////////////////////////////////////////////////////////
rinosh2 0:3aa62049d1de 169 NJE10XCtrl::Status NJE10XCtrl::showTime(){
rinosh2 0:3aa62049d1de 170 return sendCmd("NJET");
rinosh2 0:3aa62049d1de 171 }
rinosh2 0:3aa62049d1de 172 NJE10XCtrl::Status NJE10XCtrl::showContactCredit(){
rinosh2 0:3aa62049d1de 173 return sendCmd("NJEV1");
rinosh2 0:3aa62049d1de 174 }
rinosh2 0:3aa62049d1de 175 NJE10XCtrl::Status NJE10XCtrl::showNewsCredit(){
rinosh2 0:3aa62049d1de 176 return sendCmd("NJEV2");
rinosh2 0:3aa62049d1de 177 }
rinosh2 0:3aa62049d1de 178 NJE10XCtrl::Status NJE10XCtrl::showFreeCredit(){
rinosh2 0:3aa62049d1de 179 return sendCmd("NJEV3");
rinosh2 0:3aa62049d1de 180 }
rinosh2 0:3aa62049d1de 181
rinosh2 0:3aa62049d1de 182 // NJED commands ///////////////////////////////////////////////////////////////
rinosh2 0:3aa62049d1de 183 NJE10XCtrl::Status NJE10XCtrl::setOpMode(OpMode mode){
rinosh2 0:3aa62049d1de 184 const char CMD[] = "NJES02%02d";
rinosh2 0:3aa62049d1de 185 char buf[MAX_DATA_BUF];
rinosh2 0:3aa62049d1de 186 return sendCmd(buf, sprintf(buf, CMD, mode));
rinosh2 0:3aa62049d1de 187 }
rinosh2 0:3aa62049d1de 188
rinosh2 0:3aa62049d1de 189 NJE10XCtrl::Status NJE10XCtrl::setFreeMode(FreeMode mode){
rinosh2 0:3aa62049d1de 190 const char CMD[] = "NJES05%02d";
rinosh2 0:3aa62049d1de 191 char buf[MAX_DATA_BUF];
rinosh2 0:3aa62049d1de 192 return sendCmd(buf, sprintf(buf, CMD, mode));
rinosh2 0:3aa62049d1de 193 }
rinosh2 0:3aa62049d1de 194
rinosh2 0:3aa62049d1de 195 NJE10XCtrl::Status NJE10XCtrl::setScrollSpeed(ScrollSpeed speed){
rinosh2 0:3aa62049d1de 196 const char CMD[] = "NJES06%02d";
rinosh2 0:3aa62049d1de 197 char buf[MAX_DATA_BUF];
rinosh2 0:3aa62049d1de 198 return sendCmd(buf, sprintf(buf, CMD, speed));
rinosh2 0:3aa62049d1de 199 }
rinosh2 0:3aa62049d1de 200
rinosh2 0:3aa62049d1de 201 NJE10XCtrl::Status NJE10XCtrl::setBlinkSpeed(BlinkSpeed speed){
rinosh2 0:3aa62049d1de 202 const char CMD[] = "NJES07%02d";
rinosh2 0:3aa62049d1de 203 char buf[MAX_DATA_BUF];
rinosh2 0:3aa62049d1de 204 return sendCmd(buf, sprintf(buf, CMD, speed));
rinosh2 0:3aa62049d1de 205 }
rinosh2 0:3aa62049d1de 206
rinosh2 0:3aa62049d1de 207 NJE10XCtrl::Status NJE10XCtrl::setStopTime(int sec){
rinosh2 0:3aa62049d1de 208 if(sec > 10) return S_INVALID_PARAM;
rinosh2 0:3aa62049d1de 209 const char CMD[] = "NJES08%02d";
rinosh2 0:3aa62049d1de 210 char buf[MAX_DATA_BUF];
rinosh2 0:3aa62049d1de 211 return sendCmd(buf, sprintf(buf, CMD, sec));
rinosh2 0:3aa62049d1de 212 }