Project

General

Profile

Statistics
| Branch: | Revision:

root / toolbox / main.c @ 76915f20

History | View | Annotate | Download (4.7 KB)

1 20e5429c Tom Mullins
#include <stdint.h>
2 12ea39cc Tom Mullins
#include <string.h>
3
#include <avr/io.h>
4 20e5429c Tom Mullins
#include <util/delay.h>
5
#include "mb.h"
6
#include "mbport.h"
7
#include "tooltron_mb.h"
8 9b2b6d91 Tom Mullins
#include "rfid.h"
9 20e5429c Tom Mullins
10 12ea39cc Tom Mullins
enum toolstate_t {
11
  TS_INIT,
12
  TS_OFF,
13
  TS_WAIT_ACCESS,
14
  TS_REQ_DIS,
15
  TS_MISSING_ID,
16
  TS_ON
17
};
18
19
static enum toolstate_t toolstate = TS_INIT;
20 208a6fb2 Tom Mullins
static char coils;
21 12ea39cc Tom Mullins
static char current_user[RFID_SERNO_SIZE];
22 208a6fb2 Tom Mullins
23
static inline void set_coil(char coil, char bit) {
24
  coils |= (bit << coil);
25
}
26 12ea39cc Tom Mullins
static inline char get_coil(char coil) {
27
  return (coils >> coil) & 1;
28
}
29
30
static inline void tool_init() {DDRA |= _BV(DDA1);}
31
static inline void tool_enable() {PORTA |= _BV(PA1);}
32 76915f20 Tom Mullins
static inline void tool_disable() {PORTA &= ~ _BV(PA1);}
33 12ea39cc Tom Mullins
34
static void tool_main() {
35
36
  switch (toolstate) {
37
38
    case TS_INIT:
39
      if (get_coil(MB_COIL_INIT)) {
40
        set_coil(MB_COIL_NEW, 0);
41
        set_coil(MB_COIL_EN, 0);
42
        set_coil(MB_COIL_REQ_DIS, 0);
43
        toolstate = TS_OFF;
44
      }
45
      break;
46
47
    case TS_OFF:
48
      if (rfid_nonzero()) {
49
        rfid_get_serno(current_user);
50
        set_coil(MB_COIL_NEW, 1);
51
        toolstate = TS_WAIT_ACCESS;
52
      }
53
      break;
54
55
    case TS_WAIT_ACCESS:
56
      if (get_coil(MB_COIL_EN)) {
57
        tool_enable();
58
        toolstate = TS_ON;
59
      }
60
      break;
61
62
    case TS_REQ_DIS:
63 e53aa5c5 Tom Mullins
      if (!get_coil(MB_COIL_EN)) {
64
        tool_disable();
65
        toolstate = TS_OFF;
66
      } else if (!get_coil(MB_COIL_REQ_DIS)) {
67
        toolstate = TS_ON;
68
      } else {
69
        // TODO blink yellow for 10 seconds or something
70
        set_coil(MB_COIL_EN, 0);
71
        set_coil(MB_COIL_REQ_DIS, 0);
72
        tool_disable();
73
        toolstate = TS_OFF;
74
      }
75 12ea39cc Tom Mullins
      break;
76
77
    case TS_MISSING_ID:
78 e53aa5c5 Tom Mullins
      if (!get_coil(MB_COIL_EN)) {
79
        tool_disable();
80
        toolstate = TS_OFF;
81
      } else if (get_coil(MB_COIL_REQ_DIS)) {
82
        toolstate = TS_REQ_DIS;
83
      } else if (rfid_check_serno(current_user)) {
84 12ea39cc Tom Mullins
        toolstate = TS_ON;
85
      } else {
86
        // TODO blink yellow for 10 seconds or something
87
        set_coil(MB_COIL_EN, 0);
88
        tool_disable();
89
        toolstate = TS_OFF;
90
      }
91
      break;
92
93
    case TS_ON:
94
      if (!get_coil(MB_COIL_EN)) {
95
        tool_disable();
96
        toolstate = TS_OFF;
97 e53aa5c5 Tom Mullins
      } else if(get_coil(MB_COIL_REQ_DIS)) {
98 12ea39cc Tom Mullins
        toolstate = TS_REQ_DIS;
99 e53aa5c5 Tom Mullins
      } else if (!rfid_check_serno(current_user)) {
100 12ea39cc Tom Mullins
        toolstate = TS_MISSING_ID;
101
      }
102
      break;
103
104
  }
105
106
}
107 208a6fb2 Tom Mullins
108 04b8cd51 Tom Mullins
eMBErrorCode eMBRegCoilsCB(UCHAR *reg_buf, USHORT addr, USHORT n_coils,
109 20e5429c Tom Mullins
    eMBRegisterMode mode) {
110 208a6fb2 Tom Mullins
111 76915f20 Tom Mullins
  if (addr > N_COILS || n_coils >= N_COILS-addr) {
112 20e5429c Tom Mullins
    return MB_ENOREG;
113 208a6fb2 Tom Mullins
  }
114
115
  if (mode == MB_REG_WRITE) {
116
117
    switch (addr) {
118
119
      case MB_COIL_NEW:
120
        /* nop */
121
        reg_buf[0] >>= 1;
122
        n_coils--;
123
        if (n_coils == 0) {
124
          return MB_ENOERR;
125
        }
126
127
      case MB_COIL_EN:
128
        set_coil(MB_COIL_NEW, 0);
129
        set_coil(MB_COIL_EN, reg_buf[0] & 1);
130
        reg_buf[0] >>= 1;
131
        n_coils--;
132
        if (n_coils == 0) {
133
          return MB_ENOERR;
134
        }
135
136
      case MB_COIL_REQ_DIS:
137 12ea39cc Tom Mullins
        set_coil(MB_COIL_REQ_DIS, reg_buf[0] & 1);
138 208a6fb2 Tom Mullins
        reg_buf[0] >>= 1;
139
        n_coils--;
140
        if (n_coils == 0) {
141
          return MB_ENOERR;
142
        }
143
144
      case MB_COIL_INIT:
145
        set_coil(MB_COIL_INIT, reg_buf[0] & 1);
146
        reg_buf[0] >>= 1;
147
        n_coils--;
148
        if (n_coils == 0) {
149
          return MB_ENOERR;
150
        }
151
    }
152
153 20e5429c Tom Mullins
  } else if (mode == MB_REG_READ) {
154 208a6fb2 Tom Mullins
155 76915f20 Tom Mullins
    reg_buf[0] = (coils >> (addr-1)) & ((1 << n_coils) - 1);
156 208a6fb2 Tom Mullins
    return MB_ENOERR;
157
158 20e5429c Tom Mullins
  }
159 208a6fb2 Tom Mullins
160
  return MB_EIO;
161 20e5429c Tom Mullins
}
162
163 04b8cd51 Tom Mullins
eMBErrorCode eMBRegDiscreteCB(UCHAR *reg_buf, USHORT addr, USHORT n_coils) {
164 20e5429c Tom Mullins
  return MB_ENOREG;
165
}
166
167 04b8cd51 Tom Mullins
eMBErrorCode eMBRegInputCB(UCHAR *reg_buf, USHORT addr, USHORT n_regs) {
168
169 20e5429c Tom Mullins
  switch (addr) {
170 04b8cd51 Tom Mullins
171
    case MB_INP_SERNOL:
172
      // TODO check that these (and the ones in SERNOH) are in the right order
173 76915f20 Tom Mullins
      *reg_buf++ = current_user[0];
174
      *reg_buf++ = current_user[1];
175 04b8cd51 Tom Mullins
      n_regs--;
176
      if (n_regs == 0) {
177
        return MB_ENOERR;
178
      }
179
180
    case MB_INP_SERNOH:
181 76915f20 Tom Mullins
      *reg_buf++ = current_user[2];
182
      *reg_buf++ = current_user[3];
183 04b8cd51 Tom Mullins
      n_regs--;
184
      if (n_regs == 0) {
185
        return MB_ENOERR;
186
      }
187
188
    case MB_INP_CURRENT:
189
      *reg_buf++ = 0;
190
      *reg_buf++ = 0;
191
      n_regs--;
192
      if (n_regs == 0) {
193
        return MB_ENOERR;
194 20e5429c Tom Mullins
      }
195 04b8cd51 Tom Mullins
196 20e5429c Tom Mullins
    default:
197
      return MB_ENOREG;
198
  }
199
}
200
201 04b8cd51 Tom Mullins
eMBErrorCode eMBRegHoldingCB(UCHAR *reg_buf, USHORT addr, USHORT n_regs,
202 20e5429c Tom Mullins
    eMBRegisterMode mode) {
203
  if (mode == MB_REG_WRITE) {
204
    return MB_ENOREG;
205
  } else if (mode == MB_REG_READ) {
206
    return MB_ENOREG;
207
  } else {
208
    return MB_EIO;
209
  }
210
}
211
212
int main() {
213 12ea39cc Tom Mullins
214
  tool_init();
215 9b2b6d91 Tom Mullins
  rfid_init();
216 20e5429c Tom Mullins
217
  eMBInit(MB_RTU, SLAVE_ADDR, 0, MB_BAUD, MB_PAR_NONE);
218
  eMBEnable();
219
220 208a6fb2 Tom Mullins
  sei();
221
222 20e5429c Tom Mullins
  while (1) {
223
    rfid_read();
224 12ea39cc Tom Mullins
    tool_main();
225 20e5429c Tom Mullins
    eMBPoll();
226 76915f20 Tom Mullins
    _delay_ms(100);
227 20e5429c Tom Mullins
  }
228
229
  return 0;
230
}