# HG changeset patch # User Paul Boddie # Date 1361063269 0 # Node ID 4920c2e6e019f4164a7f913f66bf5c91f81bea16 # Parent d1bbe7a9319ee4e6231c9325544c21754acc0a63 Handle device disconnection and reconnection more elegantly. diff -r d1bbe7a9319e -r 4920c2e6e019 test.c --- a/test.c Sun Feb 17 00:45:43 2013 +0000 +++ b/test.c Sun Feb 17 01:07:49 2013 +0000 @@ -599,7 +599,7 @@ { uint8_t status = 0, revision = 0; uint16_t count; - bool in_toggle = 0; + bool in_toggle = 0, bus_event, data_event, suspended_event, connection_event, frame_event; max_devstate devstate = MAX_DEVSTATE_INIT; signal(SIGINT, &shutdown); @@ -675,43 +675,49 @@ { status = max_read(MAX_REG_HIRQ, NULL); - if (status & MAX_HIRQ_BUSEVENTIRQ) + if ((bus_event = status & MAX_HIRQ_BUSEVENTIRQ)) printf("Bus "); - if (status & MAX_HIRQ_RCVDAVIRQ) + if ((data_event = status & MAX_HIRQ_RCVDAVIRQ)) printf("Data "); - if (status & MAX_HIRQ_SUSDNIRQ) + if ((suspended_event = status & MAX_HIRQ_SUSDNIRQ)) printf("Suspended "); - if (status & MAX_HIRQ_CONDETIRQ) + if ((connection_event = status & MAX_HIRQ_CONDETIRQ)) printf("Connection "); - if (status & MAX_HIRQ_FRAMEIRQ) - printf("Frame "); + frame_event = status & MAX_HIRQ_FRAMEIRQ; printf("\n"); + max_write(MAX_REG_HIRQ, status); + /* Detect device connection/disconnection. */ - if ((devstate == MAX_DEVSTATE_INIT) && (status & MAX_HIRQ_CONDETIRQ) && devicechanged()) + if ((devstate == MAX_DEVSTATE_INIT) && connection_event && devicechanged()) { devstate = MAX_DEVSTATE_CONNECTED; } /* Handle device reset initiation. */ - else if ((devstate == MAX_DEVSTATE_CONNECTED) && (status & MAX_HIRQ_BUSEVENTIRQ)) + else if ((devstate == MAX_DEVSTATE_CONNECTED) && bus_event) { - status = max_write(MAX_REG_MODE, max_read(MAX_REG_MODE, NULL) | MAX_MODE_SOFKAENAB); + max_write(MAX_REG_MODE, max_read(MAX_REG_MODE, NULL) | MAX_MODE_SOFKAENAB); devstate = MAX_DEVSTATE_RESET; } /* Handle device reset completion, initiating communications. */ - else if ((devstate == MAX_DEVSTATE_RESET) && (status & MAX_HIRQ_FRAMEIRQ) && max_can_send(&status)) + else if ((devstate == MAX_DEVSTATE_RESET) && frame_event && max_can_send(&status)) { max_init_device(&in_toggle); devstate = MAX_DEVSTATE_READY; - status = max_write(MAX_REG_HIEN, MAX_HIEN_CONDETIE | MAX_HIEN_BUSEVENTIE); + max_write(MAX_REG_MODE, max_read(MAX_REG_MODE, NULL) & ~MAX_MODE_SOFKAENAB); } - max_write(MAX_REG_HIRQ, status); + /* Handle device disconnection. */ + + else if ((devstate != MAX_DEVSTATE_INIT) && connection_event) + { + devstate = MAX_DEVSTATE_INIT; + } } }