1 | //get and reset the timer ovf bits
|
2 | if (decoder.dcc.state.systemBits.timer_status) decoder.dcc.state.systemBits.timer_status = FALSE;
|
3 |
|
4 | //dcc is now high
|
5 | if (DCC_IS_HIGH && !decoder.dcc.state.systemBits.cnt_starts)
|
6 | {
|
7 | TCNT0 = NULL;
|
8 | decoder.dcc.state.systemBits.cnt_starts = TRUE;
|
9 | }
|
10 | else if (!DCC_IS_HIGH && decoder.dcc.state.systemBits.cnt_starts)
|
11 | {
|
12 | if (decoder.dcc.dcc_stretched_0) decoder.dcc.dcc_cnted_time = 0xFF;
|
13 | else decoder.dcc.dcc_cnted_time = TCNT0;
|
14 |
|
15 | decoder.dcc.dcc_stretched_0 = FALSE;
|
16 | decoder.dcc.state.systemBits.cnt_starts = FALSE;
|
17 | decoder.dcc.state.systemBits.timer_status = TRUE;
|
18 | }
|
19 | else if (decoder.dcc.state.systemBits.cnt_starts && TCNT0 >= 220) //detect streched 0
|
20 | {
|
21 | decoder.dcc.dcc_stretched_0 = TRUE;
|
22 | }
|
23 |
|
24 | if (decoder.dcc.sysCond.systemBits.init_time_over && !decoder.timer.timer_univ[start_switching_timer])
|
25 | {
|
26 | decoder.signalstate = signalstate_stop;
|
27 | decoder.signalstate_last = signalstate_stop;
|
28 | decoder.dcc.sysCond.systemBits.init_time_over = FALSE;
|
29 | }
|
30 |
|
31 |
|
32 | //noch kein ganzes packet bekommen?
|
33 | if (decoder.dcc.state.systemBits.timer_status && !decoder.dcc.state.systemBits.received_all_valid)
|
34 | {
|
35 | if (!decoder.dcc.state.systemBits.start_detected) //find beginning!
|
36 | {
|
37 | //cnt all 1 bits up to get a 0 and cnter >= 10 ==> Start!
|
38 | if (decoder.dcc.dcc_cnted_time <= decoder.dcc.dcc_time_logic_one) decoder.dcc.cnt_bit_pos++;
|
39 | else //0 is detected
|
40 | {
|
41 | //start is detected!! //more than 9 1's bits? ==> must be the start!
|
42 | if (decoder.dcc.cnt_bit_pos > 9)
|
43 | {
|
44 | decoder.dcc.cnt_byte_pos = NULL;
|
45 | decoder.dcc.state.systemBits.start_detected = TRUE;
|
46 | decoder.dcc.state.systemBits.get_data_byte = TRUE;
|
47 |
|
48 | for (uint8_t i = NULL; i < 15; i++) decoder.dcc.RX[i] = NULL;
|
49 | }
|
50 |
|
51 | decoder.dcc.cnt_bit_pos = NULL;
|
52 | }
|
53 | }
|
54 | else if (decoder.dcc.state.systemBits.get_data_byte) //byte transfer
|
55 | {
|
56 | if (decoder.dcc.dcc_cnted_time <= decoder.dcc.dcc_time_logic_one) decoder.dcc.RX[decoder.dcc.cnt_byte_pos] |= (1<<(7 - decoder.dcc.cnt_bit_pos));
|
57 |
|
58 | decoder.dcc.cnt_bit_pos++;
|
59 |
|
60 |
|
61 | //complete byte detected, now check the divisionbit
|
62 | if (decoder.dcc.cnt_bit_pos > 7)
|
63 | {
|
64 | decoder.dcc.cnt_bit_pos = NULL;
|
65 | decoder.dcc.state.systemBits.get_data_byte = FALSE;
|
66 | }
|
67 | }
|
68 | else //get the division bit, 0 = divide ==> next bytes comes, 1 = end (then check the data)
|
69 | {
|
70 | if (decoder.dcc.dcc_cnted_time <= decoder.dcc.dcc_time_logic_one) //division bit is 1 ==> end transmission
|
71 | {
|
72 | //check parity, if good ==> you can work with data
|
73 | decoder.dcc.RX[decoder.dcc.cnt_byte_pos + 1] = decoder.dcc.RX[decoder.dcc.cnt_byte_pos - 1];
|
74 | for (uint8_t i = NULL; i < (decoder.dcc.cnt_byte_pos - 1); i++) decoder.dcc.RX[decoder.dcc.cnt_byte_pos + 1] ^= decoder.dcc.RX[i];
|
75 |
|
76 | //calculated parity is same as transmitted ==> data is correct! Now check the 2 0815 states (empty data and decoder restart)
|
77 | if (decoder.dcc.RX[decoder.dcc.cnt_byte_pos] == decoder.dcc.RX[decoder.dcc.cnt_byte_pos + 1])
|
78 | {
|
79 | //set instruktion pointer!
|
80 | //where is the real data?! (only for locomotives)
|
81 | if (DCC_IS_NORMAL_ADR_SHORT) decoder.dcc.operation_instr_pos = 1;
|
82 | else decoder.dcc.operation_instr_pos = 2;
|
83 |
|
84 | decoder.dcc.state.systemBits.operation_dcc = TRUE;
|
85 | decoder.dcc.state.systemBits.received_mode = 2; //deceoder reset as init
|
86 |
|
87 | for (uint8_t i = NULL; i < decoder.dcc.cnt_byte_pos; i++) //check if every byte is 0
|
88 | if (decoder.dcc.RX[i]) decoder.dcc.state.systemBits.received_mode = 1; //not every 0's ==> check if every 2nd byte is 0
|
89 |
|
90 | for (uint8_t i = NULL; i < decoder.dcc.cnt_byte_pos; i+=2) //check if every 2nd byte is 0
|
91 | if (decoder.dcc.RX[i]) decoder.dcc.state.systemBits.received_mode = NULL; //not every 2nd byte is 0 ==> normal op
|
92 |
|
93 |
|
94 | //check the states
|
95 | if (decoder.dcc.state.systemBits.received_mode == 1) //idle mode received
|
96 | {
|
97 | decoder.dcc.dcc_reset_state = NULL;
|
98 | decoder.dcc.state.systemBits.start_detected = FALSE;
|
99 | }
|
100 | else if (decoder.dcc.state.systemBits.received_mode == 2) //reset mode received
|
101 | {
|
102 | decoder.dcc.dcc_reset_state++;
|
103 | decoder.dcc.state.systemBits.start_detected = FALSE;
|
104 |
|
105 | if (decoder.dcc.dcc_reset_state >= 8) dcc_reset_decoder();
|
106 | }
|
107 | else //check normal op or programming mode
|
108 | {
|
109 | decoder.dcc.dcc_reset_state = NULL;
|
110 |
|
111 | //cv programming (service mode)
|
112 | if (DCC_IS_SERVICE_MODE)
|
113 | {
|
114 | dcc_handle_service_mode();
|
115 | decoder.dcc.sysCond.systemBits.init_time_over = FALSE;
|
116 | }
|
117 | else if (DCC_IS_POM_MODE_ASSCES(DCC_16BIT_ADDRESS(decoder.system.switch1.switch_addr_hi, decoder.system.switch1.switch_addr_lo)))
|
118 | {
|
119 | dcc_handle_service_POM_mode();
|
120 | decoder.dcc.sysCond.systemBits.init_time_over = FALSE;
|
121 | }
|
122 | else
|
123 | decoder.dcc.state.systemBits.received_all_valid = TRUE;
|
124 | }
|
125 | }
|
126 |
|
127 | decoder.dcc.state.systemBits.start_detected = FALSE;
|
128 | }
|
129 | else //got next byte
|
130 | decoder.dcc.cnt_byte_pos++;
|
131 |
|
132 |
|
133 | decoder.dcc.state.systemBits.get_data_byte = TRUE;
|
134 | }
|
135 | }
|