\ 1-wire interface [IFUNDEF] set-baud include serial.fs [THEN] 0 Value 1-wire-fd also dos : set-tty ( fd -- ) filehandle @ >r t_old r@ tcgetattr drop t_old t_buf sizeof termios move $805 t_buf termios c_iflag ! $000 t_buf termios c_oflag ! $8BD t_buf termios c_cflag ! 0 t_buf termios c_lflag ! 0 t_buf termios c_cc VMIN + c! 3 t_buf termios c_cc VTIME + c! $D dup t_buf termios c_ispeed ! t_buf termios c_ospeed ! t_buf 1 r> tcsetattr drop ; previous : open-1-wire ( addr u -- ) r/w open-file throw to 1-wire-fd 1-wire-fd set-tty ; s" /dev/ttyUSB0" open-1-wire : 1w-write ( addr u -- ) 1-wire-fd write-file throw ; : 1w-read ( addr u -- n ) 1-wire-fd read-file throw ; : 1w? ( -- n ) 1-wire-fd check-read ; $E3 Constant :cmd $E1 Constant :data $C1 Constant :reset $C5 Constant :reset2 $BE Constant :read $B1 Constant :accel $A1 Constant :accel-off Create cmdbuf 0 c, Create 'cmd :cmd c, 0 c, :data c, Create 'address 8 0 [DO] 0 c, [LOOP] Create 'dummies 16 0 [DO] $FF c, [LOOP] Create 'search 16 0 [DO] 0 c, [LOOP] Create 'stuff $17 c, $45 c, $5b c, $0f c, $91 c, Variable results $100 allot Variable timeout : waitx &10 wait timeout @ 0 after - 0< ; : >results ( n -- ) &100 after timeout ! BEGIN dup 1-wire-fd check-read > WHILE waitx UNTIL results off true abort" Timeout" ELSE results cell+ swap 1w-read results ! THEN ; : .results ( -- ) base push hex results @+ swap bounds ?DO I c@ 3 .r LOOP ; : >address ( -- ) 'address 8 erase $40 0 DO results cell+ I 2* 1+ bit@ IF 'address I +bit THEN LOOP ; Code bswap AX bswap Next end-code macro : "address ( -- addr u ) base push hex >address 'address 2@ bswap swap bswap swap <# # # '# hold 12 0 DO # LOOP '. hold # # #> ; : .address "address type ; : maxdisc ( -- n ) 0 $40 0 DO results cell+ I 2* bit@ IF drop I THEN LOOP ; : cmd ( n -- ) cmdbuf c! cmdbuf 1 1w-write ; : cmdr ( n -- ) cmd 1 >results ; : addr ( -- ) 'address 8 1w-write 8 >results ; : dummies8 ( -- ) 'dummies 8 1w-write 8 >results ; : dummies9 ( -- ) 'dummies 9 1w-write 9 >results ; : search16 ( -- ) 'search 16 1w-write 16 >results ; : >temp ( -- ) base push decimal results cell+ w@ 2/ &100 * results cell+ 6 + c@ &100 results cell+ 7 + c@ */ - &75 + extend under dabs <# 'C hold '° xhold # # '. hold #S rot sign #> ; : .temp ( -- ) >temp type ; : >cmd ( n -- ) 'cmd 1+ c! 'cmd 3 1w-write ; : >cmdr ( n -- ) >cmd 1 >results ; : reset2 ( -- ) :reset2 >cmdr ; : init ( -- ) :reset >cmdr 'stuff 5 1w-write 5 >results reset2 ; : accel ( -- ) :accel >cmd ; : accel-off ( -- ) :accel-off >cmd ; \ "skip ROM": no address : noaddress reset2 $CC cmdr ; \ "search ROM": apply an address : address reset2 $55 cmdr addr ; : search-first ( -- ) 'search 16 erase init $F0 cmdr accel search16 accel-off ; : search-next ( -- ) results cell+ 'search 16 move 'search maxdisc 2* 1+ +bit $40 maxdisc 1+ DO 'search I 2* 1+ -bit LOOP init $F0 cmdr accel search16 accel-off ; : search-all ( -- ) search-first .address cr maxdisc BEGIN search-next .address cr maxdisc tuck = UNTIL drop ; : readout noaddress $44 cmdr &750 ms \ convert temperature noaddress $BE cmdr \ read scratchpad dummies9 ; : readrom \ would work if host didn't reply as well reset2 $33 cmdr dummies8 ; init search-first >address