Terminal Characters define
12/21/2009, 12:31 - Misc
000 0 0x00 NUL
001 1 0x01 SOH, Control-A
002 2 0x02 STX, Control-B
003 3 0x03 ETX, Control-C
004 4 0x04 EOT, Control-D
005 5 0x05 ENQ, Control-E
006 6 0x06 ACK, Control-F
007 7 0x07 BEL, Control-G
010 8 0x08 BS, backspace, Control-H
011 9 0x09 HT, tab, Control-I
012 10 0x0a LF, line feed, newline, Control-J
013 11 0x0b VT, Control-K
014 12 0x0c FF, form feed, NP, Control-L
015 13 0x0d CR, carriage return, Control-M
016 14 0x0e SO, Control-N
017 15 0x0f SI, Control-O
020 16 0x10 DLE, Control-P
021 17 0x11 DC1, XON, Control-Q
022 18 0x12 DC2, Control-R
023 19 0x13 DC3, XOFF, Control-S
024 20 0x14 DC4, Control-T
025 21 0x15 NAK, Control-U
026 22 0x16 SYN, Control-V
027 23 0x17 ETB, Control-W
030 24 0x18 CAN, Control-X
031 25 0x19 EM, Control-Y
032 26 0x1a SUB, Control-Z
發表回應 發表回應 ( 342預覽 )   |  [ 0 引用 ]   |  permalink   |   ( 2.8 / 33 )

Arduino WebSwitch
12/14/2009, 17:13 - Open Source
加入了將設定寫至 Flash memory 及將 string 用 PANGMEM 放至 Flash memory 以縮小 RAM 的用量。因為測試用的 Arduino 只有 1024 byte RAM,所以要用時間換取空間,不然 1024 byte 很快就用光了。而且將原本一個 function 到底的程式,區分為多個共用 functions 以節省 Flash memory 的用量。看來效果還不錯,不過程式的可讀性變得很低。下一個來試試 Telnet 和 Finger,若拿到 ATMega328 就有 2K RAM 和 32K Flash memory 可以用,就可以將所有的 services 放在一起了。

這個程式很簡單,在 8 支 digital pin 上,連接電晶體當電子開關,控制 Relay 或 SSR,作為網路可控制110V/220V的 8 孔電源開關。可以由 Web browser 得知開關的狀態。預設的 IP address 是用 169.254.0.0/16 所以可以在一開始時用簡單 Crossover 線,接上PC Windows (設定為 DHCP)的方式設定好正確的 IP,也可以設定開關的 default 狀態。


/*
This program is wor Arduino Ethernet Shield with W5100 ethernet chip,
As a 8 digital pins control in web page
Version : 1.0
Programmer : Tasuka Hsu, Dec 1 2009
*/

// Library import
#include <Ethernet2.h>
#include <Print.h>
#include <Server.h>
#include <Client.h>
#include <EEPROM.h>
#include <avr/pgmspace.h>

// Const define
#define LENGTH 50 // Message length
#define PINS 8 // Digital pins 1 to 8

#define EEPROM_START_ADDRESS 0
#define EEPROM_MAC EEPROM_START_ADDRESS+10
#define EEPROM_IP EEPROM_MAC+6
#define EEPROM_SUBNET EEPROM_IP+4
#define EEPROM_GATEWAY EEPROM_SUBNET+4
#define EEPROM_PORT EEPROM_GATEWAY+4
#define EEPROM_REFRESH EEPROM_PORT+2
#define EEPROM_SW EEPROM_REFRESH+2
#define EEPROM_RESERVED EEPROM_SW+8

// MAC Address
byte MAC[]={0x80,0x0c,0x01,0x01,0xef,0xfe};

byte Default IP Address setting
byte IP[]={169,254,1,1};
byte GATEWAY[]={0,0,0,0};
byte SUBNET[]={255,255,0,0};

//byte IP[]={172,16,7,250};
//byte GATEWAY[]={172,16,7,254};
//byte SUBNET[]={255,255,255,248};

byte SW[PINS]={0,0,0,0,0,0,0,0}; /* Switch defult state config */

unsigned int PORT=80; // HTTP port
unsigned int REFRESH=120; // HTTP refresh timer

// Keep Strings in Flash Memory not load into RAM for RAM space save
static char TITLE_S[] PROGMEM = "Adruino Digital Pins Control";
static char ANNOUNCE[] PROGMEM = "Tasuka Lab";
static char FOOTER0[] PROGMEM = "Open source of hardware and software for Arduino";
static char FOOTER1[] PROGMEM = "Program By Tasuka Hsu";
static char ARDUINO_WEB[] PROGMEM = "http://www.arduino.cc";

