root / trunk / code / projects / i2c_charge_station / i2c_auto.c @ 1452
History | View | Annotate | Download (3.66 KB)
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 |
|