예제 #1
0
파일: ow_moat.c 프로젝트: stromnet/owfs
static ZERO_OR_ERROR FS_r_name(struct one_wire_query *owq)
{
    BYTE buf[256];
    size_t len = OWQ_size(owq);

	RETURN_ERROR_IF_BAD( OW_r_std(buf,&len, M_CONFIG, CFG_NAME, PN(owq)));

    return OWQ_format_output_offset_and_size((const char *)buf, len, owq);
}
예제 #2
0
static ZERO_OR_ERROR FS_r_param(struct one_wire_query *owq)
{
	struct parsedname *pn = PN(owq);
	size_t pagesize = 32;
	BYTE data[pagesize];
	off_t param_offset = pn->selected_filetype->data.i ;
	
	RETURN_ERROR_IF_BAD( OW_r_page(data, pagesize-param_offset, param_offset, pn) );
	return OWQ_format_output_offset_and_size((ASCII *) data, FileLength(pn), owq);
}
예제 #3
0
파일: ow_moat.c 프로젝트: stromnet/owfs
static ZERO_OR_ERROR FS_r_ports_raw(struct one_wire_query *owq)
{
    BYTE buf[10];
    size_t len = OWQ_size(owq);
	if(len>sizeof(buf)) len=sizeof(buf);

	RETURN_ERROR_IF_BAD( OW_r_std(buf,&len, M_PORT, 0, PN(owq)));

    return OWQ_format_output_offset_and_size((const char *)buf, len, owq);
}
예제 #4
0
파일: ow_moat.c 프로젝트: stromnet/owfs
static ZERO_OR_ERROR FS_r_info_raw(struct one_wire_query *owq)
{
    BYTE buf[256];
    size_t len = OWQ_size(owq);
	if(len>sizeof(buf)) len=sizeof(buf);

	RETURN_ERROR_IF_BAD( OW_r_std(buf,&len, M_CONFIG, OWQ_pn(owq).extension, PN(owq)));

    return OWQ_format_output_offset_and_size((const char *)buf, len, owq);
}
예제 #5
0
static ZERO_OR_ERROR FS_aliaslist( struct one_wire_query * owq )
{
	struct memblob mb ;
	ZERO_OR_ERROR zoe ;
	MemblobInit( &mb, PATH_MAX ) ;
	Aliaslist( &mb ) ;
	if ( MemblobPure( &mb ) ) {
		zoe = OWQ_format_output_offset_and_size( (char *) MemblobData( &mb ), MemblobLength( &mb ), owq ) ;
	} else {
		zoe = -EINVAL ;
	}
	MemblobClear( &mb ) ;
	return zoe ;
}
예제 #6
0
/* For PBM channel -- a single letter */
static ZERO_OR_ERROR FS_r_PBM_channel(struct one_wire_query *owq)
{
	char port = PN(owq)->selected_connection->master.pbm.channel + '1';
	return OWQ_format_output_offset_and_size(&port, 1, owq);
}
예제 #7
0
/* For HA5 channel -- a single letter */
static ZERO_OR_ERROR FS_r_channel(struct one_wire_query *owq)
{
	return OWQ_format_output_offset_and_size( (char *) &(PN(owq)->selected_connection->master.ha5.channel), 1, owq);
}
예제 #8
0
파일: ow_read.c 프로젝트: stromnet/owfs
/* Structure file */
static ZERO_OR_ERROR FS_structure(struct one_wire_query *owq)
{
	char structure_text[PROPERTY_LENGTH_STRUCTURE+1] ;
	int output_length;
	struct parsedname * pn = PN(owq) ;
	struct filetype * ftype = pn->selected_filetype ;
	char format_char ;
	char change_char ;
	int index_num ;
	int elements_num ;
	

	// TEMPORARY change type from structure->real to get real length rhather than structure length
	pn->type = ePN_real;	/* "real" type to get return length, rather than "structure" length */

	// Set property type
	switch ( ftype->format ) {
		case ft_directory:
		case ft_subdir:
			format_char = 'D' ;
			break ;
		case ft_integer:
			format_char = 'i' ;
			break ;
		case ft_unsigned:
			format_char = 'u' ;
			break ;
		case ft_float:
			format_char = 'f' ;
			break ;
		case ft_alias:
			format_char = 'l' ;
			break ;
		case ft_ascii:
		case ft_vascii:
			format_char = 'a' ;
			break ;
		case ft_binary:
			format_char = 'b' ;
			break ;
		case ft_yesno:
		case ft_bitfield:
			format_char = 'y' ;
			break ;
		case ft_date:
			format_char = 'd' ;
			break ;
		case ft_temperature:
			format_char = 't' ;
			break ;
		case ft_tempgap:
			format_char = 'g' ;
			break ;
		case ft_pressure:
			format_char = 'p' ;
			break ;
		case ft_unknown:
		default:
			format_char = '?' ;
			break ;
	}

	// Set index
	index_num = (ftype->ag) ? pn->extension : 0 ;
	
	// Set elements
	if ( ftype-> ag ) { // array
		if ( ftype -> ag -> combined == ag_sparse) {
			if ( ftype -> ag -> letters == ag_letters) {
				elements_num = -1 ;
			} else { // numbered
				elements_num = 0 ;
			}
		} else { // non sparse
			elements_num = ftype->ag->elements ;
		}
	} else { // scallar
		elements_num = 1 ;
	}

	// Set changability
	switch ( ftype->change ) {
		case fc_static:
		case fc_subdir:
		case fc_directory:
			change_char = 'f' ;
			break ;
		case fc_stable:
		case fc_persistent:
			change_char = 's' ;
			break ;
		case fc_volatile:
		case fc_read_stable:
		case fc_simultaneous_temperature:
		case fc_simultaneous_voltage:
		case fc_uncached:
		case fc_statistic:
		case fc_presence:
		case fc_link:
		case fc_page:
			change_char = 'v' ;
			break ;
		case fc_second:
		default:
			change_char = 't' ;
			break ;
	}

	UCLIBCLOCK;
	output_length = snprintf(structure_text,
		 PROPERTY_LENGTH_STRUCTURE+1,
		 "%c,%.6d,%.6d,%.2s,%.6d,%c,",
		 format_char,
		 index_num ,
		 elements_num,
		 (ftype->read == NO_READ_FUNCTION) ? ((ftype->write == NO_WRITE_FUNCTION) ? "oo" : "wo")
		                                   : ((ftype->write == NO_WRITE_FUNCTION) ? "ro" : "rw"), 
		 (int) FullFileLength(PN(owq)),
		 change_char
		);
	UCLIBCUNLOCK;
	LEVEL_DEBUG("length=%d", output_length);

	// TEMPORARY restore type from real to structure
	pn->type = ePN_structure;

	if (output_length < 0) {
		LEVEL_DEBUG("Problem formatting structure string");
		return -EFAULT;
	}
	if ( output_length > PROPERTY_LENGTH_STRUCTURE ) {
		LEVEL_DEBUG("Structure string too long");
		return -EINVAL ;
	}

	return OWQ_format_output_offset_and_size(structure_text,output_length,owq);
}
예제 #9
0
파일: ow_lcd.c 프로젝트: M-o-a-T/owfs
static ZERO_OR_ERROR FS_r_version(struct one_wire_query *owq)
{
	BYTE v[_LCD_PAGE_SIZE];
	RETURN_ERROR_IF_BAD( OW_r_version(v, PN(owq)) ) ;
	return OWQ_format_output_offset_and_size((ASCII *) v, _LCD_PAGE_SIZE, owq);
}
예제 #10
0
static ZERO_OR_ERROR FS_read_tester_single(struct one_wire_query *owq)
{
	struct parsedname *pn = PN(owq);
	int tester_bus = (pn->sn[2] << 8) + pn->sn[1];
	int device = (pn->sn[6] << 8) + pn->sn[5];
	int family_code = pn->sn[0];
	int calculated_value = family_code + tester_bus + device + pn->extension;

	switch (OWQ_pn(owq).selected_filetype->format) {
	case ft_integer:
		OWQ_I(owq) = calculated_value;
		break;
	case ft_yesno:
		OWQ_Y(owq) = calculated_value & 0x1;
		break;
	case ft_bitfield:
		if (OWQ_pn(owq).extension == EXTENSION_BYTE) {
			OWQ_U(owq) = calculated_value;
		} else {
			OWQ_Y(owq) = calculated_value & 0x1;
		}
		break;
	case ft_unsigned:
		OWQ_U(owq) = calculated_value;
		break;
	case ft_pressure:
	case ft_temperature:
	case ft_tempgap:
	case ft_float:
		OWQ_F(owq) = (_FLOAT) calculated_value *0.1;;
		break;
	case ft_date:
		OWQ_D(owq) = 1174622400;
		break;
	case ft_alias:
	case ft_vascii:
	case ft_ascii:
		{
			ASCII address[16];
			size_t length_left = OWQ_size(owq);
			size_t buffer_index;
			size_t length = FileLength(PN(owq));
			ASCII return_chars[length];

			bytes2string(address, pn->sn, SERIAL_NUMBER_SIZE);
			OWQ_length(owq) = OWQ_size(owq);
			for (buffer_index = 0; buffer_index < length; buffer_index += sizeof(address)) {
				size_t copy_length = length_left;
				if (copy_length > sizeof(address)) {
					copy_length = sizeof(address);
				}
				memcpy(&return_chars[buffer_index], address, copy_length);
				length_left -= copy_length;
			}
			return OWQ_format_output_offset_and_size(return_chars, length, owq);
		}
	case ft_binary:
		{
			size_t length_left = OWQ_size(owq);
			size_t buffer_index;
			size_t length = FileLength(PN(owq));
			ASCII return_chars[length];

			OWQ_length(owq) = OWQ_size(owq);
			for (buffer_index = 0; buffer_index < length; buffer_index += SERIAL_NUMBER_SIZE) {
				size_t copy_length = length_left;
				if (copy_length > SERIAL_NUMBER_SIZE) {
					copy_length = SERIAL_NUMBER_SIZE;
				}
				memcpy(&return_chars[buffer_index], pn->sn, copy_length);
				length_left -= copy_length;
			}
			return OWQ_format_output_offset_and_size(return_chars, length, owq);
		}
	case ft_directory:
	case ft_subdir:
	case ft_unknown:
		return -ENOENT;
	}
	return 0;					// put data as string into buffer and return length
}