Solved

Using Java X10 to get Status Request from CM11

Posted on 2006-11-27
6
745 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

Is Your Active Directory as Secure as You Think?

More than 75% of all records are compromised because of the loss or theft of a privileged credential. Experts have been exploring Active Directory infrastructure to identify key threats and establish best practices for keeping data safe. Attend this month’s webinar to learn more.

Question has a verified solution.

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

Go is an acronym of golang, is a programming language developed Google in 2007. Go is a new language that is mostly in the C family, with significant input from Pascal/Modula/Oberon family. Hence Go arisen as low-level language with fast compilation…
Introduction This article is the last of three articles that explain why and how the Experts Exchange QA Team does test automation for our web site. This article covers our test design approach and then goes through a simple test case example, how …
Viewers learn about the scanner class in this video and are introduced to receiving user input for their programs. Additionally, objects, conditional statements, and loops are used to help reinforce the concepts. Introduce Scanner class: Importing…
Viewers learn how to read error messages and identify possible mistakes that could cause hours of frustration. Coding is as much about debugging your code as it is about writing it. Define Error Message: Line Numbers: Type of Error: Break Down…

895 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

Need Help in Real-Time?

Connect with top rated Experts

13 Experts available now in Live!

Get 1:1 Help Now