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:
Tue Nov 16 16:56:04 2010 +0000
Revision:
1:fb1109a73ce9
Parent:
0:3aa62049d1de
Delete debug print at the message sending.

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