?
Solved

Using Java X10 to get Status Request from CM11

Posted on 2006-11-27
6
Medium Priority
?
752 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
[X]
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
  • 3
6 Comments
 
LVL 35

Accepted Solution

by:
girionis earned 2000 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

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 …
In this post we will learn how to connect and configure Android Device (Smartphone etc.) with Android Studio. After that we will run a simple Hello World Program.
Viewers will learn about arithmetic and Boolean expressions in Java and the logical operators used to create Boolean expressions. We will cover the symbols used for arithmetic expressions and define each logical operator and how to use them in Boole…
Viewers will learn about basic arrays, how to declare them, and how to use them. Introduction and definition: Declare an array and cover the syntax of declaring them: Initialize every index in the created array: Example/Features of a basic arr…
Suggested Courses
Course of the Month12 days, 6 hours left to enroll

752 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