static char HTML_HEADER0[] PROGMEM = "HTTP/1.1 200 OK";
static char HTML_HEADER1[] PROGMEM = "Content-Type: text/html; charset=utf-8";
static char HTML[] PROGMEM = "<html>";
static char HTML_[] PROGMEM = "</html>";
static char TITLE[] PROGMEM = "<title>";
static char TITLE_[] PROGMEM = "</title>";
static char HEAD[] PROGMEM = "<head>";
static char HEAD_[] PROGMEM = "</head>";
static char CENTER[] PROGMEM = "<center>";
static char CENTER_[] PROGMEM = "</center>";
static char BODY[] PROGMEM = "<body>";
static char BODY_[] PROGMEM = "</body>";
static char INPUT_TEXT[] PROGMEM = "<input type=\"text\" name=\"";
static char INPUT_TEXT_[] PROGMEM = "\" value=\"";
static char INPUT_TEXT__[] PROGMEM = "\" size=\"";
static char INPUT_TEXT___[] PROGMEM = "\">";
static char INPUT_RADIO[] PROGMEM = "<input type=\"radio\" name=\"";
static char META[] PROGMEM = "<meta http-equiv=\"refresh\" content=\"";
static char META_[] PROGMEM = ";url=/\">";
static char SUBMIT[] PROGMEM = "<input type=\"submit\" value=\"Send\">";
static char CLEAR_BUF_CHKBX[] PROGMEM = "Clear Config<input type=\"checkbox\" name=\"cl0\">";
static char CHKBOX[] PROGMEM = "<input type=\"radio\" name=\"";
static char URL_BTN_RETURN[] PROGMEM ="<a href=\"/\"><input type=\"button\" value=\"Return\"></a>";
static char URL_BTN_BACK[] PROGMEM = "<a href=\"/?g=1\"><input type=\"button\" value=\"Back\"></a>";
static char URL_BTN_CONFIG[] PROGMEM ="<a href=\"/?g=1\"><input type=\"button\" value=\"Config\"></a>";
static char FORM[] PROGMEM = "<form method=\"GET\" action=\"/\">";
static char FORM_[] PROGMEM = "</form>";
static char DIGITAL_TITLE[] PROGMEM = "<tr><td>Digital Pin</td><td>On</td><td>Off</td></tr>";
static char TABLE_BORDER[] PROGMEM = "<table border=\"1\" align=\"center\">";
static char TABLE_NO_BORDER[] PROGMEM="<table border=\"0\" align=\"center\">";
static char TABLE_[] PROGMEM = "</table>";
static char MAC_CONFIG[] PROGMEM = "<a href=\"/?g=2\">Config MAC Address</a>";
static char IP_CONFIG[] PROGMEM = "<a href=\"/?g=3\">Config IP Address</a>";
static char SUBNET_CONFIG[] PROGMEM = "<a href=\"/?g=4\">Config Subnet Mask</a>";
static char GATEWAY_CONFIG[] PROGMEM ="<a href=\"/?g=5\">Config Gateway Address</a>";
static char PORT_CONFIG[] PROGMEM = "<a href=\"/?g=6\">Config TCP Port</a>";
static char REFRESH_CONFIG[] PROGMEM ="<a href=\"/?g=7\">Config HTML Refresh Time</a>";
static char SW_CONFIG[] PROGMEM = "<a href=\"/?g=8\">Config SW Default State</a>";
static char MAC_TITLE[] PROGMEM = "<tr><td>MAC Address</td><td>";
static char IP_TITLE[] PROGMEM = "<tr><td>IP Address</td><td>";
static char SUBNET_TITLE[] PROGMEM = "<tr><td>Subnet Mask</td><td>";
static char GATEWAY_TITLE[] PROGMEM = "<tr><td>Gateway</td><td>";
static char PORT_TITLE[] PROGMEM = "<tr><td>TCP Port</td><td>";
static char REFRESH_TITLE[] PROGMEM = "<tr><td>HTML Refresh Time</td><td>";
static char SW_TITLE[] PROGMEM = "<tr><td>Switch Default State</td><td>";
static char TD_TR_[] PROGMEM = "</td></tr>";
static char TD_TR_BR[] PROGMEM = "</td></tr><br><tr><td>";
static char ON_OFF[] PROGMEM = "<tr><td></td><td>On/Off</td></tr>";
static char CHECKED[] PROGMEM = "\" checked=\"checked";
static char SPACE[] PROGMEM = " ";

// The string address pointer
PROGMEM const char *string_table[]={
TITLE_S, //0
ANNOUNCE,
FOOTER0,
FOOTER1,
ARDUINO_WEB,
HTML_HEADER0, //5
HTML_HEADER1,
HTML,
HTML_,
TITLE,
TITLE_, //10
HEAD,
HEAD_,
CENTER,
CENTER_,
META, //15
BODY,
BODY_,
INPUT_TEXT,
INPUT_TEXT_,
INPUT_TEXT__, //20
INPUT_TEXT___,
SUBMIT,
CLEAR_BUF_CHKBX,
URL_BTN_RETURN,
URL_BTN_BACK, //25
URL_BTN_CONFIG,
TABLE_,
FORM,
META_,
DIGITAL_TITLE, //30
TABLE_BORDER,
MAC_CONFIG,
IP_CONFIG,
SUBNET_CONFIG,
GATEWAY_CONFIG, // 35
PORT_CONFIG,
REFRESH_CONFIG,
TABLE_NO_BORDER,
MAC_TITLE,
IP_TITLE, //40
SUBNET_TITLE,
GATEWAY_TITLE,
PORT_TITLE,
REFRESH_TITLE,
INPUT_RADIO, //45
FORM_,
TD_TR_,
SW_CONFIG,
SW_TITLE,
CHKBOX, //50
TD_TR_BR,
ON_OFF,
CHECKED,
SPACE
};

// RAM buffer for strings move from flash memory
char buffer[70];

// CGI GET messages buffer
char MESSAGE[LENGTH+1];
byte page=0;
boolean bootUp=true;

// HTTP Server setting
//Server server=Server(PORT);

// Load string's content from Flash memory by index of pointer to RAM
void get2RAM(byte k)
{
strcpy_P(buffer,(char *)pgm_read_word(&(string_table[k])));
}

void ReadWriteConfig()
{
byte i=0;

get2RAM(1);
// Write default data to EEPROM
if((EEPROM.read(EEPROM_START_ADDRESS)!=buffer[0])&&(EEPROM.read(EEPROM_START_ADDRESS+1)!=buffer[1])){
for(i=0;i<10;i++){
EEPROM.write(EEPROM_START_ADDRESS+i,buffer);
if(i<PINS){
EEPROM.write(EEPROM_SW+i,LOW);
SW=0;
if(i<6){
EEPROM.write(EEPROM_MAC+i,MAC);
if(i<4){
EEPROM.write(EEPROM_IP+i,IP);
EEPROM.write(EEPROM_GATEWAY+i,GATEWAY);
EEPROM.write(EEPROM_SUBNET+i,SUBNET);
}
}
}
}
EEPROM.write(EEPROM_PORT,byte((PORT&0xff00)/256));
EEPROM.write(EEPROM_PORT+1,byte(PORT&0x00ff));
EEPROM.write(EEPROM_REFRESH,byte((REFRESH&0xff00)/256));
EEPROM.write(EEPROM_REFRESH+1,byte(REFRESH&0x00ff));
}else{
// Read config data from EEPROM
for(i=0;i<PINS;i++){
SW=EEPROM.read(EEPROM_SW+i);
if(i<6){
MAC=EEPROM.read(EEPROM_MAC+i);
if(i<4){
IP=EEPROM.read(EEPROM_IP+i);
GATEWAY=EEPROM.read(EEPROM_GATEWAY+i);
SUBNET=EEPROM.read(EEPROM_SUBNET+i);
}
}
}
PORT=(int(EEPROM.read(EEPROM_PORT))*256)+int(EEPROM.read(EEPROM_PORT+1));
REFRESH=(int(EEPROM.read(EEPROM_REFRESH))*256)+int(EEPROM.read(EEPROM_REFRESH+1));
}
}

