Am 21.08.2016 um 15:39 schrieb Jan Kandziora: > Am 21.08.2016 um 13:38 schrieb Henrik Östman: >> No rush for me, I can run with the patched version for now. Just so >> that I know if I can use the next stable version, I'll monitor the >> changelog. >> > I've put a cleaned up version of that patch into the git archive. Could > you please > > [owfs-code]$ git pull > [owfs-code]$ make clean && make distclean && ./bootstrap && ./configure > [owfs-code]$ make > > and test? > Henrik (and anyone else who likes to test this feature), could you also apply the appended patch and check whether you are able to read and set the power-up value of the temperature resolution through the new .../tempres node?
Kind regards Jan
diff --git a/module/owlib/src/c/ow_1820.c b/module/owlib/src/c/ow_1820.c index f9d928c..874746d 100644 --- a/module/owlib/src/c/ow_1820.c +++ b/module/owlib/src/c/ow_1820.c @@ -56,6 +56,8 @@ READ_FUNCTION(FS_slowtemp); READ_FUNCTION(FS_power); READ_FUNCTION(FS_r_templimit); WRITE_FUNCTION(FS_w_templimit); +READ_FUNCTION(FS_r_tempres); +WRITE_FUNCTION(FS_w_tempres); READ_FUNCTION(FS_r_die); READ_FUNCTION(FS_r_trim); WRITE_FUNCTION(FS_w_trim); @@ -130,6 +132,7 @@ static struct filetype DS18B20[] = { {"latesttemp", PROPERTY_LENGTH_TEMP, NON_AGGREGATE, ft_temperature, fc_volatile, FS_22latesttemp, NO_WRITE_FUNCTION, VISIBLE, NO_FILETYPE_DATA, }, {"templow", PROPERTY_LENGTH_TEMP, NON_AGGREGATE, ft_temperature, fc_stable, FS_r_templimit, FS_w_templimit, VISIBLE, {.i=1}, }, {"temphigh", PROPERTY_LENGTH_TEMP, NON_AGGREGATE, ft_temperature, fc_stable, FS_r_templimit, FS_w_templimit, VISIBLE, {.i=0}, }, + {"tempres", PROPERTY_LENGTH_TEMP, NON_AGGREGATE, ft_unsigned, fc_stable, FS_r_tempres, FS_w_tempres, VISIBLE, NO_FILETYPE_DATA, }, {"power", PROPERTY_LENGTH_YESNO, NON_AGGREGATE, ft_yesno, fc_volatile, FS_power, NO_WRITE_FUNCTION, VISIBLE, NO_FILETYPE_DATA, }, {"scratchpad", SCRATCHPAD_LENGTH, NON_AGGREGATE, ft_binary, fc_volatile, FS_r_scratchpad, NO_WRITE_FUNCTION, VISIBLE, NO_FILETYPE_DATA, }, @@ -153,6 +156,7 @@ static struct filetype DS1822[] = { {"latesttemp", PROPERTY_LENGTH_TEMP, NON_AGGREGATE, ft_temperature, fc_volatile, FS_22latesttemp, NO_WRITE_FUNCTION, VISIBLE, NO_FILETYPE_DATA, }, {"templow", PROPERTY_LENGTH_TEMP, NON_AGGREGATE, ft_temperature, fc_stable, FS_r_templimit, FS_w_templimit, VISIBLE, {.i=1}, }, {"temphigh", PROPERTY_LENGTH_TEMP, NON_AGGREGATE, ft_temperature, fc_stable, FS_r_templimit, FS_w_templimit, VISIBLE, {.i=0}, }, + {"tempres", PROPERTY_LENGTH_TEMP, NON_AGGREGATE, ft_unsigned, fc_stable, FS_r_tempres, FS_w_tempres, VISIBLE, NO_FILETYPE_DATA, }, {"power", PROPERTY_LENGTH_YESNO, NON_AGGREGATE, ft_yesno, fc_volatile, FS_power, NO_WRITE_FUNCTION, VISIBLE, NO_FILETYPE_DATA, }, {"scratchpad", SCRATCHPAD_LENGTH, NON_AGGREGATE, ft_binary, fc_volatile, FS_r_scratchpad, NO_WRITE_FUNCTION, VISIBLE, NO_FILETYPE_DATA, }, @@ -178,6 +182,7 @@ static struct filetype DS1825[] = { {"latesttemp", PROPERTY_LENGTH_TEMP, NON_AGGREGATE, ft_temperature, fc_volatile, FS_22latesttemp, NO_WRITE_FUNCTION, VISIBLE, NO_FILETYPE_DATA, }, {"templow", PROPERTY_LENGTH_TEMP, NON_AGGREGATE, ft_temperature, fc_stable, FS_r_templimit, FS_w_templimit, VISIBLE_DS1825, {.i=1}, }, {"temphigh", PROPERTY_LENGTH_TEMP, NON_AGGREGATE, ft_temperature, fc_stable, FS_r_templimit, FS_w_templimit, VISIBLE_DS1825, {.i=0}, }, + {"tempres", PROPERTY_LENGTH_TEMP, NON_AGGREGATE, ft_unsigned, fc_stable, FS_r_tempres, FS_w_tempres, VISIBLE, NO_FILETYPE_DATA, }, {"thermocouple", PROPERTY_LENGTH_TEMP, NON_AGGREGATE, ft_temperature, fc_link, FS_thermocouple, NO_WRITE_FUNCTION, VISIBLE_MAX31850, {.i=12}, }, {"flagfield", PROPERTY_LENGTH_UNSIGNED, NON_AGGREGATE, ft_unsigned, fc_link, FS_r_flagfield, NO_WRITE_FUNCTION, INVISIBLE, NO_FILETYPE_DATA, }, {"fault" , PROPERTY_LENGTH_YESNO, NON_AGGREGATE, ft_yesno, fc_link, FS_r_bitfield, NO_WRITE_FUNCTION, VISIBLE_MAX31850, {.v= &max31850_fault,}, }, @@ -206,6 +211,7 @@ static struct filetype DS28EA00[] = { {"latesttemp", PROPERTY_LENGTH_TEMP, NON_AGGREGATE, ft_temperature, fc_volatile, FS_22latesttemp, NO_WRITE_FUNCTION, VISIBLE, NO_FILETYPE_DATA, }, {"templow", PROPERTY_LENGTH_TEMP, NON_AGGREGATE, ft_temperature, fc_stable, FS_r_templimit, FS_w_templimit, VISIBLE_DS1825, {.i=1}, }, {"temphigh", PROPERTY_LENGTH_TEMP, NON_AGGREGATE, ft_temperature, fc_stable, FS_r_templimit, FS_w_templimit, VISIBLE_DS1825, {.i=0}, }, + {"tempres", PROPERTY_LENGTH_TEMP, NON_AGGREGATE, ft_unsigned, fc_stable, FS_r_tempres, FS_w_tempres, VISIBLE, NO_FILETYPE_DATA, }, {"power", PROPERTY_LENGTH_YESNO, NON_AGGREGATE, ft_yesno, fc_volatile, FS_power, NO_WRITE_FUNCTION, VISIBLE, NO_FILETYPE_DATA, }, {"piostate", PROPERTY_LENGTH_UNSIGNED, NON_AGGREGATE, ft_unsigned, fc_volatile, FS_r_piostate, NO_WRITE_FUNCTION, INVISIBLE, NO_FILETYPE_DATA, }, {"PIO", PROPERTY_LENGTH_BITFIELD, &A28EA00, ft_bitfield, fc_link, FS_r_pio, FS_w_pio, VISIBLE, NO_FILETYPE_DATA, }, @@ -304,6 +310,8 @@ static GOOD_OR_BAD OW_22temp(_FLOAT * temp, enum temperature_problem_flag accept static GOOD_OR_BAD OW_power(BYTE * data, const struct parsedname *pn); static GOOD_OR_BAD OW_r_templimit(_FLOAT * T, const int Tindex, const struct parsedname *pn); static GOOD_OR_BAD OW_w_templimit(const _FLOAT T, const int Tindex, const struct parsedname *pn); +static GOOD_OR_BAD OW_r_tempres(UINT * resolution, const struct parsedname *pn); +static GOOD_OR_BAD OW_w_tempres(UINT resolution, const struct parsedname *pn); static GOOD_OR_BAD OW_r_scratchpad(BYTE * data, const struct parsedname *pn); static GOOD_OR_BAD OW_w_scratchpad(const BYTE * data, const struct parsedname *pn); static GOOD_OR_BAD OW_w_store_scratchpad(const BYTE * data, const struct parsedname *pn); @@ -485,6 +493,12 @@ static ZERO_OR_ERROR FS_r_templimit(struct one_wire_query *owq) return GB_to_Z_OR_E( OW_r_templimit(&OWQ_F(owq), PN(owq)->selected_filetype->data.i, PN(owq)) ); } +static ZERO_OR_ERROR FS_r_tempres(struct one_wire_query *owq) +{ + return GB_to_Z_OR_E( OW_r_tempres(&OWQ_U(owq), PN(owq)) ); +} + + /* DS1825 hardware programmable address */ static ZERO_OR_ERROR FS_r_ad(struct one_wire_query *owq) { @@ -529,6 +543,11 @@ static ZERO_OR_ERROR FS_w_templimit(struct one_wire_query *owq) return GB_to_Z_OR_E(OW_w_templimit(OWQ_F(owq), PN(owq)->selected_filetype->data.i, PN(owq))); } +static ZERO_OR_ERROR FS_w_tempres(struct one_wire_query *owq) +{ + return GB_to_Z_OR_E(OW_w_tempres(OWQ_U(owq), PN(owq))); +} + static ZERO_OR_ERROR FS_r_die(struct one_wire_query *owq) { char *d; @@ -987,6 +1006,70 @@ static GOOD_OR_BAD OW_w_templimit(const _FLOAT T, const int Tindex, const struct return OW_w_store_scratchpad(&data[2], pn); } +/* Get default resolution */ +static GOOD_OR_BAD OW_r_tempres(UINT * resolution, const struct parsedname *pn) +{ + BYTE data[SCRATCHPAD_LENGTH]; + BYTE recall[] = { _1W_RECALL_EEPROM, }; + struct transaction_log trecall[] = { + TRXN_START, + TRXN_WRITE1(recall), + TRXN_DELAY(10), + TRXN_END, + }; + + RETURN_BAD_IF_BAD(BUS_transaction(trecall, pn)) ; + + RETURN_BAD_IF_BAD(OW_r_scratchpad(data, pn)) ; + + switch (data[4] & 0x60) { + case 0x00: + resolution[0] = 9; + break ; + case 0x20: + resolution[0] = 10; + break ; + case 0x40: + resolution[0] = 11; + break ; + case 0x60: + resolution[0] = 12; + break ; + } + + return gbGOOD; +} + +/* Set default resolution */ +static GOOD_OR_BAD OW_w_tempres(UINT resolution, const struct parsedname *pn) +{ + BYTE data[SCRATCHPAD_LENGTH]; + + if (OW_r_scratchpad(data, pn)) { + return gbBAD; + } + + data[4] &= 0x9f; + switch (resolution) { + case 9: + break; + case 10: + data[4] |= 0x20; + break; + case 11: + data[4] |= 0x40; + break; + case 12: + data[4] |= 0x60; + break; + default: + return gbBAD; + } + + return OW_w_store_scratchpad(&data[2], pn); +} + + /* read 9 bytes, includes CRC8 which is checked */ static GOOD_OR_BAD OW_r_scratchpad(BYTE * data, const struct parsedname *pn) {
------------------------------------------------------------------------------
_______________________________________________ Owfs-developers mailing list Owfs-developers@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/owfs-developers