[sonyprojector] Add new channel to send infrared remote commands (#15753)
Fix #15409 Signed-off-by: Laurent Garnier <lg.hc@free.fr>
This commit is contained in:
parent
2be0f8dd66
commit
3972dde690
|
@ -187,6 +187,128 @@ The following channels are available:
|
||||||
| overscan | Overscan | Switch | RW | Hide or not the edges of the picture | ON, OFF |
|
| overscan | Overscan | Switch | RW | Hide or not the edges of the picture | ON, OFF |
|
||||||
| pictureposition | Picture Position | String | RW | Adjust the picture position | 185, 235, Custom1, Custom2, Custom3, Position1, Position2, Position3, Position4, Position5 |
|
| pictureposition | Picture Position | String | RW | Adjust the picture position | 185, 235, Custom1, Custom2, Custom3, Position1, Position2, Position3, Position4, Position5 |
|
||||||
| lampusetime | Lamp Use Time | Number | R | Indicate how long the lamp has been turned on | |
|
| lampusetime | Lamp Use Time | Number | R | Indicate how long the lamp has been turned on | |
|
||||||
|
| ircommand | IR Command | String | W | Send an infrared remote command | |
|
||||||
|
|
||||||
|
Here is the list of infrared remote commands you can use, some of them will work only on particular models.
|
||||||
|
|
||||||
|
| Command | Description |
|
||||||
|
| ------------------- | ------------------------- |
|
||||||
|
| POWER | Power On/Off |
|
||||||
|
| POWER_ON | Power On |
|
||||||
|
| POWER_OFF | Power Off |
|
||||||
|
| INPUT | Video Input |
|
||||||
|
| INPUT_DVI | DVI |
|
||||||
|
| INPUT_HDMI | HDMI |
|
||||||
|
| INPUT_HDMI1 | HDMI 1 |
|
||||||
|
| INPUT_HDMI2 | HDMI 2 |
|
||||||
|
| INPUT_COMPONENT | Component |
|
||||||
|
| INPUT_SVIDEO | S-Video |
|
||||||
|
| INPUT_VIDEO | Video |
|
||||||
|
| INPUT_INPUTA | Input A |
|
||||||
|
| CALIBRATION_PRESET | Calibration preset |
|
||||||
|
| PRESET_REFERENCE | Reference |
|
||||||
|
| PRESET_TV | TV |
|
||||||
|
| PRESET_PHOTO | Photo |
|
||||||
|
| PRESET_GAME | Game |
|
||||||
|
| PRESET_DYNAMIC | Dynamic |
|
||||||
|
| PRESET_STANDARD | Standard |
|
||||||
|
| PRESET_CINEMA | Cinema |
|
||||||
|
| PRESET_CINEMA1 | Cinema 1 |
|
||||||
|
| PRESET_CINEMA2 | Cinema 2 |
|
||||||
|
| PRESET_CINEMA3 | Cinema 3 |
|
||||||
|
| PRESET_DIGITAL | Cinema Digital |
|
||||||
|
| PRESET_FILM1 | Cinema Film 1 |
|
||||||
|
| PRESET_FILM2 | Cinema Film 2 |
|
||||||
|
| PRESET_BRTCINE | Bright Cinema |
|
||||||
|
| PRESET_BRTTV | Bright TV |
|
||||||
|
| PRESET_USER | User |
|
||||||
|
| PRESET_USER1 | User 1 |
|
||||||
|
| PRESET_USER2 | User 2 |
|
||||||
|
| PRESET_USER3 | User 3 |
|
||||||
|
| CONTRAST_UP | Contrast + |
|
||||||
|
| CONTRAST_DOWN | Contrast - |
|
||||||
|
| BRIGHTNESS_UP | Brightness + |
|
||||||
|
| BRIGHTNESS_DOWN | Brightness - |
|
||||||
|
| COLOR_UP | Color + |
|
||||||
|
| COLOR_DOWN | Color - |
|
||||||
|
| HUE_UP | Hue + |
|
||||||
|
| HUE_DOWN | Hue - |
|
||||||
|
| SHARPNESS_UP | Sharpness + |
|
||||||
|
| SHARPNESS_DOWN | Sharpness - |
|
||||||
|
| CONTRAST_ENHANCER | Contrast Enhancer |
|
||||||
|
| COLOR_TEMP | Color Temperature |
|
||||||
|
| GAMMA_CORRECTION | Gamma Correction |
|
||||||
|
| COLOR_SPACE | Color Space |
|
||||||
|
| PICTURE_MUTING | Picture Muting |
|
||||||
|
| REAL_COLOR | Real Color Processing |
|
||||||
|
| REALITY_CREATION | Reality Creation |
|
||||||
|
| FILM_PROJECTION | Film Projection |
|
||||||
|
| MOTION_ENHANCER | Motion Enhancer |
|
||||||
|
| IRIS_MODE | Iris Mode |
|
||||||
|
| ASPECT | Aspect Ratio |
|
||||||
|
| ASPECT_NORMAL | Normal |
|
||||||
|
| ASPECT_FULL | Full |
|
||||||
|
| ASPECT_FULL1 | Full 1 |
|
||||||
|
| ASPECT_FULL2 | Full 2 |
|
||||||
|
| ASPECT_ZOOM | Zoom |
|
||||||
|
| ASPECT_WIDEZOOM | Wide Zoom |
|
||||||
|
| ASPECT_VSTRETCH | V Stretch |
|
||||||
|
| ASPECT_STRETCH | Stretch |
|
||||||
|
| ASPECT_SQUEEZE | Squeeze |
|
||||||
|
| ASPECT_185 | 1.85:1 Zoom |
|
||||||
|
| ASPECT_235 | 2.35:1 Zoom |
|
||||||
|
| ASPECT_ANAMORPHIC | Anamorphic |
|
||||||
|
| ASPECT_SUBTITLE | Subtitle |
|
||||||
|
| PICTURE_POS_185 | Picture Position 1.85:1 |
|
||||||
|
| PICTURE_POS_235 | Picture Position 2.35:1 |
|
||||||
|
| PICTURE_POS_CUSTOM1 | Picture Position Custom 1 |
|
||||||
|
| PICTURE_POS_CUSTOM2 | Picture Position Custom 2 |
|
||||||
|
| PICTURE_POS_CUSTOM3 | Picture Position Custom 3 |
|
||||||
|
| MENU | Menu |
|
||||||
|
| UP | Cursor UP |
|
||||||
|
| DOWN | Cursor DOWN |
|
||||||
|
| LEFT | Cursor LEFT |
|
||||||
|
| RIGHT | Cursor RIGHT |
|
||||||
|
| ENTER | Enter |
|
||||||
|
| RESET | Reset |
|
||||||
|
| MEMORY | Memory |
|
||||||
|
| STATUS_ON | Status On |
|
||||||
|
| STATUS_OFF | Status Off |
|
||||||
|
| ADJUST_PICTURE | Adjust Picture |
|
||||||
|
| COLOR_CORRECTION | Color Correction |
|
||||||
|
| PITCH | Screen Pitch |
|
||||||
|
| SHIFT | Screen Shift |
|
||||||
|
| APA | APA |
|
||||||
|
| DOT_PHASE | Dot Phase |
|
||||||
|
| V_KEYSTONE | V Keystone |
|
||||||
|
| V_KEYSTONE_UP | V Keystone + |
|
||||||
|
| V_KEYSTONE_DOWN | V Keystone - |
|
||||||
|
| LENS_CONTROL | Lens Control |
|
||||||
|
| LENS_SHIFT | Lens Shift |
|
||||||
|
| LENS_SHIFT_LEFT | Lens Shift LEFT |
|
||||||
|
| LENS_SHIFT_RIGHT | Lens Shift RIGHT |
|
||||||
|
| LENS_SHIFT_UP | Lens Shift UP |
|
||||||
|
| LENS_SHIFT_DOWN | Lens Shift DOWN |
|
||||||
|
| LENS_ZOOM | Lens Zoom |
|
||||||
|
| LENS_ZOOM_LARGE | Lens Zoom Large |
|
||||||
|
| LENS_ZOOM_SMALL | Lens Zoom Small |
|
||||||
|
| LENS_FOCUS | Lens Focus |
|
||||||
|
| LENS_FOCUS_FAR | Lens Focus Far |
|
||||||
|
| LENS_FOCUS_NEAR | Lens Focus Near |
|
||||||
|
| LENS_POSITION | Lens Position |
|
||||||
|
| MODE_3D | 3D |
|
||||||
|
| OPTIONS | Options |
|
||||||
|
| EXIT | Exit |
|
||||||
|
| SYNC_MENU | Sync Menu |
|
||||||
|
| PLAY | Play |
|
||||||
|
| STOP | Stop |
|
||||||
|
| PAUSE | Pause |
|
||||||
|
| FAST_REWIND( | Fast Rewind |
|
||||||
|
| FAST_FORWARD | Fast Forward |
|
||||||
|
| PREVIOUS | Previous |
|
||||||
|
| NEXT | Next |
|
||||||
|
|
||||||
|
In case you know an infrared remote command not listed in this list and you know its hexadecimal code, you can send the hexadecimal value directly; it must be 4 characters started with either 17, 19 or 1B.
|
||||||
|
|
||||||
## Full Example
|
## Full Example
|
||||||
|
|
||||||
|
|
|
@ -63,4 +63,5 @@ public class SonyProjectorBindingConstants {
|
||||||
public static final String CHANNEL_OVERSCAN = "overscan";
|
public static final String CHANNEL_OVERSCAN = "overscan";
|
||||||
public static final String CHANNEL_PICTURE_POSITION = "pictureposition";
|
public static final String CHANNEL_PICTURE_POSITION = "pictureposition";
|
||||||
public static final String CHANNEL_LAMP_USE_TIME = "lampusetime";
|
public static final String CHANNEL_LAMP_USE_TIME = "lampusetime";
|
||||||
|
public static final String CHANNEL_IR_COMMAND = "ircommand";
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,42 @@
|
||||||
|
/**
|
||||||
|
* Copyright (c) 2010-2023 Contributors to the openHAB project
|
||||||
|
*
|
||||||
|
* See the NOTICE file(s) distributed with this work for additional
|
||||||
|
* information.
|
||||||
|
*
|
||||||
|
* This program and the accompanying materials are made available under the
|
||||||
|
* terms of the Eclipse Public License 2.0 which is available at
|
||||||
|
* http://www.eclipse.org/legal/epl-2.0
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: EPL-2.0
|
||||||
|
*/
|
||||||
|
package org.openhab.binding.sonyprojector.internal;
|
||||||
|
|
||||||
|
import org.eclipse.jdt.annotation.NonNullByDefault;
|
||||||
|
import org.openhab.core.events.EventPublisher;
|
||||||
|
import org.openhab.core.thing.binding.BaseDynamicCommandDescriptionProvider;
|
||||||
|
import org.openhab.core.thing.i18n.ChannelTypeI18nLocalizationService;
|
||||||
|
import org.openhab.core.thing.link.ItemChannelLinkRegistry;
|
||||||
|
import org.openhab.core.thing.type.DynamicCommandDescriptionProvider;
|
||||||
|
import org.osgi.service.component.annotations.Activate;
|
||||||
|
import org.osgi.service.component.annotations.Component;
|
||||||
|
import org.osgi.service.component.annotations.Reference;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Dynamic provider of command options while leaving other command description fields as original.
|
||||||
|
*
|
||||||
|
* @author Laurent Garnier - Initial contribution
|
||||||
|
*/
|
||||||
|
@Component(service = { DynamicCommandDescriptionProvider.class, SonyProjectorCommandDescriptionOptionProvider.class })
|
||||||
|
@NonNullByDefault
|
||||||
|
public class SonyProjectorCommandDescriptionOptionProvider extends BaseDynamicCommandDescriptionProvider {
|
||||||
|
|
||||||
|
@Activate
|
||||||
|
public SonyProjectorCommandDescriptionOptionProvider(final @Reference EventPublisher eventPublisher, //
|
||||||
|
final @Reference ItemChannelLinkRegistry itemChannelLinkRegistry, //
|
||||||
|
final @Reference ChannelTypeI18nLocalizationService channelTypeI18nLocalizationService) {
|
||||||
|
this.eventPublisher = eventPublisher;
|
||||||
|
this.itemChannelLinkRegistry = itemChannelLinkRegistry;
|
||||||
|
this.channelTypeI18nLocalizationService = channelTypeI18nLocalizationService;
|
||||||
|
}
|
||||||
|
}
|
|
@ -50,14 +50,17 @@ public class SonyProjectorHandlerFactory extends BaseThingHandlerFactory {
|
||||||
private final SerialPortManager serialPortManager;
|
private final SerialPortManager serialPortManager;
|
||||||
|
|
||||||
private final SonyProjectorStateDescriptionOptionProvider stateDescriptionProvider;
|
private final SonyProjectorStateDescriptionOptionProvider stateDescriptionProvider;
|
||||||
|
private final SonyProjectorCommandDescriptionOptionProvider commandDescriptionProvider;
|
||||||
private final TranslationProvider i18nProvider;
|
private final TranslationProvider i18nProvider;
|
||||||
|
|
||||||
@Activate
|
@Activate
|
||||||
public SonyProjectorHandlerFactory(final @Reference SerialPortManager serialPortManager,
|
public SonyProjectorHandlerFactory(final @Reference SerialPortManager serialPortManager,
|
||||||
final @Reference SonyProjectorStateDescriptionOptionProvider stateDescriptionProvider,
|
final @Reference SonyProjectorStateDescriptionOptionProvider stateDescriptionProvider,
|
||||||
|
final @Reference SonyProjectorCommandDescriptionOptionProvider commandDescriptionProvider,
|
||||||
final @Reference TranslationProvider i18nProvider) {
|
final @Reference TranslationProvider i18nProvider) {
|
||||||
this.serialPortManager = serialPortManager;
|
this.serialPortManager = serialPortManager;
|
||||||
this.stateDescriptionProvider = stateDescriptionProvider;
|
this.stateDescriptionProvider = stateDescriptionProvider;
|
||||||
|
this.commandDescriptionProvider = commandDescriptionProvider;
|
||||||
this.i18nProvider = i18nProvider;
|
this.i18nProvider = i18nProvider;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -71,7 +74,8 @@ public class SonyProjectorHandlerFactory extends BaseThingHandlerFactory {
|
||||||
ThingTypeUID thingTypeUID = thing.getThingTypeUID();
|
ThingTypeUID thingTypeUID = thing.getThingTypeUID();
|
||||||
|
|
||||||
if (SUPPORTED_THING_TYPES_UIDS.contains(thingTypeUID)) {
|
if (SUPPORTED_THING_TYPES_UIDS.contains(thingTypeUID)) {
|
||||||
return new SonyProjectorHandler(thing, stateDescriptionProvider, serialPortManager, i18nProvider);
|
return new SonyProjectorHandler(thing, stateDescriptionProvider, commandDescriptionProvider,
|
||||||
|
serialPortManager, i18nProvider);
|
||||||
}
|
}
|
||||||
|
|
||||||
return null;
|
return null;
|
||||||
|
|
|
@ -36,6 +36,7 @@ import org.openhab.binding.sonyprojector.internal.communication.SonyProjectorMot
|
||||||
import org.openhab.binding.sonyprojector.internal.communication.SonyProjectorMpegNr;
|
import org.openhab.binding.sonyprojector.internal.communication.SonyProjectorMpegNr;
|
||||||
import org.openhab.binding.sonyprojector.internal.communication.SonyProjectorNr;
|
import org.openhab.binding.sonyprojector.internal.communication.SonyProjectorNr;
|
||||||
import org.openhab.binding.sonyprojector.internal.communication.SonyProjectorPicturePosition;
|
import org.openhab.binding.sonyprojector.internal.communication.SonyProjectorPicturePosition;
|
||||||
|
import org.openhab.core.types.CommandOption;
|
||||||
import org.openhab.core.types.StateOption;
|
import org.openhab.core.types.StateOption;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -239,6 +240,15 @@ public enum SonyProjectorModel {
|
||||||
return SonyProjectorCalibrationPreset.getStateOptions(calibrPresetsCategory);
|
return SonyProjectorCalibrationPreset.getStateOptions(calibrPresetsCategory);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the list of {@link CommandOption} associated to the available calibration presets
|
||||||
|
*
|
||||||
|
* @return the list of {@link CommandOption} associated to the available calibration presets
|
||||||
|
*/
|
||||||
|
public List<CommandOption> getCalibrPresetCommandOptions() {
|
||||||
|
return SonyProjectorCalibrationPreset.getCommandOptions(calibrPresetsCategory);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the calibration preset associated to a name
|
* Get the calibration preset associated to a name
|
||||||
*
|
*
|
||||||
|
@ -248,8 +258,8 @@ public enum SonyProjectorModel {
|
||||||
*
|
*
|
||||||
* @throws SonyProjectorException - If no calibration preset is associated to the searched name
|
* @throws SonyProjectorException - If no calibration preset is associated to the searched name
|
||||||
*/
|
*/
|
||||||
public byte[] getCalibrPresetDataCodeFromName(String name) throws SonyProjectorException {
|
public SonyProjectorCalibrationPreset getCalibrPresetFromName(String name) throws SonyProjectorException {
|
||||||
return SonyProjectorCalibrationPreset.getFromName(calibrPresetsCategory, name).getDataCode();
|
return SonyProjectorCalibrationPreset.getFromName(calibrPresetsCategory, name);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -274,6 +284,15 @@ public enum SonyProjectorModel {
|
||||||
return SonyProjectorInput.getStateOptions(inputCategory);
|
return SonyProjectorInput.getStateOptions(inputCategory);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the list of {@link CommandOption} associated to the available video inputs
|
||||||
|
*
|
||||||
|
* @return the list of {@link CommandOption} associated to the available video inputs
|
||||||
|
*/
|
||||||
|
public List<CommandOption> getInputCommandOptions() {
|
||||||
|
return SonyProjectorInput.getCommandOptions(inputCategory);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the video input associated to a name
|
* Get the video input associated to a name
|
||||||
*
|
*
|
||||||
|
@ -283,8 +302,8 @@ public enum SonyProjectorModel {
|
||||||
*
|
*
|
||||||
* @throws SonyProjectorException - If no video input is associated to the searched name
|
* @throws SonyProjectorException - If no video input is associated to the searched name
|
||||||
*/
|
*/
|
||||||
public byte[] getInputDataCodeFromName(String name) throws SonyProjectorException {
|
public SonyProjectorInput getInputFromName(String name) throws SonyProjectorException {
|
||||||
return SonyProjectorInput.getFromName(inputCategory, name).getDataCode();
|
return SonyProjectorInput.getFromName(inputCategory, name);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -450,6 +469,15 @@ public enum SonyProjectorModel {
|
||||||
return SonyProjectorAspect.getStateOptions(aspectCategory);
|
return SonyProjectorAspect.getStateOptions(aspectCategory);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the list of {@link CommandOption} associated to the available aspect modes
|
||||||
|
*
|
||||||
|
* @return the list of {@link CommandOption} associated to the available aspect modes
|
||||||
|
*/
|
||||||
|
public List<CommandOption> getAspectCommandOptions() {
|
||||||
|
return SonyProjectorAspect.getCommandOptions(aspectCategory);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the aspect mode associated to a name
|
* Get the aspect mode associated to a name
|
||||||
*
|
*
|
||||||
|
@ -459,8 +487,8 @@ public enum SonyProjectorModel {
|
||||||
*
|
*
|
||||||
* @throws SonyProjectorException - If no aspect mode is associated to the searched name
|
* @throws SonyProjectorException - If no aspect mode is associated to the searched name
|
||||||
*/
|
*/
|
||||||
public byte[] getAspectCodeFromName(String name) throws SonyProjectorException {
|
public SonyProjectorAspect getAspectFromName(String name) throws SonyProjectorException {
|
||||||
return SonyProjectorAspect.getFromName(aspectCategory, name).getDataCode();
|
return SonyProjectorAspect.getFromName(aspectCategory, name);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -18,6 +18,7 @@ import java.util.List;
|
||||||
|
|
||||||
import org.eclipse.jdt.annotation.NonNullByDefault;
|
import org.eclipse.jdt.annotation.NonNullByDefault;
|
||||||
import org.openhab.binding.sonyprojector.internal.SonyProjectorException;
|
import org.openhab.binding.sonyprojector.internal.SonyProjectorException;
|
||||||
|
import org.openhab.core.types.CommandOption;
|
||||||
import org.openhab.core.types.StateOption;
|
import org.openhab.core.types.StateOption;
|
||||||
import org.openhab.core.util.HexUtils;
|
import org.openhab.core.util.HexUtils;
|
||||||
|
|
||||||
|
@ -30,56 +31,57 @@ import org.openhab.core.util.HexUtils;
|
||||||
public enum SonyProjectorAspect {
|
public enum SonyProjectorAspect {
|
||||||
|
|
||||||
// Category 1: VW260, VW270, VW285, VW295, VW300, VW315, VW320, VW328, VW350, VW365, VW385, VW500, VW515, VW520,
|
// Category 1: VW260, VW270, VW285, VW295, VW300, VW315, VW320, VW328, VW350, VW365, VW385, VW500, VW515, VW520,
|
||||||
// VW528, VW550, VW570, VW600, VW665, VW675, VW695, VW760, VW885
|
// VW528, VW550, VW570, VW600, VW665, VW675, VW695, VW760, VW885, VW1000ES, VW1100ES
|
||||||
CAT1_NORMAL(1, "Normal", new byte[] { 0x00, 0x01 }),
|
CAT1_NORMAL(1, "Normal", new byte[] { 0x00, 0x01 }, new byte[] { 0x1B, 0x41 }),
|
||||||
CAT1_V_STRETCH(1, "VStretch", new byte[] { 0x00, 0x0B }),
|
CAT1_V_STRETCH(1, "VStretch", new byte[] { 0x00, 0x0B }, new byte[] { 0x1B, 0x44 }),
|
||||||
CAT1_185(1, "185", new byte[] { 0x00, 0x0C }),
|
CAT1_185(1, "185", new byte[] { 0x00, 0x0C }, new byte[] { 0x1B, 0x45 }),
|
||||||
CAT1_235(1, "235", new byte[] { 0x00, 0x0D }),
|
CAT1_235(1, "235", new byte[] { 0x00, 0x0D }, new byte[] { 0x1B, 0x46 }),
|
||||||
CAT1_STRETCH(1, "Stretch", new byte[] { 0x00, 0x0E }),
|
CAT1_STRETCH(1, "Stretch", new byte[] { 0x00, 0x0E }, new byte[] { 0x1B, 0x47 }),
|
||||||
CAT1_SQUEEZE(1, "Squeeze", new byte[] { 0x00, 0x0F }),
|
CAT1_SQUEEZE(1, "Squeeze", new byte[] { 0x00, 0x0F }, new byte[] { 0x1B, 0x48 }),
|
||||||
|
|
||||||
// Category 2: VW40, VW50, HW10, HW15, HW20, HW30
|
// Category 2: VW40, VW50, HW10, HW15, HW20, HW30
|
||||||
CAT2_FULL(2, "Full", new byte[] { 0x00, 0x00 }),
|
CAT2_FULL(2, "Full", new byte[] { 0x00, 0x00 }, new byte[] { 0x1B, 0x42 }),
|
||||||
CAT2_NORMAL(2, "Normal", new byte[] { 0x00, 0x01 }),
|
CAT2_NORMAL(2, "Normal", new byte[] { 0x00, 0x01 }, new byte[] { 0x1B, 0x41 }),
|
||||||
CAT2_WIDE(2, "WideZoom", new byte[] { 0x00, 0x02 }),
|
CAT2_WIDE(2, "WideZoom", new byte[] { 0x00, 0x02 }, new byte[] { 0x1B, 0x3E }),
|
||||||
CAT2_ZOOM(2, "Zoom", new byte[] { 0x00, 0x03 }),
|
CAT2_ZOOM(2, "Zoom", new byte[] { 0x00, 0x03 }, new byte[] { 0x1B, 0x43 }),
|
||||||
CAT2_FULL1(2, "Full1", new byte[] { 0x00, 0x07 }),
|
CAT2_FULL1(2, "Full1", new byte[] { 0x00, 0x07 }, new byte[] { 0x1B, 0x3F }),
|
||||||
CAT2_FULL2(2, "Full2", new byte[] { 0x00, 0x08 }),
|
CAT2_FULL2(2, "Full2", new byte[] { 0x00, 0x08 }, new byte[] { 0x1B, 0x40 }),
|
||||||
|
|
||||||
// Category 3: VW60, VW70, VW80, VW85, VW90, VW95, VW200
|
// Category 3: VW60, VW70, VW80, VW85, VW90, VW95, VW200
|
||||||
CAT3_FULL(3, "Full", new byte[] { 0x00, 0x00 }),
|
CAT3_FULL(3, "Full", new byte[] { 0x00, 0x00 }, new byte[] { 0x1B, 0x42 }),
|
||||||
CAT3_NORMAL(3, "Normal", new byte[] { 0x00, 0x01 }),
|
CAT3_NORMAL(3, "Normal", new byte[] { 0x00, 0x01 }, new byte[] { 0x1B, 0x41 }),
|
||||||
CAT3_WIDE(3, "WideZoom", new byte[] { 0x00, 0x02 }),
|
CAT3_WIDE(3, "WideZoom", new byte[] { 0x00, 0x02 }, new byte[] { 0x1B, 0x3E }),
|
||||||
CAT3_ZOOM(3, "Zoom", new byte[] { 0x00, 0x03 }),
|
CAT3_ZOOM(3, "Zoom", new byte[] { 0x00, 0x03 }, new byte[] { 0x1B, 0x43 }),
|
||||||
CAT3_FULL1(3, "Full1", new byte[] { 0x00, 0x07 }),
|
CAT3_FULL1(3, "Full1", new byte[] { 0x00, 0x07 }, new byte[] { 0x1B, 0x3F }),
|
||||||
CAT3_FULL2(3, "Full2", new byte[] { 0x00, 0x08 }),
|
CAT3_FULL2(3, "Full2", new byte[] { 0x00, 0x08 }, new byte[] { 0x1B, 0x40 }),
|
||||||
CAT3_ANAMORPHIC(3, "Anamorphic", new byte[] { 0x00, 0x0B }),
|
CAT3_ANAMORPHIC(3, "Anamorphic", new byte[] { 0x00, 0x0B }, new byte[] { 0x1B, 0x44 }),
|
||||||
|
|
||||||
// Category 4: VW100
|
// Category 4: VW100
|
||||||
CAT4_FULL(4, "Full", new byte[] { 0x00, 0x00 }),
|
CAT4_FULL(4, "Full", new byte[] { 0x00, 0x00 }, new byte[] { 0x1B, 0x42 }),
|
||||||
CAT4_NORMAL(4, "Normal", new byte[] { 0x00, 0x01 }),
|
CAT4_NORMAL(4, "Normal", new byte[] { 0x00, 0x01 }, new byte[] { 0x1B, 0x41 }),
|
||||||
CAT4_WIDE(4, "WideZoom", new byte[] { 0x00, 0x02 }),
|
CAT4_WIDE(4, "WideZoom", new byte[] { 0x00, 0x02 }, new byte[] { 0x1B, 0x3E }),
|
||||||
CAT4_ZOOM(4, "Zoom", new byte[] { 0x00, 0x03 }),
|
CAT4_ZOOM(4, "Zoom", new byte[] { 0x00, 0x03 }, new byte[] { 0x1B, 0x43 }),
|
||||||
CAT3_SUBTITLE(4, "Subtitle", new byte[] { 0x00, 0x04 }),
|
CAT3_SUBTITLE(4, "Subtitle", new byte[] { 0x00, 0x04 }, new byte[] { 0x1B, 0x49 }), // IR code not confirmed
|
||||||
|
|
||||||
// Category 5: HW40ES, HW50ES, HW55ES, HW58ES
|
// Category 5: HW40ES, HW50ES, HW55ES, HW58ES
|
||||||
CAT5_FULL(5, "Full", new byte[] { 0x00, 0x00 }),
|
CAT5_FULL(5, "Full", new byte[] { 0x00, 0x00 }, new byte[] { 0x1B, 0x42 }),
|
||||||
CAT5_NORMAL(5, "Normal", new byte[] { 0x00, 0x01 }),
|
CAT5_NORMAL(5, "Normal", new byte[] { 0x00, 0x01 }, new byte[] { 0x1B, 0x41 }),
|
||||||
CAT5_WIDE(5, "WideZoom", new byte[] { 0x00, 0x02 }),
|
CAT5_WIDE(5, "WideZoom", new byte[] { 0x00, 0x02 }, new byte[] { 0x1B, 0x3E }),
|
||||||
CAT5_ZOOM(5, "Zoom", new byte[] { 0x00, 0x03 }),
|
CAT5_ZOOM(5, "Zoom", new byte[] { 0x00, 0x03 }, new byte[] { 0x1B, 0x43 }),
|
||||||
CAT5_V_STRETCH(5, "VStretch", new byte[] { 0x00, 0x0B }),
|
CAT5_V_STRETCH(5, "VStretch", new byte[] { 0x00, 0x0B }, new byte[] { 0x1B, 0x44 }),
|
||||||
CAT5_STRETCH(5, "Stretch", new byte[] { 0x00, 0x0E }),
|
CAT5_STRETCH(5, "Stretch", new byte[] { 0x00, 0x0E }, new byte[] { 0x1B, 0x47 }),
|
||||||
CAT5_SQUEEZE(5, "Squeeze", new byte[] { 0x00, 0x0F }),
|
CAT5_SQUEEZE(5, "Squeeze", new byte[] { 0x00, 0x0F }, new byte[] { 0x1B, 0x48 }),
|
||||||
|
|
||||||
// Category 6: HW45ES, HW60, HW65, HW68
|
// Category 6: HW45ES, HW60, HW65, HW68
|
||||||
CAT6_NORMAL(6, "Normal", new byte[] { 0x00, 0x01 }),
|
CAT6_NORMAL(6, "Normal", new byte[] { 0x00, 0x01 }, new byte[] { 0x1B, 0x41 }),
|
||||||
CAT6_V_STRETCH(6, "VStretch", new byte[] { 0x00, 0x0B }),
|
CAT6_V_STRETCH(6, "VStretch", new byte[] { 0x00, 0x0B }, new byte[] { 0x1B, 0x44 }),
|
||||||
CAT6_STRETCH(6, "Stretch", new byte[] { 0x00, 0x0E }),
|
CAT6_STRETCH(6, "Stretch", new byte[] { 0x00, 0x0E }, new byte[] { 0x1B, 0x47 }),
|
||||||
CAT6_SQUEEZE(6, "Squeeze", new byte[] { 0x00, 0x0F });
|
CAT6_SQUEEZE(6, "Squeeze", new byte[] { 0x00, 0x0F }, new byte[] { 0x1B, 0x48 });
|
||||||
|
|
||||||
private int category;
|
private int category;
|
||||||
private String name;
|
private String name;
|
||||||
private byte[] dataCode;
|
private byte[] dataCode;
|
||||||
|
private byte[] irCode;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Constructor
|
* Constructor
|
||||||
|
@ -87,11 +89,13 @@ public enum SonyProjectorAspect {
|
||||||
* @param category a category of projector models for which the aspect mode is available
|
* @param category a category of projector models for which the aspect mode is available
|
||||||
* @param name the name of the aspect mode
|
* @param name the name of the aspect mode
|
||||||
* @param dataCode the data code identifying the aspect mode
|
* @param dataCode the data code identifying the aspect mode
|
||||||
|
* @param irCode the IR code for the aspect mode
|
||||||
*/
|
*/
|
||||||
private SonyProjectorAspect(int category, String name, byte[] dataCode) {
|
private SonyProjectorAspect(int category, String name, byte[] dataCode, byte[] irCode) {
|
||||||
this.category = category;
|
this.category = category;
|
||||||
this.name = name;
|
this.name = name;
|
||||||
this.dataCode = dataCode;
|
this.dataCode = dataCode;
|
||||||
|
this.irCode = irCode;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -112,6 +116,15 @@ public enum SonyProjectorAspect {
|
||||||
return dataCode;
|
return dataCode;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the IR code for the current aspect mode
|
||||||
|
*
|
||||||
|
* @return the IR code
|
||||||
|
*/
|
||||||
|
public byte[] getIrCode() {
|
||||||
|
return irCode;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the name of the current aspect mode
|
* Get the name of the current aspect mode
|
||||||
*
|
*
|
||||||
|
@ -140,6 +153,26 @@ public enum SonyProjectorAspect {
|
||||||
return options;
|
return options;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the list of {@link CommandOption} associated to the available aspect modes for a particular category of
|
||||||
|
* projector models
|
||||||
|
*
|
||||||
|
* @param category a category of projector models
|
||||||
|
*
|
||||||
|
* @return the list of {@link CommandOption} associated to the available aspect modes for a provided category of
|
||||||
|
* projector models
|
||||||
|
*/
|
||||||
|
public static List<CommandOption> getCommandOptions(int category) {
|
||||||
|
List<CommandOption> options = new ArrayList<>();
|
||||||
|
for (SonyProjectorAspect value : SonyProjectorAspect.values()) {
|
||||||
|
if (value.getCategory() == category) {
|
||||||
|
options.add(new CommandOption("ASPECT_" + value.getName().toUpperCase(),
|
||||||
|
"@text/channel-type.sonyprojector.aspect.state.option." + value.getName()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return options;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the aspect mode associated to a name for a particular category of projector models
|
* Get the aspect mode associated to a name for a particular category of projector models
|
||||||
*
|
*
|
||||||
|
@ -152,7 +185,7 @@ public enum SonyProjectorAspect {
|
||||||
*/
|
*/
|
||||||
public static SonyProjectorAspect getFromName(int category, String name) throws SonyProjectorException {
|
public static SonyProjectorAspect getFromName(int category, String name) throws SonyProjectorException {
|
||||||
for (SonyProjectorAspect value : SonyProjectorAspect.values()) {
|
for (SonyProjectorAspect value : SonyProjectorAspect.values()) {
|
||||||
if (value.getCategory() == category && value.getName().equals(name)) {
|
if (value.getCategory() == category && value.getName().equalsIgnoreCase(name)) {
|
||||||
return value;
|
return value;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -18,6 +18,7 @@ import java.util.List;
|
||||||
|
|
||||||
import org.eclipse.jdt.annotation.NonNullByDefault;
|
import org.eclipse.jdt.annotation.NonNullByDefault;
|
||||||
import org.openhab.binding.sonyprojector.internal.SonyProjectorException;
|
import org.openhab.binding.sonyprojector.internal.SonyProjectorException;
|
||||||
|
import org.openhab.core.types.CommandOption;
|
||||||
import org.openhab.core.types.StateOption;
|
import org.openhab.core.types.StateOption;
|
||||||
import org.openhab.core.util.HexUtils;
|
import org.openhab.core.util.HexUtils;
|
||||||
|
|
||||||
|
@ -33,57 +34,58 @@ public enum SonyProjectorCalibrationPreset {
|
||||||
// Category 1: VW260, VW270, VW285, VW295, VW300, VW315, VW320, VW328, VW350, VW365, VW385, VW500, VW515, VW520,
|
// Category 1: VW260, VW270, VW285, VW295, VW300, VW315, VW320, VW328, VW350, VW365, VW385, VW500, VW515, VW520,
|
||||||
// VW528, VW550, VW570, VW600, VW665, VW675, VW695, VW760, VW870, VW885, VW995, HW40ES, HW45ES, HW50ES, HW55ES,
|
// VW528, VW550, VW570, VW600, VW665, VW675, VW695, VW760, VW870, VW885, VW995, HW40ES, HW45ES, HW50ES, HW55ES,
|
||||||
// HW58ES, HW60, HW65, HW68
|
// HW58ES, HW60, HW65, HW68
|
||||||
CAT1_CINEMA_FILM1(1, "Film1", new byte[] { 0x00, 0x00 }),
|
CAT1_CINEMA_FILM1(1, "Film1", new byte[] { 0x00, 0x00 }, new byte[] { 0x19, 0x53 }),
|
||||||
CAT1_CINEMA_FILM2(1, "Film2", new byte[] { 0x00, 0x01 }),
|
CAT1_CINEMA_FILM2(1, "Film2", new byte[] { 0x00, 0x01 }, new byte[] { 0x19, 0x58 }),
|
||||||
CAT1_REFERENCE(1, "Reference", new byte[] { 0x00, 0x02 }),
|
CAT1_REFERENCE(1, "Reference", new byte[] { 0x00, 0x02 }, new byte[] { 0x19, 0x55 }),
|
||||||
CAT1_TV(1, "TV", new byte[] { 0x00, 0x03 }),
|
CAT1_TV(1, "TV", new byte[] { 0x00, 0x03 }, new byte[] { 0x19, 0x52 }),
|
||||||
CAT1_PHOTO(1, "Photo", new byte[] { 0x00, 0x04 }),
|
CAT1_PHOTO(1, "Photo", new byte[] { 0x00, 0x04 }, new byte[] { 0x19, 0x57 }),
|
||||||
CAT1_GAME(1, "Game", new byte[] { 0x00, 0x05 }),
|
CAT1_GAME(1, "Game", new byte[] { 0x00, 0x05 }, new byte[] { 0x19, 0x56 }),
|
||||||
CAT1_BRT_CINE(1, "BRTCINE", new byte[] { 0x00, 0x06 }),
|
CAT1_BRT_CINE(1, "BRTCINE", new byte[] { 0x00, 0x06 }, new byte[] { 0x19, 0x59 }),
|
||||||
CAT1_BRT_TV(1, "BRTTV", new byte[] { 0x00, 0x07 }),
|
CAT1_BRT_TV(1, "BRTTV", new byte[] { 0x00, 0x07 }, new byte[] { 0x19, 0x51 }),
|
||||||
CAT1_USER(1, "User", new byte[] { 0x00, 0x08 }),
|
CAT1_USER(1, "User", new byte[] { 0x00, 0x08 }, new byte[] { 0x19, 0x54 }),
|
||||||
|
|
||||||
// Category 2: VW40, VW50, VW60, VW70, VW80, VW100, VW200, HW10, HW15, HW20
|
// Category 2: VW40, VW50, VW60, VW70, VW80, VW100, VW200, HW10, HW15, HW20
|
||||||
CAT2_DYNAMIC(2, "Dynamic", new byte[] { 0x00, 0x00 }),
|
CAT2_DYNAMIC(2, "Dynamic", new byte[] { 0x00, 0x00 }, new byte[] { 0x19, 0x51 }),
|
||||||
CAT2_STANDARD(2, "Standard", new byte[] { 0x00, 0x01 }),
|
CAT2_STANDARD(2, "Standard", new byte[] { 0x00, 0x01 }, new byte[] { 0x19, 0x52 }),
|
||||||
CAT2_CINEMA(2, "Cinema", new byte[] { 0x00, 0x02 }),
|
CAT2_CINEMA(2, "Cinema", new byte[] { 0x00, 0x02 }, new byte[] { 0x19, 0x53 }),
|
||||||
CAT2_USER1(2, "User1", new byte[] { 0x00, 0x03 }),
|
CAT2_USER1(2, "User1", new byte[] { 0x00, 0x03 }, new byte[] { 0x19, 0x54 }),
|
||||||
CAT2_USER2(2, "User2", new byte[] { 0x00, 0x04 }),
|
CAT2_USER2(2, "User2", new byte[] { 0x00, 0x04 }, new byte[] { 0x19, 0x55 }),
|
||||||
CAT2_USER3(2, "User3", new byte[] { 0x00, 0x05 }),
|
CAT2_USER3(2, "User3", new byte[] { 0x00, 0x05 }, new byte[] { 0x19, 0x56 }),
|
||||||
|
|
||||||
// Category 3: VW85, VW90
|
// Category 3: VW85, VW90
|
||||||
CAT3_DYNAMIC(3, "Dynamic", new byte[] { 0x00, 0x00 }),
|
CAT3_DYNAMIC(3, "Dynamic", new byte[] { 0x00, 0x00 }, new byte[] { 0x19, 0x51 }),
|
||||||
CAT3_STANDARD(3, "Standard", new byte[] { 0x00, 0x01 }),
|
CAT3_STANDARD(3, "Standard", new byte[] { 0x00, 0x01 }, new byte[] { 0x19, 0x52 }),
|
||||||
CAT3_CINEMA1(3, "Cinema1", new byte[] { 0x00, 0x02 }),
|
CAT3_CINEMA1(3, "Cinema1", new byte[] { 0x00, 0x02 }, new byte[] { 0x19, 0x53 }),
|
||||||
CAT3_CINEMA2(3, "Cinema2", new byte[] { 0x00, 0x03 }),
|
CAT3_CINEMA2(3, "Cinema2", new byte[] { 0x00, 0x03 }, new byte[] { 0x19, 0x54 }),
|
||||||
CAT3_CINEMA3(3, "Cinema3", new byte[] { 0x00, 0x04 }),
|
CAT3_CINEMA3(3, "Cinema3", new byte[] { 0x00, 0x04 }, new byte[] { 0x19, 0x55 }),
|
||||||
CAT3_USER(3, "User", new byte[] { 0x00, 0x05 }),
|
CAT3_USER(3, "User", new byte[] { 0x00, 0x05 }, new byte[] { 0x19, 0x56 }),
|
||||||
|
|
||||||
// Category 4: VW95, HW30ES
|
// Category 4: VW95, HW30ES
|
||||||
CAT4_DYNAMIC(4, "Dynamic", new byte[] { 0x00, 0x00 }),
|
CAT4_DYNAMIC(4, "Dynamic", new byte[] { 0x00, 0x00 }, new byte[] { 0x19, 0x51 }),
|
||||||
CAT4_STANDARD(4, "Standard", new byte[] { 0x00, 0x01 }),
|
CAT4_STANDARD(4, "Standard", new byte[] { 0x00, 0x01 }, new byte[] { 0x19, 0x52 }),
|
||||||
CAT4_CINEMA1(4, "Cinema1", new byte[] { 0x00, 0x02 }),
|
CAT4_CINEMA1(4, "Cinema1", new byte[] { 0x00, 0x02 }, new byte[] { 0x19, 0x53 }),
|
||||||
CAT4_CINEMA2(4, "Cinema2", new byte[] { 0x00, 0x03 }),
|
CAT4_CINEMA2(4, "Cinema2", new byte[] { 0x00, 0x03 }, new byte[] { 0x19, 0x54 }),
|
||||||
CAT4_CINEMA3(4, "Cinema3", new byte[] { 0x00, 0x04 }),
|
CAT4_CINEMA3(4, "Cinema3", new byte[] { 0x00, 0x04 }, new byte[] { 0x19, 0x55 }),
|
||||||
CAT4_GAME(4, "Game", new byte[] { 0x00, 0x05 }),
|
CAT4_GAME(4, "Game", new byte[] { 0x00, 0x05 }, new byte[] { 0x19, 0x56 }),
|
||||||
CAT4_PHOTO(4, "Photo", new byte[] { 0x00, 0x06 }),
|
CAT4_PHOTO(4, "Photo", new byte[] { 0x00, 0x06 }, new byte[] { 0x19, 0x57 }),
|
||||||
CAT4_USER1(4, "User1", new byte[] { 0x00, 0x07 }),
|
CAT4_USER1(4, "User1", new byte[] { 0x00, 0x07 }, new byte[] { 0x19, 0x58 }),
|
||||||
CAT4_USER2(4, "User2", new byte[] { 0x00, 0x08 }),
|
CAT4_USER2(4, "User2", new byte[] { 0x00, 0x08 }, new byte[] { 0x19, 0x59 }),
|
||||||
|
|
||||||
// Category 5: VW1000ES, VW1100ES
|
// Category 5: VW1000ES, VW1100ES
|
||||||
CAT5_CINEMA_FILM1(5, "Film1", new byte[] { 0x00, 0x00 }),
|
CAT5_CINEMA_FILM1(5, "Film1", new byte[] { 0x00, 0x00 }, new byte[] { 0x19, 0x53 }),
|
||||||
CAT5_CINEMA_FILM2(5, "Film2", new byte[] { 0x00, 0x01 }),
|
CAT5_CINEMA_FILM2(5, "Film2", new byte[] { 0x00, 0x01 }, new byte[] { 0x19, 0x58 }),
|
||||||
CAT5_CINEMA_DIGITAL(5, "Digital", new byte[] { 0x00, 0x02 }),
|
CAT5_CINEMA_DIGITAL(5, "Digital", new byte[] { 0x00, 0x02 }, new byte[] { 0x19, 0x54 }),
|
||||||
CAT5_REFERENCE(5, "Reference", new byte[] { 0x00, 0x03 }),
|
CAT5_REFERENCE(5, "Reference", new byte[] { 0x00, 0x03 }, new byte[] { 0x19, 0x55 }),
|
||||||
CAT5_TV(5, "TV", new byte[] { 0x00, 0x04 }),
|
CAT5_TV(5, "TV", new byte[] { 0x00, 0x04 }, new byte[] { 0x19, 0x52 }),
|
||||||
CAT5_PHOTO(5, "Photo", new byte[] { 0x00, 0x05 }),
|
CAT5_PHOTO(5, "Photo", new byte[] { 0x00, 0x05 }, new byte[] { 0x19, 0x57 }),
|
||||||
CAT5_GAME(5, "Game", new byte[] { 0x00, 0x06 }),
|
CAT5_GAME(5, "Game", new byte[] { 0x00, 0x06 }, new byte[] { 0x19, 0x56 }),
|
||||||
CAT5_BRT_CINE(5, "BRTCINE", new byte[] { 0x00, 0x07 }),
|
CAT5_BRT_CINE(5, "BRTCINE", new byte[] { 0x00, 0x07 }, new byte[] { 0x19, 0x59 }),
|
||||||
CAT5_BRT_TV(5, "BRTTV", new byte[] { 0x00, 0x08 });
|
CAT5_BRT_TV(5, "BRTTV", new byte[] { 0x00, 0x08 }, new byte[] { 0x19, 0x51 });
|
||||||
|
|
||||||
private int category;
|
private int category;
|
||||||
private String name;
|
private String name;
|
||||||
private byte[] dataCode;
|
private byte[] dataCode;
|
||||||
|
private byte[] irCode;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Constructor
|
* Constructor
|
||||||
|
@ -91,11 +93,13 @@ public enum SonyProjectorCalibrationPreset {
|
||||||
* @param category a category of projector models for which the calibration preset is available
|
* @param category a category of projector models for which the calibration preset is available
|
||||||
* @param name the name of the calibration preset
|
* @param name the name of the calibration preset
|
||||||
* @param dataCode the data code identifying the calibration preset
|
* @param dataCode the data code identifying the calibration preset
|
||||||
|
* @param irCode the IR code for the calibration preset
|
||||||
*/
|
*/
|
||||||
private SonyProjectorCalibrationPreset(int category, String name, byte[] dataCode) {
|
private SonyProjectorCalibrationPreset(int category, String name, byte[] dataCode, byte[] irCode) {
|
||||||
this.category = category;
|
this.category = category;
|
||||||
this.name = name;
|
this.name = name;
|
||||||
this.dataCode = dataCode;
|
this.dataCode = dataCode;
|
||||||
|
this.irCode = irCode;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -116,6 +120,15 @@ public enum SonyProjectorCalibrationPreset {
|
||||||
return dataCode;
|
return dataCode;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the IR code for the current calibration preset
|
||||||
|
*
|
||||||
|
* @return the IR code
|
||||||
|
*/
|
||||||
|
public byte[] getIrCode() {
|
||||||
|
return irCode;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the name of the current calibration preset
|
* Get the name of the current calibration preset
|
||||||
*
|
*
|
||||||
|
@ -144,6 +157,26 @@ public enum SonyProjectorCalibrationPreset {
|
||||||
return options;
|
return options;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the list of {@link CommandOption} associated to the available calibration presets for a particular category
|
||||||
|
* of projector models
|
||||||
|
*
|
||||||
|
* @param category a category of projector models
|
||||||
|
*
|
||||||
|
* @return the list of {@link CommandOption} associated to the available calibration presets for a provided category
|
||||||
|
* of projector models
|
||||||
|
*/
|
||||||
|
public static List<CommandOption> getCommandOptions(int category) {
|
||||||
|
List<CommandOption> options = new ArrayList<>();
|
||||||
|
for (SonyProjectorCalibrationPreset value : SonyProjectorCalibrationPreset.values()) {
|
||||||
|
if (value.getCategory() == category) {
|
||||||
|
options.add(new CommandOption("PRESET_" + value.getName().toUpperCase(),
|
||||||
|
"@text/channel-type.sonyprojector.calibrationpreset.state.option." + value.getName()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return options;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the calibration preset associated to a name for a particular category of projector models
|
* Get the calibration preset associated to a name for a particular category of projector models
|
||||||
*
|
*
|
||||||
|
@ -157,7 +190,7 @@ public enum SonyProjectorCalibrationPreset {
|
||||||
*/
|
*/
|
||||||
public static SonyProjectorCalibrationPreset getFromName(int category, String name) throws SonyProjectorException {
|
public static SonyProjectorCalibrationPreset getFromName(int category, String name) throws SonyProjectorException {
|
||||||
for (SonyProjectorCalibrationPreset value : SonyProjectorCalibrationPreset.values()) {
|
for (SonyProjectorCalibrationPreset value : SonyProjectorCalibrationPreset.values()) {
|
||||||
if (value.getCategory() == category && value.getName().equals(name)) {
|
if (value.getCategory() == category && value.getName().equalsIgnoreCase(name)) {
|
||||||
return value;
|
return value;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -34,6 +34,7 @@ import org.slf4j.LoggerFactory;
|
||||||
* @author Markus Wehrle - Initial contribution
|
* @author Markus Wehrle - Initial contribution
|
||||||
* @author Laurent Garnier - Refactoring to include new channels, consider serial connection and protocol depending on
|
* @author Laurent Garnier - Refactoring to include new channels, consider serial connection and protocol depending on
|
||||||
* model
|
* model
|
||||||
|
* @author Laurent Garnier - Allow sending any IR command
|
||||||
*/
|
*/
|
||||||
@NonNullByDefault
|
@NonNullByDefault
|
||||||
public abstract class SonyProjectorConnector {
|
public abstract class SonyProjectorConnector {
|
||||||
|
@ -113,9 +114,9 @@ public abstract class SonyProjectorConnector {
|
||||||
setSetting(SonyProjectorItem.POWER, POWER_ON);
|
setSetting(SonyProjectorItem.POWER, POWER_ON);
|
||||||
} else {
|
} else {
|
||||||
logger.debug("Set Power ON using IR Power command");
|
logger.debug("Set Power ON using IR Power command");
|
||||||
sendIR(SonyProjectorItem.IR_POWER_ON);
|
sendIR(SonyProjectorItem.POWER_ON);
|
||||||
if (status == null) {
|
if (status == null) {
|
||||||
sendIR(SonyProjectorItem.IR_POWER_ON);
|
sendIR(SonyProjectorItem.POWER_ON);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -139,7 +140,7 @@ public abstract class SonyProjectorConnector {
|
||||||
setSetting(SonyProjectorItem.POWER, POWER_OFF);
|
setSetting(SonyProjectorItem.POWER, POWER_OFF);
|
||||||
} else {
|
} else {
|
||||||
logger.debug("Set Power OFF using IR Power command");
|
logger.debug("Set Power OFF using IR Power command");
|
||||||
sendIR(SonyProjectorItem.IR_POWER_OFF);
|
sendIR(SonyProjectorItem.POWER_OFF);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -162,7 +163,7 @@ public abstract class SonyProjectorConnector {
|
||||||
* @throws SonyProjectorException in case of any problem
|
* @throws SonyProjectorException in case of any problem
|
||||||
*/
|
*/
|
||||||
public void setCalibrationPreset(String value) throws SonyProjectorException {
|
public void setCalibrationPreset(String value) throws SonyProjectorException {
|
||||||
setSetting(SonyProjectorItem.CALIBRATION_PRESET, model.getCalibrPresetDataCodeFromName(value));
|
setSetting(SonyProjectorItem.CALIBRATION_PRESET, model.getCalibrPresetFromName(value).getDataCode());
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -184,7 +185,7 @@ public abstract class SonyProjectorConnector {
|
||||||
* @throws SonyProjectorException in case of any problem
|
* @throws SonyProjectorException in case of any problem
|
||||||
*/
|
*/
|
||||||
public void setInput(String value) throws SonyProjectorException {
|
public void setInput(String value) throws SonyProjectorException {
|
||||||
setSetting(SonyProjectorItem.INPUT, model.getInputDataCodeFromName(value));
|
setSetting(SonyProjectorItem.INPUT, model.getInputFromName(value).getDataCode());
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -509,7 +510,7 @@ public abstract class SonyProjectorConnector {
|
||||||
* @throws SonyProjectorException in case of any problem
|
* @throws SonyProjectorException in case of any problem
|
||||||
*/
|
*/
|
||||||
public void setAspect(String value) throws SonyProjectorException {
|
public void setAspect(String value) throws SonyProjectorException {
|
||||||
setSetting(SonyProjectorItem.ASPECT, model.getAspectCodeFromName(value));
|
setSetting(SonyProjectorItem.ASPECT, model.getAspectFromName(value).getDataCode());
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -881,6 +882,64 @@ public abstract class SonyProjectorConnector {
|
||||||
setSetting(SonyProjectorItem.XVCOLOR, XVCOLOR_OFF);
|
setSetting(SonyProjectorItem.XVCOLOR, XVCOLOR_OFF);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Send an IR command to the projector
|
||||||
|
*
|
||||||
|
* @param command the IR command
|
||||||
|
*
|
||||||
|
* @throws SonyProjectorException in case this IR command is not available or any other problem
|
||||||
|
*/
|
||||||
|
public void sendIrCommand(String command) throws SonyProjectorException {
|
||||||
|
byte @Nullable [] irCode = null;
|
||||||
|
boolean found = true;
|
||||||
|
if (command.startsWith("INPUT_")) {
|
||||||
|
try {
|
||||||
|
irCode = model.getInputFromName(command.substring(6)).getIrCode();
|
||||||
|
} catch (SonyProjectorException e) {
|
||||||
|
found = false;
|
||||||
|
}
|
||||||
|
} else if (command.startsWith("PRESET_")) {
|
||||||
|
try {
|
||||||
|
irCode = model.getCalibrPresetFromName(command.substring(7)).getIrCode();
|
||||||
|
} catch (SonyProjectorException e) {
|
||||||
|
found = false;
|
||||||
|
}
|
||||||
|
} else if (command.startsWith("ASPECT_")) {
|
||||||
|
try {
|
||||||
|
irCode = model.getAspectFromName(command.substring(7)).getIrCode();
|
||||||
|
} catch (SonyProjectorException e) {
|
||||||
|
found = false;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
try {
|
||||||
|
irCode = SonyProjectorItem.getFromValue(command).getIrCode();
|
||||||
|
} catch (SonyProjectorException e) {
|
||||||
|
found = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!found) {
|
||||||
|
// Check if the command is a direct IR code in hexadecimal
|
||||||
|
// Must be 4 characters starting by either 17 or 19 or 1B
|
||||||
|
String cmd = command.trim();
|
||||||
|
if (cmd.length() != 4) {
|
||||||
|
throw new SonyProjectorException("Invalid IR code: " + command);
|
||||||
|
}
|
||||||
|
int hex;
|
||||||
|
try {
|
||||||
|
hex = Integer.parseInt(cmd, 16);
|
||||||
|
} catch (NumberFormatException e) {
|
||||||
|
throw new SonyProjectorException("Invalid IR code: " + command, e);
|
||||||
|
}
|
||||||
|
irCode = new byte[2];
|
||||||
|
irCode[0] = (byte) ((hex >> 8) & 0x000000FF);
|
||||||
|
irCode[1] = (byte) (hex & 0x000000FF);
|
||||||
|
}
|
||||||
|
if (irCode == null || !SonyProjectorItem.isValidIrCode(irCode)) {
|
||||||
|
throw new SonyProjectorException("Invalid IR code: " + command);
|
||||||
|
}
|
||||||
|
sendIR(irCode);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Request the projector to get the current value for a setting
|
* Request the projector to get the current value for a setting
|
||||||
*
|
*
|
||||||
|
@ -899,7 +958,7 @@ public abstract class SonyProjectorConnector {
|
||||||
logger.debug("Get setting {} succeeded: result data: {}", item.getName(), HexUtils.bytesToHex(result));
|
logger.debug("Get setting {} succeeded: result data: {}", item.getName(), HexUtils.bytesToHex(result));
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
} catch (CommunicationException e) {
|
} catch (CommunicationException | SonyProjectorException e) {
|
||||||
throw new SonyProjectorException("Get setting " + item.getName() + " failed", e);
|
throw new SonyProjectorException("Get setting " + item.getName() + " failed", e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -917,7 +976,7 @@ public abstract class SonyProjectorConnector {
|
||||||
|
|
||||||
try {
|
try {
|
||||||
executeCommand(item, false, data);
|
executeCommand(item, false, data);
|
||||||
} catch (CommunicationException e) {
|
} catch (CommunicationException | SonyProjectorException e) {
|
||||||
throw new SonyProjectorException("Set setting " + item.getName() + " failed", e);
|
throw new SonyProjectorException("Set setting " + item.getName() + " failed", e);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -931,8 +990,24 @@ public abstract class SonyProjectorConnector {
|
||||||
*
|
*
|
||||||
* @throws SonyProjectorException in case of any problem
|
* @throws SonyProjectorException in case of any problem
|
||||||
*/
|
*/
|
||||||
private synchronized void sendIR(SonyProjectorItem item) throws SonyProjectorException {
|
private void sendIR(SonyProjectorItem item) throws SonyProjectorException {
|
||||||
logger.debug("Send IR {}", item.getName());
|
byte @Nullable [] irCode = item.getIrCode();
|
||||||
|
if (irCode == null || !SonyProjectorItem.isValidIrCode(irCode)) {
|
||||||
|
throw new SonyProjectorException("Send IR code failed, code is invalid");
|
||||||
|
}
|
||||||
|
sendIR(irCode);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Send an IR command to the projector
|
||||||
|
*
|
||||||
|
* @param irCode the IR code (2 bytes) to send
|
||||||
|
*
|
||||||
|
* @throws SonyProjectorException in case of any problem
|
||||||
|
*/
|
||||||
|
private synchronized void sendIR(byte[] irCode) throws SonyProjectorException {
|
||||||
|
String codeStr = String.format("%02x%02x", irCode[0], irCode[1]);
|
||||||
|
logger.debug("Send IR code {}", codeStr);
|
||||||
|
|
||||||
try {
|
try {
|
||||||
boolean runningSession = connected;
|
boolean runningSession = connected;
|
||||||
|
@ -940,7 +1015,7 @@ public abstract class SonyProjectorConnector {
|
||||||
open();
|
open();
|
||||||
|
|
||||||
// Build the message and send it
|
// Build the message and send it
|
||||||
writeCommand(buildMessage(item, false, DUMMY_DATA));
|
writeCommand(buildMessage(irCode, false, DUMMY_DATA));
|
||||||
|
|
||||||
// Wait at least 45 ms
|
// Wait at least 45 ms
|
||||||
Thread.sleep(45);
|
Thread.sleep(45);
|
||||||
|
@ -951,13 +1026,13 @@ public abstract class SonyProjectorConnector {
|
||||||
close();
|
close();
|
||||||
}
|
}
|
||||||
} catch (CommunicationException e) {
|
} catch (CommunicationException e) {
|
||||||
throw new SonyProjectorException("Send IR " + item.getName() + " failed", e);
|
throw new SonyProjectorException("Send IR code " + codeStr + " failed", e);
|
||||||
} catch (InterruptedException e) {
|
} catch (InterruptedException e) {
|
||||||
Thread.currentThread().interrupt();
|
Thread.currentThread().interrupt();
|
||||||
throw new SonyProjectorException("Send IR " + item.getName() + " interrupted", e);
|
throw new SonyProjectorException("Send IR code " + codeStr + " interrupted", e);
|
||||||
}
|
}
|
||||||
|
|
||||||
logger.debug("Send IR {} succeeded", item.getName());
|
logger.debug("Send IR code {} succeeded", codeStr);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -971,15 +1046,21 @@ public abstract class SonyProjectorConnector {
|
||||||
*
|
*
|
||||||
* @throws ConnectionException in case of any connection problem
|
* @throws ConnectionException in case of any connection problem
|
||||||
* @throws CommunicationException in case of any communication problem
|
* @throws CommunicationException in case of any communication problem
|
||||||
|
* @throws SonyProjectorException in case of any other problem
|
||||||
*/
|
*/
|
||||||
private synchronized byte[] executeCommand(SonyProjectorItem item, boolean getCommand, byte[] data)
|
private synchronized byte[] executeCommand(SonyProjectorItem item, boolean getCommand, byte[] data)
|
||||||
throws ConnectionException, CommunicationException {
|
throws ConnectionException, CommunicationException, SonyProjectorException {
|
||||||
|
byte @Nullable [] code = item.getCode();
|
||||||
|
if (code == null) {
|
||||||
|
throw new SonyProjectorException("Undefined data code");
|
||||||
|
}
|
||||||
|
|
||||||
boolean runningSession = connected;
|
boolean runningSession = connected;
|
||||||
|
|
||||||
open();
|
open();
|
||||||
|
|
||||||
// Build the message and send it
|
// Build the message and send it
|
||||||
writeCommand(buildMessage(item, getCommand, data));
|
writeCommand(buildMessage(code, getCommand, data));
|
||||||
|
|
||||||
// Read the response
|
// Read the response
|
||||||
byte[] responseMessage = readResponse();
|
byte[] responseMessage = readResponse();
|
||||||
|
@ -1029,13 +1110,13 @@ public abstract class SonyProjectorConnector {
|
||||||
/**
|
/**
|
||||||
* Build the message buffer corresponding to the request of a particular information
|
* Build the message buffer corresponding to the request of a particular information
|
||||||
*
|
*
|
||||||
* @param item the projector setting to get or set
|
* @param itemCode the code (2 bytes) of the projector setting to get or set
|
||||||
* @param getCommand true for a GET command or false for a SET command
|
* @param getCommand true for a GET command or false for a SET command
|
||||||
* @param data the value to be considered in case of a SET command
|
* @param data the value to be considered in case of a SET command
|
||||||
*
|
*
|
||||||
* @return the message buffer
|
* @return the message buffer
|
||||||
*/
|
*/
|
||||||
protected abstract byte[] buildMessage(SonyProjectorItem item, boolean getCommand, byte[] data);
|
protected abstract byte[] buildMessage(byte[] itemCode, boolean getCommand, byte[] data);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Reads some number of bytes from the input stream and stores them into the buffer array b. The number of bytes
|
* Reads some number of bytes from the input stream and stores them into the buffer array b. The number of bytes
|
||||||
|
|
|
@ -18,6 +18,7 @@ import java.util.List;
|
||||||
|
|
||||||
import org.eclipse.jdt.annotation.NonNullByDefault;
|
import org.eclipse.jdt.annotation.NonNullByDefault;
|
||||||
import org.openhab.binding.sonyprojector.internal.SonyProjectorException;
|
import org.openhab.binding.sonyprojector.internal.SonyProjectorException;
|
||||||
|
import org.openhab.core.types.CommandOption;
|
||||||
import org.openhab.core.types.StateOption;
|
import org.openhab.core.types.StateOption;
|
||||||
import org.openhab.core.util.HexUtils;
|
import org.openhab.core.util.HexUtils;
|
||||||
|
|
||||||
|
@ -31,41 +32,42 @@ public enum SonyProjectorInput {
|
||||||
|
|
||||||
// Category 1: VW260, VW270, VW285, VW295, VW300, VW315, VW320, VW328, VW350, VW365, VW385, VW500, VW515, VW520,
|
// Category 1: VW260, VW270, VW285, VW295, VW300, VW315, VW320, VW328, VW350, VW365, VW385, VW500, VW515, VW520,
|
||||||
// VW528, VW550, VW570, VW600, VW665, VW675, VW695, VW760, VW870, VW885, VW995, HW45ES, HW60, HW65, HW68
|
// VW528, VW550, VW570, VW600, VW665, VW675, VW695, VW760, VW870, VW885, VW995, HW45ES, HW60, HW65, HW68
|
||||||
CAT1_HDMI1(1, "HDMI1", new byte[] { 0x00, 0x02 }),
|
CAT1_HDMI1(1, "HDMI1", new byte[] { 0x00, 0x02 }, new byte[] { 0x17, 0x2B }),
|
||||||
CAT1_HDMI2(1, "HDMI2", new byte[] { 0x00, 0x03 }),
|
CAT1_HDMI2(1, "HDMI2", new byte[] { 0x00, 0x03 }, new byte[] { 0x17, 0x2C }),
|
||||||
|
|
||||||
// Category 2: VW40, VW50, VW60, VW70, VW80, VW85, VW200, HW10, HW15, HW20
|
// Category 2: VW40, VW50, VW60, VW70, VW80, VW85, VW200, HW10, HW15, HW20
|
||||||
CAT2_VIDEO(2, "Video", new byte[] { 0x00, 0x00 }),
|
CAT2_VIDEO(2, "Video", new byte[] { 0x00, 0x00 }, new byte[] { 0x17, 0x2A }),
|
||||||
CAT2_SVIDEO(2, "SVideo", new byte[] { 0x00, 0x01 }),
|
CAT2_SVIDEO(2, "SVideo", new byte[] { 0x00, 0x01 }, new byte[] { 0x17, 0x5F }),
|
||||||
CAT2_INPUT_A(2, "InputA", new byte[] { 0x00, 0x02 }),
|
CAT2_INPUT_A(2, "InputA", new byte[] { 0x00, 0x02 }, new byte[] { 0x17, 0x2B }),
|
||||||
CAT2_COMPONENT(2, "Component", new byte[] { 0x00, 0x03 }),
|
CAT2_COMPONENT(2, "Component", new byte[] { 0x00, 0x03 }, new byte[] { 0x17, 0x2C }),
|
||||||
CAT2_HDMI1(2, "HDMI1", new byte[] { 0x00, 0x04 }),
|
CAT2_HDMI1(2, "HDMI1", new byte[] { 0x00, 0x04 }, new byte[] { 0x17, 0x6F }),
|
||||||
CAT2_HDMI2(2, "HDMI2", new byte[] { 0x00, 0x05 }),
|
CAT2_HDMI2(2, "HDMI2", new byte[] { 0x00, 0x05 }, new byte[] { 0x17, 0x70 }),
|
||||||
|
|
||||||
// Category 3: VW95, VW1000ES, VW1100ES, HW30ES, HW40ES, HW50ES, HW55ES, HW58ES
|
// Category 3: VW95, VW1000ES, VW1100ES, HW30ES, HW40ES, HW50ES, HW55ES, HW58ES
|
||||||
CAT3_INPUT_A(3, "InputA", new byte[] { 0x00, 0x02 }),
|
CAT3_INPUT_A(3, "InputA", new byte[] { 0x00, 0x02 }, new byte[] { 0x17, 0x2B }),
|
||||||
CAT3_COMPONENT(3, "Component", new byte[] { 0x00, 0x03 }),
|
CAT3_COMPONENT(3, "Component", new byte[] { 0x00, 0x03 }, new byte[] { 0x17, 0x2C }),
|
||||||
CAT3_HDMI1(3, "HDMI1", new byte[] { 0x00, 0x04 }),
|
CAT3_HDMI1(3, "HDMI1", new byte[] { 0x00, 0x04 }, new byte[] { 0x17, 0x6F }),
|
||||||
CAT3_HDMI2(3, "HDMI2", new byte[] { 0x00, 0x05 }),
|
CAT3_HDMI2(3, "HDMI2", new byte[] { 0x00, 0x05 }, new byte[] { 0x17, 0x70 }),
|
||||||
|
|
||||||
// Category 4: VW100
|
// Category 4: VW100
|
||||||
CAT4_VIDEO(4, "Video", new byte[] { 0x00, 0x00 }),
|
CAT4_VIDEO(4, "Video", new byte[] { 0x00, 0x00 }, new byte[] { 0x17, 0x2A }),
|
||||||
CAT4_SVIDEO(4, "SVideo", new byte[] { 0x00, 0x01 }),
|
CAT4_SVIDEO(4, "SVideo", new byte[] { 0x00, 0x01 }, new byte[] { 0x17, 0x5F }),
|
||||||
CAT4_INPUT_A(4, "InputA", new byte[] { 0x00, 0x02 }),
|
CAT4_INPUT_A(4, "InputA", new byte[] { 0x00, 0x02 }, new byte[] { 0x17, 0x2B }),
|
||||||
CAT4_COMPONENT(4, "Component", new byte[] { 0x00, 0x03 }),
|
CAT4_COMPONENT(4, "Component", new byte[] { 0x00, 0x03 }, new byte[] { 0x17, 0x2C }),
|
||||||
CAT4_HDMI(4, "HDMI", new byte[] { 0x00, 0x04 }),
|
CAT4_HDMI(4, "HDMI", new byte[] { 0x00, 0x04 }, new byte[] { 0x17, 0x6F }),
|
||||||
CAT4_DVI(4, "DVI", new byte[] { 0x00, 0x05 }),
|
CAT4_DVI(4, "DVI", new byte[] { 0x00, 0x05 }, new byte[] { 0x17, 0x70 }),
|
||||||
|
|
||||||
// Category 5: VW90
|
// Category 5: VW90
|
||||||
CAT5_VIDEO(5, "Video", new byte[] { 0x00, 0x00 }),
|
CAT5_VIDEO(5, "Video", new byte[] { 0x00, 0x00 }, new byte[] { 0x17, 0x2A }),
|
||||||
CAT5_INPUT_A(5, "InputA", new byte[] { 0x00, 0x02 }),
|
CAT5_INPUT_A(5, "InputA", new byte[] { 0x00, 0x02 }, new byte[] { 0x17, 0x2B }),
|
||||||
CAT5_COMPONENT(5, "Component", new byte[] { 0x00, 0x03 }),
|
CAT5_COMPONENT(5, "Component", new byte[] { 0x00, 0x03 }, new byte[] { 0x17, 0x2C }),
|
||||||
CAT5_HDMI1(5, "HDMI1", new byte[] { 0x00, 0x04 }),
|
CAT5_HDMI1(5, "HDMI1", new byte[] { 0x00, 0x04 }, new byte[] { 0x17, 0x6F }),
|
||||||
CAT5_HDMI2(5, "HDMI2", new byte[] { 0x00, 0x05 });
|
CAT5_HDMI2(5, "HDMI2", new byte[] { 0x00, 0x05 }, new byte[] { 0x17, 0x70 });
|
||||||
|
|
||||||
private int category;
|
private int category;
|
||||||
private String name;
|
private String name;
|
||||||
private byte[] dataCode;
|
private byte[] dataCode;
|
||||||
|
private byte[] irCode;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Constructor
|
* Constructor
|
||||||
|
@ -73,11 +75,13 @@ public enum SonyProjectorInput {
|
||||||
* @param category a category of projector models for which the video input is available
|
* @param category a category of projector models for which the video input is available
|
||||||
* @param name the name of the video input
|
* @param name the name of the video input
|
||||||
* @param dataCode the data code identifying the video input
|
* @param dataCode the data code identifying the video input
|
||||||
|
* @param irCode the IR code for the video input
|
||||||
*/
|
*/
|
||||||
private SonyProjectorInput(int category, String name, byte[] dataCode) {
|
private SonyProjectorInput(int category, String name, byte[] dataCode, byte[] irCode) {
|
||||||
this.category = category;
|
this.category = category;
|
||||||
this.name = name;
|
this.name = name;
|
||||||
this.dataCode = dataCode;
|
this.dataCode = dataCode;
|
||||||
|
this.irCode = irCode;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -98,6 +102,15 @@ public enum SonyProjectorInput {
|
||||||
return dataCode;
|
return dataCode;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the IR code for the current video input
|
||||||
|
*
|
||||||
|
* @return the IR code
|
||||||
|
*/
|
||||||
|
public byte[] getIrCode() {
|
||||||
|
return irCode;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the name of the current video input
|
* Get the name of the current video input
|
||||||
*
|
*
|
||||||
|
@ -126,6 +139,26 @@ public enum SonyProjectorInput {
|
||||||
return options;
|
return options;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the list of {@link CommandOption} associated to the available video inputs for a particular category of
|
||||||
|
* projector models
|
||||||
|
*
|
||||||
|
* @param category a category of projector models
|
||||||
|
*
|
||||||
|
* @return the list of {@link CommandOption} associated to the available video inputs for a provided category of
|
||||||
|
* projector models
|
||||||
|
*/
|
||||||
|
public static List<CommandOption> getCommandOptions(int category) {
|
||||||
|
List<CommandOption> options = new ArrayList<>();
|
||||||
|
for (SonyProjectorInput value : SonyProjectorInput.values()) {
|
||||||
|
if (value.getCategory() == category) {
|
||||||
|
options.add(new CommandOption("INPUT_" + value.getName().toUpperCase(),
|
||||||
|
"@text/channel-type.sonyprojector.input.state.option." + value.getName()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return options;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the video input associated to a name for a particular category of projector models
|
* Get the video input associated to a name for a particular category of projector models
|
||||||
*
|
*
|
||||||
|
@ -138,7 +171,7 @@ public enum SonyProjectorInput {
|
||||||
*/
|
*/
|
||||||
public static SonyProjectorInput getFromName(int category, String name) throws SonyProjectorException {
|
public static SonyProjectorInput getFromName(int category, String name) throws SonyProjectorException {
|
||||||
for (SonyProjectorInput value : SonyProjectorInput.values()) {
|
for (SonyProjectorInput value : SonyProjectorInput.values()) {
|
||||||
if (value.getCategory() == category && value.getName().equals(name)) {
|
if (value.getCategory() == category && value.getName().equalsIgnoreCase(name)) {
|
||||||
return value;
|
return value;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -12,63 +12,81 @@
|
||||||
*/
|
*/
|
||||||
package org.openhab.binding.sonyprojector.internal.communication;
|
package org.openhab.binding.sonyprojector.internal.communication;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
import org.eclipse.jdt.annotation.NonNullByDefault;
|
import org.eclipse.jdt.annotation.NonNullByDefault;
|
||||||
|
import org.eclipse.jdt.annotation.Nullable;
|
||||||
|
import org.openhab.binding.sonyprojector.internal.SonyProjectorException;
|
||||||
|
import org.openhab.core.types.CommandOption;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Represents the different kinds of commands
|
* Represents the different kinds of commands
|
||||||
*
|
*
|
||||||
* @author Markus Wehrle - Initial contribution
|
* @author Markus Wehrle - Initial contribution
|
||||||
* @author Laurent Garnier - Transform into an enum and rename it
|
* @author Laurent Garnier - Transform into an enum and rename it
|
||||||
|
* @author Laurent Garnier - Add more IR commands
|
||||||
*/
|
*/
|
||||||
@NonNullByDefault
|
@NonNullByDefault
|
||||||
public enum SonyProjectorItem {
|
public enum SonyProjectorItem {
|
||||||
|
|
||||||
// Not available for VW40, VW50, VW60, VW70, VW80, VW85, VW90, VW95, VW100, VW200, VW1000ES, VW1100ES,
|
// Not available for VW40, VW50, VW60, VW70, VW80, VW85, VW90, VW95, VW100, VW200, VW1000ES, VW1100ES,
|
||||||
// HW10, HW15, HW20, HW30ES, HW35ES, HW40ES, HW50ES, HW55ES, HW58ES
|
// HW10, HW15, HW20, HW30ES, HW35ES, HW40ES, HW50ES, HW55ES, HW58ES
|
||||||
POWER("Power", new byte[] { 0x01, 0x30 }),
|
POWER("Power On/Off", new byte[] { 0x01, 0x30 }, new byte[] { 0x17, 0x15 }),
|
||||||
|
POWER_ON("Power On", null, new byte[] { 0x17, 0x2E }),
|
||||||
|
POWER_OFF("Power Off", null, new byte[] { 0x17, 0x2F }),
|
||||||
|
|
||||||
INPUT("Input", new byte[] { 0x00, 0x01 }),
|
INPUT("Input", new byte[] { 0x00, 0x01 }, new byte[] { 0x17, 0x57 }, "input"),
|
||||||
CALIBRATION_PRESET("Calibration Preset", new byte[] { 0x00, 0x02 }),
|
CALIBRATION_PRESET("Calibration Preset", new byte[] { 0x00, 0x02 }, new byte[] { 0x19, 0x5B }, "calibrationpreset"),
|
||||||
CONTRAST("Contrast", new byte[] { 0x00, 0x10 }),
|
CONTRAST("Contrast", new byte[] { 0x00, 0x10 }),
|
||||||
|
CONTRAST_UP("Contrast +", null, new byte[] { 0x17, 0x18 }),
|
||||||
|
CONTRAST_DOWN("Contrast -", null, new byte[] { 0x17, 0x19 }),
|
||||||
BRIGHTNESS("Brigtness", new byte[] { 0x00, 0x11 }),
|
BRIGHTNESS("Brigtness", new byte[] { 0x00, 0x11 }),
|
||||||
|
BRIGHTNESS_UP("Brightness +", null, new byte[] { 0x17, 0x1E }),
|
||||||
|
BRIGHTNESS_DOWN("Brightness -", null, new byte[] { 0x17, 0x1F }),
|
||||||
COLOR("Color", new byte[] { 0x00, 0x12 }),
|
COLOR("Color", new byte[] { 0x00, 0x12 }),
|
||||||
|
COLOR_UP("Color +", null, new byte[] { 0x17, 0x1A }),
|
||||||
|
COLOR_DOWN("Color -", null, new byte[] { 0x17, 0x1B }),
|
||||||
HUE("Hue", new byte[] { 0x00, 0x13 }),
|
HUE("Hue", new byte[] { 0x00, 0x13 }),
|
||||||
|
HUE_UP("Hue +", null, new byte[] { 0x17, 0x20 }),
|
||||||
|
HUE_DOWN("Hue -", null, new byte[] { 0x17, 0x21 }),
|
||||||
SHARPNESS("Sharpness", new byte[] { 0x00, 0x14 }),
|
SHARPNESS("Sharpness", new byte[] { 0x00, 0x14 }),
|
||||||
COLOR_TEMP("Color Temperature", new byte[] { 0x00, 0x17 }),
|
SHARPNESS_UP("Sharpness +", null, new byte[] { 0x17, 0x22 }),
|
||||||
|
SHARPNESS_DOWN("Sharpness -", null, new byte[] { 0x17, 0x23 }),
|
||||||
|
CONTRAST_ENHANCER("Contrast Enhancer", new byte[] { 0x00, 0x1C }, new byte[] { 0x17, 0x07 }, "contrastenhancer"),
|
||||||
|
COLOR_TEMP("Color Temperature", new byte[] { 0x00, 0x17 }, new byte[] { 0x19, 0x5C }, "colortemperature"),
|
||||||
|
GAMMA_CORRECTION("Gamma Correction", new byte[] { 0x00, 0x22 }, new byte[] { 0x19, 0x5E }, "gammacorrection"),
|
||||||
|
COLOR_SPACE("Color Space", new byte[] { 0x00, 0x3B }, new byte[] { 0x19, 0x4B }, "colorspace"),
|
||||||
|
|
||||||
|
PICTURE_MUTING("Picture Muting", new byte[] { 0x00, 0x30 }, new byte[] { 0x17, 0x24 }, "picturemuting"),
|
||||||
|
NR("NR", new byte[] { 0x00, 0x25 }),
|
||||||
|
|
||||||
// Not available for VW100, VW200
|
// Not available for VW100, VW200
|
||||||
LAMP_CONTROL("Lamp Control", new byte[] { 0x00, 0x1A }),
|
LAMP_CONTROL("Lamp Control", new byte[] { 0x00, 0x1A }),
|
||||||
|
|
||||||
CONTRAST_ENHANCER("Contrast Enhancer", new byte[] { 0x00, 0x1C }),
|
|
||||||
|
|
||||||
// Not available for VW260, VW270, VW285, VW295, VW300, VW315, VW320, VW328, VW350, VW365, HW35ES, HW40ES, HW45ES,
|
|
||||||
// HW58ES
|
|
||||||
IRIS_MODE("Iris Mode", new byte[] { 0x00, 0x1D }),
|
|
||||||
|
|
||||||
// Not available for VW315, VW320, VW328, VW365, VW515, VW520, VW528, VW665, HW60, HW65, HW68
|
// Not available for VW315, VW320, VW328, VW365, VW515, VW520, VW528, VW665, HW60, HW65, HW68
|
||||||
REAL_COLOR("Real Color Processing", new byte[] { 0x00, 0x1E }),
|
REAL_COLOR("Real Color Processing", new byte[] { 0x00, 0x1E }, new byte[] { 0x19, 0x08 }),
|
||||||
|
|
||||||
|
// Not available for VW40, VW50, VW60, VW70, VW85, VW95, VW100, HW15, HW20, HW30ES
|
||||||
|
REALITY_CREATION("Reality Creation", new byte[] { 0x00, 0x67 }, new byte[] { 0x19, 0x4C }),
|
||||||
|
|
||||||
// Not available for VW40, VW50, VW60
|
// Not available for VW40, VW50, VW60
|
||||||
FILM_MODE("Film Mode", new byte[] { 0x00, 0x1F }),
|
FILM_MODE("Film Mode", new byte[] { 0x00, 0x1F }),
|
||||||
|
|
||||||
ASPECT("Aspect", new byte[] { 0x00, 0x20 }),
|
// Not available for VW40, VW50, VW60, VW70, VW100, VW260, VW270, VW285, VW295, VW300, VW315, VW320, VW328, VW350,
|
||||||
GAMMA_CORRECTION("Gamma Correction", new byte[] { 0x00, 0x22 }),
|
// VW365, VW385, VW500, VW515, VW520, VW528, VW570, VW600, VW665, VW675, VW695, VW760, VW870, VW885, VW995, HW10,
|
||||||
COLOR_SPACE("Color Space", new byte[] { 0x00, 0x3B }),
|
// HW15, HW20, HW30ES, HW45ES, HW60, HW65, HW68
|
||||||
PICTURE_MUTING("Picture Muting", new byte[] { 0x00, 0x30 }),
|
FILM_PROJECTION("Film Projection", new byte[] { 0x00, 0x58 }, new byte[] { 0x17, 0x08 }, "filmprojection"),
|
||||||
NR("NR", new byte[] { 0x00, 0x25 }),
|
|
||||||
|
|
||||||
// Not available for VW40, VW50, VW60, VW100, VW200, VW260, VW270, VW285, VW295, VW300, VW315, VW320, VW328, VW350,
|
// Not available for VW40, VW50, VW60, VW70, VW100, HW10, HW15, HW20, HW30ES
|
||||||
// VW365, VW385, VW500, VW515, VW520, VW528, VW550, VW570, VW600, VW665, VW675, VW760, VW870, VW885, VW995,
|
MOTION_ENHANCER("Motion Enhancer", new byte[] { 0x00, 0x59 }, new byte[] { 0x17, 0x05 }, "motionenhancer"),
|
||||||
// VW1000ES, VW1100ES, HW35ES, HW40ES, HW45ES, HW50ES, HW55ES, HW58ES, HW60, HW65, HW68
|
|
||||||
BLOCK_NR("Block NR", new byte[] { 0x00, 0x26 }),
|
|
||||||
MOSQUITO_NR("Mosquito NR", new byte[] { 0x00, 0x27 }),
|
|
||||||
|
|
||||||
// Not available for VW40, VW50, VW60, VW70, VW80, VW85, VW90, VW95, VW100, VW200, HW10, HW15, HW20, HW30ES
|
// Not available for VW40, VW50, VW60, VW100
|
||||||
MPEG_NR("MPEG NR", new byte[] { 0x00, 0x6C }),
|
XVCOLOR("xvColor", new byte[] { 0x00, 0x5A }),
|
||||||
|
|
||||||
// Not available for VW260, VW270, VW285, VW295, VW300, VW315, VW320, VW328, VW350, VW365, VW385, VW500, VW515,
|
// Not available for VW260, VW270, VW285, VW295, VW300, VW315, VW320, VW328, VW350, VW365, HW35ES, HW40ES, HW45ES,
|
||||||
// VW520, VW528, VW550, VW570, VW600, VW665, VW675, VW760, VW870, VW885, VW995, HW45ES, HW60, HW65, HW68
|
// HW58ES
|
||||||
OVERSCAN("Overscan", new byte[] { 0x00, 0x23 }),
|
IRIS_MODE("Iris Mode", new byte[] { 0x00, 0x1D }, new byte[] { 0x19, 0x5F }, "irismode"),
|
||||||
|
|
||||||
// Not available for VW100, VW260, VW270, VW285, VW295, VW300, VW315, VW320, VW328, VW350, VW365, VW385, VW500,
|
// Not available for VW100, VW260, VW270, VW285, VW295, VW300, VW315, VW320, VW328, VW350, VW365, VW385, VW500,
|
||||||
// VW515, VW520, VW528, VW550, VW570, VW600, VW665, VW675, VW760, VW870, VW885, VW995, VW1000ES, VW1100ES, HW35ES,
|
// VW515, VW520, VW528, VW550, VW570, VW600, VW665, VW675, VW760, VW870, VW885, VW995, VW1000ES, VW1100ES, HW35ES,
|
||||||
|
@ -79,28 +97,35 @@ public enum SonyProjectorItem {
|
||||||
// VW885, VW995, HW35ES, HW40ES, HW45ES, HW58ES
|
// VW885, VW995, HW35ES, HW40ES, HW45ES, HW58ES
|
||||||
IRIS_MANUAL("Iris Manual", new byte[] { 0x00, 0x57 }),
|
IRIS_MANUAL("Iris Manual", new byte[] { 0x00, 0x57 }),
|
||||||
|
|
||||||
// Not available for VW40, VW50, VW60, VW70, VW100, VW260, VW270, VW285, VW295, VW300, VW315, VW320, VW328, VW350,
|
// Not available for VW40, VW50, VW60, VW100, VW200, VW260, VW270, VW285, VW295, VW300, VW315, VW320, VW328, VW350,
|
||||||
// VW365, VW385, VW500, VW515, VW520, VW528, VW570, VW600, VW665, VW675, VW695, VW760, VW870, VW885, VW995, HW10,
|
// VW365, VW385, VW500, VW515, VW520, VW528, VW550, VW570, VW600, VW665, VW675, VW760, VW870, VW885, VW995,
|
||||||
// HW15, HW20, HW30ES, HW45ES, HW60, HW65, HW68
|
// VW1000ES, VW1100ES, HW35ES, HW40ES, HW45ES, HW50ES, HW55ES, HW58ES, HW60, HW65, HW68
|
||||||
FILM_PROJECTION("Film Projection", new byte[] { 0x00, 0x58 }),
|
BLOCK_NR("Block NR", new byte[] { 0x00, 0x26 }),
|
||||||
|
MOSQUITO_NR("Mosquito NR", new byte[] { 0x00, 0x27 }),
|
||||||
|
|
||||||
// Not available for VW40, VW50, VW60, VW70, VW100, HW10, HW15, HW20, HW30ES
|
// Not available for VW40, VW50, VW60, VW70, VW80, VW85, VW90, VW95, VW100, VW200, HW10, HW15, HW20, HW30ES
|
||||||
MOTION_ENHANCER("Motion Enhancer", new byte[] { 0x00, 0x59 }),
|
MPEG_NR("MPEG NR", new byte[] { 0x00, 0x6C }),
|
||||||
|
|
||||||
// Not available for VW40, VW50, VW60, VW100
|
// Not available for VW40, VW50, VW60, VW70, VW85, VW95, VW100, VW315, VW320, VW328, VW365, VW1000ES, VW1100ES
|
||||||
XVCOLOR("xvColor", new byte[] { 0x00, 0x5A }),
|
// HW15, HW20, HW30ES, HW35ES, HW40ES, HW50ES, HW55ES, HW58ES, HW60, HW65, HW68
|
||||||
|
HDR("HDR", new byte[] { 0x00, 0x7C }),
|
||||||
|
|
||||||
|
ASPECT("Aspect", new byte[] { 0x00, 0x20 }, new byte[] { 0x19, 0x6E }, "aspect"),
|
||||||
|
|
||||||
|
// Not available for VW260, VW270, VW285, VW295, VW300, VW315, VW320, VW328, VW350, VW365, VW385, VW500, VW515,
|
||||||
|
// VW520, VW528, VW550, VW570, VW600, VW665, VW675, VW760, VW870, VW885, VW995, HW45ES, HW60, HW65, HW68
|
||||||
|
OVERSCAN("Overscan", new byte[] { 0x00, 0x23 }),
|
||||||
|
|
||||||
// Not available for VW40, VW50, VW60, VW70, VW80, VW85, VW90, VW100, VW200, VW260, VW270, VW285, VW295, VW300,
|
// Not available for VW40, VW50, VW60, VW70, VW80, VW85, VW90, VW100, VW200, VW260, VW270, VW285, VW295, VW300,
|
||||||
// VW315, VW320, VW328, VW350, VW365, HW10, HW15, HW20, HW30ES, HW35ES, HW40ES, HW45ES, HW50ES, HW55ES, HW58ES,
|
// VW315, VW320, VW328, VW350, VW365, HW10, HW15, HW20, HW30ES, HW35ES, HW40ES, HW45ES, HW50ES, HW55ES, HW58ES,
|
||||||
// HW60, HW65, HW68
|
// HW60, HW65, HW68
|
||||||
PICTURE_POSITION("Picture Position", new byte[] { 0x00, 0x66 }),
|
PICTURE_POSITION("Picture Position", new byte[] { 0x00, 0x66 }),
|
||||||
|
|
||||||
// Not available for VW40, VW50, VW60, VW70, VW85, VW95, VW100, HW15, HW20, HW30ES
|
PICTURE_POS_185("Picture Position 1.85:1", null, new byte[] { 0x1B, 0x20 }),
|
||||||
REALITY_CREATION("Reality Creation", new byte[] { 0x00, 0x67 }),
|
PICTURE_POS_235("Picture Position 2.35:1", null, new byte[] { 0x1B, 0x21 }),
|
||||||
|
PICTURE_POS_CUSTOM1("Picture Position Custom 1", null, new byte[] { 0x1B, 0x22 }),
|
||||||
// Not available for VW40, VW50, VW60, VW70, VW85, VW95, VW100, VW315, VW320, VW328, VW365, VW1000ES, VW1100ES
|
PICTURE_POS_CUSTOM2("Picture Position Custom 2", null, new byte[] { 0x1B, 0x23 }),
|
||||||
// HW15, HW20, HW30ES, HW35ES, HW40ES, HW50ES, HW55ES, HW58ES, HW60, HW65, HW68
|
PICTURE_POS_CUSTOM3("Picture Position Custom 3", null, new byte[] { 0x1B, 0x24 }),
|
||||||
HDR("HDR", new byte[] { 0x00, 0x7C }),
|
|
||||||
|
|
||||||
// Not available for VW40, VW50, VW60, VW70, VW85, VW95, VW100, VW1000ES, VW1100ES
|
// Not available for VW40, VW50, VW60, VW70, VW85, VW95, VW100, VW1000ES, VW1100ES
|
||||||
// HW15, HW20, HW30ES, HW35ES, HW40ES, HW50ES, HW55ES, HW58ES
|
// HW15, HW20, HW30ES, HW35ES, HW40ES, HW50ES, HW55ES, HW58ES
|
||||||
|
@ -113,36 +138,125 @@ public enum SonyProjectorItem {
|
||||||
// Not available for VW40, VW50, VW60, VW70, VW100
|
// Not available for VW40, VW50, VW60, VW70, VW100
|
||||||
STATUS_ERROR2("Status Error 2", new byte[] { 0x01, 0x25 }),
|
STATUS_ERROR2("Status Error 2", new byte[] { 0x01, 0x25 }),
|
||||||
|
|
||||||
IR_POWER_ON("Power On", new byte[] { 0x17, 0x2E }),
|
|
||||||
IR_POWER_OFF("Power Off", new byte[] { 0x17, 0x2F }),
|
|
||||||
|
|
||||||
CATEGORY_CODE("Category Code", new byte[] { (byte) 0x80, 0x00 }),
|
CATEGORY_CODE("Category Code", new byte[] { (byte) 0x80, 0x00 }),
|
||||||
MODEL_NAME("Model Name", new byte[] { (byte) 0x80, 0x01 }),
|
MODEL_NAME("Model Name", new byte[] { (byte) 0x80, 0x01 }),
|
||||||
SERIAL_NUMBER("Serial Number", new byte[] { (byte) 0x80, 0x02 }),
|
SERIAL_NUMBER("Serial Number", new byte[] { (byte) 0x80, 0x02 }),
|
||||||
INSTALLATION_LOCATION("Installation Location", new byte[] { (byte) 0x80, 0x03 });
|
INSTALLATION_LOCATION("Installation Location", new byte[] { (byte) 0x80, 0x03 }),
|
||||||
|
|
||||||
|
MENU("Menu", null, new byte[] { 0x17, 0x29 }),
|
||||||
|
UP("Cursor UP", null, new byte[] { 0x17, 0x35 }),
|
||||||
|
DOWN("Cursor DOWN", null, new byte[] { 0x17, 0x36 }),
|
||||||
|
LEFT("Cursor LEFT", null, new byte[] { 0x17, 0x34 }),
|
||||||
|
RIGHT("Cursor RIGHT", null, new byte[] { 0x17, 0x33 }),
|
||||||
|
ENTER("Enter", null, new byte[] { 0x17, 0x5A }),
|
||||||
|
RESET("Reset", null, new byte[] { 0x17, 0x7B }),
|
||||||
|
MEMORY("Memory", null, new byte[] { 0x17, 0x5E }),
|
||||||
|
STATUS_ON("Status On", null, new byte[] { 0x17, 0x25 }),
|
||||||
|
STATUS_OFF("Status Off", null, new byte[] { 0x17, 0x26 }),
|
||||||
|
|
||||||
|
ADJUST_PICTURE("Adjust Picture", null, new byte[] { 0x19, 0x09 }),
|
||||||
|
|
||||||
|
COLOR_CORRECTION("Color Correction", null, new byte[] { 0x1B, 0x1C }),
|
||||||
|
|
||||||
|
PITCH("Screen Pitch", null, new byte[] { 0x17, 0x47 }),
|
||||||
|
SHIFT("Screen Shift", null, new byte[] { 0x17, 0x48 }),
|
||||||
|
|
||||||
|
APA("APA", null, new byte[] { 0x19, 0x60 }),
|
||||||
|
DOT_PHASE("Dot Phase", null, new byte[] { 0x19, 0x61 }),
|
||||||
|
|
||||||
|
V_KEYSTONE("V Keystone", null, new byte[] { 0x19, 0x3A }),
|
||||||
|
V_KEYSTONE_UP("V Keystone +", null, new byte[] { 0x19, 0x00 }),
|
||||||
|
V_KEYSTONE_DOWN("V Keystone -", null, new byte[] { 0x19, 0x01 }),
|
||||||
|
LENS_CONTROL("Lens Control", null, new byte[] { 0x19, 0x78 }),
|
||||||
|
LENS_SHIFT("Lens Shift", null, new byte[] { 0x19, 0x63 }),
|
||||||
|
LENS_SHIFT_LEFT("Lens Shift LEFT", null, new byte[] { 0x19, 0x02 }),
|
||||||
|
LENS_SHIFT_RIGHT("Lens Shift RIGHT", null, new byte[] { 0x19, 0x03 }),
|
||||||
|
|
||||||
|
LENS_SHIFT_UP("Lens Shift UP", null, new byte[] { 0x17, 0x72 }),
|
||||||
|
LENS_SHIFT_DOWN("Lens Shift DOWN", null, new byte[] { 0x17, 0x73 }),
|
||||||
|
|
||||||
|
LENS_ZOOM("Lens Zoom", null, new byte[] { 0x19, 0x62 }),
|
||||||
|
|
||||||
|
LENS_ZOOM_LARGE("Lens Zoom Large", null, new byte[] { 0x17, 0x77 }),
|
||||||
|
LENS_ZOOM_SMALL("Lens Zoom Small", null, new byte[] { 0x17, 0x78 }),
|
||||||
|
|
||||||
|
LENS_FOCUS("Lens Focus", null, new byte[] { 0x19, 0x64 }),
|
||||||
|
|
||||||
|
LENS_FOCUS_FAR("Lens Focus Far", null, new byte[] { 0x17, 0x74 }),
|
||||||
|
LENS_FOCUS_NEAR("Lens Focus Near", null, new byte[] { 0x17, 0x75 }),
|
||||||
|
|
||||||
|
LENS_POSITION("Lens Position", null, new byte[] { 0x1B, 0x18 }),
|
||||||
|
|
||||||
|
MODE_3D("3D", null, new byte[] { 0x19, 0x3B }),
|
||||||
|
|
||||||
|
OPTIONS("Options", null, new byte[] { 0x1B, 0x6E }),
|
||||||
|
EXIT("Exit", null, new byte[] { 0x1B, 0x6F }),
|
||||||
|
SYNC_MENU("Sync Menu", null, new byte[] { 0x1B, 0x70 }),
|
||||||
|
PLAY("Play", null, new byte[] { 0x1B, 0x71 }),
|
||||||
|
STOP("Stop", null, new byte[] { 0x1B, 0x72 }),
|
||||||
|
PAUSE("Pause", null, new byte[] { 0x1B, 0x73 }),
|
||||||
|
FAST_REWIND("Fast Rewind", null, new byte[] { 0x1B, 0x74 }),
|
||||||
|
FAST_FORWARD("Fast Forward", null, new byte[] { 0x1B, 0x75 }),
|
||||||
|
PREVIOUS("Previous", null, new byte[] { 0x1B, 0x76 }),
|
||||||
|
NEXT("Next", null, new byte[] { 0x1B, 0x77 });
|
||||||
|
|
||||||
private String name;
|
private String name;
|
||||||
private byte[] code;
|
private byte @Nullable [] code;
|
||||||
|
private byte @Nullable [] irCode;
|
||||||
|
private @Nullable String channelType;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
* @param name the item name
|
* @param name the item name
|
||||||
* @param code the data code associated to the item
|
* @param code the data code associated to the item
|
||||||
*/
|
*/
|
||||||
private SonyProjectorItem(String name, byte[] code) {
|
private SonyProjectorItem(String name, byte @Nullable [] code) {
|
||||||
|
this(name, code, null, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param name the item name
|
||||||
|
* @param code the data code associated to the item
|
||||||
|
* @param irCode the IR code associated to the item
|
||||||
|
*/
|
||||||
|
private SonyProjectorItem(String name, byte @Nullable [] code, byte @Nullable [] irCode) {
|
||||||
|
this(name, code, irCode, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param name the item name
|
||||||
|
* @param code the data code associated to the item
|
||||||
|
* @param irCode the IR code associated to the item
|
||||||
|
* @param channelType the channel type id to consider to retrieve the command option label
|
||||||
|
*/
|
||||||
|
private SonyProjectorItem(String name, byte @Nullable [] code, byte @Nullable [] irCode,
|
||||||
|
@Nullable String channelType) {
|
||||||
this.name = name;
|
this.name = name;
|
||||||
this.code = code;
|
this.code = code;
|
||||||
|
this.irCode = irCode;
|
||||||
|
this.channelType = channelType;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the data code associated to the current item
|
* Get the data code associated to the current item
|
||||||
*
|
*
|
||||||
* @return the data code
|
* @return the data code or null if undefined
|
||||||
*/
|
*/
|
||||||
public byte[] getCode() {
|
public byte @Nullable [] getCode() {
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the IR code associated to the current item
|
||||||
|
*
|
||||||
|
* @return the IR code or null if undefined
|
||||||
|
*/
|
||||||
|
public byte @Nullable [] getIrCode() {
|
||||||
|
return irCode;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the item name
|
* Get the item name
|
||||||
*
|
*
|
||||||
|
@ -151,4 +265,66 @@ public enum SonyProjectorItem {
|
||||||
public String getName() {
|
public String getName() {
|
||||||
return name;
|
return name;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the channel type id to consider to retrieve the command option label
|
||||||
|
*
|
||||||
|
* @return the channel type id
|
||||||
|
*/
|
||||||
|
public @Nullable String getChannelType() {
|
||||||
|
return channelType;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static boolean isValidIrCode(byte @Nullable [] irCode) {
|
||||||
|
if (irCode != null && irCode.length == 2) {
|
||||||
|
return irCode[0] == 0x17 || irCode[0] == 0x19 || irCode[0] == 0x1B;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the command associated to a value
|
||||||
|
*
|
||||||
|
* @param val the value used to identify the command
|
||||||
|
*
|
||||||
|
* @return the command associated to the searched value
|
||||||
|
*
|
||||||
|
* @throws SonyProjectorException - If no command is associated to the searched value
|
||||||
|
*/
|
||||||
|
public static SonyProjectorItem getFromValue(String val) throws SonyProjectorException {
|
||||||
|
for (SonyProjectorItem value : SonyProjectorItem.values()) {
|
||||||
|
if (value.name().equalsIgnoreCase(val)) {
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
throw new SonyProjectorException("Invalid value for a command: " + val);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the list of {@link CommandOption} associated to the available IR commands
|
||||||
|
*
|
||||||
|
* @param inputOptions the command options associated to the video inputs
|
||||||
|
* @param presetOptions the command options associated to the calibration presets
|
||||||
|
* @param aspectOptions the command options associated to the aspect ratios
|
||||||
|
*
|
||||||
|
* @return the list of {@link CommandOption} associated to the available IR commands
|
||||||
|
*/
|
||||||
|
public static List<CommandOption> getIRCommandOptions(List<CommandOption> inputOptions,
|
||||||
|
List<CommandOption> presetOptions, List<CommandOption> aspectOptions) {
|
||||||
|
List<CommandOption> options = new ArrayList<>();
|
||||||
|
for (SonyProjectorItem value : SonyProjectorItem.values()) {
|
||||||
|
if (isValidIrCode(value.getIrCode())) {
|
||||||
|
options.add(new CommandOption(value.name(), value.getChannelType() == null ? value.getName()
|
||||||
|
: "@text/channel-type.sonyprojector." + value.getChannelType() + ".label"));
|
||||||
|
}
|
||||||
|
if (value == INPUT) {
|
||||||
|
options.addAll(inputOptions);
|
||||||
|
} else if (value == CALIBRATION_PRESET) {
|
||||||
|
options.addAll(presetOptions);
|
||||||
|
} else if (value == ASPECT) {
|
||||||
|
options.addAll(aspectOptions);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return options;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -20,6 +20,7 @@ import java.net.Socket;
|
||||||
import java.net.SocketTimeoutException;
|
import java.net.SocketTimeoutException;
|
||||||
import java.nio.charset.StandardCharsets;
|
import java.nio.charset.StandardCharsets;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
|
import java.util.Objects;
|
||||||
import java.util.concurrent.TimeUnit;
|
import java.util.concurrent.TimeUnit;
|
||||||
|
|
||||||
import org.eclipse.jdt.annotation.NonNullByDefault;
|
import org.eclipse.jdt.annotation.NonNullByDefault;
|
||||||
|
@ -155,7 +156,7 @@ public class SonyProjectorSdcpConnector extends SonyProjectorConnector {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected byte[] buildMessage(SonyProjectorItem item, boolean getCommand, byte[] data) {
|
protected byte[] buildMessage(byte[] itemCode, boolean getCommand, byte[] data) {
|
||||||
byte[] communityData = community.getBytes();
|
byte[] communityData = community.getBytes();
|
||||||
byte[] message = new byte[10 + data.length];
|
byte[] message = new byte[10 + data.length];
|
||||||
message[0] = HEADER[0];
|
message[0] = HEADER[0];
|
||||||
|
@ -165,8 +166,8 @@ public class SonyProjectorSdcpConnector extends SonyProjectorConnector {
|
||||||
message[4] = communityData[2];
|
message[4] = communityData[2];
|
||||||
message[5] = communityData[3];
|
message[5] = communityData[3];
|
||||||
message[6] = getCommand ? GET : SET;
|
message[6] = getCommand ? GET : SET;
|
||||||
message[7] = item.getCode()[0];
|
message[7] = itemCode[0];
|
||||||
message[8] = item.getCode()[1];
|
message[8] = itemCode[1];
|
||||||
message[9] = getCommand ? 0 : (byte) data.length;
|
message[9] = getCommand ? 0 : (byte) data.length;
|
||||||
if (!getCommand) {
|
if (!getCommand) {
|
||||||
System.arraycopy(data, 0, message, 10, data.length);
|
System.arraycopy(data, 0, message, 10, data.length);
|
||||||
|
@ -259,9 +260,10 @@ public class SonyProjectorSdcpConnector extends SonyProjectorConnector {
|
||||||
|
|
||||||
// Item number should be the same as used for sending
|
// Item number should be the same as used for sending
|
||||||
byte[] itemResponseMsg = Arrays.copyOfRange(responseMessage, 7, 9);
|
byte[] itemResponseMsg = Arrays.copyOfRange(responseMessage, 7, 9);
|
||||||
if (!Arrays.equals(itemResponseMsg, item.getCode())) {
|
byte[] itemSentMsg = Objects.requireNonNull(item.getCode());
|
||||||
|
if (!Arrays.equals(itemResponseMsg, itemSentMsg)) {
|
||||||
logger.debug("Unexpected item number in response: {} rather than {}", HexUtils.bytesToHex(itemResponseMsg),
|
logger.debug("Unexpected item number in response: {} rather than {}", HexUtils.bytesToHex(itemResponseMsg),
|
||||||
HexUtils.bytesToHex(item.getCode()));
|
HexUtils.bytesToHex(itemSentMsg));
|
||||||
throw new CommunicationException("Unexpected item number in response");
|
throw new CommunicationException("Unexpected item number in response");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -14,7 +14,6 @@ package org.openhab.binding.sonyprojector.internal.communication.sdcp;
|
||||||
|
|
||||||
import org.eclipse.jdt.annotation.NonNullByDefault;
|
import org.eclipse.jdt.annotation.NonNullByDefault;
|
||||||
import org.openhab.binding.sonyprojector.internal.SonyProjectorModel;
|
import org.openhab.binding.sonyprojector.internal.SonyProjectorModel;
|
||||||
import org.openhab.binding.sonyprojector.internal.communication.SonyProjectorItem;
|
|
||||||
import org.openhab.core.i18n.CommunicationException;
|
import org.openhab.core.i18n.CommunicationException;
|
||||||
import org.openhab.core.i18n.ConnectionException;
|
import org.openhab.core.i18n.ConnectionException;
|
||||||
import org.openhab.core.util.HexUtils;
|
import org.openhab.core.util.HexUtils;
|
||||||
|
@ -33,7 +32,7 @@ public class SonyProjectorSdcpSimuConnector extends SonyProjectorSdcpConnector {
|
||||||
|
|
||||||
private final Logger logger = LoggerFactory.getLogger(SonyProjectorSdcpSimuConnector.class);
|
private final Logger logger = LoggerFactory.getLogger(SonyProjectorSdcpSimuConnector.class);
|
||||||
|
|
||||||
private SonyProjectorItem lastItem = SonyProjectorItem.POWER;
|
private byte[] lastItemCode = new byte[] { 0x00, 0x00 };
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Constructor
|
* Constructor
|
||||||
|
@ -61,9 +60,9 @@ public class SonyProjectorSdcpSimuConnector extends SonyProjectorSdcpConnector {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected byte[] buildMessage(SonyProjectorItem item, boolean getCommand, byte[] data) {
|
protected byte[] buildMessage(byte[] itemCode, boolean getCommand, byte[] data) {
|
||||||
lastItem = item;
|
lastItemCode = itemCode;
|
||||||
return super.buildMessage(item, getCommand, data);
|
return super.buildMessage(itemCode, getCommand, data);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -77,8 +76,8 @@ public class SonyProjectorSdcpSimuConnector extends SonyProjectorSdcpConnector {
|
||||||
message[4] = communityData[2];
|
message[4] = communityData[2];
|
||||||
message[5] = communityData[3];
|
message[5] = communityData[3];
|
||||||
message[6] = OK;
|
message[6] = OK;
|
||||||
message[7] = lastItem.getCode()[0];
|
message[7] = lastItemCode[0];
|
||||||
message[8] = lastItem.getCode()[1];
|
message[8] = lastItemCode[1];
|
||||||
message[9] = 2;
|
message[9] = 2;
|
||||||
message[10] = 0;
|
message[10] = 0;
|
||||||
message[11] = 1;
|
message[11] = 1;
|
||||||
|
|
|
@ -16,6 +16,7 @@ import java.io.IOException;
|
||||||
import java.io.InputStream;
|
import java.io.InputStream;
|
||||||
import java.io.OutputStream;
|
import java.io.OutputStream;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
|
import java.util.Objects;
|
||||||
import java.util.TooManyListenersException;
|
import java.util.TooManyListenersException;
|
||||||
import java.util.concurrent.TimeUnit;
|
import java.util.concurrent.TimeUnit;
|
||||||
|
|
||||||
|
@ -162,11 +163,11 @@ public class SonyProjectorSerialConnector extends SonyProjectorConnector impleme
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected byte[] buildMessage(SonyProjectorItem item, boolean getCommand, byte[] data) {
|
protected byte[] buildMessage(byte[] itemCode, boolean getCommand, byte[] data) {
|
||||||
byte[] message = new byte[8];
|
byte[] message = new byte[8];
|
||||||
message[0] = START_CODE;
|
message[0] = START_CODE;
|
||||||
message[1] = item.getCode()[0];
|
message[1] = itemCode[0];
|
||||||
message[2] = item.getCode()[1];
|
message[2] = itemCode[1];
|
||||||
message[3] = getCommand ? GET : SET;
|
message[3] = getCommand ? GET : SET;
|
||||||
message[4] = data[0];
|
message[4] = data[0];
|
||||||
message[5] = data[1];
|
message[5] = data[1];
|
||||||
|
@ -246,9 +247,10 @@ public class SonyProjectorSerialConnector extends SonyProjectorConnector impleme
|
||||||
if (responseMessage[3] == TYPE_ITEM) {
|
if (responseMessage[3] == TYPE_ITEM) {
|
||||||
// Item number should be the same as used for sending
|
// Item number should be the same as used for sending
|
||||||
byte[] itemResponseMsg = Arrays.copyOfRange(responseMessage, 1, 3);
|
byte[] itemResponseMsg = Arrays.copyOfRange(responseMessage, 1, 3);
|
||||||
if (!Arrays.equals(itemResponseMsg, item.getCode())) {
|
byte[] itemSentMsg = Objects.requireNonNull(item.getCode());
|
||||||
|
if (!Arrays.equals(itemResponseMsg, itemSentMsg)) {
|
||||||
logger.debug("Unexpected item number in response: {} rather than {}",
|
logger.debug("Unexpected item number in response: {} rather than {}",
|
||||||
HexUtils.bytesToHex(itemResponseMsg), HexUtils.bytesToHex(item.getCode()));
|
HexUtils.bytesToHex(itemResponseMsg), HexUtils.bytesToHex(itemSentMsg));
|
||||||
throw new CommunicationException("Unexpected item number in response");
|
throw new CommunicationException("Unexpected item number in response");
|
||||||
}
|
}
|
||||||
} else if (responseMessage[3] == TYPE_ACK) {
|
} else if (responseMessage[3] == TYPE_ACK) {
|
||||||
|
|
|
@ -19,10 +19,12 @@ import java.util.concurrent.TimeUnit;
|
||||||
|
|
||||||
import org.eclipse.jdt.annotation.NonNullByDefault;
|
import org.eclipse.jdt.annotation.NonNullByDefault;
|
||||||
import org.eclipse.jdt.annotation.Nullable;
|
import org.eclipse.jdt.annotation.Nullable;
|
||||||
|
import org.openhab.binding.sonyprojector.internal.SonyProjectorCommandDescriptionOptionProvider;
|
||||||
import org.openhab.binding.sonyprojector.internal.SonyProjectorException;
|
import org.openhab.binding.sonyprojector.internal.SonyProjectorException;
|
||||||
import org.openhab.binding.sonyprojector.internal.SonyProjectorModel;
|
import org.openhab.binding.sonyprojector.internal.SonyProjectorModel;
|
||||||
import org.openhab.binding.sonyprojector.internal.SonyProjectorStateDescriptionOptionProvider;
|
import org.openhab.binding.sonyprojector.internal.SonyProjectorStateDescriptionOptionProvider;
|
||||||
import org.openhab.binding.sonyprojector.internal.communication.SonyProjectorConnector;
|
import org.openhab.binding.sonyprojector.internal.communication.SonyProjectorConnector;
|
||||||
|
import org.openhab.binding.sonyprojector.internal.communication.SonyProjectorItem;
|
||||||
import org.openhab.binding.sonyprojector.internal.communication.SonyProjectorStatusPower;
|
import org.openhab.binding.sonyprojector.internal.communication.SonyProjectorStatusPower;
|
||||||
import org.openhab.binding.sonyprojector.internal.communication.sdcp.SonyProjectorSdcpConnector;
|
import org.openhab.binding.sonyprojector.internal.communication.sdcp.SonyProjectorSdcpConnector;
|
||||||
import org.openhab.binding.sonyprojector.internal.communication.sdcp.SonyProjectorSdcpSimuConnector;
|
import org.openhab.binding.sonyprojector.internal.communication.sdcp.SonyProjectorSdcpSimuConnector;
|
||||||
|
@ -60,6 +62,7 @@ import org.slf4j.LoggerFactory;
|
||||||
*
|
*
|
||||||
* @author Markus Wehrle - Initial contribution
|
* @author Markus Wehrle - Initial contribution
|
||||||
* @author Laurent Garnier - Refactoring, poll thread for regular channels updates, new serial thing type, new channels
|
* @author Laurent Garnier - Refactoring, poll thread for regular channels updates, new serial thing type, new channels
|
||||||
|
* @author Laurent Garnier - Add new channel "ircommand"
|
||||||
*/
|
*/
|
||||||
@NonNullByDefault
|
@NonNullByDefault
|
||||||
public class SonyProjectorHandler extends BaseThingHandler {
|
public class SonyProjectorHandler extends BaseThingHandler {
|
||||||
|
@ -70,6 +73,7 @@ public class SonyProjectorHandler extends BaseThingHandler {
|
||||||
private final Logger logger = LoggerFactory.getLogger(SonyProjectorHandler.class);
|
private final Logger logger = LoggerFactory.getLogger(SonyProjectorHandler.class);
|
||||||
|
|
||||||
private final SonyProjectorStateDescriptionOptionProvider stateDescriptionProvider;
|
private final SonyProjectorStateDescriptionOptionProvider stateDescriptionProvider;
|
||||||
|
private final SonyProjectorCommandDescriptionOptionProvider commandDescriptionProvider;
|
||||||
private final SerialPortManager serialPortManager;
|
private final SerialPortManager serialPortManager;
|
||||||
private final TranslationProvider i18nProvider;
|
private final TranslationProvider i18nProvider;
|
||||||
|
|
||||||
|
@ -88,9 +92,11 @@ public class SonyProjectorHandler extends BaseThingHandler {
|
||||||
private final Object commandLock = new Object();
|
private final Object commandLock = new Object();
|
||||||
|
|
||||||
public SonyProjectorHandler(Thing thing, SonyProjectorStateDescriptionOptionProvider stateDescriptionProvider,
|
public SonyProjectorHandler(Thing thing, SonyProjectorStateDescriptionOptionProvider stateDescriptionProvider,
|
||||||
|
SonyProjectorCommandDescriptionOptionProvider commandDescriptionProvider,
|
||||||
SerialPortManager serialPortManager, TranslationProvider i18nProvider) {
|
SerialPortManager serialPortManager, TranslationProvider i18nProvider) {
|
||||||
super(thing);
|
super(thing);
|
||||||
this.stateDescriptionProvider = stateDescriptionProvider;
|
this.stateDescriptionProvider = stateDescriptionProvider;
|
||||||
|
this.commandDescriptionProvider = commandDescriptionProvider;
|
||||||
this.serialPortManager = serialPortManager;
|
this.serialPortManager = serialPortManager;
|
||||||
this.i18nProvider = i18nProvider;
|
this.i18nProvider = i18nProvider;
|
||||||
this.bundle = FrameworkUtil.getBundle(this.getClass());
|
this.bundle = FrameworkUtil.getBundle(this.getClass());
|
||||||
|
@ -287,6 +293,9 @@ public class SonyProjectorHandler extends BaseThingHandler {
|
||||||
case CHANNEL_PICTURE_POSITION:
|
case CHANNEL_PICTURE_POSITION:
|
||||||
connector.setPicturePosition(command.toString());
|
connector.setPicturePosition(command.toString());
|
||||||
break;
|
break;
|
||||||
|
case CHANNEL_IR_COMMAND:
|
||||||
|
connector.sendIrCommand(command.toString());
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
throw new SonyProjectorException("Unexpected command");
|
throw new SonyProjectorException("Unexpected command");
|
||||||
}
|
}
|
||||||
|
@ -521,6 +530,9 @@ public class SonyProjectorHandler extends BaseThingHandler {
|
||||||
model.getAspectStateOptions());
|
model.getAspectStateOptions());
|
||||||
stateDescriptionProvider.setStateOptions(new ChannelUID(getThing().getUID(), CHANNEL_PICTURE_POSITION),
|
stateDescriptionProvider.setStateOptions(new ChannelUID(getThing().getUID(), CHANNEL_PICTURE_POSITION),
|
||||||
model.getPicturePositionStateOptions());
|
model.getPicturePositionStateOptions());
|
||||||
|
commandDescriptionProvider.setCommandOptions(new ChannelUID(getThing().getUID(), CHANNEL_IR_COMMAND),
|
||||||
|
SonyProjectorItem.getIRCommandOptions(model.getInputCommandOptions(),
|
||||||
|
model.getCalibrPresetCommandOptions(), model.getAspectCommandOptions()));
|
||||||
}
|
}
|
||||||
return model;
|
return model;
|
||||||
}
|
}
|
||||||
|
|
|
@ -64,6 +64,8 @@ channel-type.sonyprojector.hue.label = Hue
|
||||||
channel-type.sonyprojector.hue.description = Adjust the color tone
|
channel-type.sonyprojector.hue.description = Adjust the color tone
|
||||||
channel-type.sonyprojector.input.label = Video Input
|
channel-type.sonyprojector.input.label = Video Input
|
||||||
channel-type.sonyprojector.input.description = Select the equipment from which to display images
|
channel-type.sonyprojector.input.description = Select the equipment from which to display images
|
||||||
|
channel-type.sonyprojector.ircommand.label = IR Command
|
||||||
|
channel-type.sonyprojector.ircommand.description = Send an infrared remote command
|
||||||
channel-type.sonyprojector.irismanual.label = Iris Manual
|
channel-type.sonyprojector.irismanual.label = Iris Manual
|
||||||
channel-type.sonyprojector.irismanual.description = Force the iris aperture to a fixed value
|
channel-type.sonyprojector.irismanual.description = Force the iris aperture to a fixed value
|
||||||
channel-type.sonyprojector.irismode.label = Iris Mode
|
channel-type.sonyprojector.irismode.label = Iris Mode
|
||||||
|
@ -203,6 +205,69 @@ channel-type.sonyprojector.input.state.option.Video = Video
|
||||||
channel-type.sonyprojector.input.state.option.SVideo = S-Video
|
channel-type.sonyprojector.input.state.option.SVideo = S-Video
|
||||||
channel-type.sonyprojector.input.state.option.InputA = Input A
|
channel-type.sonyprojector.input.state.option.InputA = Input A
|
||||||
channel-type.sonyprojector.input.state.option.Component = Component
|
channel-type.sonyprojector.input.state.option.Component = Component
|
||||||
|
channel-type.sonyprojector.ircommand.command.option.POWER = Power On/Off
|
||||||
|
channel-type.sonyprojector.ircommand.command.option.POWER_ON = Power On
|
||||||
|
channel-type.sonyprojector.ircommand.command.option.POWER_OFF = Power Off
|
||||||
|
channel-type.sonyprojector.ircommand.command.option.CONTRAST_UP = Contrast +
|
||||||
|
channel-type.sonyprojector.ircommand.command.option.CONTRAST_DOWN = Contrast -
|
||||||
|
channel-type.sonyprojector.ircommand.command.option.BRIGHTNESS_UP = Brightness +
|
||||||
|
channel-type.sonyprojector.ircommand.command.option.BRIGHTNESS_DOWN = Brightness -
|
||||||
|
channel-type.sonyprojector.ircommand.command.option.COLOR_UP = Color +
|
||||||
|
channel-type.sonyprojector.ircommand.command.option.COLOR_DOWN = Color -
|
||||||
|
channel-type.sonyprojector.ircommand.command.option.HUE_UP = Hue +
|
||||||
|
channel-type.sonyprojector.ircommand.command.option.HUE_DOWN = Hue -
|
||||||
|
channel-type.sonyprojector.ircommand.command.option.SHARPNESS_UP = Sharpness +
|
||||||
|
channel-type.sonyprojector.ircommand.command.option.SHARPNESS_DOWN = Sharpness -
|
||||||
|
channel-type.sonyprojector.ircommand.command.option.REAL_COLOR = Real Color Processing
|
||||||
|
channel-type.sonyprojector.ircommand.command.option.REALITY_CREATION = Reality Creation
|
||||||
|
channel-type.sonyprojector.ircommand.command.option.PICTURE_POS_185 = Picture Position 1.85:1
|
||||||
|
channel-type.sonyprojector.ircommand.command.option.PICTURE_POS_235 = Picture Position 2.35:1
|
||||||
|
channel-type.sonyprojector.ircommand.command.option.PICTURE_POS_CUSTOM1 = Picture Position Custom 1
|
||||||
|
channel-type.sonyprojector.ircommand.command.option.PICTURE_POS_CUSTOM2 = Picture Position Custom 2
|
||||||
|
channel-type.sonyprojector.ircommand.command.option.PICTURE_POS_CUSTOM3 = Picture Position Custom 3
|
||||||
|
channel-type.sonyprojector.ircommand.command.option.MENU = Menu
|
||||||
|
channel-type.sonyprojector.ircommand.command.option.UP = Cursor UP
|
||||||
|
channel-type.sonyprojector.ircommand.command.option.DOWN = Cursor DOWN
|
||||||
|
channel-type.sonyprojector.ircommand.command.option.LEFT = Cursor LEFT
|
||||||
|
channel-type.sonyprojector.ircommand.command.option.RIGHT = Cursor RIGHT
|
||||||
|
channel-type.sonyprojector.ircommand.command.option.ENTER = Enter
|
||||||
|
channel-type.sonyprojector.ircommand.command.option.RESET = Reset
|
||||||
|
channel-type.sonyprojector.ircommand.command.option.MEMORY = Memory
|
||||||
|
channel-type.sonyprojector.ircommand.command.option.STATUS_ON = Status On
|
||||||
|
channel-type.sonyprojector.ircommand.command.option.STATUS_OFF = Status Off
|
||||||
|
channel-type.sonyprojector.ircommand.command.option.ADJUST_PICTURE = Adjust Picture
|
||||||
|
channel-type.sonyprojector.ircommand.command.option.COLOR_CORRECTION = Color Correction
|
||||||
|
channel-type.sonyprojector.ircommand.command.option.PITCH = Screen Pitch
|
||||||
|
channel-type.sonyprojector.ircommand.command.option.SHIFT = Screen Shift
|
||||||
|
channel-type.sonyprojector.ircommand.command.option.APA = APA
|
||||||
|
channel-type.sonyprojector.ircommand.command.option.DOT_PHASE = Dot Phase
|
||||||
|
channel-type.sonyprojector.ircommand.command.option.V_KEYSTONE = V Keystone
|
||||||
|
channel-type.sonyprojector.ircommand.command.option.V_KEYSTONE_UP = V Keystone +
|
||||||
|
channel-type.sonyprojector.ircommand.command.option.V_KEYSTONE_DOWN = V Keystone -
|
||||||
|
channel-type.sonyprojector.ircommand.command.option.LENS_CONTROL = Lens Control
|
||||||
|
channel-type.sonyprojector.ircommand.command.option.LENS_SHIFT = Lens Shift
|
||||||
|
channel-type.sonyprojector.ircommand.command.option.LENS_SHIFT_LEFT = Lens Shift LEFT
|
||||||
|
channel-type.sonyprojector.ircommand.command.option.LENS_SHIFT_RIGHT = Lens Shift RIGHT
|
||||||
|
channel-type.sonyprojector.ircommand.command.option.LENS_SHIFT_UP = Lens Shift UP
|
||||||
|
channel-type.sonyprojector.ircommand.command.option.LENS_SHIFT_DOWN = Lens Shift DOWN
|
||||||
|
channel-type.sonyprojector.ircommand.command.option.LENS_ZOOM = Lens Zoom
|
||||||
|
channel-type.sonyprojector.ircommand.command.option.LENS_ZOOM_LARGE = Lens Zoom Large
|
||||||
|
channel-type.sonyprojector.ircommand.command.option.LENS_ZOOM_SMALL = Lens Zoom Small
|
||||||
|
channel-type.sonyprojector.ircommand.command.option.LENS_FOCUS = Lens Focus
|
||||||
|
channel-type.sonyprojector.ircommand.command.option.LENS_FOCUS_FAR = Lens Focus Far
|
||||||
|
channel-type.sonyprojector.ircommand.command.option.LENS_FOCUS_NEAR = Lens Focus Near
|
||||||
|
channel-type.sonyprojector.ircommand.command.option.LENS_POSITION = Lens Position
|
||||||
|
channel-type.sonyprojector.ircommand.command.option.MODE_3D = 3D
|
||||||
|
channel-type.sonyprojector.ircommand.command.option.OPTIONS = Options
|
||||||
|
channel-type.sonyprojector.ircommand.command.option.EXIT = Exit
|
||||||
|
channel-type.sonyprojector.ircommand.command.option.SYNC_MENU = Sync Menu
|
||||||
|
channel-type.sonyprojector.ircommand.command.option.PLAY = Play
|
||||||
|
channel-type.sonyprojector.ircommand.command.option.STOP = Stop
|
||||||
|
channel-type.sonyprojector.ircommand.command.option.PAUSE = Pause
|
||||||
|
channel-type.sonyprojector.ircommand.command.option.FAST_REWIND = Fast Rewind
|
||||||
|
channel-type.sonyprojector.ircommand.command.option.FAST_FORWARD = Fast Forward
|
||||||
|
channel-type.sonyprojector.ircommand.command.option.PREVIOUS = Previous
|
||||||
|
channel-type.sonyprojector.ircommand.command.option.NEXT = Next
|
||||||
channel-type.sonyprojector.irismode.state.option.Full = Full
|
channel-type.sonyprojector.irismode.state.option.Full = Full
|
||||||
channel-type.sonyprojector.irismode.state.option.Limited = Limited
|
channel-type.sonyprojector.irismode.state.option.Limited = Limited
|
||||||
channel-type.sonyprojector.irismode.state.option.AutoFull = Auto Full
|
channel-type.sonyprojector.irismode.state.option.AutoFull = Auto Full
|
||||||
|
|
|
@ -201,4 +201,10 @@
|
||||||
<state readOnly="true" pattern="%d h"></state>
|
<state readOnly="true" pattern="%d h"></state>
|
||||||
</channel-type>
|
</channel-type>
|
||||||
|
|
||||||
|
<channel-type id="ircommand" advanced="true">
|
||||||
|
<item-type>String</item-type>
|
||||||
|
<label>IR Command</label>
|
||||||
|
<description>Send an infrared remote command</description>
|
||||||
|
</channel-type>
|
||||||
|
|
||||||
</thing:thing-descriptions>
|
</thing:thing-descriptions>
|
||||||
|
|
|
@ -40,8 +40,13 @@
|
||||||
<channel id="overscan" typeId="overscan"/>
|
<channel id="overscan" typeId="overscan"/>
|
||||||
<channel id="pictureposition" typeId="pictureposition"/>
|
<channel id="pictureposition" typeId="pictureposition"/>
|
||||||
<channel id="lampusetime" typeId="lampusetime"/>
|
<channel id="lampusetime" typeId="lampusetime"/>
|
||||||
|
<channel id="ircommand" typeId="ircommand"/>
|
||||||
</channels>
|
</channels>
|
||||||
|
|
||||||
|
<properties>
|
||||||
|
<property name="thingTypeVersion">1</property>
|
||||||
|
</properties>
|
||||||
|
|
||||||
<config-description>
|
<config-description>
|
||||||
<parameter name="host" type="text" required="true">
|
<parameter name="host" type="text" required="true">
|
||||||
<context>network-address</context>
|
<context>network-address</context>
|
||||||
|
|
|
@ -40,8 +40,13 @@
|
||||||
<channel id="overscan" typeId="overscan"/>
|
<channel id="overscan" typeId="overscan"/>
|
||||||
<channel id="pictureposition" typeId="pictureposition"/>
|
<channel id="pictureposition" typeId="pictureposition"/>
|
||||||
<channel id="lampusetime" typeId="lampusetime"/>
|
<channel id="lampusetime" typeId="lampusetime"/>
|
||||||
|
<channel id="ircommand" typeId="ircommand"/>
|
||||||
</channels>
|
</channels>
|
||||||
|
|
||||||
|
<properties>
|
||||||
|
<property name="thingTypeVersion">1</property>
|
||||||
|
</properties>
|
||||||
|
|
||||||
<config-description>
|
<config-description>
|
||||||
<parameter name="port" type="text" required="true">
|
<parameter name="port" type="text" required="true">
|
||||||
<context>serial-port</context>
|
<context>serial-port</context>
|
||||||
|
|
|
@ -40,8 +40,13 @@
|
||||||
<channel id="overscan" typeId="overscan"/>
|
<channel id="overscan" typeId="overscan"/>
|
||||||
<channel id="pictureposition" typeId="pictureposition"/>
|
<channel id="pictureposition" typeId="pictureposition"/>
|
||||||
<channel id="lampusetime" typeId="lampusetime"/>
|
<channel id="lampusetime" typeId="lampusetime"/>
|
||||||
|
<channel id="ircommand" typeId="ircommand"/>
|
||||||
</channels>
|
</channels>
|
||||||
|
|
||||||
|
<properties>
|
||||||
|
<property name="thingTypeVersion">1</property>
|
||||||
|
</properties>
|
||||||
|
|
||||||
<config-description>
|
<config-description>
|
||||||
<parameter name="host" type="text" required="true">
|
<parameter name="host" type="text" required="true">
|
||||||
<context>network-address</context>
|
<context>network-address</context>
|
||||||
|
|
|
@ -0,0 +1,36 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
|
||||||
|
<update:update-descriptions xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
|
xmlns:update="https://openhab.org/schemas/update-description/v1.0.0"
|
||||||
|
xsi:schemaLocation="https://openhab.org/schemas/update-description/v1.0.0 https://openhab.org/schemas/update-description-1.0.0.xsd">
|
||||||
|
|
||||||
|
<thing-type uid="sonyprojector:ethernetconnection">
|
||||||
|
|
||||||
|
<instruction-set targetVersion="1">
|
||||||
|
<add-channel id="ircommand">
|
||||||
|
<type>sonyprojector:ircommand</type>
|
||||||
|
</add-channel>
|
||||||
|
</instruction-set>
|
||||||
|
|
||||||
|
</thing-type>
|
||||||
|
|
||||||
|
<thing-type uid="sonyprojector:serialconnection">
|
||||||
|
|
||||||
|
<instruction-set targetVersion="1">
|
||||||
|
<add-channel id="ircommand">
|
||||||
|
<type>sonyprojector:ircommand</type>
|
||||||
|
</add-channel>
|
||||||
|
</instruction-set>
|
||||||
|
|
||||||
|
</thing-type>
|
||||||
|
|
||||||
|
<thing-type uid="sonyprojector:serialoveripconnection">
|
||||||
|
|
||||||
|
<instruction-set targetVersion="1">
|
||||||
|
<add-channel id="ircommand">
|
||||||
|
<type>sonyprojector:ircommand</type>
|
||||||
|
</add-channel>
|
||||||
|
</instruction-set>
|
||||||
|
|
||||||
|
</thing-type>
|
||||||
|
|
||||||
|
</update:update-descriptions>
|
Loading…
Reference in New Issue