void char2Hex(byte m)
{
byte j=0;

for(byte i=0;i<2;i++){
if(i==0){
j=(m&0xf0)/16;
}else{
j=m&0x0f;
}
if(j>=0&&j<=9){
buffer=char(int(j)+'0');
}else{
buffer=char(int(j)+'A'-10);
}
}
buffer[2]='\0';
}

byte getIP(byte i,byte t)
{
byte j=MESSAGE[i+2]-'0';
byte k=4;
if(j>=0&&j<4){
byte l=0;
while((MESSAGE[i+k]!='&')&&(MESSAGE[i+k]!=' ')&&(MESSAGE[i+k]!='\n')&&(MESSAGE[i+k]!='\r')&&(MESSAGE[i+k]!='\0')){
l=l*10+byte(MESSAGE[i+k]-'0');
k++;
}
switch(t){
case 1:
IP[j]=l;
EEPROM.write(EEPROM_IP+j,l);
break;
case 2:
SUBNET[j]=l;
EEPROM.write(EEPROM_SUBNET+j,l);
break;
case 3:
GATEWAY[j]=l;
EEPROM.write(EEPROM_GATEWAY+j,l);
break;
}
}
return(k);
}

byte getDigit(byte i,byte t)
{
byte k=4;
unsigned int l=0;
while((MESSAGE[i+k]!='&')&&(MESSAGE[i+k]!=' ')&&(MESSAGE[i+k]!='\n')&&(MESSAGE[i+k]!='\r')&&(MESSAGE[i+k]!='\0')){
l=l*10+byte(MESSAGE[i+k]-'0');
k++;
}
switch(t){
case 1:
PORT=l;
EEPROM.write(EEPROM_PORT,byte((PORT&0xff00)/256));
EEPROM.write(EEPROM_PORT+1,byte(PORT&0x00ff));
break;
case 2:
REFRESH=l;
EEPROM.write(EEPROM_REFRESH,byte((REFRESH&0xff00)/256));
EEPROM.write(EEPROM_REFRESH+1,byte(REFRESH&0x00ff));
break;
}
return(k);
}
void parseCGI()
{
byte i=0;
byte flag=false;

// Send to Digital pins from parse HTTP send message
while(MESSAGE!='\0'){
// Port Status
if((MESSAGE=='p'||MESSAGE=='P')&&(MESSAGE[i+2]=='=')){
digitalWrite(int(MESSAGE[i+1])-'0',int(MESSAGE[i+3])-'0');
i+=3;
}
// Page
if((MESSAGE=='g'||MESSAGE=='G')&&(MESSAGE[i+1]=='=')){
page=MESSAGE[i+2]-'0';
i+=2;
}
// Clear EEPROM to zero
if((MESSAGE=='c'||MESSAGE=='C')&&(MESSAGE[i+1]=='l'||MESSAGE[i+1]=='L')&&(MESSAGE[i+2]=='0')&&(MESSAGE[i+3]=='=')){
for(int j=0;j<512;j++){
EEPROM.write(EEPROM_START_ADDRESS+j,0);
}
i+=6;
}
// MAC Address Config and Write MAC to EEPROM
if((MESSAGE=='m'||MESSAGE=='M')&&(MESSAGE[i+1]=='a'||MESSAGE[i+1]=='A')&&(MESSAGE[i+3]=='=')){
byte j=MESSAGE[i+2]-'0';
if(j>=0&&j<6){
for(byte l=0;l<2;l++){
byte k=MESSAGE[i+4+l];
// Change to upper case
if(k>'Z'){
k=k-'a'+'A';
}
if(k<='9'&&k>='0'){
switch(l){
case 0:
MAC[j]=byte(int(k-'0')*16);
break;
case 1:
MAC[j]+=byte(int(k-'0'));
break;
}
}else{
switch(l){
case 0:
MAC[j]=byte(int(k-'A'+10)*16);
break;
case 1:
MAC[j]+=byte(int(k-'A'+10));
break;
}
}
}
EEPROM.write(EEPROM_MAC+j,MAC[j]);
}
i+=5;
}
// IP Address Config and Write to EEPROM
if((MESSAGE=='i'||MESSAGE=='I')&&(MESSAGE[i+1]=='p'||MESSAGE[i+1]=='P')&&(MESSAGE[i+3]=='=')){
i+=getIP(i,1);
}
// Subnet Address Config and Write to EEPROM
if((MESSAGE=='s'||MESSAGE=='S')&&(MESSAGE[i+1]=='b'||MESSAGE[i+1]=='B')&&(MESSAGE[i+3]=='=')){
i+=getIP(i,2);
}
// Gateway Address Config and Write to EEPROM
if((MESSAGE=='g'||MESSAGE=='G')&&(MESSAGE[i+1]=='w'||MESSAGE[i+1]=='W')&&(MESSAGE[i+3]=='=')){
i+=getIP(i,3);
}
// Port Config and Write to EEPROM
if((MESSAGE=='p'||MESSAGE=='P')&&(MESSAGE[i+1]=='r'||MESSAGE[i+1]=='R')&&(MESSAGE[i+2]=='0')&&(MESSAGE[i+3]=='=')){
i+=getDigit(i,1);
}
// Refresh Time Config and Write to EEPROM
if((MESSAGE=='r'||MESSAGE=='R')&&(MESSAGE[i+1]=='f'||MESSAGE[i+1]=='F')&&(MESSAGE[i+2]=='0')&&(MESSAGE[i+3]=='=')){
i+=getDigit(i,2);
}
// Switch default state Config and Write to EEPROM
if((MESSAGE=='s'||MESSAGE=='S')&&(MESSAGE[i+1]=='w'||MESSAGE[i+1]=='W')&&(MESSAGE[i+3]=='=')){
byte j=MESSAGE[i+2]-'0';
SW[j]=byte(MESSAGE[i+4]-'0');
EEPROM.write(EEPROM_SW+j,SW[j]);
i+=5;
}
i++;
}
}

