diff options
Diffstat (limited to 'serial_link')
| -rw-r--r-- | serial_link/protocol/transport.c | 17 | ||||
| -rw-r--r-- | serial_link/protocol/transport.h | 16 | ||||
| -rw-r--r-- | serial_link/tests/transport_tests.c | 15 |
3 files changed, 48 insertions, 0 deletions
diff --git a/serial_link/protocol/transport.c b/serial_link/protocol/transport.c index e49e9d69d..03f83a806 100644 --- a/serial_link/protocol/transport.c +++ b/serial_link/protocol/transport.c | |||
| @@ -79,6 +79,9 @@ void transport_recv_frame(uint8_t from, uint8_t* data, uint16_t size) { | |||
| 79 | start = obj->buffer + LOCAL_OBJECT_SIZE(obj->object_size); | 79 | start = obj->buffer + LOCAL_OBJECT_SIZE(obj->object_size); |
| 80 | start += (from - 1) * REMOTE_OBJECT_SIZE(obj->object_size); | 80 | start += (from - 1) * REMOTE_OBJECT_SIZE(obj->object_size); |
| 81 | } | 81 | } |
| 82 | else { | ||
| 83 | start = obj->buffer + NUM_SLAVES * LOCAL_OBJECT_SIZE(obj->object_size); | ||
| 84 | } | ||
| 82 | triple_buffer_object_t* tb = (triple_buffer_object_t*)start; | 85 | triple_buffer_object_t* tb = (triple_buffer_object_t*)start; |
| 83 | void* ptr = triple_buffer_begin_write_internal(obj->object_size, tb); | 86 | void* ptr = triple_buffer_begin_write_internal(obj->object_size, tb); |
| 84 | memcpy(ptr, data, size -1); | 87 | memcpy(ptr, data, size -1); |
| @@ -101,5 +104,19 @@ void update_transport(void) { | |||
| 101 | router_send_frame(dest, ptr, obj->object_size + 1); | 104 | router_send_frame(dest, ptr, obj->object_size + 1); |
| 102 | } | 105 | } |
| 103 | } | 106 | } |
| 107 | else { | ||
| 108 | uint8_t* start = obj->buffer; | ||
| 109 | int j; | ||
| 110 | for (j=0;j<NUM_SLAVES;j++) { | ||
| 111 | triple_buffer_object_t* tb = (triple_buffer_object_t*)start; | ||
| 112 | uint8_t* ptr = (uint8_t*)triple_buffer_read_internal(obj->object_size + LOCAL_OBJECT_EXTRA, tb); | ||
| 113 | if (ptr) { | ||
| 114 | ptr[obj->object_size] = i; | ||
| 115 | uint8_t dest = j + 1; | ||
| 116 | router_send_frame(dest, ptr, obj->object_size + 1); | ||
| 117 | } | ||
| 118 | start += LOCAL_OBJECT_SIZE(obj->object_size); | ||
| 119 | } | ||
| 120 | } | ||
| 104 | } | 121 | } |
| 105 | } | 122 | } |
diff --git a/serial_link/protocol/transport.h b/serial_link/protocol/transport.h index 94ff85312..a1a83b8f7 100644 --- a/serial_link/protocol/transport.h +++ b/serial_link/protocol/transport.h | |||
| @@ -94,9 +94,25 @@ typedef struct { \ | |||
| 94 | } \ | 94 | } \ |
| 95 | }; \ | 95 | }; \ |
| 96 | type* begin_write_##name(uint8_t slave) { \ | 96 | type* begin_write_##name(uint8_t slave) { \ |
| 97 | remote_object_t* obj = (remote_object_t*)&remote_object_##name; \ | ||
| 98 | uint8_t* start = obj->buffer;\ | ||
| 99 | start += slave * LOCAL_OBJECT_SIZE(obj->object_size); \ | ||
| 100 | triple_buffer_object_t* tb = (triple_buffer_object_t*)start; \ | ||
| 101 | return (type*)triple_buffer_begin_write_internal(sizeof(type) + LOCAL_OBJECT_EXTRA, tb); \ | ||
| 97 | }\ | 102 | }\ |
| 98 | void end_write_##name(uint8_t slave) { \ | 103 | void end_write_##name(uint8_t slave) { \ |
| 104 | remote_object_t* obj = (remote_object_t*)&remote_object_##name; \ | ||
| 105 | uint8_t* start = obj->buffer;\ | ||
| 106 | start += slave * LOCAL_OBJECT_SIZE(obj->object_size); \ | ||
| 107 | triple_buffer_object_t* tb = (triple_buffer_object_t*)start; \ | ||
| 108 | triple_buffer_end_write_internal(tb); \ | ||
| 99 | signal_data_written(); \ | 109 | signal_data_written(); \ |
| 110 | }\ | ||
| 111 | type* read_##name() { \ | ||
| 112 | remote_object_t* obj = (remote_object_t*)&remote_object_##name; \ | ||
| 113 | uint8_t* start = obj->buffer + NUM_SLAVES * LOCAL_OBJECT_SIZE(obj->object_size);\ | ||
| 114 | triple_buffer_object_t* tb = (triple_buffer_object_t*)start; \ | ||
| 115 | return triple_buffer_read_internal(obj->object_size, tb); \ | ||
| 100 | } | 116 | } |
| 101 | 117 | ||
| 102 | #define SLAVE_TO_MASTER_OBJECT(name, type) \ | 118 | #define SLAVE_TO_MASTER_OBJECT(name, type) \ |
diff --git a/serial_link/tests/transport_tests.c b/serial_link/tests/transport_tests.c index 334827507..3fa8eab4a 100644 --- a/serial_link/tests/transport_tests.c +++ b/serial_link/tests/transport_tests.c | |||
| @@ -108,3 +108,18 @@ Ensure(Transport, writes_from_slave_to_master) { | |||
| 108 | assert_that(obj2, is_not_equal_to(NULL)); | 108 | assert_that(obj2, is_not_equal_to(NULL)); |
| 109 | assert_that(obj2->test, is_equal_to(7)); | 109 | assert_that(obj2->test, is_equal_to(7)); |
| 110 | } | 110 | } |
| 111 | |||
| 112 | Ensure(Transport, writes_from_master_to_single_slave) { | ||
| 113 | update_transport(); | ||
| 114 | test_object1_t* obj = begin_write_master_to_single_slave(3); | ||
| 115 | obj->test = 7; | ||
| 116 | expect(signal_data_written); | ||
| 117 | end_write_master_to_single_slave(3); | ||
| 118 | expect(router_send_frame, | ||
| 119 | when(destination, is_equal_to(4))); | ||
| 120 | update_transport(); | ||
| 121 | transport_recv_frame(0, sent_data, sent_data_size); | ||
| 122 | test_object1_t* obj2 = read_master_to_single_slave(); | ||
| 123 | assert_that(obj2, is_not_equal_to(NULL)); | ||
| 124 | assert_that(obj2->test, is_equal_to(7)); | ||
| 125 | } | ||
