Commit mthomas changes to GCC and port those changes to IAR
[avr_bc100.git] / BaseMegaFirmware / GCC / bc100_slave.c
1 // Martin Thomas 3/2008\r
2 \r
3 #include <stdint.h>\r
4 #include <stdlib.h>\r
5 #include <avr/io.h>\r
6 \r
7 #include "../../BaseTinyFirmware/GCC/enums.h"\r
8 #include "../../BaseTinyFirmware/GCC/structs.h"\r
9 \r
10 #include "spi.h"\r
11 #include "bc100_slave.h"\r
12 \r
13 #ifdef BC100_SLAVE_TEST\r
14 #include "mystdio.h"\r
15 #endif\r
16 \r
17 #define dummy 0x00\r
18 \r
19 void bc100_slave_init( void )\r
20 {\r
21 }\r
22 \r
23 uint8_t bc100_slave_read( uint8_t cmd, size_t size, void *buf )\r
24 {\r
25         uint8_t err = 0;\r
26 \r
27         return err;\r
28 }\r
29 \r
30 #ifdef BC100_SLAVE_TEST\r
31 \r
32 uint8_t bc100_slave_test(void)\r
33 {\r
34         uint8_t err = 0;\r
35         uint8_t in, out, i;\r
36         uint32_t timevals[TIMERS];\r
37 \r
38         SPI_init();\r
39 \r
40         SPI_rw( dummy );\r
41         myprintf_P("Timers:\n");\r
42         out = BC100_SLAVE_READ | BC100_SLAVE_SRAM | sizeof(timevals);\r
43         SPI_rw( out );\r
44         out = ADR_TIMERS;\r
45         in = SPI_rw( out );\r
46         myprintf_P("In1 : 0x%02x (expected 0xcc)\n", in );\r
47         in = SPI_rw( dummy );\r
48         myprintf_P("In2 : 0x%02x (expected 0xbb)\n", in );\r
49 #if 0\r
50         uint8_t tmp\r
51         for ( i = TIMERS; i > 0; i-- ) {\r
52                 tmp  = (uint32_t)(SPI_rw(dummy)) << 24;\r
53                 tmp |= (uint32_t)(SPI_rw(dummy)) << 16;\r
54                 tmp |= (uint32_t)(SPI_rw(dummy)) <<  8;\r
55                 tmp |= (uint32_t)(SPI_rw(dummy)) <<  0;\r
56                 timevals[i-1] = tmp;\r
57         }\r
58 #else\r
59         i = sizeof(timevals);\r
60         while ( i-- > 0 ) {\r
61                 *( (unsigned char*)&timevals + i ) = SPI_rw(dummy);\r
62         }\r
63 #endif\r
64         for ( i=0; i<TIMERS; i++ ) {\r
65                 myprintf_P("Timer #%d = %lu (0x%08lx)\n", i, timevals[i], timevals[i] );\r
66         }\r
67 \r
68 \r
69         ADC_Status_t ADCS;\r
70         myprintf_P("ADC-Status:\n");\r
71         out = BC100_SLAVE_READ | BC100_SLAVE_SRAM | sizeof(ADCS);\r
72         SPI_rw( out );\r
73         out = ADR_ADCS;\r
74         in = SPI_rw( out );\r
75         myprintf_P("In1 : 0x%02x (expected 0xcc)\n", in );\r
76         in = SPI_rw( dummy );\r
77         myprintf_P("In2 : 0x%02x (expected 0xbb)\n", in );\r
78         i = sizeof(ADCS);\r
79         while ( i-- > 0 ) {\r
80                 *( (unsigned char*)&ADCS + i ) = SPI_rw(dummy);\r
81         }\r
82         myprintf_P("ADC-MUX        %d\n", ADCS.MUX );\r
83         myprintf_P("Cycle complete %d\n", ADCS.Flag);\r
84         myprintf_P("Mains OK       %d\n", ADCS.Mains);\r
85         myprintf_P("A/D halt       %d\n", ADCS.Halt);\r
86         myprintf_P("Offs ADC3 g20  %d\n", ADCS.ADC3_G20_OS);\r
87         myprintf_P("Offs ADC5 g20  %d\n", ADCS.ADC5_G20_OS);\r
88         myprintf_P("rawRID         %d\n", ADCS.rawRID);\r
89         myprintf_P("rawNTC         %d\n", ADCS.rawNTC);\r
90         myprintf_P("rawVBAT        %d\n", ADCS.rawVBAT);\r
91         myprintf_P("Supply         %d [mV]\n", ADCS.VIN);\r
92         myprintf_P("Batt. Voltage  %d [mV]\n", ADCS.VBAT);\r
93         myprintf_P("Batt. Current  %d [mA]\n", ADCS.IBAT);\r
94         for ( i=0; i<4; i++ ) {\r
95                 myprintf_P("DiscIBAT[%d]    %d [mA]\n", i, ADCS.discIBAT[i] );\r
96         }\r
97         myprintf_P("average IBAT   %d [mA]\n", ADCS.avgIBAT);\r
98 \r
99         Batteries_t BattData;\r
100         myprintf_P("Current Battery:\n");\r
101         out = BC100_SLAVE_READ | BC100_SLAVE_SRAM | sizeof(BattData);\r
102         SPI_rw( out );\r
103         out = ADR_BATTDATA;\r
104         in = SPI_rw( out );\r
105         myprintf_P("In1 : 0x%02x (expected 0xcc)\n", in );\r
106         in = SPI_rw( dummy );\r
107         myprintf_P("In2 : 0x%02x (expected 0xbb)\n", in );\r
108         i = sizeof(BattData);\r
109         while ( i-- > 0 ) {\r
110                 *( (unsigned char*)&BattData + i ) = SPI_rw(dummy);\r
111         }\r
112         if ( BattData.Present ) {\r
113                 myprintf_P("Battery found\n");\r
114                 if ( BattData.Charged ) {\r
115                         myprintf_P("- fully charged\n");\r
116                 }\r
117                 if ( BattData.Low ) {\r
118                         myprintf_P("- low voltage\n");\r
119                 }\r
120                 if ( BattData.Exhausted) {\r
121                         myprintf_P("- exhausted\n");\r
122                 }\r
123                 if ( BattData.HasRID) {\r
124                         myprintf_P("- has a ID-Resistor\n");\r
125                 }\r
126                 myprintf_P("Safety circuit ID    %d\n", BattData.Circuit );\r
127                 myprintf_P("Tempearture          %d centi-degree C\n", BattData.Temperature );\r
128                 myprintf_P("ADCSteps/half degree %d\n", BattData.ADCSteps);\r
129                 myprintf_P("Capacity             %d mAh\n", BattData.Capacity);\r
130                 myprintf_P("max. Current         %d mA\n", BattData.MaxCurrent);\r
131                 myprintf_P("max. cut-off Time    %d min\n", BattData.MaxTime);\r
132                 myprintf_P("min. cut-off Current %d mA\n", BattData.MinCurrent);\r
133         }\r
134         else {\r
135                 myprintf_P("Battery not found\n");\r
136         }\r
137 \r
138         SPI_release();\r
139 \r
140         return err;\r
141 }\r
142 \r
143 #endif /* BC100_SLAVE_TEST */\r
144 \r