static ZERO_OR_ERROR FS_w_vib_mode(struct one_wire_query *owq) { struct parsedname *pn = PN(owq); UINT vib_request = OWQ_U(owq) ; BYTE vib_stored ; switch (vib_request) { case e_mVM001_peak: case e_mVM001_rms: case e_mVM001_multi: break ; default: return -EINVAL ; } if ( BAD( Cache_Get_SlaveSpecific(&vib_stored, sizeof(vib_stored), SlaveSpecificTag(VIB), pn)) ) { if ( vib_stored == vib_request ) { return 0 ; } } if ( BAD( OW_set_vib_mode( vib_request, pn ) ) ) { return -EINVAL ; } Cache_Add_SlaveSpecific(&vib_request, sizeof(vib_request), SlaveSpecificTag(VIB), pn); return 0 ; }
// range is 5=5V or 2=2.5V static GOOD_OR_BAD OW_set_range( int range, struct parsedname * pn ) { int stored_range ; /* Range */ if ( BAD( Cache_Get_SlaveSpecific(&stored_range, sizeof(stored_range), SlaveSpecificTag(RAN), pn)) || stored_range != range) { // need to set resolution BYTE p[_1W_2450_PAGESIZE]; RETURN_BAD_IF_BAD( OW_r_mem(p, _1W_2450_PAGESIZE, _ADDRESS_CONTROL_PAGE, pn) ) ; switch ( range ) { case 2: p[_1W_2450_REG_A+1] &= ~_1W_2450_IR ; p[_1W_2450_REG_B+1] &= ~_1W_2450_IR ; p[_1W_2450_REG_C+1] &= ~_1W_2450_IR ; p[_1W_2450_REG_D+1] &= ~_1W_2450_IR ; break ; case 5: default: p[_1W_2450_REG_A+1] |= _1W_2450_IR ; p[_1W_2450_REG_B+1] |= _1W_2450_IR ; p[_1W_2450_REG_C+1] |= _1W_2450_IR ; p[_1W_2450_REG_D+1] |= _1W_2450_IR ; break ; } RETURN_BAD_IF_BAD( OW_w_mem(p, _1W_2450_PAGESIZE, _ADDRESS_CONTROL_PAGE, pn) ); return Cache_Add_SlaveSpecific(&range, sizeof(int), SlaveSpecificTag(RAN), pn); } return gbGOOD ; }
static GOOD_OR_BAD OW_r_counters(UINT * data, const struct parsedname *pn) { BYTE d[8]; UINT cum[4]; RETURN_BAD_IF_BAD( LCD_byte(_LCD_COMMAND_COUNTER_READ_TO_SCRATCH, 1, pn)) ; RETURN_BAD_IF_BAD( OW_r_scratch(d, 8, pn)) ; data[0] = ((UINT) d[1]) << 8 | d[0]; data[1] = ((UINT) d[3]) << 8 | d[2]; data[2] = ((UINT) d[5]) << 8 | d[4]; data[3] = ((UINT) d[7]) << 8 | d[6]; //printf("OW_COUNTER key=%s\n",key); if ( BAD( Cache_Get_SlaveSpecific((void *) cum, sizeof(cum), SlaveSpecificTag(CUM), pn)) ) { /* First pass at cumulative */ cum[0] = data[0]; cum[1] = data[1]; cum[2] = data[2]; cum[3] = data[3]; } else { cum[0] += data[0]; cum[1] += data[1]; cum[2] += data[2]; cum[3] += data[3]; } Cache_Add_SlaveSpecific((void *) cum, sizeof(cum), SlaveSpecificTag(CUM), pn); return gbGOOD; }
static ZERO_OR_ERROR FS_Mclear(struct one_wire_query *owq) { struct parsedname *pn = PN(owq); int init = 1; if ( BAD( Cache_Get_SlaveSpecific(&init, sizeof(init), SlaveSpecificTag(INI), pn)) ) { OWQ_Y(owq) = 1; if ( FS_r_strobe(owq) != 0 ) { // set reset pin to strobe mode return -EINVAL; } RETURN_ERROR_IF_BAD( OW_w_pio(0x30, pn) ); UT_delay(100); // init RETURN_ERROR_IF_BAD( OW_w_pio(0x38, pn) ) ; UT_delay(10); // Enable Display, Cursor, and Blinking // Entry-mode: auto-increment, no shift RETURN_ERROR_IF_BAD( OW_w_pio(0x0F, pn) ) ; RETURN_ERROR_IF_BAD( OW_w_pio(0x06, pn) ) ; Cache_Add_SlaveSpecific(&init, sizeof(init), SlaveSpecificTag(INI), pn); } // clear RETURN_ERROR_IF_BAD( OW_w_pio(0x01, pn) ); UT_delay(2); return FS_Mhome(owq); }
// good if powered. static GOOD_OR_BAD OW_get_power( struct parsedname * pn ) { int power ; /* power */ if ( BAD( Cache_Get_SlaveSpecific(&power, sizeof(power), SlaveSpecificTag(POW), pn)) ) { BYTE p[1]; /* get power flag -- to see if pullup can be avoided */ RETURN_BAD_IF_BAD( OW_r_mem(p, 1, _ADDRESS_POWERED, pn) ) ; power = (p[0]==_1W_2450_POWERED) ? 1 : 0 ; Cache_Add_SlaveSpecific(&power, sizeof(power), SlaveSpecificTag(POW), pn); } return power==1 ? gbGOOD : gbBAD ; }
/* caching system for storage */ static ZERO_OR_ERROR FS_r_cum(struct one_wire_query *owq) { UINT u[4]; /* just to prime the "CUM" data */ RETURN_ERROR_IF_BAD( OW_r_counters(u, PN(owq)) ) ; if ( BAD( Cache_Get_SlaveSpecific((void *) u, 4 * sizeof(UINT), SlaveSpecificTag(CUM), PN(owq))) ) { return -EINVAL; } OWQ_array_U(owq, 0) = u[0]; OWQ_array_U(owq, 1) = u[1]; OWQ_array_U(owq, 2) = u[2]; OWQ_array_U(owq, 3) = u[3]; return 0; }
static GOOD_OR_BAD OW_Hinit(struct parsedname * pn) { int init = 1; // clear, display on, mode BYTE start[] = { NIBBLE_ONE(LCD_COMMAND_ATTENTION), }; BYTE next[] = { NIBBLE_ONE(LCD_COMMAND_ATTENTION), NIBBLE_ONE(LCD_COMMAND_ATTENTION), NIBBLE_ONE(LCD_COMMAND_4_BIT), NIBBLE_CTRL(LCD_COMMAND_4_BIT_2_LINES), }; BYTE data[6]; // already done? RETURN_GOOD_IF_GOOD( Cache_Get_SlaveSpecific(&init, sizeof(init), SlaveSpecificTag(INI), pn) ) if ( BAD( OW_w_control(0x04, pn) ) // strobe || BAD( OW_r_reg(data, pn) ) ) { LEVEL_DEBUG("Trouble sending strobe to Hobbyboard LCD") ; return gbBAD; } if ( data[5] != 0x84 ) { LEVEL_DEBUG("LCD is not powered"); // not powered return gbBAD ; } if ( BAD( OW_c_latch(pn) ) ) { LEVEL_DEBUG("Trouble clearing latches") ; return gbBAD ; }// clear PIOs if ( BAD( OW_w_pios(start, 1, pn) ) ) { LEVEL_DEBUG("Error sending initial attention"); return gbBAD; } UT_delay(5); if ( BAD( OW_w_pios(next, 5, pn) ) ) { LEVEL_DEBUG("Error sending setup commands"); return gbBAD; } Cache_Add_SlaveSpecific(&init, sizeof(init), SlaveSpecificTag(INI), pn); return gbGOOD ; }
static GOOD_OR_BAD OW_set_resolution( int resolution, struct parsedname * pn ) { int stored_resolution ; /* Resolution */ if ( BAD( Cache_Get_SlaveSpecific(&stored_resolution, sizeof(stored_resolution), SlaveSpecificTag(RES), pn)) || stored_resolution != resolution) { // need to set resolution BYTE p[_1W_2450_PAGESIZE]; RETURN_BAD_IF_BAD( OW_r_mem(p, _1W_2450_PAGESIZE, _ADDRESS_CONTROL_PAGE, pn) ) ; p[_1W_2450_REG_A] &= ~_1W_2450_RC_MASK ; p[_1W_2450_REG_A] |= ( resolution & _1W_2450_RC_MASK ) ; p[_1W_2450_REG_B] &= ~_1W_2450_RC_MASK ; p[_1W_2450_REG_B] |= ( resolution & _1W_2450_RC_MASK ) ; p[_1W_2450_REG_C] &= ~_1W_2450_RC_MASK ; p[_1W_2450_REG_C] |= ( resolution & _1W_2450_RC_MASK ) ; p[_1W_2450_REG_D] &= ~_1W_2450_RC_MASK ; p[_1W_2450_REG_D] |= ( resolution & _1W_2450_RC_MASK ) ; RETURN_BAD_IF_BAD( OW_w_mem(p, _1W_2450_PAGESIZE, _ADDRESS_CONTROL_PAGE, pn) ); return Cache_Add_SlaveSpecific(&resolution, sizeof(int), SlaveSpecificTag(RES), pn); } return gbGOOD ; }