MQTT client test with W5200 ethernet shield

Dependents:   IBMIoTClientEthernetExample_W5200

Fork of W5500Interface by W5500-Ethernet-Interface Makers

Socket/Socket.cpp

Committer:
hjjeon
Date:
2014-10-15
Revision:
9:dfffa4d6f022
Parent:
4:af0ed4fbca02
Child:
10:713b6d2aaefb

File content as of revision 9:dfffa4d6f022:

/* Copyright (C) 2012 mbed.org, MIT License
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy of this software
 * and associated documentation files (the "Software"), to deal in the Software without restriction,
 * including without limitation the rights to use, copy, modify, merge, publish, distribute,
 * sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is
 * furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in all copies or
 * substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
 * BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
 * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 */

#include "Socket.h"
static uint16_t sock_any_port = SOCK_ANY_PORT_NUM;
Socket::Socket() : _sock_fd(-1),_blocking(true), _timeout(1500)
{
    eth = WIZnet_Chip::getInstance();
    if (eth == NULL) {
        error("Socket constructor error: no W5500 instance available!\r\n");
    }
}

void Socket::set_blocking(bool blocking, unsigned int timeout)
{
    _blocking = blocking;
    _timeout = timeout;
}

int Socket::close()
{
    // add this code refer from EthernetInterface.
    // update by Patrick Pollet
    int res;
    res = eth->close(_sock_fd);
    _sock_fd = -1;
    return (res)? 0: -1;
}

Socket::~Socket()
{
    close(); //Don't want to leak
}


int8_t Socket::Socket_macraw(uint8_t sn, uint16_t port, uint8_t flag)
{
    //CHECK_SOCKNUM();
    
    if((flag & 0x06) != 0) return SOCKERR_SOCKFLAG;
    
    eth->close(sn);
    eth->setSn_MR(sn, (Sn_MR_MACRAW | (flag & 0xF0)));
    if(!port)
    {
       port = sock_any_port++;
       if(sock_any_port == 0xFFF0) sock_any_port = SOCK_ANY_PORT_NUM;
    }
    eth->setSn_PORT(sn,port); 
    eth->setSn_CR(sn,Sn_CR_OPEN);
    while(eth->getSn_CR(sn));
    //sock_io_mode |= ((flag & SF_IO_NONBLOCK) << sn);   
    //sock_is_sending &= ~(1<<sn);
    //sock_remained_size[sn] = 0;
    //sock_pack_info[sn] = 0;
    while(eth->getSn_SR(sn) == SOCK_CLOSED);
    return (int8_t)sn;
}      
/*
int8_t Socket::close(uint8_t sn)
{
    //CHECK_SOCKNUM();
    
    eth->setSn_CR(sn,Sn_CR_CLOSE);
   // wait to process the command... 
    while( eth->getSn_CR(sn) );
    // clear all interrupt of the socket. 
    eth->setSn_IR(sn, 0xFF);
    //sock_is_sending &= ~(1<<sn);
    //sock_remained_size[sn] = 0;
    //sock_pack_info[sn] = 0;
    while(eth->getSn_SR(sn) != SOCK_CLOSED);
    return SOCK_OK;
}
*/