int8_t hh10d_read(struct packet_t *packet) { int RH; char buf[6]; uart_putstr_P(PSTR("hh10d read\r\n")); RH = (offset - (double)old_cnt) * sens / 4096.0; #ifdef DEBUG itoa(old_cnt,buf,10); uart_putstr(buf); uart_putstr_P(PSTR("\r\n")); itoa(RH,buf,10); uart_putstr(buf); uart_putstr_P(PSTR("\r\n")); #endif if (get_remaining_length(packet) < 2) return -1; return set_data_int16(packet,RH); }
void socket_read_handle(struct ev_loop *reactor, ev_io *w, int events) { session_t *s_session = (session_t*)w; if(s_session->to_process == HEADER){ /* here is a brand new packet */ int r_len = read(w->fd, &s_session->header, 1); if(r_len == 0){ log_error("unexpected EOF"); remove_session(s_session); return; } s_session->recv_length += 1; //s_session->command = get_command(s_session->header); s_session->to_process = REMAINING; } if(s_session->to_process == REMAINING){ /* * get "remaining" part in header, it may takes 1~4 bytes, and it has * to read one by one. * */ do{ int r_len = read(w->fd, s_session->remain_bytes+(int)s_session->remaining_read, 1); if(r_len == 0){ log_error("unexpected EOF"); remove_session(s_session); return; } if(r_len < 0){ if(errno == EAGAIN || errno == EINTR){ /* exit wait for next data in */ return; }else{ log_error("error connection"); remove_session(s_session); return; } } s_session->remaining_read += 1; s_session->recv_length += r_len; /* it means at least one more byte exist */ if((s_session->remain_bytes[s_session->remaining_read-1] & 128) > 0){ /* 4 bytes at most for repesenting remaining length */ if( s_session->remaining_read >= MQTT_LENGTH_MAX_BYTE){ log_error("protocol error"); remove_session(s_session); return; } }else{ /* all bytes for remaining length read */ s_session->remaining_length = get_remaining_length(s_session->remain_bytes); s_session->to_process = CONTENT; s_session->recv_length = 0; s_session->content = (char*)talloc(s_session->remaining_length); break; } }while(1); } if(s_session->to_process == CONTENT){ /* at least one byte left to read */ do{ int r_len; r_len = read(w->fd, s_session->content, s_session->remaining_length-s_session->recv_length); if(r_len == 0){ log_error("unexpected EOF"); remove_session(s_session); return; } if(r_len < 0){ if(errno == EAGAIN || errno == EINTR){ return; }else{ log_error("error connection"); remove_session(s_session); return; } } s_session->recv_length += r_len; if(s_session->recv_length >= s_session->remaining_length){ _msg_add(pdata.msg_queue, s_session); _clean_session(s_session); break; } }while(1); } return; }