void setup()
{
// Read/Write config from/to EEPROM
ReadWriteConfig();

// Initial digital pin setting to EEPROM store setting
for(byte i=0;i<PINS;i++){
pinMode(i,OUTPUT);
digitalWrite(i,SW);
}
}

void loop()
{
Server server=Server(PORT);
if(bootUp){
// Initial Ethernet MAC and IP setting
Ethernet.begin(MAC,IP,GATEWAY,SUBNET);

// Start server listen
server.begin();
bootUp=false;
}

/* Initial client */
Client client=server.available();

if(client) {
boolean current_line_is_blank=true,flag=false;
char c='\0';
byte i=0;

// If connected
while(client.connected()){
if(client.available()){

/* Clear MESSAGE */
for(i=0;i<LENGTH;i++){
MESSAGE='\0';
}

flag=false;
i=0;

// Read from HTTP GET input information
while((c=client.read())!='\n' && i<=LENGTH){
if(c=='?'){
flag=true;
}
if(c==' '||c=='\n'||c=='\0'){
flag=false;
}
if(flag){
MESSAGE[i++]=c;
}
}
MESSAGE='\0';

page=0;
parseCGI();

if(current_line_is_blank){
// Send HTTP header
get2RAM(5);
client.println(buffer);
//client.println("HTTP/1.1 200 OK");
get2RAM(6);
client.println(buffer);
//client.println("Content-Type: text/html; charset=utf-8");
client.println();

// Send HTML
get2RAM(7);
client.println(buffer);
//client.println("<html>");
get2RAM(9);
client.print(buffer);
//client.print("<title>");
get2RAM(0);
client.print(buffer);
//client.print(TITLE);
get2RAM(10);
client.println(buffer);
//client.println("</title>");
get2RAM(11);
//client.print("<head>");
client.print(buffer);
get2RAM(13);
client.print(buffer);
//client.print("<center>");
client.print("<h1>");
get2RAM(0);
client.print(buffer);
//client.print(TITLE);
client.print("</h1>");
get2RAM(14);
client.print(buffer);
//client.println("</center>");
get2RAM(15);
client.print(buffer);
//client.print("<meta http-equiv=\"refresh\" content=\"");

if(page==0){
client.print(REFRESH);
}else{
client.print(3600);
}

get2RAM(29);
client.print(buffer);
//client.println(";url=/\">");
get2RAM(12);
client.println(buffer);
//client.println("</head>");
get2RAM(16);
client.print(buffer);
//client.println("<body>");
client.println("<hr>");
get2RAM(28);
client.print(buffer);
//client.print("<form method=\"");
//client.print("GET");
//client.print("\"");
//client.println(" action=\"/\">");

if(page==0){
// Read data from digital pin
get2RAM(31);
client.print(buffer);
/*
client.print("<table border=\"");
client.print(1);
client.print("\"");
client.print(" ");
client.print("align=\"");
client.print("center");
client.print("\"");
client.println(">");
*/
get2RAM(30);
client.print(buffer);
/*
client.print("<tr>");
client.print("<td>");
client.print("Digital");
client.print(" ");
client.print("Pin");
client.print("</td>");
client.print("<td>");
client.print("On");
client.print("</td>");
client.print("<td>");
client.print("Off");
client.print("</td>");
client.println("</tr>");
*/
for(i=0;i<PINS;i++){
client.print("<tr><td>SW ");
client.print(int(i));
client.println("</td><td>");

/* Display pins status */
if(digitalRead(i)==HIGH){
get2RAM(45);
client.print(buffer);
client.print("p");
client.print(int(i));
get2RAM(53);
client.print(buffer);
//client.print("\" checked=\"checked");
client.print(1);
get2RAM(21);
client.print(buffer);
/*
client.print("<input type=radio");
client.print(" ");
client.print("name=\"");
client.print("p");
client.print(int(i));
client.print("\"");
client.print(" ");
client.print("checked");
client.print(" ");
client.print("value=\"");
client.print(1);
client.print("\">");
*/
client.println("</td>");

client.print("<td>");
get2RAM(45);
client.print(buffer);
client.print("p");
client.print(int(i));
get2RAM(19);
client.print(buffer);
client.print(0);
get2RAM(21);
client.print(buffer);
/*
client.print("<input type=radio");
client.print(" ");
client.print("name=\"");
client.print("p");
client.print(int(i));
client.print("\"");
client.print(" ");
client.print("value=\"");
client.print(0);
client.println("\">");
*/
}else{
get2RAM(45);
client.print(buffer);
client.print("p");
client.print(int(i));
get2RAM(19);
client.print(buffer);
client.print(1);
get2RAM(21);
client.print(buffer);
/*
client.print("<input type=radio");
client.print(" ");
client.print("value=\"");
client.print(1);
client.print("\"");
client.print(" ");
client.print("name=\"");
client.print("p");
client.print(int(i));
client.print("\">");
*/
client.println("</td>");

client.print("<td>");
get2RAM(45);
client.print(buffer);
client.print("p");
client.print(int(i));
get2RAM(53);
client.print(buffer);
//client.print("\" checked=\"checked");
get2RAM(19);
client.print(buffer);
client.print(0);
get2RAM(21);
client.print(buffer);
/*
client.print("<input type=radio");
client.print(" ");
client.print("checked");
client.print(" ");
client.print("value=\"");
client.print(0);
client.print("\"");
client.print(" ");
client.print("name=\"");
client.print("p");
client.print(int(i));
client.println("\">");
*/
}

get2RAM(47);
client.print(buffer);
//client.println("</td></tr>");

}
get2RAM(27);
client.print(buffer);
//client.print("</table>");
}

get2RAM(13);
client.print(buffer);
//client.print("<center>");
if(page==1){
get2RAM(32);
client.print(buffer);
/*
client.print("<a href=\"/?g=");
client.print(2);
client.print("\"");
client.print(">");
client.print("Config");
client.print(" ");
client.print("MAC Address");
client.print("</a>");
*/
client.println("<br>");

get2RAM(33);
client.print(buffer);
/*
client.print("<a href=\"/?g=");
client.print(3);
client.print("\"");
client.print(">");
client.print("Config");
client.print(" ");
client.print("IP Address");
client.print("</a>");
*/
client.println("<br>");

get2RAM(34);
client.print(buffer);
/*
client.print("<a href=\"/?g=");
client.print(4);
client.print("\"");
client.print(">");
client.print("Config");
client.print(" ");
client.print("Subnet Mask");
client.print("</a>");
*/
client.println("<br>");

get2RAM(35);
client.print(buffer);
/*
client.print("<a href=\"/?g=");
client.print(5);
client.print("\"");
client.print(">");
client.print("Config");
client.print(" ");
client.print("Gateway Address");
client.print("</a>");
*/
client.println("<br>");

get2RAM(36);
client.print(buffer);
/*
client.print("<a href=\"/?g=");
client.print(6);
client.print("\"");
client.print(">");
client.print("Config");
client.print(" ");
client.print("TCP Port");
client.print("</a>");
*/
client.println("<br>");

get2RAM(37);
client.print(buffer);
/*
client.print("<a href=\"/?g=");
client.print(7);
client.print("\"");
client.print(">");
client.print("Config");
client.print(" ");
client.print("HTML Refresh Time");
client.print("</a>");
*/
client.println("<br>");

get2RAM(48);
client.print(buffer);

client.println("<br>");
}
if(page>=2){
get2RAM(38);
client.print(buffer);
/*
client.print("<table border=\"");
client.print(0);
client.print("\"");
client.print(" ");
client.print("align=\"");
client.print("center");
client.print("\"");
client.print(">");
*/

if(page==2){
get2RAM(39);
client.print(buffer);
/*
client.println("<tr>");
client.print("<td>");
client.print("MAC Address");
client.println("</td>");

client.print("<td>");
*/
for(i=0;i<6;i++){
if(i>0&&i<6){
client.print(":");
}
get2RAM(18);
client.print(buffer);
client.print("ma");
client.print(int(i));
get2RAM(19);
client.print(buffer);
char2Hex(MAC);
client.print(buffer);
get2RAM(20);
client.print(buffer);
client.print(2);
get2RAM(21);
client.print(buffer);
}

client.println("</td>");
}

if(page==3){
get2RAM(40);
client.print(buffer);
/*
client.println("<tr>");

client.print("<td>");
client.print("IP Address");
client.println("</td>");

client.println("<td>");
*/
for(i=0;i<4;i++){
if(i>0&&i<4){
client.print(".");
}
get2RAM(18);
client.print(buffer);
client.print("ip");
client.print(int(i));
get2RAM(20);
client.print(buffer);
client.print(3);
get2RAM(19);
client.print(buffer);
client.print(int(IP));
get2RAM(21);
client.print(buffer);
}

get2RAM(47);
client.print(buffer);
//client.println("</td></tr>");
}

if(page==4){
get2RAM(41);
client.print(buffer);
/*
client.println("<tr>");
client.print("<td>");
client.print("Subnet Mask");
client.println("</td>");

client.println("<td>");
*/
for(i=0;i<4;i++){
if(i>0&&i<4){
client.print(".");
}
get2RAM(18);
client.print(buffer);
client.print("sb");
client.print(int(i));
get2RAM(20);
client.print(buffer);
client.print(3);
get2RAM(19);
client.print(buffer);
client.print(int(SUBNET));
get2RAM(21);
client.print(buffer);
}

get2RAM(47);
client.print(buffer);
//client.println("</td></tr>");
}

if(page==5){
get2RAM(42);
client.print(buffer);
/*
client.println("<tr>");
client.println("<td>");
client.print("Gateway");
client.println("</td>");

client.print("<td>");
*/
for(i=0;i<4;i++){
if(i>0&&i<4){
client.print(".");
}
get2RAM(18);
client.print(buffer);
client.print("gw");
client.print(int(i));
get2RAM(20);
client.print(buffer);
client.print(3);
get2RAM(19);
client.print(buffer);
client.print(int(GATEWAY));
get2RAM(21);
client.print(buffer);
}

get2RAM(47);
client.print(buffer);
//client.println("</td></tr>");
}

if(page==6){
get2RAM(43);
client.print(buffer);
/*
client.println("<tr>");
client.print("<td>");
client.print("TCP Port");
client.println("</td>");

client.println("<td>");
*/
get2RAM(18);
client.print(buffer);
client.print("pr");
client.print(0);
get2RAM(20);
client.print(buffer);
client.print(5);
get2RAM(19);
client.print(buffer);
client.print((unsigned int)int(PORT));
get2RAM(21);
client.print(buffer);

get2RAM(47);
client.print(buffer);
//client.println("</td></tr>");
}

if(page==7){
//client.println("<td>");
get2RAM(44);
client.print(buffer);

get2RAM(18);
client.print(buffer);
client.print("rf");
client.print(0);
get2RAM(20);
client.print(buffer);
client.print(3);
get2RAM(19);
client.print(buffer);
client.print((unsigned int)int(REFRESH));
get2RAM(21);
client.print(buffer);

get2RAM(47);
client.print(buffer);
//client.println("</td></tr>");
}

if(page==8){
get2RAM(49);
client.print(buffer);
get2RAM(51);
client.print(buffer);
//client.print("</td></tr><br><tr><td>");
get2RAM(38);
client.print(buffer);
get2RAM(52);
client.print(buffer);
//client.println("<tr><td></td><td>On/Off</td></tr>");

for(i=0;i<PINS;i++){
client.print("<tr><td>SW");
client.print(int(i));
client.print("</td><td>");
get2RAM(45);
client.print(buffer);
//client.print("<input type=\"radio\" name=\"sw");
client.print("sw");
client.print(int(i));
get2RAM(19);
client.print(buffer);
//client.print("\" value=\"");
client.print(1);
if(SW==1){
get2RAM(53);
client.print(buffer);
//client.print("\" checked=\"checked");
}
get2RAM(21);
client.print(buffer);

get2RAM(45);
client.print(buffer);
//client.print("<input type=\"radio\" name=\"sw");
client.print("sw");
client.print(int(i));
get2RAM(19);
client.print(buffer);
//client.print("\" value=\"");
client.print(0);
if(SW==0){
get2RAM(53);
client.print(buffer);
//client.print("\" checked=\"checked");
}
get2RAM(21);
client.print(buffer);

get2RAM(47);
client.print(buffer);
//client.println("</td></tr>");
}
get2RAM(27);
client.print(buffer);
//client.print("</table>");
get2RAM(47);
client.print(buffer);
//client.print("</td></tr>");
get2RAM(47);
client.print(buffer);
//client.println("</td></tr>");
}
get2RAM(27);
client.print(buffer);
//client.println("</table>");
client.println("<br>");
}
get2RAM(14);
client.print(buffer);
//client.println("</center>");

if(page>=2){
get2RAM(13);
client.print(buffer);
//client.println("<center>");
get2RAM(23);
client.print(buffer);
get2RAM(14);
client.print(buffer);
//client.println("</center>");
client.println("<br>");
}

if(page!=1){
get2RAM(13);
client.print(buffer);
//client.println("<center>");
get2RAM(22);
client.print(buffer);
get2RAM(14);
client.print(buffer);
//client.println("</center>");
}

get2RAM(46);
client.print(buffer);
//client.println("</form>");
client.println("<br>");

client.print("<hr>");
get2RAM(13);
client.print(buffer);
//client.print("<center>");
if(page==0){
get2RAM(26);
client.print(buffer);
}
if(page>=2){
get2RAM(25);
client.print(buffer);
}
if(page!=0){
get2RAM(24);
client.print(buffer);
}
get2RAM(14);
client.print(buffer);
//client.print("</center>");
client.println("<br>");
/*
// Debug received message
client.print("Message=");
client.println(MESSAGE);

for(i=0;i<16;i++){
client.print(int(EEPROM.read(EEPROM_START_ADDRESS+i)));
client.print(" ");
}
client.print("Page ");
client.println(int(page));
// Debug message end
*/
// HTML tail
client.println("<h6>");
get2RAM(2);
client.print(buffer);
client.print("<br>");
//client.println("Open source of hardware and software for Arduino";

client.print("<a href=");
get2RAM(4);
client.print(buffer);
//client.print("http://www.arduino.cc");
client.print(">");
get2RAM(4);
client.print(buffer);
//client.print("http://www.arduino.cc");
client.print("</a>");

client.print("<br>");
get2RAM(3);
client.println(buffer);
client.println("<br>");

client.println("</h6>");
get2RAM(17);
client.println(buffer);
//client.println("</body>");
get2RAM(8);
client.println(buffer);
//client.println("</html>");
break;
}
if(c=='\n'){
current_line_is_blank=false;
}
}
}
delay(1);
client.stop();
}
}


