コード例 #1
0
int serial_buffer_rx(struct serial_buffer *sb,
                     const size_t ms_delay)
{
        const size_t available = sb->length - sb->curr_len;
        char *ptr = sb->buffer + sb->curr_len;
        size_t msg_len = 0;

        while (!msg_len) {
                const int read = serial_get_line_wait(
                        sb->serial, ptr, available, msToTicks(ms_delay));

                if (!read) {
                        pr_trace("[serial_buffer] msg timeout\r\n");
                        return 0;
                }

                ctrl_char_strip(ptr);
                msg_len = strlen(ptr);
        }

        pr_trace("[serial_buffer] Msg (offset = ");
        pr_trace_int(sb->curr_len);
        pr_trace("): \"");
        pr_trace(ptr);
        pr_trace("\"\r\n");

        sb->curr_len += msg_len + 1;
        return msg_len + 1;
}
コード例 #2
0
char* serial_buffer_rx(struct serial_buffer *sb,
                       const size_t ms_delay)
{
        const size_t available = sb->length - sb->curr_len;
	if (!available)
		return NULL;

        char *ptr = sb->buffer + sb->curr_len;
        size_t msg_len = 0;
        int read;

        while (!msg_len) {
                read  = serial_read_line_wait(sb->serial, ptr, available - 1,
					      msToTicks(ms_delay));

                if (read < 1)
                        return NULL;

                msg_len = serial_msg_strlen(ptr);
        }

	/* Check for overflow and warn */
	if (read == available)
		pr_warning(LOG_PFX "Serial buffer overflow!\r\n");

	/* If here, got a non-empty msg.  Terminate it and add the length */
        ptr[read] = 0;
        sb->curr_len += ++read;
        return ptr;
}
コード例 #3
0
void OBD2Task(void *pvParameters)
{
    pr_info("Start OBD2 task\r\n");
    size_t max_obd2_samplerate = msToTicks((TICK_RATE_HZ / MAX_OBD2_SAMPLE_RATE));
    LoggerConfig *config = getWorkingLoggerConfig();
    OBD2Config *oc = &config->OBD2Configs;
    while(1) {
        while(oc->enabled && oc->enabledPids > 0) {
            for (size_t i = 0; i < oc->enabledPids; i++) {
                PidConfig *pidCfg = &oc->pids[i];
                int value;
                unsigned char pid = pidCfg->pid;
                if (OBD2_request_PID(pid, &value, OBD2_PID_DEFAULT_TIMEOUT_MS)) {
                    OBD2_set_current_PID_value(i, value);
                    if (TRACE_LEVEL) {
                        pr_trace("read OBD2 PID ");
                        pr_trace_int(pid);
                        pr_trace("=")
                        pr_trace_int(value);
                        pr_trace("\r\n");
                    }
                } else {
                    pr_warning_int_msg("OBD2: PID read fail: ", pid);
                }
                delayTicks(max_obd2_samplerate);
            }
        }
        delayMs(OBD2_FEATURE_DISABLED_DELAY_MS);
    }
}
コード例 #4
0
ファイル: os_timer.c プロジェクト: BLEHexapod/os_freertos
os_timerHandle_t os_timerTaskNew(os_timerConfig_t* conf, uint16_t initDelay)
{
    bool ret = false;
    os_timerHandle_t handle = calloc(1, sizeof(struct os_timerHandle));
    handle->timerHandle = xTimerCreate(conf->name,
            msToTicks(conf->period),
            !conf->oneShot,
            NULL,
            conf->callback);
    if(handle->timerHandle && !conf->startLater) {
        ret = xTimerStart(handle->timerHandle, initDelay);
        if(ret) {
            return handle;
        } else {
            xTimerDelete(handle->timerHandle, 0);
            free(handle);
            return NULL;
        }
    } else if(conf->startLater) {
        handle->initDelay = initDelay;
        return handle;
    } else {
        free(handle);
        return NULL;
    }
}
コード例 #5
0
ファイル: sleep.c プロジェクト: CoffeeJack/CS415
void sleep(struct pcb* process, unsigned int milliseconds){
    
    int ticks = msToTicks(milliseconds);
    
    //kprintf("ticks = %d\n",ticks);
    
    addToSleepQueue(process,ticks);
}
コード例 #6
0
static void setup_debug_tools()
{
        /* Only enable this code if we are doing debug work */
#if ! (ASL_DEBUG)
        return;
#endif
        const size_t timer_ticks = msToTicks(CHAR_CHECK_PERIOD_MS);
        const signed char* timer_name = (signed char*) "Dropped Char Check Timer";
        xTimerHandle timer_handle = xTimerCreate(timer_name, timer_ticks,
                                                 true, NULL, dropped_char_timer_cb);
        xTimerStart(timer_handle, timer_ticks);
}
コード例 #7
0
int CAN_device_tx_msg(uint8_t channel, CAN_msg * msg, unsigned int timeoutMs)
{
        CanTxMsg TxMessage;

        /* Transmit Structure preparation */
        if (msg->isExtendedAddress) {
                TxMessage.ExtId = msg->addressValue;
                TxMessage.IDE = CAN_ID_EXT;
        } else {
                TxMessage.StdId = msg->addressValue;
                TxMessage.IDE = CAN_ID_STD;
        }

        TxMessage.RTR = CAN_RTR_DATA;
        TxMessage.DLC = msg->dataLength;
        memcpy(TxMessage.Data, msg->data, msg->dataLength);

        CAN_TypeDef* chan = channel == 0 ? CAN1 : CAN2;
        const uint8_t mailbox = CAN_Transmit(chan, &TxMessage);

        /*
         * Then they don't want to wait.  Ok.  Let caller know if they
         * got a mailbox then.  If not, message was unable to be sent.
         */
        if (0 == timeoutMs)
                return mailbox != CAN_TxStatus_NoMailBox;

        /* Using ticks avoids a race-condition */
        size_t ticks = getCurrentTicks();
        const size_t trigger = ticks + msToTicks(timeoutMs);
        uint8_t status = CAN_TxStatus_Failed;

        while(ticks <= trigger) {
                status = CAN_TransmitStatus(chan, mailbox);
                if (CAN_TxStatus_Pending != status)
                        break;

                /*
                 * Not using yield here as it will cause lower priority tasks
                 * to starve.  Yield only allows tasks of equal or greater
                 * priority to run.
                 */
                delayTicks(1);

                ticks = getCurrentTicks();
        }

        if (CAN_TxStatus_Pending == status)
                CAN_CancelTransmit(chan, mailbox);

        return status == CAN_TxStatus_Ok;
}
コード例 #8
0
static int readModemWait(Serial *serial, size_t delay)
{
    int c = serial->get_line_wait(g_cellBuffer, g_bufferLen, msToTicks(delay));
    if (c > 2) {
            /*
             * Cell messages always end with a newline.  This also ignores
             * the messages that are simply stupid short.
             */
            pr_debug("Cell: read ");
            pr_debug(g_cellBuffer);
    }
    return c;
}
コード例 #9
0
int CAN_device_rx_msg(uint8_t channel, CAN_msg * msg, unsigned int timeoutMs)
{
    CanRxMsg rxMsg;
    if (xQueueReceive(channel == 0 ? xCan1Rx : xCan2Rx, &rxMsg, msToTicks(timeoutMs)) == pdTRUE) {
        msg->isExtendedAddress = rxMsg.IDE == CAN_ID_EXT ? 1 : 0;
        msg->addressValue = msg->isExtendedAddress ? rxMsg.ExtId : rxMsg.StdId;
        memcpy(msg->data, rxMsg.Data, rxMsg.DLC);
        msg->dataLength = rxMsg.DLC;
        return 1;
    } else {
        pr_debug("timeout rx CAN msg\r\n");
        return 0;
    }
}
コード例 #10
0
ファイル: os_timer.c プロジェクト: BLEHexapod/os_freertos
void os_timerDelay(uint32_t ms)
{
    vTaskDelay(msToTicks(ms));
}