Newer
Older
#include "vanne.h"
/*[[[cog
import conf
import avrxmegastuff as ams
]]]*/
//[[[end]]]
/*[[[cog
cog.out(
ams.ev(
prefix="vanne",
**conf.VANNE,
header=False,
)
)
]]]*/
volatile ev_state_t vanne_internal_status;
void vanne_init()
{
VANNE_CMD_PORT.DIRSET = VANNE_CMD_OPEN_bm | VANNE_CMD_CLOSE_bm;
VANNE_CMD_PORT.OUTCLR = VANNE_CMD_OPEN_bm | VANNE_CMD_CLOSE_bm;
VANNE_SENSOR_PORT.DIRCLR = VANNE_SENSOR_OPEN_bm | VANNE_SENSOR_CLOSE_bm;
VANNE_SENSOR_OPEN_PINCTRL = PORT_OPC_PULLUP_gc;
VANNE_SENSOR_CLOSE_PINCTRL = PORT_OPC_PULLUP_gc;
vanne_internal_status = EV_MID;
}
uint8_t vanne_internal_step_close(uint16_t d, uint8_t force)
if(!force)
if(vanne_internal_status == EV_CLOSED)
return 1;
if(d<VANNE_ACTION_LIMIT)
return 0;
if(vanne_internal_status == EV_OPENED)
d = 500;
vanne_internal_status = EV_MID;
vanne_callback_close();
uint16_t k;
VANNE_CMD_PORT.OUTSET = VANNE_CMD_CLOSE_bm;
for(k=0;k<d;k++)
_delay_ms(1);
if(!force)
if(!(VANNE_SENSOR_PORT.IN & VANNE_SENSOR_CLOSE_bm))
vanne_internal_status = EV_CLOSED;
VANNE_CMD_PORT.OUTCLR = VANNE_CMD_CLOSE_bm;
if(vanne_internal_status == EV_CLOSED)
return 1;
return 0;
}
uint8_t vanne_internal_step_open(uint16_t d, uint8_t force)
if(!force)
if(vanne_internal_status == EV_OPENED)
return 1;
if(d<VANNE_ACTION_LIMIT)
return 0;
if(vanne_internal_status == EV_CLOSED)
d = 500;
vanne_internal_status = EV_MID;
vanne_callback_open();
uint16_t k;
VANNE_CMD_PORT.OUTSET = VANNE_CMD_OPEN_bm;
for(k=0;k<d;k++)
_delay_ms(1);
if(!force)
if(!(VANNE_SENSOR_PORT.IN & VANNE_SENSOR_OPEN_bm))
vanne_internal_status = EV_OPENED;
VANNE_CMD_PORT.OUTCLR = VANNE_CMD_OPEN_bm;
if(vanne_internal_status == EV_OPENED)
return 1;
return 0;
}
uint8_t vanne_step_close(uint16_t d, uint8_t force)
{
uint16_t steps = d/(d/101+1);
uint16_t k;
uint8_t ret;
for(k=0;k<d;k+=steps)
{
if(k+steps<=d)
ret = vanne_internal_step_close(steps, force);
ret = vanne_internal_step_close(d-k, force);
uint8_t vanne_step_open(uint16_t d, uint8_t force)
{
uint16_t steps = d/(d/101+1);
uint16_t k;
uint8_t ret;
for(k=0;k<d;k+=steps)
{
if(k+steps<=d)
ret = vanne_internal_step_open(steps, force);
ret = vanne_internal_step_open(d-k, force);
if(ret)
return ret;
}
return ret;
}
void vanne_close()
{
uint16_t k;
for(k=0;k<1000;k++)
if(vanne_internal_step_close(10,0))
break;
vanne_internal_status = EV_CLOSED;
}
void vanne_force_close()
{
uint16_t k;
for(k=0;k<1000;k++)
if(vanne_internal_step_close(10,1))
}
void vanne_open()
{
uint16_t k;
for(k=0;k<1000;k++)
uint8_t kmin;
if(kopen<900)
kmin = kopen/2;
else
{
if(kclose<900)
kmin = kclose/2;
else
kmin = 50;
}