/*
* Copyright (c) 2013 by Renato Aloi
*
* This file is free software; you can redistribute it and/or modify
* it under the terms of either the GNU General Public License version 2
* or the GNU Lesser General Public License version 2.1, both as
* published by the Free Software Foundation.
*
* 2013-12-26 :: REV 1 by Renato Aloi (missing DHCP part)
* 2014-01-28 :: REV 2 by Renato Aloi (general clean up)
*/
#include "tcpStack.h"
#include
#include
extern "C"
{
#include "enc28j60.h"
}
static void WaitForDMACopy(void);
// Init Method
//
void SocketClass::init()
{
sizeRx = 0;
stopRx = 0;
lastRx = 0;
lastTx = 0;
status = SnSR::CLOSED;
internalStatus = SOCKET_CLOSED;
sessionPort = 0;
idNum = 0;
clientPayload = 0;
lastPayload = 0;
ackNum = 0;
seqNum = 0;
}
uint8_t SocketClass::available(TCP_PACKET packet, uint16_t _startRx)
{
if (packet.tcp.Flags.Bits.FlagSYN)
{
// Copy packet from
// ENC28J60's RX buffer to socket RX buffer
// With options 'cause we send
// MMS option along with SYN/ACK
DMACopyTo(RX, _startRx, TCP_BUFF_SIZE_W_OPT);
WaitForDMACopy();
return 1;
}
return 0;
}
uint8_t SocketClass::established(TCP_PACKET packet, uint16_t _startRx)
{
if (packet.tcp.Flags.Bits.FlagACK)
{
// Copy packet from
// ENC28J60's RX buffer to socket RX buffer
DMACopyTo(RX, _startRx, TCP_BUFF_SIZE);
WaitForDMACopy();
return 1;
}
return 0;
}
uint8_t SocketClass::pushed(TCP_PACKET packet, uint16_t _startRx)
{
if (packet.tcp.Flags.Bits.FlagPSH)
{
// Copy packet from
// ENC28J60's RX buffer to socket RX buffer
//DMACopyTo(RX, _startRx, TCP_BUFF_SIZE);
DMACopyTo(RX, _startRx, packet.ip.TotalLength.Value + ETH_BUFF_SIZE);
WaitForDMACopy();
return 1;
}
return 0;
}
uint8_t SocketClass::acked(TCP_PACKET packet, uint16_t _startRx)
{
if (packet.tcp.Flags.Bits.FlagACK)
{
// Copy packet from
// ENC28J60's RX buffer to socket RX buffer
//DMACopyTo(RX, _startRx, TCP_BUFF_SIZE);
DMACopyTo(RX, _startRx, TCP_BUFF_SIZE);
WaitForDMACopy();
return 1;
}
return 0;
}
uint8_t SocketClass::finished(TCP_PACKET packet, uint16_t _startRx)
{
if (packet.tcp.Flags.Bits.FlagFIN)
{
// Copy packet from
// ENC28J60's RX buffer to socket RX buffer
//DMACopyTo(RX, _startRx, TCP_BUFF_SIZE);
DMACopyTo(RX, _startRx, TCP_BUFF_SIZE);
WaitForDMACopy();
return 1;
}
return 0;
}
uint8_t SocketClass::getStatus()
{
return status;
}
uint8_t SocketClass::getInternalStatus()
{
return internalStatus;
}
void SocketClass::setStatus(uint8_t st)
{
status = st;
}
void SocketClass::setInternalStatus(uint8_t st)
{
internalStatus = st;
}
void SocketClass::setSessionPort(uint16_t port)
{
sessionPort = port;
}
uint16_t SocketClass::getSessionPort()
{
return sessionPort;
}
void SocketClass::setIdNum(uint16_t id)
{
idNum = id;
}
uint16_t SocketClass::getIdNum()
{
return idNum;
}
void SocketClass::setRxSize(uint16_t size)
{
sizeRx = size;
}
uint16_t SocketClass::getRxSize()
{
return sizeRx;
}
void SocketClass::setRxPointer(uint16_t _pt)
{
SOCKETSetRxPointer(_pt);
}
uint16_t SocketClass::getRxPointer()
{
return SOCKETGetRxPointer();
}
void SocketClass::setTxPointer(uint16_t _pt)
{
SOCKETSetTxPointer(_pt);
}
uint16_t SocketClass::getTxPointer()
{
return SOCKETGetTxPointer();
}
void SocketClass::setClientPayload(uint16_t _payload)
{
clientPayload = _payload;
}
uint16_t SocketClass::getClientPayload()
{
return clientPayload;
}
void SocketClass::setLastPayload(uint16_t _payload)
{
lastPayload = _payload;
}
uint16_t SocketClass::getLastPayload()
{
return lastPayload;
}
void SocketClass::setAckNum(uint32_t _num)
{
ackNum = _num;
}
uint32_t SocketClass::getAckNum()
{
return ackNum;
}
void SocketClass::setSeqNum(uint32_t _num)
{
seqNum = _num;
}
uint32_t SocketClass::getSeqNum()
{
return seqNum;
}
uint16_t SocketClass::getStopRx()
{
return stopRx;
}
void SocketClass::setStopRx(uint16_t _stop)
{
stopRx = _stop;
}
uint16_t SocketClass::getLastRx()
{
return lastRx;
}
void SocketClass::setLastRx(uint16_t _last)
{
lastRx = _last;
}
uint16_t SocketClass::getLastTx()
{
return lastTx;
}
void SocketClass::setLastTx(uint16_t _last)
{
lastTx = _last;
}
// Wait for DMA Copy finish
//
static void WaitForDMACopy(void)
{
unsigned long timerSendTrigger = millis();
while(!IsDMACopyDone())
{
if (timerSendTrigger + 1000 < millis())
{
//Serial.println(F("ERRO DMA COPY!"));
//delay(10);
break;
}
}
}