Solved

Using Java X10 to get Status Request from CM11

Posted on 2006-11-27
6
748 Views
Last Modified: 2008-01-09
I'm currently using Java X10 API (http://x10.homelinux.org/docs/) that utilized JavaComm (http://java.sun.com/products/javacomm/reference/api/index.html) to communicate with a CM11 device that's connected to my computer throught a serial port.

Here's the protocol that CM11 uses (http://www.x10pro.com/pro/pdf/cm11a_protocol.txt).

I've managed to send out X10 signals to a AM12 device connected to a standing fan to make it on/off. I'm now trying to send a Status Request command to the CM11 (0x8b), and apparently the CM11 sends data back to me through the serial port which i read off using the inputbuffer/outputbuffer.

I need to get bit range 31-16 as defined in the CM11 protocol so that i can monitor if a device is switched on/off from the byte that i picked off the inputbuffer.
0
Comment
Question by:timlow84
  • 3
6 Comments
 
LVL 35

Accepted Solution

by:
girionis earned 500 total points
ID: 18018187
How many bytes is the response? You usually right shift the value in order to get the bits seperately, for example if you have a short value (16 bits) you would do something like the following in order to break it into two bytes

short value = ...;
byte left = (byte) (value >>> 8);
byte right = (byte) value;

Likewise you should do for the bits 16-31, to get the bits from 23 to 31 you would do something like

(byte) (value >>> 24)

and so on.
0
 
LVL 35

Expert Comment

by:girionis
ID: 18018309
> to get the bits from 23 to 31

I meant from 24 to 31.
0
 

Author Comment

by:timlow84
ID: 18025221
Upon sending the status command, i would get 16 bytes back... and the status request is

--------------------------------------------------------------------------------------
        # Bit range      Description
      # 111 to 96      Battery timer (set to 0xffff on reset)                   (Byte 0-1)
      # 95 to 88      Current time (seconds)                                  (Byte 2 )
      # 87 to 80      Current time (minutes ranging from 0 to 119)      (Byte 3)
      # 79 to 72      Current time (hours/2, ranging from 0 to 11)       (Byte 4)
      # 71 to 63      Current year day (MSB bit 63)                         (Byte 5+)
      # 62 to 56      Day mask (SMTWTFS)                              (Byte 6-)
      # 55 to 52      Monitored house code                                 (Byte 7 lo)
      # 51 to 48      Firmware revision level 0 to 15                           (Byte 7 hi)
      # 47 to 32      Currently addressed monitored devices              (Byte 8-9)
      # 31 to 16      On / Off status of the monitored devices         (Byte 10-11)
      # 15 to 0       Dim status of the monitored devices                 (Byte 12-13)
--------------------------------------------------------------------------------------

Scenario: i'm reading data off the inputstream in a thread... if i detect nothing in the outputstream, i'll attempt to read incoming data... here's a sniplet of my code...

public class CM11ASerialController implements Runnable, Controller
{
    private DataInputStream fromX10;
    public static final byte TIME_POLL = ((byte) 0xA5);
    public static final byte DATA_POLL = ((byte) 0x5A);
    ...
    ...

    public void run()
    {
        byte nextByte = (byte) fromX10.readByte();

                switch(nextByte)
            {
                    // detect that a status request is sent, and handle the status request
                    // in a function handleStatusRequest();
                case TIME_POLL : setInterfaceTime();
                    break;
                case DATA_POLL : handleData();
                    break;
                default : handleChecksum(nextByte);
            }
            if (running && (fromX10.available() == 0))
            {
                System.out.println("Sending data from SerialPort to Interface");
                initiateNextCommand();
            }
    ...
}

i want to be able to...
(1) detect that a status request, and then pass the byte to a function in which i'll handle the data
(2) inside the function where i'm able to get the On / Off status of the monitored devices throught [bit range 31 to 16] / [Byte 10-11]...
0
 
LVL 35

Expert Comment

by:girionis
ID: 18025967
You have to do it like I said in my first comment, right shift the value you need as many positions as the number of the bits you want to get.
0

Featured Post

Free Tool: ZipGrep

ZipGrep is a utility that can list and search zip (.war, .ear, .jar, etc) archives for text patterns, without the need to extract the archive's contents.

One of a set of tools we're offering as a way to say thank you for being a part of the community.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Suggested Solutions

Title # Comments Views Activity
expectj telnet failing 5 45
Configure a Bean in an XML file 4 42
maven module vs maven project 3 46
mysql jsp example issue 32 48
An old method to applying the Singleton pattern in your Java code is to check if a static instance, defined in the same class that needs to be instantiated once and only once, is null and then create a new instance; otherwise, the pre-existing insta…
By the end of 1980s, object oriented programming using languages like C++, Simula69 and ObjectPascal gained momentum. It looked like programmers finally found the perfect language. C++ successfully combined the object oriented principles of Simula w…
Video by: Michael
Viewers learn about how to reduce the potential repetitiveness of coding in main by developing methods to perform specific tasks for their program. Additionally, objects are introduced for the purpose of learning how to call methods in Java. Define …
Viewers will learn about the different types of variables in Java and how to declare them. Decide the type of variable desired: Put the keyword corresponding to the type of variable in front of the variable name: Use the equal sign to assign a v…

809 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question