So-net無料ブログ作成
検索選択

ネットワーク電飾 (1) [ColdFire V2]このエントリーを含むはてなブックマーク#

2068980

ネットワークから点灯パターンを送り込んでプログラムする「ネットワーク電飾」を作りました。

固定パターンによる電飾

LEDは、PUB[3:0]に配置しました。 LEDは、電流制限抵抗付きに改造してありますので、誤解の無いように。 最初のモデルは、固定パターンに従って、LEDを点灯させるプログラムです。

main() {
  char *pubpar = 0x40100072;
  char *portub = 0x40100012;
  char *ddrub  = 0x4010002a;
  char *pat;
  int  index;
  *pubpar = 0x00; // PUBPAR[3:0]=0000
  *portub = 0x00; // PORTUB[3:0]=0000
  *ddrub  = 0x0F; // DDRUB[3:0]=1111
  pat = MemoryAlloc(16);
  pat[0]=1;pat[1]=3;pat[2]=11;pat[3]=15;
  pat[4]=14;pat[5]=12;pat[6]=4;pat[7]=0;
  pat[8]=pat[10]=pat[12]=15;
  pat[9]=pat[11]=pat[13]=pat[14]=pat[15]=0;
  index=0;
  #stop 0
  for(;;){
    if (Getc(0)=='q')break;
    Sleep(20);
    *portub = pat[index];
    index = (index+1)&0x0F;
  }
  MemoryFree(pat);
}

SilentCは、定数配列が使えないので、ヒープに領域を確保して、1バイトずつ値を代入していきます。 ダサいけど、確実な方法です。 パターンは、16ステップで一周するようにしてあります。

ネットワークから点灯パターンを送り込む

このプログラムのループでは、200m秒間の時間待ちがあります。 この部分にタイムアウト時間200m秒でUDP通信の到着を待つ構文を入れて、到着したデータでパターンを更新するようにすると、ネットワーク対応電飾になります。

main() {
  char *pubpar = 0x40100072;
  char *portub = 0x40100012;
  char *ddrub  = 0x4010002a;
  char *pat;
  char socket;
  int  errcode;
  char *buf;
  int  index;
  *pubpar = 0x00; // PUBPAR[3:0]=0000
  *portub = 0x00; // PORTUB[3:0]=0000
  *ddrub  = 0x0F; // DDRUB[3:0]=1111
  socket = CreateSocket(0); // UDP socket
  Bind(socket, 30049, 1); // Bind to port
  pat=MemoryAlloc(16);
  MemClear(pat,16);
  index=0;
  #stop 0
  for(;;){
    if (Getc(0)=='q')break;
    errcode = RecvFrom(socket, 20);
    if (errcode >= 16){
      buf=GetReceiveBuffer(socket,1);
      BufCopy(pat,buf,16);
      MemoryFree(buf);
    }
    *portub=pat[index];
    index=(index+1)&0x0F;
  }
  MemoryFree(pat);
  CloseSocket(socket);
}

ホストPC側のプログラムは、Javaで書きました。

package org.noritan.networkillumination;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetSocketAddress;
import java.net.SocketAddress;
import java.net.SocketException;
import java.util.ArrayList;

/**
 * This UdpSender class is used to send a UDP packet to a specified
 * host.
 * 
 * @author noritan
 */
public class UdpSender {

    /**
     * A String type of hostname constant. This
     * specifies the host where to send a UDP packet.
     */
    private String hostname;

    /**
     * Construct a UdpSender object.
     * 
     * @param hostname
     *            a host name to send a packet.
     */
    public UdpSender(String hostname) {
        this.hostname = hostname;
    }

    /**
     * Send a UDP packet including a data specified by the argument.
     * 
     * @param buf
     *            a UDP payload to be sent.
     */
    public void send(byte[] buf) {
        DatagramPacket packet = new DatagramPacket(buf, buf.length);
        try {
            DatagramSocket socket;
            socket = new DatagramSocket();
            try {
                SocketAddress address = new InetSocketAddress(hostname, 30049);
                socket.connect(address);
                socket.send(packet);
            } catch (IOException e) {
                // Failed to connect/send
                e.printStackTrace();
            } finally {
                socket.close();
            }
        } catch (SocketException e) {
            // Failed to open a socket
            e.printStackTrace();
        }
    }

    /**
     * Send a UDP packet including data specified as String.
     * 
     * @param data
     *            a UDP payload to be sent.
     */
    private void send(String data) {
        // Convert a String into ArrayList
        ArrayList work = new ArrayList();
        for (int i = 0; i < data.length(); i++) {
            try {
                work.add(Byte.parseByte(data.substring(i, i + 1), 16));
            } catch (NumberFormatException e) {
                // Do nothing
            }
        }
        // Make a Byte[]
        Byte[] buf = new Byte[work.size()];
        // Then send it
        send(work.toArray(buf));
    }

    /**
     * Send a UDP packet including data specified as Byte.
     * 
     * @param data
     *            a UDP payload to be sent.
     */
    private void send(Byte[] data) {
        // Convert a Byte[] into byte[]
        byte[] buf = new byte[data.length];
        for (int i = 0; i < data.length; i++) {
            buf[i] = data[i];
        }
        // Then send it
        send(buf);
    }

    /**
     * Main method as an stand alone application.
     * 
     * @param args
     *            HEX data to be sent as an UDP packet.
     */
    public static void main(String[] args) {
        UdpSender sender = new UdpSender("192.168.1.10");
        try {
            for (int i = 0; i < args.length; i++) {
                sender.send(args[i]);
                Thread.sleep(10000); // 10sec
            }
        } catch (InterruptedException e) {
            // Exit Program
        }
    }
}

引数で与えられたパターンを10秒ごとに送り込みます。

java org.noritan.networkillumination.UdpSender 1284821284821000 13BFEC40F0F0F000 1010202080804040

続く

参考文献

Interface (インターフェース) 2008年 09月号 [雑誌]

Interface (インターフェース) 2008年 09月号 [雑誌]

  • 作者:
  • 出版社/メーカー: CQ出版
  • 発売日: 2008/07/25
  • メディア: 雑誌

nice!(0)  コメント(0)  トラックバック(0)  このエントリーを含むはてなブックマーク#

nice! 0

コメント 0

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

トラックバック 0

この記事のトラックバックURL:
※言及リンクのないトラックバックは受信されません。

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。