Exemple #1
0
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;
}