1 /*
2 OWFS -- One-Wire filesystem
3 OWHTTPD -- One-Wire Web Server
4 Written 2003 Paul H Alfille
5 email: paul.alfille@gmail.com
6 Released under the GPL
7 See the header file: ow.h for full attribution
8 1wire/iButton system from Dallas Semiconductor
9 */
10
11 #include <config.h>
12 #include "owfs_config.h"
13 #include "ow.h"
14 #include "ow_counters.h"
15 #include "ow_connection.h"
16 #include "ow_codes.h"
17
18 /** BUS_send_data
19 Send a data and expect response match
20 */
BUS_send_bits(const BYTE * data,const size_t len,const struct parsedname * pn)21 GOOD_OR_BAD BUS_send_bits(const BYTE * data, const size_t len, const struct parsedname *pn)
22 {
23 BYTE resp[len];
24
25 if (len == 0) {
26 return gbGOOD;
27 }
28
29 if ( BAD( BUS_sendback_bits(data, resp, len, pn) ) ) {
30 STAT_ADD1_BUS(e_bus_errors, pn->selected_connection);
31 return gbBAD ;
32 }
33
34 RETURN_GOOD_IF_GOOD( BUS_compare_bits( data, resp, len ) ) ;
35
36 LEVEL_DEBUG("Response doesn't match bits sent");
37 STAT_ADD1_BUS(e_bus_errors, pn->selected_connection);
38 return gbBAD ;
39 }
40
41 // compare bits (just non-zero or zero)
BUS_compare_bits(const BYTE * data1,const BYTE * data2,const size_t len)42 GOOD_OR_BAD BUS_compare_bits(const BYTE * data1, const BYTE * data2, const size_t len)
43 {
44 size_t i ;
45
46 if (len == 0) {
47 return gbGOOD;
48 }
49
50 for ( i=0 ; i< len ; ++i ) {
51 if ( (data1[i]==0) != (data2[i]==0) ) {
52 return gbBAD ;
53 }
54 }
55 return gbGOOD;
56 }
57
58 /** readin_data
59 Send 0xFFs and return response block
60 */
BUS_readin_bits(BYTE * data,const size_t len,const struct parsedname * pn)61 GOOD_OR_BAD BUS_readin_bits(BYTE * data, const size_t len, const struct parsedname *pn)
62 {
63 memset(data, 0xFF, (size_t) len) ;
64 RETURN_GOOD_IF_GOOD( BUS_sendback_bits( data, data, len, pn) ) ;
65
66 STAT_ADD1(BUS_readin_data_errors);
67 return gbBAD;
68 }
69
BUS_sendback_bits(const BYTE * databits,BYTE * respbits,const size_t len,const struct parsedname * pn)70 GOOD_OR_BAD BUS_sendback_bits( const BYTE * databits, BYTE * respbits, const size_t len, const struct parsedname * pn )
71 {
72 GOOD_OR_BAD (*sendback_bits) (const BYTE * databits, BYTE * respbits, const size_t len, const struct parsedname * pn) = ((pn)->selected_connection->iroutines.sendback_bits) ;
73 if ( sendback_bits != NO_SENDBACKBITS_ROUTINE ) {
74 return (sendback_bits)((databits),(respbits),(len),(pn)) ;
75 }
76 return gbBAD ;
77 }
78
79