1.1 --- a/test.c Sun Feb 17 00:45:43 2013 +0000
1.2 +++ b/test.c Sun Feb 17 01:07:49 2013 +0000
1.3 @@ -599,7 +599,7 @@
1.4 {
1.5 uint8_t status = 0, revision = 0;
1.6 uint16_t count;
1.7 - bool in_toggle = 0;
1.8 + bool in_toggle = 0, bus_event, data_event, suspended_event, connection_event, frame_event;
1.9 max_devstate devstate = MAX_DEVSTATE_INIT;
1.10
1.11 signal(SIGINT, &shutdown);
1.12 @@ -675,43 +675,49 @@
1.13 {
1.14 status = max_read(MAX_REG_HIRQ, NULL);
1.15
1.16 - if (status & MAX_HIRQ_BUSEVENTIRQ)
1.17 + if ((bus_event = status & MAX_HIRQ_BUSEVENTIRQ))
1.18 printf("Bus ");
1.19 - if (status & MAX_HIRQ_RCVDAVIRQ)
1.20 + if ((data_event = status & MAX_HIRQ_RCVDAVIRQ))
1.21 printf("Data ");
1.22 - if (status & MAX_HIRQ_SUSDNIRQ)
1.23 + if ((suspended_event = status & MAX_HIRQ_SUSDNIRQ))
1.24 printf("Suspended ");
1.25 - if (status & MAX_HIRQ_CONDETIRQ)
1.26 + if ((connection_event = status & MAX_HIRQ_CONDETIRQ))
1.27 printf("Connection ");
1.28 - if (status & MAX_HIRQ_FRAMEIRQ)
1.29 - printf("Frame ");
1.30 + frame_event = status & MAX_HIRQ_FRAMEIRQ;
1.31 printf("\n");
1.32
1.33 + max_write(MAX_REG_HIRQ, status);
1.34 +
1.35 /* Detect device connection/disconnection. */
1.36
1.37 - if ((devstate == MAX_DEVSTATE_INIT) && (status & MAX_HIRQ_CONDETIRQ) && devicechanged())
1.38 + if ((devstate == MAX_DEVSTATE_INIT) && connection_event && devicechanged())
1.39 {
1.40 devstate = MAX_DEVSTATE_CONNECTED;
1.41 }
1.42
1.43 /* Handle device reset initiation. */
1.44
1.45 - else if ((devstate == MAX_DEVSTATE_CONNECTED) && (status & MAX_HIRQ_BUSEVENTIRQ))
1.46 + else if ((devstate == MAX_DEVSTATE_CONNECTED) && bus_event)
1.47 {
1.48 - status = max_write(MAX_REG_MODE, max_read(MAX_REG_MODE, NULL) | MAX_MODE_SOFKAENAB);
1.49 + max_write(MAX_REG_MODE, max_read(MAX_REG_MODE, NULL) | MAX_MODE_SOFKAENAB);
1.50 devstate = MAX_DEVSTATE_RESET;
1.51 }
1.52
1.53 /* Handle device reset completion, initiating communications. */
1.54
1.55 - else if ((devstate == MAX_DEVSTATE_RESET) && (status & MAX_HIRQ_FRAMEIRQ) && max_can_send(&status))
1.56 + else if ((devstate == MAX_DEVSTATE_RESET) && frame_event && max_can_send(&status))
1.57 {
1.58 max_init_device(&in_toggle);
1.59 devstate = MAX_DEVSTATE_READY;
1.60 - status = max_write(MAX_REG_HIEN, MAX_HIEN_CONDETIE | MAX_HIEN_BUSEVENTIE);
1.61 + max_write(MAX_REG_MODE, max_read(MAX_REG_MODE, NULL) & ~MAX_MODE_SOFKAENAB);
1.62 }
1.63
1.64 - max_write(MAX_REG_HIRQ, status);
1.65 + /* Handle device disconnection. */
1.66 +
1.67 + else if ((devstate != MAX_DEVSTATE_INIT) && connection_event)
1.68 + {
1.69 + devstate = MAX_DEVSTATE_INIT;
1.70 + }
1.71 }
1.72 }
1.73