發表回應 發表回應 ( 1196預覽 )   |  [ 0 引用 ]   |  permalink   |   ( 3.2 / 44 )

SED recursive strip
12/14/2009, 11:48 - Misc
This is a script to recursive strip some thing between "$A_PROPERTIES" and "$FUNCTIONS" also between "$FUNCTIONS" to "$NETS"
And strip all of the ":FXX." to "."


#!/bin/sh
sed -e "s/\:F[0-9]*\./\./g" $1 >$1.txt
sed -e "/^\$A_PROPERTIES/,/^\$FUNCTIONS/!b
/^\$A_PROPERTIES/{
x
s/^.*\n//
x
}
G
/\$FUNCTIONS/!d
s/\n.*//
" $1.txt >$1.txt.txt

sed -e "/^\$FUNCTIONS/,/^\$NETS/!b
/^\$FUNCTIONS/{
x
s/^.*\n//
x
}
G
/\$NETS/!d
s/\n.*//
" $1.txt.txt >$1.txt

rm -fr $1.txt.txt



發表回應 發表回應 ( 224預覽 )   |  [ 0 引用 ]   |  permalink   |   ( 3.2 / 33 )

Arduino Ethernet Shield
12/02/2009, 17:15 - Open Source
花了一點時間,用了一下Arduino 這個小東西,Open source 的硬體和軟體。順便作了一個可以經由網路控制的數位腳,及SSR當作電源開關。這個程式加上了 Arduino Ethernet Shield 可以用 Arduino Ethernet Library 也可以換成 Ethernet2 Library,用 Ethernet2 空間會比較省。下次再配合 Arduino SD shield 看看吧!作起來比 Microship 的 PIC 簡單,程式工具不用錢,可以在Windows/Mac OS X/Linux 下寫程式,不必被限制一定要用Windows。不必買燒錄工具,用 USB 就可以寫入資料。不過在燒入資料時,digital pin 1 和 2 不可以接東西。目前 MAC address 和 IP 是固定的,有空再試試 DHCP library


