示例#1
0
int main(void)
{
    u32 cmd;
    u32 delay;
    u32 hr;

    arduino_init(0,0,0,0);
    config_arduino_switch(A_GPIO, A_GPIO, A_GPIO, 
                          A_GPIO, A_SDA, A_SCL,
                          D_GPIO, D_GPIO, D_GPIO, D_GPIO, D_GPIO,
                          D_GPIO, D_GPIO, D_GPIO, D_GPIO,
                          D_GPIO, D_GPIO, D_GPIO, D_GPIO);

    // Run application
    while(1){
        // wait and store valid command
        while((MAILBOX_CMD_ADDR)==0);

        cmd = MAILBOX_CMD_ADDR;

        switch(cmd){
            case CONFIG_IOP_SWITCH:
                // use dedicated I2C
                config_arduino_switch(A_GPIO, A_GPIO, A_GPIO, 
                                      A_GPIO, A_SDA, A_SCL,
                                      D_GPIO, D_GPIO, D_GPIO, D_GPIO, D_GPIO,
                                      D_GPIO, D_GPIO, D_GPIO, D_GPIO,
                                      D_GPIO, D_GPIO, D_GPIO, D_GPIO);
                MAILBOX_CMD_ADDR = 0x0;
                break;
            case READ_DATA:
                hr = read_fingerHR();
                // write out hr, reset mailbox
                MAILBOX_DATA(0) = hr;
                MAILBOX_CMD_ADDR = 0x0;
                break;
            case READ_AND_LOG_DATA:
                // initialize logging variables, reset cmd
                cb_init(&arduino_log, LOG_BASE_ADDRESS, 
                        LOG_CAPACITY, LOG_ITEM_SIZE);
                delay = MAILBOX_DATA(1);
                MAILBOX_CMD_ADDR = 0x0;
                do{
                    // push sample to log and delay
                    hr = read_fingerHR();
                    cb_push_back(&arduino_log, &hr);
                    delay_ms(delay);
                } while((MAILBOX_CMD_ADDR & 0x1)== 0);
                break;
            default:
                MAILBOX_CMD_ADDR = 0x0; // reset command
                break;
        }
    }
    return 0;
}
示例#2
0
文件: amq.c 项目: nugins99/amq
/** send a message */
int amq_send(amqd_t mqdes, const char * msg_ptr, size_t msg_len, 
        unsigned msg_prio) {
    struct impl_t * q = (struct impl_t *)mqdes;
    pthread_mutex_lock(&q->mutex); 
    while (q->cb.count == q->cb.capacity) {
        pthread_cond_wait(&q->cond, &q->mutex); 
    }
    q->tmp->size  = msg_len; 
    // copy into temp buffer 
    memcpy(q->tmp->data, msg_ptr, msg_len);
    cb_push_back(&q->cb, q->tmp); 
    pthread_cond_broadcast(&q->cond);
    pthread_mutex_unlock(&q->mutex); 

};
示例#3
0
void *producer(void *producerId) {
  int *prodId;
  int r,i;

  prodId = (int *)producerId;

 // printf("Hello from *producer(thread) %d. \n Let's generate some numbers.\n",*prodId);

  for(i = 0; i < numberOfRandomNumbers; i++){

    /*Locking mutex*/
    rc = pthread_mutex_lock(&mutex);
    if (rc != 0){
      printf("ERROR: return code from pthread_mutex_lock*() is %d \n",rc);
      pthread_exit(&rc);
    }
		

		//ελέγχει αν ο buffer είναι γεμάτος, αν είναι περιμένει να ελευθερωθεί θέση
		while(cb_isFull(cb) == 1){
			rc = pthread_cond_wait(&bufferFull, &mutex);		//περιμένει μέχρι να ελευθερωθεί θέση στον πίνακα
			if (rc != 0) {	
				printf("ERROR: return code from pthread_cond_wait() is %d\n", rc);
				pthread_exit(&rc);
			}
		} 

		r = rand_r(&seed) % 256;
		printf("Random number produced : %d \n", r);
    cb_push_back(cb, &r); // places the random number insider the buffer


    /*Unlocking mutex*/
    rc = pthread_mutex_unlock(&mutex);
    if (rc != 0){
      printf("ERROR: retrn code from pthread_mutex_lock*() is %d \n",rc);
      pthread_exit(&rc);
    }

    fprintf(fc, "Producer %d : %d \n",*prodId,r );
  }
  pthread_exit(prodId);
}
示例#4
0
文件: amq.c 项目: nugins99/amq
/** send a message */
int amq_timedsend(amqd_t mqdes, const char * msg_ptr, size_t msg_len, 
        unsigned msg_prio, const struct timespec * abs_time) {
    struct impl_t * q = (struct impl_t *)mqdes;
    pthread_mutex_lock(&q->mutex); 
    while (q->cb.count == q->cb.capacity) {
        if (ETIMEDOUT == pthread_cond_timedwait(&q->cond, 
                    &q->mutex, abs_time)) { 
            pthread_mutex_unlock(&q->mutex);
            errno = ETIMEDOUT; 
            return -1; 
        }
    }
    q->tmp->size  = msg_len; 
    // copy into temp buffer 
    memcpy(q->tmp->data, msg_ptr, msg_len);
    cb_push_back(&q->cb, q->tmp); 
    pthread_cond_broadcast(&q->cond);
    pthread_mutex_unlock(&q->mutex); 

};
示例#5
0
int main(void)
{
    u32 cmd, data_channels, delay;
    u32 xStatus;
    u8 iop_pins[19];
    int i, log_capacity;
    u32 xadc_raw_value;
    float xadc_voltage;

    // Initialize PMOD and timers
    arduino_init(0,0,0,0);

    // SysMon Initialize
    SysMonConfigPtr = XSysMon_LookupConfig(SYSMON_DEVICE_ID);
    if(SysMonConfigPtr == NULL)
        xil_printf("SysMon LookupConfig failed.\n\r");
    xStatus = XSysMon_CfgInitialize(SysMonInstPtr, SysMonConfigPtr,
                                    SysMonConfigPtr->BaseAddress);
    if(XST_SUCCESS != xStatus)
        xil_printf("SysMon CfgInitialize failed\r\n");
    // Clear the old status
    XSysMon_GetStatus(SysMonInstPtr);

    // Initialize the default switch
    config_arduino_switch(A_GPIO, A_GPIO, A_GPIO, A_GPIO, A_GPIO, A_GPIO,
                          D_GPIO, D_GPIO, D_GPIO, D_GPIO, D_GPIO,
                          D_GPIO, D_GPIO, D_GPIO, D_GPIO,
                          D_GPIO, D_GPIO, D_GPIO, D_GPIO);

    while(1){
        // wait and store valid command
        while((MAILBOX_CMD_ADDR & 0x1)==0);
        cmd = (MAILBOX_CMD_ADDR & 0xF);

        switch(cmd){
            case CONFIG_IOP_SWITCH:
            // Assign default pin configurations
                iop_pins[0] = MAILBOX_DATA(0);
                iop_pins[1] = MAILBOX_DATA(1);
                iop_pins[2] = MAILBOX_DATA(2);
                iop_pins[3] = MAILBOX_DATA(3);
                iop_pins[4] = MAILBOX_DATA(4);
                iop_pins[5] = MAILBOX_DATA(5);
                iop_pins[6] = D_GPIO;
                iop_pins[7] = D_GPIO;
                iop_pins[8] = D_GPIO;
                iop_pins[9] = D_GPIO;
                iop_pins[10] = D_GPIO;
                iop_pins[11] = D_GPIO;
                iop_pins[12] = D_GPIO;
                iop_pins[13] = D_GPIO;
                iop_pins[14] = D_GPIO;
                iop_pins[15] = D_GPIO;
                iop_pins[16] = D_GPIO;
                iop_pins[17] = D_GPIO;
                iop_pins[18] = D_GPIO;
                config_arduino_switch(iop_pins[0], iop_pins[1], iop_pins[2], 
                                      iop_pins[3], iop_pins[4], iop_pins[5], 
                                      iop_pins[6], iop_pins[7],
                                      iop_pins[8], iop_pins[9], 
                                      iop_pins[10], iop_pins[11], 
                                      iop_pins[12], iop_pins[13], 
                                      iop_pins[14], iop_pins[15],
                                      iop_pins[16], iop_pins[17], 
                                      iop_pins[18]);
                MAILBOX_CMD_ADDR = 0x0;
                break;

            case GET_RAW_DATA:
                i=0;
                // Wait for the conversion complete
                while ((XSysMon_GetStatus(SysMonInstPtr) & 
                        XSM_SR_EOS_MASK) != XSM_SR_EOS_MASK);
                data_channels = MAILBOX_CMD_ADDR >> 8;
                if(data_channels & 0x1)
                    MAILBOX_DATA(i++) = XSysMon_GetAdcData(SysMonInstPtr,
                                            XSM_CH_AUX_MIN+1);
                if(data_channels & 0x2)
                    MAILBOX_DATA(i++) = XSysMon_GetAdcData(SysMonInstPtr,
                                            XSM_CH_AUX_MIN+9);
                if(data_channels & 0x4)
                    MAILBOX_DATA(i++) = XSysMon_GetAdcData(SysMonInstPtr,
                                            XSM_CH_AUX_MIN+6);
                if(data_channels & 0x8)
                    MAILBOX_DATA(i++) = XSysMon_GetAdcData(SysMonInstPtr,
                                            XSM_CH_AUX_MIN+15);
                if(data_channels & 0x10)
                    MAILBOX_DATA(i++) = XSysMon_GetAdcData(SysMonInstPtr,
                                            XSM_CH_AUX_MIN+5);
                if(data_channels & 0x20)
                    MAILBOX_DATA(i++) = XSysMon_GetAdcData(SysMonInstPtr,
                                            XSM_CH_AUX_MIN+13);
                MAILBOX_CMD_ADDR = 0x0;
                break;

            case GET_VOLTAGE:
                i=0;
                // Wait for the conversion complete
                while ((XSysMon_GetStatus(SysMonInstPtr) & 
                        XSM_SR_EOS_MASK) != XSM_SR_EOS_MASK);
                data_channels = MAILBOX_CMD_ADDR >> 8;
                if(data_channels & 0x1)
                    MAILBOX_DATA_FLOAT(i++) = (float)(XSysMon_GetAdcData(
                                SysMonInstPtr,XSM_CH_AUX_MIN+1)*V_REF/65536);
                if(data_channels & 0x2)
                    MAILBOX_DATA_FLOAT(i++) = (float)(XSysMon_GetAdcData(
                                SysMonInstPtr,XSM_CH_AUX_MIN+9)*V_REF/65536);
                if(data_channels & 0x4)
                    MAILBOX_DATA_FLOAT(i++) = (float)(XSysMon_GetAdcData(
                                SysMonInstPtr,XSM_CH_AUX_MIN+6)*V_REF/65536);
                if(data_channels & 0x8)
                    MAILBOX_DATA_FLOAT(i++) = (float)(XSysMon_GetAdcData(
                                SysMonInstPtr,XSM_CH_AUX_MIN+15)*V_REF/65536);
                if(data_channels & 0x10)
                    MAILBOX_DATA_FLOAT(i++) = (float)(XSysMon_GetAdcData(
                                SysMonInstPtr,XSM_CH_AUX_MIN+5)*V_REF/65536);
                if(data_channels & 0x20)
                    MAILBOX_DATA_FLOAT(i++) = (float)(XSysMon_GetAdcData(
                                SysMonInstPtr,XSM_CH_AUX_MIN+13)*V_REF/65536);
                MAILBOX_CMD_ADDR = 0x0;
                break;

            case READ_AND_LOG_RAW:
                // initialize logging variables, reset cmd
                delay = MAILBOX_DATA(1);
                // get channels to be sampled
                data_channels = MAILBOX_CMD_ADDR >> 8;
                // allocate 1000 samples per channel
                log_capacity = 4000 / LOG_INT_SIZE * 
                               count_set_bits(data_channels);
                cb_init(&arduino_log, LOG_BASE_ADDRESS, 
                        log_capacity, LOG_INT_SIZE);
                while(MAILBOX_CMD_ADDR != RESET_ANALOG){
                    // wait for sample conversion
                    while ((XSysMon_GetStatus(SysMonInstPtr) & 
                            XSM_SR_EOS_MASK) != XSM_SR_EOS_MASK);
                            
                    if(data_channels & 0x1) {
                        xadc_raw_value = XSysMon_GetAdcData(SysMonInstPtr,
                                                        XSM_CH_AUX_MIN+1);
                        cb_push_back(&arduino_log, &xadc_raw_value);
                    }
                    if(data_channels & 0x2) {
                        xadc_raw_value = XSysMon_GetAdcData(SysMonInstPtr,
                                                        XSM_CH_AUX_MIN+9);
                        cb_push_back(&arduino_log, &xadc_raw_value);
                    }
                    if(data_channels & 0x4) {
                        xadc_raw_value = XSysMon_GetAdcData(SysMonInstPtr,
                                                        XSM_CH_AUX_MIN+6);
                        cb_push_back(&arduino_log, &xadc_raw_value);
                    }
                    if(data_channels & 0x8) {
                        xadc_raw_value = XSysMon_GetAdcData(SysMonInstPtr,
                                                        XSM_CH_AUX_MIN+15);
                        cb_push_back(&arduino_log, &xadc_raw_value);
                    }
                    if(data_channels & 0x10) {
                        xadc_raw_value = XSysMon_GetAdcData(SysMonInstPtr,
                                                        XSM_CH_AUX_MIN+5);
                        cb_push_back(&arduino_log, &xadc_raw_value);
                    }
                    if(data_channels & 0x20) {
                        xadc_raw_value = XSysMon_GetAdcData(SysMonInstPtr,
                                                        XSM_CH_AUX_MIN+13);
                        cb_push_back(&arduino_log, &xadc_raw_value);
                    }
                    delay_ms(delay);
                }
                MAILBOX_CMD_ADDR = 0x0;
                break;

            case READ_AND_LOG_FLOAT:
                // initialize logging variables, reset cmd
                delay = MAILBOX_DATA(1);
                // get channels to be sampled
                data_channels = MAILBOX_CMD_ADDR >> 8;
                // allocate 1000 samples per channel
                log_capacity = 4000 / LOG_FLOAT_SIZE * 
                               count_set_bits(data_channels);
                cb_init(&arduino_log, LOG_BASE_ADDRESS, 
                        log_capacity, LOG_FLOAT_SIZE);
                while(MAILBOX_CMD_ADDR != RESET_ANALOG){
                    // wait for sample conversion
                    while ((XSysMon_GetStatus(SysMonInstPtr) & 
                            XSM_SR_EOS_MASK) != XSM_SR_EOS_MASK);
                            
                    if(data_channels & 0x1) {
                        xadc_voltage = (float)(XSysMon_GetAdcData(
                                SysMonInstPtr,XSM_CH_AUX_MIN+1)*V_REF/65536);
                        cb_push_back_float(&arduino_log, &xadc_voltage);
                    }
                    if(data_channels & 0x2) {
                        xadc_voltage = (float)(XSysMon_GetAdcData(
                                SysMonInstPtr,XSM_CH_AUX_MIN+9)*V_REF/65536);
                        cb_push_back_float(&arduino_log, &xadc_voltage);
                    }
                    if(data_channels & 0x4) {
                        xadc_voltage = (float)(XSysMon_GetAdcData(
                                SysMonInstPtr,XSM_CH_AUX_MIN+6)*V_REF/65536);
                        cb_push_back_float(&arduino_log, &xadc_voltage);
                    }
                    if(data_channels & 0x8) {
                        xadc_voltage = (float)(XSysMon_GetAdcData(
                                SysMonInstPtr,XSM_CH_AUX_MIN+15)*V_REF/65536);
                        cb_push_back_float(&arduino_log, &xadc_voltage);
                    }
                    if(data_channels & 0x10) {
                        xadc_voltage = (float)(XSysMon_GetAdcData(
                                SysMonInstPtr,XSM_CH_AUX_MIN+5)*V_REF/65536);
                        cb_push_back_float(&arduino_log, &xadc_voltage);
                    }
                    if(data_channels & 0x20) {
                        xadc_voltage = (float)(XSysMon_GetAdcData(
                                SysMonInstPtr,XSM_CH_AUX_MIN+13)*V_REF/65536);
                        cb_push_back_float(&arduino_log, &xadc_voltage);
                    }
                    delay_ms(delay);
                }
                MAILBOX_CMD_ADDR = 0x0;
                break;
            
            case RESET_ANALOG:
                // SysMon Initialize
                SysMonConfigPtr = XSysMon_LookupConfig(SYSMON_DEVICE_ID);
                if(SysMonConfigPtr == NULL)
                    xil_printf("SysMon LookupConfig failed.\n\r");
                xStatus = XSysMon_CfgInitialize(SysMonInstPtr, 
                            SysMonConfigPtr, SysMonConfigPtr->BaseAddress);
                if(XST_SUCCESS != xStatus)
                    xil_printf("SysMon CfgInitialize failed.\r\n");
                // Clear the old status
                XSysMon_GetStatus(SysMonInstPtr);
                MAILBOX_CMD_ADDR = 0x0;
                break;
            
            default:
                MAILBOX_CMD_ADDR = 0x0;
                break;
    }
  }
  return 0;
}
示例#6
0
//=============================================================================
// dtmfGen() function
//=============================================================================
void dtmfGen(char btn, circular_buffer *cb)
{
  float freqA;
  float freqB;
  unsigned int num_back_fill;
  uint32_t i;
  uint16_t value;
  DAC_Sample sample;
  sample.Bias = 0;
  sample.RESERVED_SET_ZERO = 0;
  sample.RESERVED_SET_ZERO_2 = 0;
  float amp = MAX_AMPLITUDE/4;
  float offset = MAX_AMPLITUDE/2+1;

  switch (btn)
  {
    case '1':
      freqA = ROW_0_FREQ;
      freqB = COL_0_FREQ;
      break;

    case '2':
      freqA = ROW_0_FREQ;
      freqB = COL_1_FREQ;
      break;

    case '3':
      freqA = ROW_0_FREQ;
      freqB = COL_2_FREQ;
      break;

    case 'A':
      freqA = ROW_0_FREQ;
      freqB = COL_3_FREQ;
      break;

    case '4':
      freqA = ROW_1_FREQ;
      freqB = COL_0_FREQ;
      break;

    case '5':
      freqA = ROW_1_FREQ;
      freqB = COL_1_FREQ;
      break;

    case '6':
      freqA = ROW_1_FREQ;
      freqB = COL_2_FREQ;
      break;

    case 'B':
      freqA = ROW_1_FREQ;
      freqB = COL_3_FREQ;
      break;

    case '7':
      freqA = ROW_2_FREQ;
      freqB = COL_0_FREQ;
      break;

    case '8':
      freqA = ROW_2_FREQ;
      freqB = COL_1_FREQ;
      break;

    case '9':
      freqA = ROW_2_FREQ;
      freqB = COL_2_FREQ;
      break;

    case 'C':
      freqA = ROW_2_FREQ;
      freqB = COL_3_FREQ;
      break;

    case '*':
      freqA = ROW_3_FREQ;
      freqB = COL_0_FREQ;
      break;

    case '0':
      freqA = ROW_3_FREQ;
      freqB = COL_1_FREQ;
      break;

    case '#':
      freqA = ROW_3_FREQ;
      freqB = COL_2_FREQ;
      break;

    case 'D':
      freqA = ROW_3_FREQ;
      freqB = COL_3_FREQ;
      break;

    default:
      break;
  }

  // keep filling buffer until end
  for(i=0; i<cb->capacity; i++)
  {
    //value = (uint16_t)(offset + sin_aft(amp, 100, t));
    value = (uint16_t)(offset + sin_aft(amp, freqA, t)+ sin_aft(amp, freqB, t));
    sample.Value = value;
    cb_push_back(&sample, cb);
    t++;
    if (t>DAC_SAMPLE_PER_SECOND) t = 0;
#ifdef DEBUG_TONE_SAMPLE
    {
        vPrintStringAndNumber("  New sample val:  ", value);
    }
#endif
  }
}