Subversion Repositories HomeAutomation

Rev

Go to most recent revision | Details | Last modification | View Log | SVN | RSS feed

Rev Author Line No. Line
179 eqlazer 1
/**
335 eqlazer 2
 * CanCLCD.
179 eqlazer 3
 * For HD44780- and KS0073-based LCD displays
335 eqlazer 4
 * Prints sensor data and other interesting things.
179 eqlazer 5
 *
6
 * @date    2006-12-11
7
 * @author  Erik Larsson
8
 *
9
 * TODO Fix more types of output: relay status, mail recieved etc.
10
 *
11
 */
12
 
13
/*-----------------------------------------------------------------------------
14
 * Includes
15
 *---------------------------------------------------------------------------*/
16
/* system files */
17
#include <avr/io.h>
18
#include <avr/interrupt.h>
19
#include <stdio.h>
20
/* lib files */
332 eqlazer 21
#include <bios.h>
179 eqlazer 22
#include <lcd_HD44780.h>
196 eqlazer 23
#include <clcd20x4.h>
24
/* funcdefs */
332 eqlazer 25
//#include <global_funcdefs.h>
196 eqlazer 26
#include <eqlazer_funcdefs.h>
179 eqlazer 27
 
28
/* defines */
196 eqlazer 29
#define BUFFER_SIZE 20
332 eqlazer 30
#define TRUE 1
31
#define FALSE 0
179 eqlazer 32
 
332 eqlazer 33
Can_Message_t rxMsg;
256 eqlazer 34
 
335 eqlazer 35
uint8_t currentView = MAIN_VIEW,
36
		msg_received = FALSE;
37
 
38
uint8_t temperatureData[8],
39
		servoPosition[4],
40
		//relayStatus[4],
41
		//dimmerStatus[4],
42
		temperatureLength = 8,
43
		servoLength = 0;
44
		//, relayLength=0; //TODO mer generaliserat
45
 
46
uint8_t rot_lastdir = 0,
47
		rot_laststate = 0;
48
 
332 eqlazer 49
ISR( PCINT2_vect ){
335 eqlazer 50
	uint8_t rot_data = 0;
256 eqlazer 51
 
335 eqlazer 52
	if(PIND&(1<<PD6)){
53
		rot_data |= 0x01;
54
	}
55
	if(PIND&(1<<PD7)){
56
		rot_data |= 0x02;
57
	}
58
 
59
	if( rot_data==3 && rot_laststate!=3 ){
60
		if( rot_lastdir&0x01 ){
61
			// Moving left
62
			if(currentView>0){
63
				currentView--;
64
				msg_received = TRUE;
65
			}
66
		}else{
67
			// Moving right
68
			if(currentView<LAST_VIEW){
69
				currentView++;
70
				msg_received = TRUE;
71
			}
72
		}
73
		rot_laststate=3;
74
	}else if( rot_data==0 && rot_laststate!=0 ){
75
		rot_laststate = 0;
76
	}else if( rot_data==1 || rot_data==2 ){
77
		rot_lastdir = rot_data;
78
	}
332 eqlazer 79
}
179 eqlazer 80
 
332 eqlazer 81
void can_receive(Can_Message_t *msg){
334 eqlazer 82
	uint8_t temp, m;
332 eqlazer 83
	/* Check for incoming messages from IR-receiver node */
84
	if( CLASS_SNS == ((msg->Id & CLASS_MASK) >> CLASS_MASK_BITS) ){
85
		/* FIXME detta är väldigt fult och borde fixas
86
		 * knapp 4 på fjärren bläddrar åt vänster
87
		 * knapp 6 åt höger
88
		 */
89
		if( SNS_IR_RECEIVE == (msg->Id & TYPE_MASK)>>TYPE_MASK_BITS){
90
			if(msg->Data.bytes[0] == 0 && msg->Data.bytes[1] == 0 && msg->Data.bytes[2] == 0){
91
				if(msg->Data.bytes[3] == 4 && currentView>0){
92
					currentView--;
93
					msg_received = TRUE;
94
				}else if(msg->Data.bytes[3] == 6 && currentView<LAST_VIEW){
95
					currentView++;
96
					msg_received = TRUE;
97
				}
98
			}
99
		}
100
		/* Other sensor messages should be placed here */
179 eqlazer 101
 
332 eqlazer 102
		/* DS18S20 sensors */
103
		if( SNS_TEMP_DS18S20 == (msg->Id & SNS_TYPE_MASK)>>SNS_TYPE_BITS ){
104
			temp = (msg->Id & SNS_ID_MASK)>>SNS_ID_BITS;
334 eqlazer 105
			temperatureData[ (temp-1)*2 ] = msg->Data.bytes[0];
106
			temperatureData[ (temp-1)*2+1 ] = msg->Data.bytes[1];
332 eqlazer 107
		}
334 eqlazer 108
 
109
		/* Servo controllers */
110
		if( SNS_ACT_STATUS_SERVO == (msg->Id & TYPE_MASK)>>TYPE_MASK_BITS ){ // TODO annan struktur på statusmeddelanden från servo
111
			temp = msg->DataLength - 3;
112
			for(m=0;m<temp;m++){
113
				servoPosition[ m ] = msg->Data.bytes[m+3];
114
			}
115
			servoLength = temp;
116
		}
117
 
332 eqlazer 118
	}
119
}
120
 
121
 
179 eqlazer 122
/*-----------------------------------------------------------------------------
123
 * Main Program
124
 *---------------------------------------------------------------------------*/
125
int main(void) {
126
 
127
    char buffer[ BUFFER_SIZE ];
335 eqlazer 128
	/*
129
	 * Initialize rotaryencoders and buttons
130
	 */
131
	/* Set as input */
132
	DDRD &= ~( (1<<DDD6)|(1<<DDD7) );
133
	/* Enable IO-pin interrupt */
134
	PCICR |= (1<<PCIE2);
135
	/* Unmask PD6 and PD7 */
136
	PCMSK2 |= (1<<PCINT22)|(1<<PCINT23);
179 eqlazer 137
 
335 eqlazer 138
	sei();
332 eqlazer 139
	bios->can_callback = &can_receive;
256 eqlazer 140
 
332 eqlazer 141
	lcd_init( LCD_DISP_ON );
142
	lcd_clrscr();
179 eqlazer 143
 
144
    lcd_clrscr();
256 eqlazer 145
    printLCDview( MAIN_VIEW );
179 eqlazer 146
 
147
    /* main loop */
332 eqlazer 148
	while(1){
149
        /* check if any messages have been received */
150
		if(msg_received){
256 eqlazer 151
                /* Print views skeleton and if existing its data */
334 eqlazer 152
			printLCDview( currentView );
153
			if(currentView == TEMPSENS_VIEW){
154
				printLCDviewData( TEMPSENS_VIEW, temperatureData, temperatureLength);
155
			}else if(currentView == SERVO_VIEW){
156
				printLCDviewData( SERVO_VIEW, servoPosition, servoLength);
157
			}
158
			msg_received = FALSE;
159
		}
332 eqlazer 160
	}
179 eqlazer 161
}