@@ -1075,15 +1075,18 @@ impl Sun2000 {
1075
1075
let mut params: Vec < Parameter > = vec ! [ ] ;
1076
1076
let mut disconnected = false ;
1077
1077
let now = Instant :: now ( ) ;
1078
- let mut params_wanted: Vec < _ > = parameters. into_iter ( ) . filter ( |s| {
1079
- ( initial_read && s. initial_read )
1080
- || ( !initial_read
1081
- && ( s. save_to_influx
1082
- || s. name . starts_with ( "state_" )
1083
- || s. name . starts_with ( "alarm_" )
1084
- || s. name . ends_with ( "_status" )
1085
- || s. name . ends_with ( "_code" ) ) )
1086
- } ) . collect ( ) ;
1078
+ let mut params_wanted: Vec < _ > = parameters
1079
+ . into_iter ( )
1080
+ . filter ( |s| {
1081
+ ( initial_read && s. initial_read )
1082
+ || ( !initial_read
1083
+ && ( s. save_to_influx
1084
+ || s. name . starts_with ( "state_" )
1085
+ || s. name . starts_with ( "alarm_" )
1086
+ || s. name . ends_with ( "_status" )
1087
+ || s. name . ends_with ( "_code" ) ) )
1088
+ } )
1089
+ . collect ( ) ;
1087
1090
1088
1091
//sort by register address
1089
1092
params_wanted. sort_by ( |a, b| a. reg_address . cmp ( & b. reg_address ) ) ;
@@ -1099,9 +1102,9 @@ impl Sun2000 {
1099
1102
start_addr = Some ( p. reg_address ) ;
1100
1103
} else {
1101
1104
if p. reg_address + p. len - start_addr. unwrap ( ) > 64 {
1102
- start_addr = Some ( p. reg_address ) ;
1103
- all_blocks. push ( reg_block) ;
1104
- reg_block = vec ! [ ] ;
1105
+ start_addr = Some ( p. reg_address ) ;
1106
+ all_blocks. push ( reg_block) ;
1107
+ reg_block = vec ! [ ] ;
1105
1108
}
1106
1109
}
1107
1110
reg_block. push ( p) ;
@@ -1121,7 +1124,10 @@ impl Sun2000 {
1121
1124
let mut attempts = 0 ;
1122
1125
while attempts < SUN2000_ATTEMPTS_PER_PARAM {
1123
1126
attempts = attempts + 1 ;
1124
- debug ! ( "-> obtaining register block #{} start={:#x}, len={}, attempt={}" , i, start_addr, len, attempts) ;
1127
+ debug ! (
1128
+ "-> obtaining register block #{} start={:#x}, len={}, attempt={}" ,
1129
+ i, start_addr, len, attempts
1130
+ ) ;
1125
1131
let retval = ctx. read_holding_registers ( start_addr, len) ;
1126
1132
let read_res;
1127
1133
let start = Instant :: now ( ) ;
@@ -1154,69 +1160,72 @@ impl Sun2000 {
1154
1160
) ;
1155
1161
}
1156
1162
1157
- for p in reg_block {
1158
- let offset = ( p. reg_address - start_addr) as usize ;
1159
- let data = & data[ offset..offset + ( p. len as usize ) ] ;
1160
- debug ! ( "-> parsing {} ({:?}) @ {:#x} offset={:#x} len={}..." , p. name, p. desc, p. reg_address, offset, p. len) ;
1161
- let mut val;
1162
- match & p. value {
1163
- ParamKind :: Text ( _) => {
1164
- let bytes: Vec < u8 > = data. iter ( ) . fold ( vec ! [ ] , |mut x, elem| {
1165
- if ( elem >> 8 ) as u8 != 0 {
1166
- x. push ( ( elem >> 8 ) as u8 ) ;
1167
- }
1168
- if ( elem & 0xff ) as u8 != 0 {
1169
- x. push ( ( elem & 0xff ) as u8 ) ;
1163
+ for p in reg_block {
1164
+ let offset = ( p. reg_address - start_addr) as usize ;
1165
+ let data = & data[ offset..offset + ( p. len as usize ) ] ;
1166
+ debug ! (
1167
+ "-> parsing {} ({:?}) @ {:#x} offset={:#x} len={}..." ,
1168
+ p. name, p. desc, p. reg_address, offset, p. len
1169
+ ) ;
1170
+ let mut val;
1171
+ match & p. value {
1172
+ ParamKind :: Text ( _) => {
1173
+ let bytes: Vec < u8 > = data. iter ( ) . fold ( vec ! [ ] , |mut x, elem| {
1174
+ if ( elem >> 8 ) as u8 != 0 {
1175
+ x. push ( ( elem >> 8 ) as u8 ) ;
1176
+ }
1177
+ if ( elem & 0xff ) as u8 != 0 {
1178
+ x. push ( ( elem & 0xff ) as u8 ) ;
1179
+ }
1180
+ x
1181
+ } ) ;
1182
+ let id = String :: from_utf8 ( bytes) . unwrap ( ) ;
1183
+ val = ParamKind :: Text ( Some ( id) ) ;
1184
+ }
1185
+ ParamKind :: NumberU16 ( _) => {
1186
+ debug ! ( "-> {} = {:?}" , p. name, data) ;
1187
+ val = ParamKind :: NumberU16 ( Some ( data[ 0 ] as u16 ) ) ;
1188
+ }
1189
+ ParamKind :: NumberI16 ( _) => {
1190
+ debug ! ( "-> {} = {:?}" , p. name, data) ;
1191
+ val = ParamKind :: NumberI16 ( Some ( data[ 0 ] as i16 ) ) ;
1192
+ }
1193
+ ParamKind :: NumberU32 ( _) => {
1194
+ let new_val: u32 = ( ( data[ 0 ] as u32 ) << 16 ) | data[ 1 ] as u32 ;
1195
+ debug ! ( "-> {} = {:X?} {:X}" , p. name, data, new_val) ;
1196
+ val = ParamKind :: NumberU32 ( Some ( new_val) ) ;
1197
+ if p. unit . unwrap_or_default ( ) == "epoch" && new_val == 0 {
1198
+ //zero epoch makes no sense, let's set it to None
1199
+ val = ParamKind :: NumberU32 ( None ) ;
1170
1200
}
1171
- x
1172
- } ) ;
1173
- let id = String :: from_utf8 ( bytes) . unwrap ( ) ;
1174
- val = ParamKind :: Text ( Some ( id) ) ;
1175
- }
1176
- ParamKind :: NumberU16 ( _) => {
1177
- debug ! ( "-> {} = {:?}" , p. name, data) ;
1178
- val = ParamKind :: NumberU16 ( Some ( data[ 0 ] as u16 ) ) ;
1179
- }
1180
- ParamKind :: NumberI16 ( _) => {
1181
- debug ! ( "-> {} = {:?}" , p. name, data) ;
1182
- val = ParamKind :: NumberI16 ( Some ( data[ 0 ] as i16 ) ) ;
1183
- }
1184
- ParamKind :: NumberU32 ( _) => {
1185
- let new_val: u32 = ( ( data[ 0 ] as u32 ) << 16 ) | data[ 1 ] as u32 ;
1186
- debug ! ( "-> {} = {:X?} {:X}" , p. name, data, new_val) ;
1187
- val = ParamKind :: NumberU32 ( Some ( new_val) ) ;
1188
- if p. unit . unwrap_or_default ( ) == "epoch" && new_val == 0 {
1189
- //zero epoch makes no sense, let's set it to None
1190
- val = ParamKind :: NumberU32 ( None ) ;
1201
+ }
1202
+ ParamKind :: NumberI32 ( _) => {
1203
+ let new_val: i32 =
1204
+ ( ( data[ 0 ] as i32 ) << 16 ) | ( data[ 1 ] as u32 ) as i32 ;
1205
+ debug ! ( "-> {} = {:X?} {:X}" , p. name, data, new_val) ;
1206
+ val = ParamKind :: NumberI32 ( Some ( new_val) ) ;
1191
1207
}
1192
1208
}
1193
- ParamKind :: NumberI32 ( _) => {
1194
- let new_val: i32 =
1195
- ( ( data[ 0 ] as i32 ) << 16 ) | ( data[ 1 ] as u32 ) as i32 ;
1196
- debug ! ( "-> {} = {:X?} {:X}" , p. name, data, new_val) ;
1197
- val = ParamKind :: NumberI32 ( Some ( new_val) ) ;
1198
- }
1199
- }
1200
- let param = Parameter :: new_from_string (
1201
- p. name . clone ( ) ,
1202
- val,
1203
- p. desc . clone ( ) ,
1204
- p. unit . clone ( ) ,
1205
- p. gain ,
1206
- p. reg_address ,
1207
- p. len ,
1208
- p. initial_read ,
1209
- p. save_to_influx ,
1210
- ) ;
1211
- params. push ( param. clone ( ) ) ;
1209
+ let param = Parameter :: new_from_string (
1210
+ p. name . clone ( ) ,
1211
+ val,
1212
+ p. desc . clone ( ) ,
1213
+ p. unit . clone ( ) ,
1214
+ p. gain ,
1215
+ p. reg_address ,
1216
+ p. len ,
1217
+ p. initial_read ,
1218
+ p. save_to_influx ,
1219
+ ) ;
1220
+ params. push ( param. clone ( ) ) ;
1212
1221
1213
- //write data to influxdb if configured
1214
- if let Some ( c) = client. clone ( ) {
1215
- if !initial_read && p. save_to_influx {
1216
- let _ = Sun2000 :: save_to_influxdb ( c, & self . name , param) . await ;
1222
+ //write data to influxdb if configured
1223
+ if let Some ( c) = client. clone ( ) {
1224
+ if !initial_read && p. save_to_influx {
1225
+ let _ = Sun2000 :: save_to_influxdb ( c, & self . name , param) . await ;
1226
+ }
1217
1227
}
1218
1228
}
1219
- }
1220
1229
//we parsed all parameters in this block,
1221
1230
//break the attempt loop and try next register block
1222
1231
break ;
0 commit comments