diff --git a/examples/basic/basic.ino b/examples/basic/basic.ino new file mode 100644 index 0000000..9a1d32a --- /dev/null +++ b/examples/basic/basic.ino @@ -0,0 +1,45 @@ +/* +Zarpli - Tecnología Interactiva +12112021 Alejandro Zárate +https://github.com/zarpli/BrightSign/ + +DESCRIPTION +==================== + +Simple example of the BrightSign library that play a media file +and wait for it to finish to run again. + +The BSuControl Script must be installed in the BrightSign unit +memory unit and must be connected to the Serial1 port. + +https://github.com/zarpli/BSuControl/ + +Media Files for Testing +https://github.com/zarpli/Media/ +*/ + +#include + +// Instantiate a BrightSign object and Attach to Serial1 +BrightSign BS(Serial1); + +void setup(){ + +// Enable debug msg over Serial +BS.debug(); + +Serial.begin(9600); +while(!Serial); + +Serial.println("Waiting BrightSign Power-Up"); +while(!BS.online())BS.update(); + +//Set Volume to 20% +BS.volume(20); +} + +void loop(){ +// Update the BrightSign instance +BS.update(); +if(BS.media_ended()) BS.play("AUDIO.M4A"); +} diff --git a/keywords.txt b/keywords.txt new file mode 100644 index 0000000..3fe6259 --- /dev/null +++ b/keywords.txt @@ -0,0 +1,75 @@ +####################################### +# Syntax Coloring Map For Z906 +####################################### + +####################################### +# Datatypes (KEYWORD1) +####################################### + +Z906 KEYWORD1 + +####################################### +# Methods and Functions (KEYWORD2) +####################################### +command KEYWORD2 +request KEYWORD2 + +####################################### +# Constants (LITERAL1) +####################################### + +PWM_ON LITERAL1 +SET_INPUT_1 LITERAL1 +SET_INPUT_2 LITERAL1 +SET_INPUT_3 LITERAL1 +SET_INPUT_4 LITERAL1 +SET_INPUT_5 LITERAL1 +SET_INPUT_AUX LITERAL1 + +VOL_MAIN_UP LITERAL1 +VOL_MAIN_DOWN LITERAL1 +VOL_SUB_UP LITERAL1 +VOL_SUB_DOWN LITERAL1 +VOL_CENTER_UP LITERAL1 +VOL_CENTER_DOWN LITERAL1 +VOL_REAR_UP LITERAL1 +VOL_DOWN_UP LITERAL1 + +PWM_OFF LITERAL1 +PWM_ON LITERAL1 + +SET_EFFECT_3D LITERAL1 +SET_EFFECT_41 LITERAL1 +SET_EFFECT_21 LITERAL1 +SET_EFFECT_NO LITERAL1 + +BLOCK_INPUTS LITERAL1 +GET_TEMP LITERAL1 +GET_INPUT_GAIN LITERAL1 +NO_BLOCK_INPUTS LITERAL1 + +RESET_IDLE_TIME LITERAL1 +GET_IDLE_TIME LITERAL1 +GET_STATUS LITERAL1 +EEPROM_SAVE LITERAL1 + +MUTE_ON LITERAL1 +MUTE_OFF LITERAL1 + +MAIN_GAIN LITERAL1 +READ_GAIN LITERAL1 +CENTER_GAIN LITERAL1 +SUB_GAIN LITERAL1 +CURRENT_INPUT LITERAL1 +EFFECT_INPUT_1 LITERAL1 +EFFECT_INPUT_2 LITERAL1 +EFFECT_INPUT_3 LITERAL1 +EFFECT_INPUT_4 LITERAL1 +EFFECT_INPUT_5 LITERAL1 +EFFECT_INPUT_AUX LITERAL1 +SPDIF_STATUS LITERAL1 +SIGNAL_INPUT_STATUS LITERAL1 +VERSION LITERAL1 +STANDBY LITERAL1 +AUTO_STANDBY LITERAL1 +CHECKSUM LITERAL1 \ No newline at end of file diff --git a/library.properties b/library.properties new file mode 100644 index 0000000..198194a --- /dev/null +++ b/library.properties @@ -0,0 +1,11 @@ +name=Z906 +version=1.0.0 +author=Alejandro Zárate +maintainer=Alejandro Zárate +sentence=Logitech Serial Port Control +paragraph=This library is designed to control Logitech Z906 unit using a serial interface. +category=Device Control +url=https://zarpli.com +architectures=* +includes= +depends= diff --git a/src/Z906.cpp b/src/Z906.cpp new file mode 100644 index 0000000..082fd93 --- /dev/null +++ b/src/Z906.cpp @@ -0,0 +1,76 @@ +#include "Z906.h" + +Z906::Z906(HardwareSerial &serial) { + dev_serial = &serial; + dev_serial->begin(BAUD_RATE,SERIAL_CONFIG); +} + +int Z906::request(unsigned char cmd){ + + dev_serial->write(GET_STATUS); + + unsigned long currentMillis = millis(); + + while(dev_serial->available() < CMD_TOTAL_LENGTH) + if (millis() - currentMillis > SERIAL_TIME_OUT) return 0; + + if (dev_serial->read() != CMD_STX) return 0; + if (dev_serial->read() != CMD_STATUS) return 0; + if (dev_serial->read() != CMD_LENGTH) return 0; + + unsigned char main_gain = dev_serial->read(); + unsigned char read_gain = dev_serial->read(); + unsigned char center_gain = dev_serial->read(); + unsigned char sub_gain = dev_serial->read(); + unsigned char current_input = dev_serial->read(); + dev_serial->read(); + unsigned char effect_input_4 = dev_serial->read(); + unsigned char effect_input_5 = dev_serial->read(); + unsigned char effect_input_2 = dev_serial->read(); + unsigned char effect_input_AUX = dev_serial->read(); + unsigned char effect_input_1 = dev_serial->read(); + unsigned char effect_input_3 = dev_serial->read(); + unsigned char spdif_status = dev_serial->read(); + unsigned char signal_input_status = dev_serial->read(); + unsigned char version_a = dev_serial->read(); + unsigned char version_b = dev_serial->read(); + unsigned char version_c = dev_serial->read(); + unsigned char standby = dev_serial->read(); + unsigned char auto_standby = dev_serial->read(); + unsigned char checksum = dev_serial->read(); + + switch (cmd) + { + case MAIN_GAIN: return main_gain; + case READ_GAIN: return read_gain; + case CENTER_GAIN: return center_gain; + case SUB_GAIN: return sub_gain; + case CURRENT_INPUT: return current_input + 1; + case EFFECT_INPUT_1: return effect_input_1; + case EFFECT_INPUT_2: return effect_input_2; + case EFFECT_INPUT_3: return effect_input_3; + case EFFECT_INPUT_4: return effect_input_4; + case EFFECT_INPUT_5: return effect_input_5; + case EFFECT_INPUT_AUX: return effect_input_AUX; + case SPDIF_STATUS: return spdif_status; + case SIGNAL_INPUT_STATUS: return signal_input_status; + case VERSION: return version_c + 10 * version_b + 100 * version_a; + case STANDBY: return standby; + case AUTO_STANDBY: return auto_standby; + case CHECKSUM: return checksum; + } +} + +int Z906::command(unsigned char cmd){ + + if(cmd == GET_STATUS || cmd == GET_TEMP || cmd == GET_INPUT_GAIN) return 0; + + dev_serial->write(cmd); + + unsigned long currentMillis = millis(); + + while(dev_serial->available() == 0) + if (millis() - currentMillis > SERIAL_TIME_OUT) return 0; + + return dev_serial->read(); +} \ No newline at end of file diff --git a/src/Z906.h b/src/Z906.h new file mode 100644 index 0000000..a65775e --- /dev/null +++ b/src/Z906.h @@ -0,0 +1,98 @@ +#include "Arduino.h" + +#define BAUD_RATE 57600 +#define SERIAL_CONFIG SERIAL_8O1 +#define SERIAL_TIME_OUT 1000 + +#define SET_INPUT_1 0x02 +#define SET_INPUT_2 0x05 +#define SET_INPUT_3 0x03 +#define SET_INPUT_4 0x04 +#define SET_INPUT_5 0x06 +#define SET_INPUT_AUX 0x07 + +#define GAIN_MAIN_UP 0x08 +#define GAIN_MAIN_DOWN 0x09 +#define GAIN_SUB_UP 0x0A +#define GAIN_SUB_DOWN 0x0B +#define GAIN_CENTER_UP 0x0C +#define GAIN_CENTER_DOWN 0x0D +#define GAIN_REAR_UP 0x0E +#define GAIN_DOWN_UP 0x0F + +#define PWM_OFF 0x10 +#define PWM_ON 0x11 + +#define SET_EFFECT_3D 0x14 +#define SET_EFFECT_41 0x15 +#define SET_EFFECT_21 0x16 +#define SET_EFFECT_NO 0x35 + +#define BLOCK_INPUTS 0x22 +#define GET_TEMP 0x25 +#define GET_INPUT_GAIN 0x2F +#define NO_BLOCK_INPUTS 0x33 + +#define RESET_IDLE_TIME 0x30 +#define GET_IDLE_TIME 0x31 +#define GET_STATUS 0x34 +#define EEPROM_SAVE 0x36 + +#define MUTE_ON 0x38 +#define MUTE_OFF 0x39 + +#define SPK_NONE 0x00 // speaker mask +#define SPK_ALL 0xFF +#define SPK_FR 0x01 +#define SPK_FL 0x10 +#define SPK_RR 0x02 +#define SPK_RL 0x08 +#define SPK_CENTER 0x04 +#define SPK_SUB 0x20 + +#define EFFECT_3D 0x00 +#define EFFECT_21 0x01 +#define EFFECT_41 0x02 +#define EFFECT_NO 0x03 + +#define ON_LINE 0x3F + +#define CMD_STX 0xAA +#define CMD_NOISE 0x07 +#define CMD_STATUS 0x0A + +#define CMD_LENGTH 0x13 +#define CMD_TOTAL_LENGTH 0x17 + +#define MAIN_GAIN 0x01 +#define READ_GAIN 0x02 +#define CENTER_GAIN 0x03 +#define SUB_GAIN 0x04 +#define CURRENT_INPUT 0x05 +#define EFFECT_INPUT_1 0x06 +#define EFFECT_INPUT_2 0x07 +#define EFFECT_INPUT_3 0x08 +#define EFFECT_INPUT_4 0x09 +#define EFFECT_INPUT_5 0x0A +#define EFFECT_INPUT_AUX 0xA1 +#define SPDIF_STATUS 0xA2 +#define SIGNAL_INPUT_STATUS 0xA3 +#define VERSION 0xA4 +#define STANDBY 0xA5 +#define AUTO_STANDBY 0xA6 +#define CHECKSUM 0xA7 + +class Z906 +{ +public: + +Z906(HardwareSerial &serial); + +int command(unsigned char); +int request(unsigned char); + +private: + +HardwareSerial* dev_serial; + +};