/*
This program is wor Arduino Ethernet Shield with W5100 ethernet chip,
As a 8 digital pins control in web page
Programmer : Tasuka Hsu, Dec 1 2009
*/

/* Library import */
#include <Ethernet2.h>
#include <Print.h>
#include <Server.h>
#include <Client.h>

/* Const define */
#define LENGTH 42 /* Message length */
#define PINS 8 /* Digital pins 1 to 8 */
#define PORT 80 /* HTTP port */
#define REFRESH 10 /* HTTP refresh timer */

/* MAC Address */
byte MAC[]={0x00,0x0c,0x01,0x01,0xef,0xff};

/* IP Address setting */
byte IP[]={172,16,7,251};
byte GATEWAY[]={172.16,7,254};
byte SUBNET[]={255,255,255,248};

/* HTTP Server setting */
Server server=Server(PORT);

char TITLE[]="Adruino Digital Pins Control";
char MESSAGE[LENGTH+1];

void setup()
{
/* Initial Ethernet MAC and IP setting */
Ethernet.begin(MAC,IP,GATEWAY,SUBNET);

/* Initial digital pin setting to default 0 */
for(int i=0;i<PINS;i++){
pinMode(i,OUTPUT);
digitalWrite(i,0);
}

/* Start server listen */
server.begin();
}

