ネットワーク電飾 (1) [ColdFire V2]
ネットワークから点灯パターンを送り込んでプログラムする「ネットワーク電飾」を作りました。
固定パターンによる電飾
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; /** * ThisUdpSender
class is used to send a UDP packet to a specified * host. * * @author noritan */ public class UdpSender { /** * AString
type ofhostname
constant. This * specifies the host where to send a UDP packet. */ private String hostname; /** * Construct aUdpSender
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 ArrayListArrayList 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月号 [雑誌]
- 作者:
- 出版社/メーカー: CQ出版
- 発売日: 2008/07/25
- メディア: 雑誌
コメント 0