Project

General

Profile

Revision 666

Added by Kevin Woo almost 15 years ago

Added charging station's i2c_auto code in so that we can do plug and
play i2c. Filled in the function prototypes and commented what each
funtion should do.

View differences:

trunk/code/projects/i2c_charge_station/i2c_auto.c
1
/**
2
 * This is the API for i2c_autodetect used on the 
3
 * charging station. This block explains the high
4
 * level implementation. The functions below explain
5
 * the low level.
6
 * 
7
 ***** High Level *****
8
 * Since the charge stations are hooked up
9
 * via i2c lines, we must determine one master. We
10
 * decide that the one with the XBee is the master.
11
 * There should only be one Xbee in an i2c chain, though
12
 * in the case that there are two, the second one to detect
13
 * that they have an XBee must yeild the the older one.
14
 * All others are slaves. At startup, we check if we have an
15
 * XBee. If so, we poll for master, if there is none we declare
16
 * ourselves master. If you do not have an XBee, poll the line
17
 * asking for a master. If there is none, wait for a while and
18
 * then try again until the master assigns you an ID.
19
 * Once you have an ID, wait until the Master sends you commands.
20
 * Periodically check if you have an XBee, just in case.
21
 * The master must hand out IDs to the slaves. These IDs are
22
 * kept in a table that indicates the status of the station.
23
 * Occassionally poll the slaves to make sure they are not there and
24
 * update the table as needed. If a packet comes in over XBee,
25
 * forward to the correct charging station.
26
 * In the event that the master loses the XBee, broadcast a message
27
 * indicating that. Then poll for a new master. When one comes on,
28
 * pass it the table.
29
 **/
30
 
31
 /**
32
  * Sets up the needed states for i2c_autodetect
33
  */
34
 void i2c_startup (void) {
35
 
36
 }
37
 
38
 /**
39
  * Checks if an XBee is present.
40
  *
41
  * @return 0 if false, 1 if true
42
  */
43
 char i2c_has_xbee(void) {
44
 
45
 }
46
 
47
 /**
48
  * Acting as a temporary master, poll the master for an ID. If there
49
  * is a master, he should respond with an ID in which case you should
50
  * add that as your ID. Otherwise leave your ID blank.
51
  *
52
  * @return your ID, otherwise 0x00
53
  */
54
char i2c_request_id(void) {
55
    
56
}
57

  
58
/**
59
 * This should be called on the reception of an ID request. Since this
60
 * will be called during an interrupt, make it as fast as possible.
61
 * Check for the next available ID in the allocation table ans assign it.
62
 * Send the ID back on the bus.
63
 **/
64
void i2c_allocate_id(void) {
65
    
66
}
67

  
68
/**
69
 * This is your handler function to be called by the i2c interrupt. You
70
 * should get only 1 byte at a time and it will not be buffered. Handle it
71
 * fast. You should analyze if the packet is a ID request, a poll, a transfer
72
 * ID table, or data and then call the correct function. Basically this is a
73
 * giant switch.
74
 *
75
 * @param data Data byte received from master
76
 */
77
void i2c_receive_data(char data) {
78

  
79
}
80

  
81
/**
82
 * Called if a poll request has been received. Since this is in an interrupt make it
83
 * fast. Queues up a poll response message to the master.
84
 */
85
void i2c_poll_respond(void) {
86

  
87
}
88

  
89
/**
90
 * This should be done periodically. The allocation table should have a time since
91
 * last poll field which counts down along with a poll send bit. 
92
 * If time reaches 0 after a  poll remove it. This function, when
93
 * called with a NULL should run through the table and send out request to all 
94
 * those who are not currently being polled and check if those who have polls
95
 * have reached 0 and remove them. If called with an ID, set the poll status
96
 * bit for that ID to 0.
97
 * 
98
 * @param ID ID of the slave who has responded. If NULL poll all those not being polled
99
 */
100
void i2c_poll_slaves_send(char ID) {
101

  
102
}
103

  
104
/**
105
 * Call this if you have lost the XBee and a new master has arrived. You should 
106
 * transfer the entire table over to the new master.
107
 */
108
void i2c_transfer_table(void) {
109

  
110
}
111

  
112
/**
113
 * Call this if you receive a transfer table request. You should accept it and 
114
 * merge it into your table.
115
 */
116
 void i2c_receive_table(void) {
117
 
118
 }
119

  
120

  

Also available in: Unified diff