void loop()
{
/* Initial client */
Client client=server.available();

if(client) {
boolean current_line_is_blank=true,flag=false;
char c='\0';
int i=0;

/* If connected */
while(client.connected()){
if(client.available()){

/* Clear MESSAGE */
for(i=0;i<LENGTH;i++){
MESSAGE='\0';
}

flag=false;
i=0;
/* Read from HTTP GET input information */
while((c=client.read())!='\n' && i<=LENGTH){
if(c=='?'){
flag=true;
}
if(c==' '||c=='\n'||c=='\0'){
flag=false;
}
if(flag){
MESSAGE[i++]=c;
}
}
MESSAGE='\0';

i=0;
flag=false;
/* Send to Digital pins from parse HTTP send message */
while(MESSAGE!='\0'){
if((MESSAGE=='p'||MESSAGE=='P')&&(MESSAGE[i+2]=='=')){
digitalWrite(int(MESSAGE[i+1])-0x30,int(MESSAGE[i+3])-0x30);
i+=3;
}
i++;
}

if(current_line_is_blank){
/* Send HTTP header */
client.println("HTTP/1.1 200 OK");
client.println("Content-Type: text/html; charset=utf-8");
client.println();

/* Send HTML */
client.print("<html>\n<title>");
client.print(TITLE);
client.print("</title>\n<head>\n<center><h1>");
client.print(TITLE);
client.print("</h1></center>\n");
client.print("<meta http-equiv=\"refresh\" content=\"");
client.print(REFRESH);
client.print(";url=/\">\n</head>\n<body>\n");
client.print("<hr>\n<form method=\"GET\" action=\"/\">\n");

/* Read data from digital pin */
client.print("<table border=\"1\">\n");
client.print("<tr><td>Digital Pin</td><td>On</td><td>Off</td></tr>\n");

for(i=0;i<8;i++){
client.print("\n<tr><td>Pin ");
client.print(i);
client.print("</td>\n<td>");

/* Display pins status */
if(digitalRead(i)==1){
client.print("<input type=radio checked value=1 name=\"p");
client.print(i);
client.print("\"></td>\n");
client.print("<td><input type=radio value=0 name=\"p");
client.print(i);
client.print("\">\n");
}else{
client.print("<input type=radio value=1 name=\"p");
client.print(i);
client.print("\"></td>\n");
client.print("<td><input type=radio checked value=0 name=\"p");
client.print(i);
client.print("\">\n");
}
client.print("</td></tr>\n");

}
client.print("</table>\n");
client.print("<br><input type=submit value=\"Send\"></form><br>\n");

/* Debug received message */
// client.print("Message=");
// client.println(MESSAGE);

/* HTML tail */
client.print("<h6>\nOpen source of hardware and software for Arduino\n<br>\n");
client.print("<a href=http://www.arduino.cc>http://www.arduino.cc</a></h6>\n");
client.print("</body>\n</html>\n");
break;
}
if(c=='\n'){
current_line_is_blank=false;
}
}
}
delay(1);
client.stop();
}
}



發表回應 發表回應 ( 379預覽 )   |  [ 0 引用 ]   |  permalink   |   ( 3 / 37 )

Parallels Desktop 5 for Mac 小小改善
11/23/2009, 11:57 - Apple
Parallels 4 Windows 7 系統分數

Parallels 5 Windows 7 系統分數


看來是好一點了,對我而言不是重點,反正我用到Windows的機會很低。想說的是為何 Ubuntu 9.10 在 Parallels 4 下,安裝 Parallels Tools 就會失敗(因為用的 Linux Kernel版本較 Parallels Tools 中支援列表的要新,沒辦法安裝),而 Parallels 5 就可以用,這對沒有更新到 Parallels 5 的人來說很不公平吧!
還有就是網路計價的問題,這去年更新 Parallels 4 時 Fred 就說過了-Parallels 4.0‥‥結帳注意事項,不過今年還是一樣。

原本想放棄 Parallels 而換用 VirtualBox 的,因為價格及支援的問題,Ubuntu 9.10 在 VirtualBox 下就很好,但是 VirtualBox 一直沒有解決 USB device 的問題,至少在我的 Windows/Linux/MacOSX 上都不能用,所以目前的Parallels還會活在我的MacBookPro上。
2 回應 2 回應 ( 630預覽 )   |  [ 0 引用 ]   |  permalink   |   ( 3.1 / 26 )

OS X 10.6.2 Update
11/10/2009, 12:28 - Apple


發表回應 發表回應 ( 320預覽 )   |  [ 0 引用 ]   |  permalink   |   ( 2.5 / 40 )

