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; }
/** 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); };
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); }
/** 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); };
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; }
//============================================================================= // 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 } }