Page MenuHomePhabricator

No OneTemporary

diff --git a/ethernet.c b/ethernet.c
--- a/ethernet.c
+++ b/ethernet.c
@@ -1,202 +1,198 @@
/*
* Simple socket server for FreeRTOS based on the Arduino Ethernet Library
* (c) 2011 Andreas Boehler <andreas@aboehler.at>
*
* 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.
*/
#include "ethernet.h"
#include "main.h"
/**
* \file ethernet.c
* \brief Main ethernet source code
* This file contains the main ethernet handling code.
*/
/********************
* Global variables *
********************/
uint8_t eth_state[MAX_SOCK_NUM] = { 0, 0, 0, 0 }; ///< Ethernet states
uint16_t eth_server_port[MAX_SOCK_NUM] = { 0, 0, 0, 0 }; ///< Ethernet ports
uint8_t ethernet_init(uint8_t *mac, uint8_t *ip, uint8_t *gateway, uint8_t *subnet)
{
- w5100_init();
- w5100_setMACAddress(mac);
- w5100_setIPAddress(ip);
- w5100_setGatewayIp(gateway);
- w5100_setSubnetMask(subnet);
- return TRUE;
+ w5100_init();
+ w5100_setMACAddress(mac);
+ w5100_setIPAddress(ip);
+ w5100_setGatewayIp(gateway);
+ w5100_setSubnetMask(subnet);
+ return TRUE;
}
-uint8_t socket_server_init(uint16_t port)
+uint8_t socket_server_init(SOCKET s, uint16_t port)
{
- uint8_t sock;
- for(sock = 0; sock < MAX_SOCK_NUM; sock++)
- {
- if(w5100_readSnSR(sock) == SNSR_CLOSED)
- {
- eth_server_port[sock] = port;
- socket_server_create_socket(sock, SNMR_TCP, eth_server_port[sock], 0);
- if(socket_server_listen(sock))
- return sock+1;
- else
- return FALSE;
- }
- }
- return FALSE;
+ if(w5100_readSnSR(s) == SNSR_CLOSED)
+ {
+ eth_server_port[s] = port;
+ socket_server_create_socket(s, SNMR_TCP, eth_server_port[s], 0);
+ if(socket_server_listen(s))
+ return TRUE;
+ else
+ return FALSE;
+ }
+ return FALSE;
}
uint8_t socket_server_socket_status(SOCKET s)
{
- return w5100_readSnSR(s);
+ return w5100_readSnSR(s);
}
uint8_t socket_server_create_socket(SOCKET s, uint8_t protocol, uint16_t port, uint8_t flag)
{
- if((protocol == SNMR_TCP) || (protocol == SNMR_UDP) || (protocol == SNMR_IPRAW) || (protocol == SNMR_MACRAW) || (protocol == SNMR_PPPOE))
- {
- socket_server_close_socket(s);
- w5100_writeSnMR(s, protocol | flag);
- if(port != 0)
- w5100_writeSnPORT(s, port);
- else
- w5100_writeSnPORT(s, 80); // We hardcode a default port here
- w5100_execCmdSn(s, Sock_OPEN);
- return TRUE;
- }
- else
- return FALSE;
+ if((protocol == SNMR_TCP) || (protocol == SNMR_UDP) || (protocol == SNMR_IPRAW) || (protocol == SNMR_MACRAW) || (protocol == SNMR_PPPOE))
+ {
+ socket_server_close_socket(s);
+ w5100_writeSnMR(s, protocol | flag);
+ if(port != 0)
+ w5100_writeSnPORT(s, port);
+ else
+ w5100_writeSnPORT(s, 80); // We hardcode a default port here
+ w5100_execCmdSn(s, Sock_OPEN);
+ return TRUE;
+ }
+ else
+ return FALSE;
}
uint8_t socket_server_close_socket(SOCKET s)
{
- w5100_execCmdSn(s, Sock_CLOSE);
- w5100_writeSnIR(s, 0xFF);
- return TRUE;
+ w5100_execCmdSn(s, Sock_CLOSE);
+ w5100_writeSnIR(s, 0xFF);
+ return TRUE;
}
uint8_t socket_server_listen(SOCKET s)
{
- if(w5100_readSnSR(s) != SNSR_INIT)
- return FALSE;
- else
- w5100_execCmdSn(s, Sock_LISTEN);
- return TRUE;
+ if(w5100_readSnSR(s) != SNSR_INIT)
+ return FALSE;
+ else
+ w5100_execCmdSn(s, Sock_LISTEN);
+ return TRUE;
}
uint8_t socket_server_data_available(SOCKET s)
{
- //uint8_t stat = socket_server_socket_status(s);
- //if((stat == SNSR_ESTABLISHED) || (stat == SNSR_CLOSE_WAIT))
- return w5100_getRXReceivedSize(s);
- //else
- // return FALSE;
+ //uint8_t stat = socket_server_socket_status(s);
+ //if((stat == SNSR_ESTABLISHED) || (stat == SNSR_CLOSE_WAIT))
+ return w5100_getRXReceivedSize(s);
+ //else
+ // return FALSE;
}
uint8_t socket_server_socket_connected(SOCKET s)
{
- uint8_t stat = socket_server_socket_status(s);
- if((stat == SNSR_ESTABLISHED))
- return TRUE;
- else
- return FALSE;
+ uint8_t stat = socket_server_socket_status(s);
+ if((stat == SNSR_ESTABLISHED))
+ return TRUE;
+ else
+ return FALSE;
}
uint8_t socket_server_socket_closed(SOCKET s)
{
- uint8_t stat = socket_server_socket_status(s);
- if((stat == SNSR_CLOSE_WAIT))
- return TRUE;
- else
- return FALSE;
+ uint8_t stat = socket_server_socket_status(s);
+ if((stat == SNSR_CLOSE_WAIT))
+ return TRUE;
+ else
+ return FALSE;
}
#ifdef USE_ETHERNET_INTERRUPT
uint8_t socket_server_handle_interrupt(void)
{
- uint8_t ir = w5100_readIR();
- uint8_t sock = 0;
- uint8_t sr = 0;
- uint8_t i;
+ uint8_t ir = w5100_readIR();
+ uint8_t sock = 0;
+ uint8_t sr = 0;
+ uint8_t i;
- for(i=0; i<MAX_SOCK_NUM; i++)
- {
- if(ir & (1<<i))
- {
- sr = w5100_readSnIR(i);
- sock = i;
- }
- }
- if(sock != MAX_SOCK_NUM)
- {
- w5100_writeSnIR(sock, sr);
- return sock;
- }
- else
- {
- return FALSE;
- }
+ for(i=0; i<MAX_SOCK_NUM; i++)
+ {
+ if(ir & (1<<i))
+ {
+ sr = w5100_readSnIR(i);
+ sock = i;
+ }
+ }
+ if(sock != MAX_SOCK_NUM)
+ {
+ w5100_writeSnIR(sock, sr);
+ return sock;
+ }
+ else
+ {
+ return FALSE;
+ }
}
#endif
uint16_t socket_server_write(SOCKET s, uint8_t *buffer, size_t size)
{
- uint16_t ret = 0;
- uint16_t freesize = 0;
- if(socket_server_socket_status(s) == SNSR_ESTABLISHED)
- {
- if(size > SSIZE)
- ret = SSIZE;
- else
- ret = size;
- freesize = w5100_getTXFreeSize(s);
- if(freesize < ret)
- ret = 0;
- /*
- do
- {
- freesize = w5100_getTXFreeSize(s);
+ uint16_t ret = 0;
+ uint16_t freesize = 0;
+ if(socket_server_socket_status(s) == SNSR_ESTABLISHED)
+ {
+ if(size > SSIZE)
+ ret = SSIZE;
+ else
+ ret = size;
+ freesize = w5100_getTXFreeSize(s);
+ if(freesize < ret)
+ ret = 0;
+ /*
+ do
+ {
+ freesize = w5100_getTXFreeSize(s);
- stat = w5100_readSnSR(s);
- if((stat != SNSR_ESTABLISHED) && (stat != SNSR_CLOSE_WAIT))
- {
- ret = 0;
- break;
- }
- }
- while(freesize < ret);
- */
- w5100_send_data_processing(s, (uint8_t *) buffer, ret);
- w5100_execCmdSn(s, Sock_SEND);
+ stat = w5100_readSnSR(s);
+ if((stat != SNSR_ESTABLISHED) && (stat != SNSR_CLOSE_WAIT))
+ {
+ ret = 0;
+ break;
+ }
+ }
+ while(freesize < ret);
+ */
+ w5100_send_data_processing(s, (uint8_t *) buffer, ret);
+ w5100_execCmdSn(s, Sock_SEND);
- while((w5100_readSnIR(s) & SNIR_SEND_OK) != SNIR_SEND_OK)
- {
- if(w5100_readSnSR(s) == SNSR_CLOSED)
- {
- socket_server_close_socket(s);
- return FALSE;
- }
- }
- w5100_writeSnIR(s, SNIR_SEND_OK);
- return ret;
- }
- return FALSE;
+ while((w5100_readSnIR(s) & SNIR_SEND_OK) != SNIR_SEND_OK)
+ {
+ if(w5100_readSnSR(s) == SNSR_CLOSED)
+ {
+ socket_server_close_socket(s);
+ return FALSE;
+ }
+ }
+ w5100_writeSnIR(s, SNIR_SEND_OK);
+ return ret;
+ }
+ return FALSE;
}
uint16_t socket_server_receive(SOCKET s, uint8_t *buf, uint16_t len)
{
- uint16_t ret = FALSE;
- if(len>0)
- {
- w5100_recv_data_processing(s, buf, len, 0);
- w5100_execCmdSn(s, Sock_RECV);
- ret = len;
- }
- return ret;
+ uint16_t ret = FALSE;
+ if(len>0)
+ {
+ w5100_recv_data_processing(s, buf, len, 0);
+ w5100_execCmdSn(s, Sock_RECV);
+ ret = len;
+ }
+ return ret;
}
diff --git a/ethernet.h b/ethernet.h
--- a/ethernet.h
+++ b/ethernet.h
@@ -1,197 +1,197 @@
/*
* Simple socket server for FreeRTOS based on the Arduino Ethernet Library
* (c) 2011 Andreas Boehler <andreas@aboehler.at>
*
* 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.
*/
/**
* \file ethernet.h
* Simple socket server for FreeRTOS based on the Arduino Ethernet Library for the
* W5100 Ethernet controller.
*/
#ifndef ETHERNET_H
#define ETHERNET_H
#include "w5100.h"
/**
* ethernet.h
*
* <pre>ethernet_init(uint8_t *mac, uint8_t *ip, uint8_t *gateway, uint8_t *subnet)</pre>
*
* <i>Function</i> that initializes the ethernet controller with the given parameters.
*
* @param mac Pointer to a byte holding the mac address of the ethernet controller
* @param ip Pointer to an array of bytes holding the IP address for the ethernet controller
* @param gateway Pointer to an array of bytes holding the Gateway IP Address
* @param subnet Pointer to an array of bytes holding the Subnet address
* @return TRUE on success, FALSE on failure.
* \ingroup Ethernet
*/
uint8_t ethernet_init(uint8_t *mac, uint8_t *ip, uint8_t *gateway, uint8_t *subnet);
/**
* ethernet.h
*
* <pre>socket_server_init(uint16_t port)</pre>
*
* <i>Function</i> that initializes a new socket server on the given port.
*
* @param port Integer that specifies the Port Number to create
* @return Socket Number +1 on success, 0 on failure.
* \ingroup Ethernet
*/
-uint8_t socket_server_init(uint16_t port);
+uint8_t socket_server_init(SOCKET s, uint16_t port);
/**
* ethernet.h
*
* <pre>socket_server_create_socket(SOCKET s, uint8_t protocol, uint16_t port, uint8_t flag)</pre>
*
* <i>Function</i> used e.g. by socker_server_init that creates a new socket server on the
* specified socket number using given protocol, port and flags.
* If the socket is already opened, it is automatically closed.
*
* @param s The socket number to create (0-3)
* @param protocol The protocol the socket should use
* @param port The port the new socket should listen one
* @param flag Additional flags to use
* @return TRUE on success, FALSE on failure.
* \ingroup Ethernet
*/
uint8_t socket_server_create_socket(SOCKET s, uint8_t protocol, uint16_t port, uint8_t flag);
/**
* ethernet.h
*
* <pre>socket_server_close_socket(SOCKET s)</pre>
*
* <i>Function</i> that closes a previously opened socket.
*
* @param s The socket to close
* @return TRUE on success, FALSE on failure.
* \ingroup Ethernet
*/
uint8_t socket_server_close_socket(SOCKET s);
/**
* ethernet.h
*
* <pre>socket_server_listen(SOCKET s)</pre>
*
* <i>Function</i> to start listening on the given socket.
*
* @param s The socket number to start listening on
* @return TRUE on success, FALSE on failure.
* \ingroup Ethernet
*/
uint8_t socket_server_listen(SOCKET s);
/**
* ethernet.h
*
* <pre>socket_server_socket_status(SOCKET s)</pre>
*
* <i>Function</i> that checks the status of a given socket.
*
* @param s The socket number to check.
* @return The status of the socket
* \ingroup Ethernet
*/
uint8_t socket_server_socket_status(SOCKET s);
/**
* ethernet.h
*
* <pre>socket_server_socket_connected(SOCKET s)</pre>
*
* <i>Function</i> that checks whether a socket is connected or not.
*
* @param s The socket number to check
* @return TRUE if a node is connected, FALSE if nothing is connected to the socket.
* \ingroup Ethernet
*/
uint8_t socket_server_socket_connected(SOCKET s);
/**
* ethernet.h
*
* <pre>socket_server_socket_closed(SOCKET s)</pre>
*
* <i>Function</i> that checks whether a given socket is closed or no.
*
* @param s The socket number to check
* @return TRUE if the socket's status is closed, otherwise FALSE.
* \ingroup Ethernet
*/
uint8_t socket_server_socket_closed(SOCKET s);
/**
* ethernet.h
*
* <pre>socket_server_data_available(SOCKET s)</pre>
*
* <i>Function</i> that checks if and how many data is available on a given socket.
*
* @param s The socket number to check
* @return FALSE if no data is available, otherwise the number of bytes that have been received.
* \ingroup Ethernet
*/
uint8_t socket_server_data_available(SOCKET s);
#ifdef USE_ETHERNET_INTERRUPT
/**
* ethernet.h
*
* <pre>socket_server_handle_interrupt(void)</pre>
*
* <i>Function</i> that handles the W5100 interrupt. It reads the interrupt register,
* extracts the socket number the interrupt happened on and clears the interrupt register
* (by mirroring the register values back).
*
* @return The socket number if successful, otherwise FALSE
* \warning If the socket number is 0, it might be misinterpreted as FALSE!
* \ingroup Ethernet
*/
uint8_t socket_server_handle_interrupt(void);
#endif
/**
* ethernet.h
*
* <pre>socket_server_write(SOCKET s, uint8_t *buffer, size_t size)</pre>
*
* <i>Function</i> that writes a character array, buffer, of length size to a given socket.
*
* @param s The socket to write to
* @param buffer Pointer to an array of uint8_t that holds the data
* @param size The length of the buffer array
* @return TRUE on success, FALSE on failure.
* \ingroup Ethernet
*/
uint16_t socket_server_write(SOCKET s, uint8_t *buffer, size_t size);
/**
* ethernet.h
*
* <pre>socket_server_receive(SOCKET s, uint8_t *buf, uint16_t len)</pre>
*
* <i>Function</i> that receives a given number of bytes from a given socket to the
* buffer specified.
*
* @param s The socket to receive from
* @param buf Pointer to a character Array to store the bytes to
* @param len Maximum number of characters to receive, usually retrieved by socket_server_data_available
* \ingroup Ethernet
*/
uint16_t socket_server_receive(SOCKET s, uint8_t *buf, uint16_t len);
#endif //ETHERNET_H
diff --git a/main.c b/main.c
--- a/main.c
+++ b/main.c
@@ -1,611 +1,612 @@
/*
* This is COSMICrtOS based on FreeRTOS port to ATmega2560.
* (c) 2011 Andreas Boehler <andreas@aboehler.at>
*
* ATTENTION: Software licenses apply! GPL is probably incompatible
* with our NDA! Can we link to a binary blob instead?
*/
// FIXME: Get rid of FreeRTOS
#include <stdlib.h>
#include <string.h>
#include <avr/eeprom.h>
#include <avr/interrupt.h>
#include <avr/wdt.h>
#include <util/delay.h>
#include "iomacro.h"
#include "main.h"
#include "neteeprom.h"
#include "ethernet.h"
volatile int gEthFired = FALSE;
-SOCKET gSock = MAX_SOCK_NUM;
#define TOGGLE_DELAY 300
#define INCR_DELAY 200
#define CMD_STOP 5
#define CMD_SELECT 6
#define CMD_UP 7
#define CMD_DOWN 8
#ifdef USE_MEGA2560 // ATMega2560 (Arduino Mega2560) defines
#define AI_PIN0 F,0
#define AI_PIN1 F,1
#define AI_PIN2 F,2
#define AI_PIN3 F,3
#define DO_PIN_STOP E,3
#define DO_PIN_SELECT H,3
#define DO_PIN_UP H,4
#define DO_PIN_DOWN H,5
#else // ATMega328p (Arduino Ethernet) defines
#define AI_PIN0 C,0
#define AI_PIN1 C,1
#define AI_PIN2 C,2
#define AI_PIN3 C,3
#define DO_PIN_STOP D,5
#define DO_PIN_SELECT D,6
#define DO_PIN_UP D,7
#define DO_PIN_DOWN B,0
#endif
#ifdef USE_ETHERNET_INTERRUPT
/***************************************
* Helper function to setup interrupts *
***************************************/
void setupExternalInterrupts(void)
{
EICRB |= (1 << ISC41); // Enable falling edge interrupt
EIMSK |= (1 << INT4); // enable external interrupt 4
}
/****************************************************
* Setup the interrupt handler for ethernet traffic *
****************************************************/
ISR(INT4_vect)
{
gEthFired = TRUE;
}
#endif
/************************************************
* Setup and initialize the ethernet controller *
************************************************/
void setupEthernet(void)
{
//uint8_t mac[] = { 0x00, 0x01, 0x02, 0x0D, 0x74, 0x49 };
//uint8_t ip[] = { 192, 168, 1, 30 };
//uint8_t gateway[] = { 192, 168, 1, 1 };
//uint8_t subnet[] = { 255, 255, 255, 0 };
uint8_t mac[6];
uint8_t ip[4];
uint8_t gateway[4];
uint8_t subnet[4];
+ SOCKET s;
eepromReadMAC(mac);
eepromReadIP(ip);
eepromReadGW(gateway);
eepromReadSN(subnet);
if(!eepromNetSigIsSet())
{
eepromWriteIP(ip);
eepromWriteMAC(mac);
eepromWriteGW(gateway);
eepromWriteSN(subnet);
eepromWriteNetSig();
}
if(ethernet_init(mac, ip, gateway, subnet))
{
- if((gSock = socket_server_init(SOCK_PORT)))
+ for(s = 0; s<MAX_SOCK_NUM; s++)
{
- gSock -= 1;
+ socket_server_init(s, SOCK_PORT);
}
}
}
/*****************
* Main function *
*****************/
int main( void )
{
// Setup registers for input and output
setupIOPorts();
#ifdef USE_ETHERNET_INTERRUPT
setupExternalInterrupts();
#endif
if(spi_init())
setupEthernet();
#ifdef USE_ETHERNET_INTERRUPT
sei();
#endif
uint8_t new_connect[MAX_SOCK_NUM];
uint8_t connected[MAX_SOCK_NUM];
uint8_t i;
uint16_t len;
SOCKET sock;
unsigned char clientline[BUF_SIZE];
for(i=0; i < MAX_SOCK_NUM; i++)
{
new_connect[i] = TRUE;
connected[i] = FALSE;
}
for( ;; )
{
#ifndef USE_ETHERNET_INTERRUPT
for(i=0; i<MAX_SOCK_NUM; i++)
{
if(socket_server_socket_connected(i))
{
if((new_connect[i]) || (socket_server_data_available(i)))
{
gEthFired = TRUE;
sock = i;
break;
}
}
}
#endif
if(gEthFired)
{
gEthFired = FALSE;
#ifdef USE_ETHERNET_INTERRUPT
sock = socket_server_handle_interrupt();
#endif
connected[sock] = socket_server_socket_connected(sock);
if(connected[sock])
{
if(new_connect[sock])
{
socket_server_write(sock, (unsigned char*)"BlindControl ready\n", (uint16_t)19);
new_connect[sock] = FALSE;
}
}
else
{
if (!new_connect[sock])
new_connect[sock] = TRUE;
if(socket_server_socket_closed(sock))
{
- socket_server_close_socket(gSock);
- setupEthernet();
+ socket_server_close_socket(sock);
+ socket_server_init(sock, SOCK_PORT);
}
}
if(connected[sock] && (len = socket_server_data_available(sock)))
{
if(len >= BUF_SIZE)
len = BUF_SIZE-1;
socket_server_receive(sock, clientline, len);
clientline[len] = '\0';
- if(!handle_req((signed char*)clientline))
+ if(!handle_req(sock, (signed char*)clientline))
{
- socket_server_close_socket(gSock);
+ socket_server_close_socket(sock);
new_connect[sock] = TRUE;
- setupEthernet();
+ socket_server_init(sock, SOCK_PORT);
}
}
}
}
return 0;
}
void wdtReset(void)
{
wdt_disable();
wdt_enable(WDTO_2S);
}
-int handle_req(signed char *clientline)
+int handle_req(SOCKET sock, signed char *clientline)
{
int blindNum;
uint8_t buff[6];
char helpStr[] = "Available Commands: SelectBlind N, BlindUp[ N], BlindDown[ N], "
"BlindStop[ N], BlindIncr[ N], BlindDecr[ N], AllUp, AllDown, AllStop, SetIP, "
"GetIP, SetSN, SetMAC, SetGW, help, reset, reprogram, quit\n\n";
if(strncmp(clientline, "SelectBlind ", 12) == 0)
{
blindNum = atoi(&clientline[12]);
if((blindNum > 5) || (blindNum < 0))
{
- socket_server_write(gSock, (unsigned char *)"ERR\n", 4);
+ socket_server_write(sock, (unsigned char *)"ERR\n", 4);
}
else
{
selectBlindChannel(blindNum);
- socket_server_write(gSock, "OK\n", 3);
+ socket_server_write(sock, "OK\n", 3);
}
}
else if(strncmp(clientline, "BlindUp ", 8) == 0)
{
blindNum = atoi(&clientline[8]);
if((blindNum > 5) || (blindNum < 0))
{
- socket_server_write(gSock, (unsigned char *)"ERR\n", 4);
+ socket_server_write(sock, (unsigned char *)"ERR\n", 4);
}
else
{
blindUp(blindNum);
- socket_server_write(gSock, "OK\n", 3);
+ socket_server_write(sock, "OK\n", 3);
}
}
else if(strncmp(clientline, "BlindDown ", 10) == 0)
{
blindNum = atoi(&clientline[10]);
if((blindNum > 5) || (blindNum < 0))
{
- socket_server_write(gSock, (unsigned char *)"ERR\n", 4);
+ socket_server_write(sock, (unsigned char *)"ERR\n", 4);
}
else
{
blindDown(blindNum);
- socket_server_write(gSock, "OK\n", 3);
+ socket_server_write(sock, "OK\n", 3);
}
}
else if(strncmp(clientline, "BlindStop ", 10) == 0)
{
blindNum = atoi(&clientline[10]);
if((blindNum > 5) || (blindNum < 0))
{
- socket_server_write(gSock, (unsigned char *)"ERR\n", 4);
+ socket_server_write(sock, (unsigned char *)"ERR\n", 4);
}
else
{
blindStop(blindNum);
- socket_server_write(gSock, "OK\n", 3);
+ socket_server_write(sock, "OK\n", 3);
}
}
else if(strncmp(clientline, "BlindIncr ", 10) == 0)
{
blindNum = atoi(&clientline[10]);
if((blindNum > 5) || (blindNum < 0))
{
- socket_server_write(gSock, (unsigned char *)"ERR\n", 4);
+ socket_server_write(sock, (unsigned char *)"ERR\n", 4);
}
else
{
selectBlindChannel(blindNum);
sendCommand(CMD_UP);
_delay_ms(INCR_DELAY);
sendCommand(CMD_STOP);
- socket_server_write(gSock, "OK\n", 3);
+ socket_server_write(sock, "OK\n", 3);
}
}
else if(strncmp(clientline, "BlindDecr ", 10) == 0)
{
blindNum = atoi(&clientline[10]);
if((blindNum > 5) || (blindNum < 0))
{
- socket_server_write(gSock, (unsigned char *)"ERR\n", 4);
+ socket_server_write(sock, (unsigned char *)"ERR\n", 4);
}
else
{
selectBlindChannel(blindNum);
sendCommand(CMD_DOWN);
_delay_ms(INCR_DELAY);
- sendCommand(CMD_STOP); socket_server_write(gSock, "OK\n", 3);
+ sendCommand(CMD_STOP);
+ socket_server_write(sock, "OK\n", 3);
}
}
else if(strncmp(clientline, "BlindUp", 7) == 0)
{
sendCommand(CMD_UP);
- socket_server_write(gSock, "OK\n", 3);
+ socket_server_write(sock, "OK\n", 3);
}
else if(strncmp(clientline, "BlindDown", 9) == 0)
{
sendCommand(CMD_DOWN);
- socket_server_write(gSock, "OK\n", 3);
+ socket_server_write(sock, "OK\n", 3);
}
else if(strncmp(clientline, "BlindStop", 9) == 0)
{
sendCommand(CMD_STOP);
- socket_server_write(gSock, "OK\n", 3);
+ socket_server_write(sock, "OK\n", 3);
}
else if(strncmp(clientline, "BlindIncr", 9) == 0)
{
sendCommand(CMD_UP);
_delay_ms(INCR_DELAY);
sendCommand(CMD_STOP);
- socket_server_write(gSock, "OK\n", 3);
+ socket_server_write(sock, "OK\n", 3);
}
else if(strncmp(clientline, "BlindDecr", 9) == 0)
{
sendCommand(CMD_DOWN);
_delay_ms(INCR_DELAY);
sendCommand(CMD_STOP);
- socket_server_write(gSock, "OK\n", 3);
+ socket_server_write(sock, "OK\n", 3);
}
else if(strncmp(clientline, "AllUp", 5) == 0)
{
for(blindNum=1; blindNum<6; blindNum++)
{
blindUp(blindNum);
}
- socket_server_write(gSock, "OK\n", 3);
+ socket_server_write(sock, "OK\n", 3);
}
else if(strncmp(clientline, "AllDown", 7) == 0)
{
for(blindNum=1; blindNum<6; blindNum++)
{
blindDown(blindNum);
}
- socket_server_write(gSock, "OK\n", 3);
+ socket_server_write(sock, "OK\n", 3);
}
else if(strncmp(clientline, "AllStop", 7) == 0)
{
for(blindNum = 1; blindNum < 6; blindNum++)
{
blindStop(blindNum);
}
- socket_server_write(gSock, "OK\n", 3);
+ socket_server_write(sock, "OK\n", 3);
}
else if(strncmp(clientline, "reset", 5) == 0)
{
wdtReset();
- socket_server_write(gSock, "OK\n", 3);
+ socket_server_write(sock, "OK\n", 3);
return FALSE;
}
else if(strncmp(clientline, "reprogram", 9) == 0)
{
eepromWriteImgBad();
wdtReset();
- socket_server_write(gSock, "OK\n", 3);
+ socket_server_write(sock, "OK\n", 3);
return FALSE;
}
else if(strncmp(clientline, "SetIP", 5) == 0)
{
if(strlen(clientline) > 13)
{
parseAddr(clientline+6, buff, ".");
eepromWriteIP(buff);
if(!eepromNetSigIsSet())
eepromWriteNetSig();
- socket_server_write(gSock, "OK\n", 3);
+ socket_server_write(sock, "OK\n", 3);
}
else
{
- socket_server_write(gSock, "ERR\n", 4);
+ socket_server_write(sock, "ERR\n", 4);
}
}
else if(strncmp(clientline, "SetGW", 5) == 0)
{
if(strlen(clientline) > 13)
{
parseAddr(clientline+6, buff, ".");
eepromWriteGW(buff);
if(!eepromNetSigIsSet())
eepromWriteNetSig();
- socket_server_write(gSock, "OK\n", 3);
+ socket_server_write(sock, "OK\n", 3);
}
else
{
- socket_server_write(gSock, "ERR\n", 4);
+ socket_server_write(sock, "ERR\n", 4);
}
}
else if(strncmp(clientline, "SetSN", 5) == 0)
{
if(strlen(clientline) > 13)
{
parseAddr(clientline+6, buff, ".");
eepromWriteSN(buff);
if(!eepromNetSigIsSet())
eepromWriteNetSig();
- socket_server_write(gSock, "OK\n", 3);
+ socket_server_write(sock, "OK\n", 3);
}
else
{
- socket_server_write(gSock, "ERR\n", 4);
+ socket_server_write(sock, "ERR\n", 4);
}
}
else if(strncmp(clientline, "SetMAC", 6) == 0)
{
if(strlen(clientline) > 13) // FIXME: Must be bigger!
{
parseAddr(clientline+7, buff, ":");
eepromWriteMAC(buff);
if(!eepromNetSigIsSet())
eepromWriteNetSig();
- socket_server_write(gSock, "OK\n", 3);
+ socket_server_write(sock, "OK\n", 3);
}
else
{
- socket_server_write(gSock, "ERR\n", 4);
+ socket_server_write(sock, "ERR\n", 4);
}
}
else if(strncmp(clientline, "GetIP", 5) == 0)
{
uint8_t buff2[10];
eepromReadIP(buff);
for(int i=0; i<4; i++)
{
itoa(buff[i], buff2, 10);
- socket_server_write(gSock, buff2, strlen(buff2));
+ socket_server_write(sock, buff2, strlen(buff2));
if(i<3)
- socket_server_write(gSock, ".", 1);
+ socket_server_write(sock, ".", 1);
else
- socket_server_write(gSock, "\n", 1);
+ socket_server_write(sock, "\n", 1);
}
- socket_server_write(gSock, "OK\n", 3);
+ socket_server_write(sock, "OK\n", 3);
}
else if(strncmp(clientline, "help", 4) == 0)
{
- socket_server_write(gSock, helpStr, strlen(helpStr));
+ socket_server_write(sock, helpStr, strlen(helpStr));
}
else if(strncmp(clientline, "quit", 4) == 0)
{
return FALSE;
}
else
{
- socket_server_write(gSock, "ERR\n", 4);
+ socket_server_write(sock, "ERR\n", 4);
}
return TRUE;
}
int getCurrentBlindChannel(void)
{
int currentChannel = 0;
int readValues;
readValues = readFromADC();
if(readValues == 0)
{
sendCommand(CMD_SELECT);
readValues = readFromADC();
}
switch(readValues)
{
case 1:
currentChannel = 1;
break;
case 2:
currentChannel = 2;
break;
case 4:
currentChannel = 3;
break;
case 8:
currentChannel = 4;
break;
case 15:
currentChannel = 5;
break;
default:
currentChannel = 0;
}
return currentChannel;
}
int readFromADC(void)
{
int j;
int channel = 0;
for(j=0;j<200;j++)
{
if(!IS_SET(AI_PIN0))
channel |= 0x01;
if(!IS_SET(AI_PIN1))
channel |= 0x02;
if(!IS_SET(AI_PIN2))
channel |= 0x04;
if(!IS_SET(AI_PIN3))
channel |= 0x08;
}
return channel;
}
int selectBlindChannel(int telisChannel)
{
while(getCurrentBlindChannel() != telisChannel)
sendCommand(CMD_SELECT);
return TRUE;
}
int blindUp(int telisChannel)
{
selectBlindChannel(telisChannel);
sendCommand(CMD_UP);
return TRUE;
}
int blindDown(int telisChannel)
{
selectBlindChannel(telisChannel);
sendCommand(CMD_DOWN);
return TRUE;
}
int blindStop(int telisChannel)
{
selectBlindChannel(telisChannel);
sendCommand(CMD_STOP);
return TRUE;
}
int sendCommand(int digitalChannel)
{
switch(digitalChannel)
{
case CMD_STOP:
SET(DO_PIN_STOP);
_delay_ms(TOGGLE_DELAY);
RESET(DO_PIN_STOP);
break;
case CMD_SELECT:
SET(DO_PIN_SELECT);
_delay_ms(TOGGLE_DELAY);
RESET(DO_PIN_SELECT);
break;
case CMD_UP:
SET(DO_PIN_UP);
_delay_ms(TOGGLE_DELAY);
RESET(DO_PIN_UP);
break;
case CMD_DOWN:
SET(DO_PIN_DOWN);
_delay_ms(TOGGLE_DELAY);
RESET(DO_PIN_DOWN);
break;
}
_delay_ms(TOGGLE_DELAY);
return TRUE;
}
/****************************************
* Setup all required I/O Ports for use *
****************************************/
uint8_t setupIOPorts( void )
{
SET_INPUT(AI_PIN0);
SET_INPUT(AI_PIN1);
SET_INPUT(AI_PIN2);
SET_INPUT(AI_PIN3);
RESET(DO_PIN_STOP);
RESET(DO_PIN_SELECT);
RESET(DO_PIN_UP);
RESET(DO_PIN_DOWN);
SET_OUTPUT(DO_PIN_STOP);
SET_OUTPUT(DO_PIN_SELECT);
SET_OUTPUT(DO_PIN_UP);
SET_OUTPUT(DO_PIN_DOWN);
return TRUE;
}
void parseAddr(signed char *str, uint8_t *ip, char *delim)
{
int i = 0;
char* buff = (char*)malloc(10);
buff = strtok(str, delim);
while (buff != NULL)
{
ip[i] = (uint8_t)atoi(buff);
buff = strtok(NULL, delim);
i++;
}
free(buff);
}
//EOF
diff --git a/main.h b/main.h
--- a/main.h
+++ b/main.h
@@ -1,46 +1,48 @@
#ifndef MAIN_H
#define MAIN_H
+#include "w5100.h"
+
#define TRUE 1
#define FALSE 0
#ifdef USE_MEGA2560 // Arduino Mega2560 defines
#define P_MOSI B,2
#define P_MISO B,3
#define P_SCK B,1
#define P_SS B,0
#define W5100_CS B,4
#define W5100_INT D,2
#else // Arduino Ethernet defines
#define P_MOSI B,3 //B,2
#define P_MISO B,4 //B,3
#define P_SCK B,5 //B,1
#define P_SS B,2 //B,0
#define W5100_CS B,2 //B,4
#define W5100_INT E,4 // D,2
#endif
#define BUF_SIZE 255
#define SOCK_PORT 63543
int readADC(int digitalChannel);
int getCurrentBlindChannel(void);
int selectBlindChannel(int telisChannel);
int blindUp(int telisChannel);
int blindDown(int telisChannel);
int blindStop(int telisChannel);
int sendCommand(int digitalChannel);
int readFromADC(void);
void wdtReset(void);
void parseAddr(signed char *str, uint8_t *ip, char *delim);
int main(void);
#ifdef USE_ETHERNET_INTERRUPT
void setupExternalInterrupts(void);
#endif
-int handle_req(signed char* clientline);
+int handle_req(SOCKET sock, signed char* clientline);
uint8_t setupIOPorts(void);
#endif
diff --git a/vera/D_DiySomfy1.xml b/vera/D_DiySomfy1.xml
new file mode 100644
--- /dev/null
+++ b/vera/D_DiySomfy1.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0"?>
+<root xmlns="urn:schemas-upnp-org:device-1-0">
+ <specVersion>
+ <major>1</major>
+ <minor>0</minor>
+ </specVersion>
+ <device>
+ <deviceType>urn:diy-somfy:device:blinds:1</deviceType>
+ <friendlyName>DiY Somfy Interface</friendlyName>
+ <manufacturer>Somfy</manufacturer>
+ <manufacturerURL>somfy.com</manufacturerURL>
+ <modelName>DiY Ethernet</modelName>
+ <protocol>raw</protocol>
+ <handleChildren>1</handleChildren>
+ <serviceList></serviceList>
+ <implementationList>
+ <implementationFile>I_DiySomfy1.xml</implementationFile>
+ </implementationList>
+ </device>
+</root>
diff --git a/vera/I_DiySomfy1.xml b/vera/I_DiySomfy1.xml
new file mode 100644
--- /dev/null
+++ b/vera/I_DiySomfy1.xml
@@ -0,0 +1,78 @@
+<?xml version="1.0"?>
+<implementation>
+ <functions>
+ function lug_startup (lul_device)
+ local TELNET_PORT = 63543
+ ipAddress = luup.devices[lul_device].ip
+ local blindIds = luup.variable_get( "urn:micasaverde-com:serviceId:DiySomfy1", "BlindIds", lul_device) or ""
+ if (blindIds == "") then
+ blindIds = "1,2"
+ luup.variable_set( "urn:micasaverde-com:serviceId:DiySomfy1", "BlindIds", blindIds, lul_device)
+ end
+
+ if (ipAddress == "") then
+ luup.log("No ip address for Somfy", 1)
+ return false, "Set up the IP address for Somfy", "Somfy DiY Blind Interface"
+ end
+ luup.log( "Somfy channels are '" .. blindIds)
+ luup.io.open(lul_device, ipAddress, TELNET_PORT)
+
+ local childDevices = luup.chdev.start(lul_device)
+ for blindNo in blindIds:gmatch("%d") do
+ luup.log( "Adding blind #" .. blindNo ..".")
+ luup.chdev.append( lul_device, childDevices, blindNo, "Blind #"..blindNo, "urn:schemas-micasaverde-com:device:WindowCovering:1", "D_WindowCovering1.xml", "", "", false)
+ end
+
+ luup.chdev.sync(lul_device, childDevices)
+ end
+ </functions>
+ <startup>lug_startup</startup>
+ <incoming>
+ <lua>
+ local response = tostring(lul_data)
+
+ luup.log("Response:" .. response)
+ </lua>
+ </incoming>
+ <actionList>
+ <action>
+ <serviceId>urn:upnp-org:serviceId:WindowCovering1</serviceId>
+ <name>Up</name>
+ <run>
+ local lul_command = "BlindUp " .. luup.devices[lul_device].id .. "\r"
+
+ if (luup.io.write(lul_command) == false) then
+ luup.log( "Cannot send '" .. tostring(lul_command) .. "'.", 1)
+ luup.set_failure(true)
+ return false
+ end
+ </run>
+ </action>
+ <action>
+ <serviceId>urn:upnp-org:serviceId:WindowCovering1</serviceId>
+ <name>Down</name>
+ <run>
+ local lul_command = "BlindDown " .. luup.devices[lul_device].id .. "\r"
+
+ if (luup.io.write(lul_command) == false) then
+ luup.log( "Cannot send '" .. tostring(lul_command) .. "'.", 1)
+ luup.set_failure(true)
+ return false
+ end
+ </run>
+ </action>
+ <action>
+ <serviceId>urn:upnp-org:serviceId:WindowCovering1</serviceId>
+ <name>Stop</name>
+ <run>
+ local lul_command = "BlindStop " .. luup.devices[lul_device].id .. "\r"
+
+ if (luup.io.write(lul_command) == false) then
+ luup.log( "Cannot send '" .. tostring(lul_command) .. "'.", 1)
+ luup.set_failure(true)
+ return false
+ end
+ </run>
+ </action>
+ </actionList>
+</implementation>

File Metadata

Mime Type
text/x-diff
Expires
Sun, Dec 22, 9:53 PM (2 d, 10 h ago)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
532463
Default Alt Text
(33 KB)

Event Timeline