OS X server 10.4.11 upgrade to 10.6 問題解決
11/06/2009, 21:35 - Apple
看來是 Apache 和 PHP5 之間的問題,Snow Leopard Server 的 PHP 是

root# php -v
PHP 5.3.0 (cli) (built: Jul 19 2009 00:34:29)
Copyright (c) 1997-2009 The PHP Group
Zend Engine v2.3.0, Copyright (c) 1998-2009 Zend Technologies


但是在系統中並沒有 Zend,而查看 Sample CPU load of httpd 時,發現 load 是在作 zend debug 時最多,所以在 /etc/php.ini 中加上兩行:

report_zend_debug = 0
mbstring.script_encoding=""


CPU load 就下來了。不過要試個幾天確定一下!

root# uptime
21:41 up 5 days, 10:57, 2 users, load averages: 0.03 0.08 0.52


發表回應 發表回應 ( 382預覽 )   |  [ 0 引用 ]   |  permalink   |   ( 2.9 / 37 )

Snow Leopard hosts.allow and hosts.deny
11/06/2009, 15:00 - Apple
新裝好的 Snow Leopard Server, 一直收到有人用字典攻擊,在測試密碼. 先用 /etc/hosts.allow 和 /etc/hosts.deny 過濾掉沒有正確 IP 正反解的連線, 到時再用 sshdfilter 來擋!

/etc/hosts.allow

#
# hosts.allow This file describes the names of the hosts which are
# allowed to use the local INET services, as decided
# by the '/usr/sbin/tcpd' server.
#
#in.identd:ALL:ALLOW
#
smtpd:KNOWN,LOCAL,192.168.0.0/255.255.242.0:ALLOW
smtpd:UNKNOWN,PARANOID:DENY
#
httpd:KNOWN,LOCAL,192.168.0.0/255.255.2242.0:ALLOW
httpd:UNKNOWN,PARANOID:DENY
#
vsftpd:LOCAL,KNOWN,192.168.0.0/255.255.242.0:ALLOW
vsftpd:UNKNOWN,PARANOID:DENY
#
##in.telnetd:LOCAL,KNOWN,host,192.168.0.0/255.255.242.0:ALLOW
##in.telnetd:KNOWN,UNKNOWN,PARANOID:DENY
#
ipop3d:KNOWN,LOCAL,192.168.0.0/255.255.242.0,:ALLOW
ipop3d:UNKNOWN,PARANOID:DENY
#
imapd:KNOWN,LOCAL,192.168.0.0/255.255.242.0,:ALLOW
imapd:UNKNOWN,PARANOID:DENY
#
sshd:KNOWN,LOCAL,192.168.0.0/255.255.242.0:ALLOW
sshd:UNKNOWN,PARANOID,173.183.250.38:DENY
#
named:ALL:ALLOW
#
ALL:KNOWN,LOCAL,192.168.0.0/255.255.242.0:ALLOW
ALL:UNKNOWN,PARANOID:DENY
#


/etc/hosts.deny

#
# hosts.deny This file describes the names of the hosts which are
# *not* allowed to use the local INET services, as decided
# by the '/usr/sbin/tcpd' server.
#
#ALL:UNKNOWN,PARANOID:DENY

發表回應 發表回應 ( 506預覽 )   |  [ 0 引用 ]   |  permalink   |   ( 2.8 / 39 )

OS X server 10.4.11 upgrade to 10.6 問題暫解
11/03/2009, 11:59 - Apple
最近將原本在 iMac G5 上的 OS X Server 從 Tiger 10.4.11 昇級並換裝至 Mac Mini 的 Snow Leopard Server 10.6. 從 PowerPC 換成 Intel 的 CPU, 因為 Apple 在這兩種 CPU 上使用的 HDD Partition 格式不同, 無法直接以原來PowerPC的硬碟在Intel機器上開機. 所以將 iMac G5 放到 Target Disk Mode, 用 Firewire 連至 MacMini, 當成資料硬碟, 就可以無痛昇級,Snow Leopard Server 系統在一安裝好之後,第一次開機會有 Server Migration 可以自動作昇級,並自動作資料的搬移及轉換, 不過時間要等有點久, Snow Leopard Server 安裝約一個小時,但需要3個小時作 migration, 最多時間用在作原本的 user 所存放的 mail 格式轉換. 10.6 server 的 postfix 己經由原本的 UNIX mailbox 格式, 換成 QMail 的 maildir 可以加快信件的處理速度. 經過 Server Migration 之後, 所有的的資料都在, 密碼及SSL的CA設定也都沒有改變, 在外部的人根本無法察覺到 Server 己經換了.

跑了兩天發現系統的 loading (uptime) 會上昇到 40 以上, CPU 100% 滿載, (一般的 UNIX 系統在 3 至 5 就不得了了), 讓系統反應變慢. 檢查的結果應該是 apache2 的關係, 原因還不明, 因為有使用 Squirrel webmail, 無法停掉 apache, 先作一個 shell script 放在 crontab 中定時檢查若 load 大於 8, 就重新起動 apache. 作為暫時解決的方案.


#!/bin/sh
AP_PS=`ps -ax|grep httpd|grep -v grep|wc -l|awk '{printf("%d\n",$1)}'`
LOAD=`uptime|awk '{printf("%d\n",$11)}'`

if [ $LOAD -ge 8 ]; then
if [ $AP_PS -ge 10 ]; then
/usr/sbin/apachectl restart
fi
fi




發表回應 發表回應 ( 602預覽 )   |  [ 0 引用 ]   |  permalink   |   ( 3.1 / 33 )

Parallels Windows 7
10/30/2009, 16:08 - Apple
用 Parallels4 在 Snow Leopard 上跑 Windows 7,得到的測試結果,Graphics 還要再加強啊!

發表回應 發表回應 ( 244預覽 )   |  [ 0 引用 ]   |  permalink   |   ( 3.1 / 26 )


<<開始 <前一頁 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 下一頁> 最後>>