Advertisement
mathiasbk

Untitled

Mar 17th, 2011
107
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 13.86 KB | None | 0 0
  1. #include "etherShield.h"
  2.  
  3. // please modify the following lines. mac and ip have to be unique
  4. // in your local area network. You can not have the same numbers in
  5. // two devices:
  6. static uint8_t mymac[6] = {0x54,0x55,0x58,0x10,0x00,0x24};
  7. static uint8_t myip[4] = {192,168,1,88};
  8. static uint16_t my_port = 1200;     // client port
  9.  
  10. // client_ip - modify it when you have multiple client on the network
  11. // for server to distinguish each ethershield client
  12. static char client_ip[] = "192.168.1.88";
  13.  
  14. // server settings - modify the service ip to your own server
  15. static uint8_t dest_ip[4]={192,168,1,114};
  16. static uint8_t dest_mac[6];
  17.  
  18. enum CLIENT_STATE
  19. {  
  20.    IDLE, ARP_SENT, ARP_REPLY, SYNC_SENT
  21.  };
  22.  
  23. static CLIENT_STATE client_state;
  24.  
  25. static uint8_t client_data_ready;
  26.  
  27. static uint8_t syn_ack_timeout = 0;
  28.  
  29.  
  30. #define BUFFER_SIZE 500
  31. static uint8_t buf[BUFFER_SIZE+1];
  32.  
  33. char sensorData[10];
  34.  
  35. EtherShield es=EtherShield();
  36.  
  37. // prepare the webpage by writing the data to the tcp send buffer
  38. uint16_t print_webpage(uint8_t *buf);
  39. int8_t analyse_cmd(char *str);
  40. // get current temperature
  41. #define TEMP_PIN  3
  42. void getCurrentTemp( char *temperature);
  43. void client_process(void);
  44.  
  45. void setup(){
  46.  
  47.    /*initialize enc28j60*/
  48.      es.ES_enc28j60Init(mymac);
  49.    es.ES_enc28j60clkout(2); // change clkout from 6.25MHz to 12.5MHz
  50.    delay(10);
  51.        
  52.     /* Magjack leds configuration, see enc28j60 datasheet, page 11 */
  53.     // LEDA=greed LEDB=yellow
  54.     //
  55.     // 0x880 is PHLCON LEDB=on, LEDA=on
  56.     // enc28j60PhyWrite(PHLCON,0b0000 1000 1000 00 00);
  57.     es.ES_enc28j60PhyWrite(PHLCON,0x880);
  58.     delay(500);
  59.     //
  60.     // 0x990 is PHLCON LEDB=off, LEDA=off
  61.     // enc28j60PhyWrite(PHLCON,0b0000 1001 1001 00 00);
  62.     es.ES_enc28j60PhyWrite(PHLCON,0x990);
  63.     delay(500);
  64.     //
  65.     // 0x880 is PHLCON LEDB=on, LEDA=on
  66.     // enc28j60PhyWrite(PHLCON,0b0000 1000 1000 00 00);
  67.     es.ES_enc28j60PhyWrite(PHLCON,0x880);
  68.     delay(500);
  69.     //
  70.     // 0x990 is PHLCON LEDB=off, LEDA=off
  71.     // enc28j60PhyWrite(PHLCON,0b0000 1001 1001 00 00);
  72.     es.ES_enc28j60PhyWrite(PHLCON,0x990);
  73.     delay(500);
  74.     //
  75.   // 0x476 is PHLCON LEDA=links status, LEDB=receive/transmit
  76.   // enc28j60PhyWrite(PHLCON,0b0000 0100 0111 01 10);
  77.   es.ES_enc28j60PhyWrite(PHLCON,0x476);
  78.     delay(100);
  79.        
  80.   //init the ethernet/ip layer:
  81.   es.ES_init_ip_arp_udp_tcp(mymac,myip,80);
  82.  
  83.   // intialize varible;
  84.   syn_ack_timeout =0;
  85.   client_data_ready = 0;
  86.   client_state = IDLE;
  87.   // initialize DS18B20 datapin
  88.     digitalWrite(TEMP_PIN, LOW);
  89.     pinMode(TEMP_PIN, INPUT);      // sets the digital pin as input (logic 1)
  90.  
  91.  
  92. }
  93.  
  94. void loop(){
  95.  
  96.         //if(client_data_ready==0){
  97.           //delay(4280);             // delay 60s
  98.           delay(600UL);
  99.           getCurrentTemp(sensorData);
  100.           client_data_ready = 1;
  101.          //}
  102.     client_process();
  103.        
  104. }
  105.  
  106. uint16_t gen_client_request(uint8_t *buf )
  107. {
  108.     uint16_t plen;
  109.     byte i;
  110.        
  111.     plen= es.ES_fill_tcp_data_p(buf,0, PSTR ( "GET /temp/insert.php?tmp=1" ) );
  112.    
  113.      
  114.        
  115.     plen= es.ES_fill_tcp_data_p(buf, plen, PSTR ( " HTTP/1.0\r\n" ));
  116.     plen= es.ES_fill_tcp_data_p(buf, plen, PSTR ( "Host: 192.168.1.88\r\n" ));
  117.     plen= es.ES_fill_tcp_data_p(buf, plen, PSTR ( "User-Agent: AVR ethernet\r\n" ));
  118.         plen= es.ES_fill_tcp_data_p(buf, plen, PSTR ( "Accept: text/html\r\n" ));
  119.     plen= es.ES_fill_tcp_data_p(buf, plen, PSTR ( "Keep-Alive: 300\r\n" ));
  120.     plen= es.ES_fill_tcp_data_p(buf, plen, PSTR ( "Connection: keep-alive\r\n\r\n" ));
  121.  
  122.     return plen;
  123. }
  124.  
  125. //*****************************************************************************************
  126. //
  127. // Function : client_process
  128. // Description : send temparature to web server, this option is disabled by default.
  129. // YOU MUST install webserver and server script before enable this option,
  130. // I recommented Apache webserver and PHP script.
  131. // More detail about Apache and PHP installation please visit http://www.avrportal.com/
  132. //
  133. //*****************************************************************************************
  134. void client_process ( void )
  135. {
  136.     uint16_t plen;
  137.     uint8_t i;
  138.  
  139.     if (client_data_ready == 0)  return;     // nothing to send
  140.  
  141.     if(client_state == IDLE){   // initialize ARP
  142.        es.ES_make_arp_request(buf, dest_ip);
  143.        
  144.        client_state = ARP_SENT;
  145.        return;
  146.     }
  147.      
  148.        
  149.     if(client_state == ARP_SENT){
  150.        
  151.         plen = es.ES_enc28j60PacketReceive(BUFFER_SIZE, buf);
  152.  
  153.         // destination ip address was found on network
  154.         if ( plen!=0 )
  155.         {
  156.             if ( es.ES_arp_packet_is_myreply_arp ( buf ) ){
  157.                 client_state = ARP_REPLY;
  158.                 syn_ack_timeout=0;
  159.                 return;
  160.             }
  161.        
  162.         }
  163.             delay(10);
  164.         syn_ack_timeout++;
  165.        
  166.        
  167.         if(syn_ack_timeout== 100) {  //timeout, server ip not found
  168.             client_state = IDLE;
  169.             client_data_ready =0;
  170.             syn_ack_timeout=0;
  171.             return;
  172.         }  
  173.     }
  174.  
  175.    
  176.  
  177.  // send SYN packet to initial connection
  178.     if(client_state == ARP_REPLY){
  179.         // save dest mac
  180.         for(i=0; i<6; i++){
  181.             dest_mac[i] = buf[ETH_SRC_MAC+i];
  182.         }
  183.    
  184.         es.ES_tcp_client_send_packet (
  185.                        buf,
  186.                        80,
  187.                        1200,
  188.                        TCP_FLAG_SYN_V,                 // flag
  189.                        1,                                              // (bool)maximum segment size
  190.                        1,                                              // (bool)clear sequence ack number
  191.                        0,                                              // 0=use old seq, seqack : 1=new seq,seqack no data : new seq,seqack with data
  192.                        0,                                              // tcp data length
  193.               dest_mac,
  194.               dest_ip
  195.                        );
  196.        
  197.         client_state = SYNC_SENT;
  198.     }
  199.   // get new packet
  200.   if(client_state == SYNC_SENT){
  201.     plen = es.ES_enc28j60PacketReceive(BUFFER_SIZE, buf);
  202.  
  203.        // no new packet incoming
  204.     if ( plen == 0 )
  205.     {
  206.         return;
  207.     }
  208.  
  209.        // check ip packet send to avr or not?
  210.        // accept ip packet only
  211.     if ( es.ES_eth_type_is_ip_and_my_ip(buf,plen)==0){
  212.         return;
  213.     }
  214.  
  215.        // check SYNACK flag, after AVR send SYN server response by send SYNACK to AVR
  216.     if ( buf [ TCP_FLAGS_P ] == ( TCP_FLAG_SYN_V | TCP_FLAG_ACK_V ) )
  217.     {
  218.  
  219.                // send ACK to answer SYNACK
  220.  
  221.                es.ES_tcp_client_send_packet (
  222.                        buf,
  223.                        80,
  224.                        1200,
  225.                        TCP_FLAG_ACK_V,                 // flag
  226.                        0,                                              // (bool)maximum segment size
  227.                        0,                                              // (bool)clear sequence ack number
  228.                        1,                                              // 0=use old seq, seqack : 1=new seq,seqack no data : new seq,seqack with data
  229.                        0,                                              // tcp data length
  230.                         dest_mac,
  231.                         dest_ip
  232.                        );
  233.                // setup http request to server
  234.                plen = gen_client_request( buf );
  235.                // send http request packet
  236.                // send packet with PSHACK
  237.                es.ES_tcp_client_send_packet (
  238.                                        buf,
  239.                                        80,                                             // destination port
  240.                                        1200,                                   // source port
  241.                                        TCP_FLAG_ACK_V | TCP_FLAG_PUSH_V,                        // flag
  242.                                        0,                                              // (bool)maximum segment size
  243.                                        0,                                              // (bool)clear sequence ack number
  244.                                        0,                                              // 0=use old seq, seqack : 1=new seq,seqack no data : >1 new seq,seqack with data
  245.                                        plen,                           // tcp data length
  246.                                        dest_mac,
  247.                                        dest_ip
  248.                                        );
  249.                return;
  250.        }
  251.        // after AVR send http request to server, server response by send data with PSHACK to AVR
  252.        // AVR answer by send ACK and FINACK to server
  253.        if ( buf [ TCP_FLAGS_P ] == (TCP_FLAG_ACK_V|TCP_FLAG_PUSH_V) )
  254.        {
  255.                plen = es.ES_tcp_get_dlength( (uint8_t*)&buf );
  256.  
  257.                // send ACK to answer PSHACK from server
  258.                es.ES_tcp_client_send_packet (
  259.                                        buf,
  260.                                        80,                                             // destination port
  261.                                        1200,                                   // source port
  262.                                        TCP_FLAG_ACK_V,                  // flag
  263.                                        0,                                              // (bool)maximum segment size
  264.                                        0,                                              // (bool)clear sequence ack number
  265.                                        plen,                                           // 0=use old seq, seqack : 1=new seq,seqack no data : >1 new seq,seqack with data
  266.                                        0,                              // tcp data length
  267.                       dest_mac,
  268.                       dest_ip
  269.                );;
  270.                // send finack to disconnect from web server
  271.  
  272.                es.ES_tcp_client_send_packet (
  273.                                        buf,
  274.                                        80,                                             // destination port
  275.                                        1200,                                   // source port
  276.                                        TCP_FLAG_FIN_V|TCP_FLAG_ACK_V,                  // flag
  277.                                        0,                                              // (bool)maximum segment size
  278.                                        0,                                              // (bool)clear sequence ack number
  279.                                        0,                                           // 0=use old seq, seqack : 1=new seq,seqack no data : >1 new seq,seqack with data
  280.                                        0,
  281.                                         dest_mac,
  282.                                         dest_ip
  283.                 );
  284.  
  285.                return;
  286.                
  287.        }
  288.        // answer FINACK from web server by send ACK to web server
  289.        if ( buf [ TCP_FLAGS_P ] == (TCP_FLAG_ACK_V|TCP_FLAG_FIN_V) )
  290.        {
  291.                // send ACK with seqack = 1
  292.                es.ES_tcp_client_send_packet(
  293.  
  294.                                        buf,
  295.                                        80,                                             // destination port
  296.                                        1200,                                   // source port
  297.                                        TCP_FLAG_ACK_V,                 // flag
  298.                                        0,                                              // (bool)maximum segment size
  299.                                        0,                                              // (bool)clear sequence ack number
  300.                                        1,                                              // 0=use old seq, seqack : 1=new seq,seqack no data : >1 new seq,seqack with data
  301.                                        0,
  302.                                        dest_mac,
  303.                                        dest_ip
  304.                 );
  305.             client_state = IDLE;        // return to IDLE state
  306.             client_data_ready =0;       // client data sent
  307.         }
  308.   }      
  309. }
  310.  
  311. void OneWireReset(int Pin) // reset.  Should improve to act as a presence pulse
  312. {
  313.      digitalWrite(Pin, LOW);
  314.      pinMode(Pin, OUTPUT); // bring low for 500 us
  315.      delayMicroseconds(500);
  316.      pinMode(Pin, INPUT);
  317.      delayMicroseconds(500);
  318. }
  319.  
  320. void OneWireOutByte(int Pin, byte d) // output byte d (least sig bit first).
  321. {
  322.    byte n;
  323.  
  324.    for(n=8; n!=0; n--)
  325.    {
  326.       if ((d & 0x01) == 1)  // test least sig bit
  327.       {
  328.          digitalWrite(Pin, LOW);
  329.          pinMode(Pin, OUTPUT);
  330.          delayMicroseconds(5);
  331.          pinMode(Pin, INPUT);
  332.          delayMicroseconds(60);
  333.       }
  334.       else
  335.       {
  336.          digitalWrite(Pin, LOW);
  337.          pinMode(Pin, OUTPUT);
  338.          delayMicroseconds(60);
  339.          pinMode(Pin, INPUT);
  340.       }
  341.  
  342.       d=d>>1; // now the next bit is in the least sig bit position.
  343.    }
  344.    
  345. }
  346.  
  347. byte OneWireInByte(int Pin) // read byte, least sig byte first
  348. {
  349.     byte d, n, b;
  350.  
  351.     for (n=0; n<8; n++)
  352.     {
  353.         digitalWrite(Pin, LOW);
  354.         pinMode(Pin, OUTPUT);
  355.         delayMicroseconds(5);
  356.         pinMode(Pin, INPUT);
  357.         delayMicroseconds(5);
  358.         b = digitalRead(Pin);
  359.         delayMicroseconds(50);
  360.         d = (d >> 1) | (b<<7); // shift d to right and insert b in most sig bit position
  361.     }
  362.     return(d);
  363. }
  364.  
  365.  
  366. void getCurrentTemp(char *temp)
  367. {  
  368.   int HighByte, LowByte, TReading, Tc_100, sign, whole, fract;
  369.  
  370.   OneWireReset(TEMP_PIN);
  371.   OneWireOutByte(TEMP_PIN, 0xcc);
  372.   OneWireOutByte(TEMP_PIN, 0x44); // perform temperature conversion, strong pullup for one sec
  373.  
  374.   OneWireReset(TEMP_PIN);
  375.   OneWireOutByte(TEMP_PIN, 0xcc);
  376.   OneWireOutByte(TEMP_PIN, 0xbe);
  377.  
  378.   LowByte = OneWireInByte(TEMP_PIN);
  379.   HighByte = OneWireInByte(TEMP_PIN);
  380.   TReading = (HighByte << 8) + LowByte;
  381.   sign = TReading & 0x8000;  // test most sig bit
  382.   if (sign) // negative
  383.   {
  384.     TReading = (TReading ^ 0xffff) + 1; // 2's comp
  385.   }
  386.   Tc_100 = (6 * TReading) + TReading / 4;    // multiply by (100 * 0.0625) or 6.25
  387.  
  388.   whole = Tc_100 / 100;  // separate off the whole and fractional portions
  389.   fract = Tc_100 % 100;
  390.  
  391.     if(sign) temp[0]='-';
  392.     else         temp[0]='+';
  393.    
  394.    
  395.     temp[1]= (whole-(whole/100)*100)/10 +'0' ;
  396.     temp[2]= whole-(whole/10)*10 +'0';
  397.    
  398.     temp[3]='.';
  399.     temp[4]=fract/10 +'0';
  400.     temp[5]=fract-(fract/10)*10 +'0';
  401.    
  402.     temp[6] = '\0';
  403. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement