Hi,
I am planning to create an ultrasonic library (based on ch201) because I can't find any library for it. So I am porting code from ch201 development kit to nrf52 custom board.
So in my main code, I am defining a method for creating initialization just like the development kit does. Below is the header of my main code, as you can see there is
#include <stdio.h> #include "boards.h" #include "app_util_platform.h" #include "app_error.h" #include "nrf_delay.h" #include "nrf_log.h" #include "nrf_log_ctrl.h" #include "nrf_log_default_backends.h" #include "ch201.h" #include "ch201_gprmt.h" #include "EventRecorder.h" #define LED_PIN 7 #define CH201_SENSOR_FW_INIT_FUNC ch201_gprmt_init ///////////// methods & variables declaration //////////////////////// uint8_t chirp_error = 0; uint8_t init_sensor(ch201_device *dev_ptr, ch_fw_init_func_t fw_init_func); uint8_t start_sensor(ch201_device *dev_ptr);
In my main loop, you can check at the part of sensor initialization, there is a method called ch201_init and has 2 arguments.
int main(void) { EventRecorderInitialize(EventRecordAll, 1); printf("init fw\n"); nrf_gpio_cfg_output(LED_PIN); nrf_gpio_pin_clear(LED_PIN); nrf_delay_ms(500); // I2C initiate printf("\nInit i2c"); twi_init(); nrf_delay_ms(500); printf("\nWrite i2c"); // find sensors find_sensors(); // initialize sensors /* init sensor firmware */ chirp_error |= ch201_init(&sensor, CH201_SENSOR_FW_INIT_FUNC); if (chirp_error != 0) { printf("Fail initialize sensor.\n"); printf("Error: %d\n", chirp_error); }
First argument for selecting sensor struct, and second argument is firmware method for initialization process.
Here is the source code for that method.
uint8_t ch201_gprmt_init(ch201_device *dev_ptr, uint8_t i2c_addr, uint8_t io_index, uint8_t i2c_bus_index) { dev_ptr->part_number = CH201_PART_NUMBER; dev_ptr->app_i2c_address = i2c_addr; dev_ptr->io_index = io_index; dev_ptr->i2c_bus_index = i2c_bus_index; /* Init firmware-specific function pointers */ dev_ptr->firmware = ch201_gprmt_fw; dev_ptr->fw_version_string = ch201_gprmt_version; dev_ptr->ram_init = (uint8_t *) get_ram_ch201_gprmt_init_ptr(); dev_ptr->get_fw_ram_init_size = get_ch201_gprmt_fw_ram_init_size; dev_ptr->get_fw_ram_init_addr = get_ch201_gprmt_fw_ram_init_addr; dev_ptr->prepare_pulse_timer = ch_common_prepare_pulse_timer; dev_ptr->store_pt_result = ch_common_store_pt_result; dev_ptr->store_op_freq = ch_common_store_op_freq; dev_ptr->store_scalefactor = ch_common_store_scale_factor; dev_ptr->get_locked_state = ch_common_get_locked_state; dev_ptr->api_funcs.fw_load = ch_common_fw_load; dev_ptr->api_funcs.set_mode = ch_common_set_mode; dev_ptr->api_funcs.set_sample_interval = ch_common_set_sample_interval; dev_ptr->api_funcs.set_num_samples = ch_common_set_num_samples; dev_ptr->api_funcs.set_max_range = ch_common_set_max_range; dev_ptr->api_funcs.set_static_range = NULL; // not supported dev_ptr->api_funcs.get_range = ch_common_get_range; dev_ptr->api_funcs.get_amplitude = ch_common_get_amplitude; dev_ptr->api_funcs.get_iq_data = ch_common_get_iq_data; dev_ptr->api_funcs.samples_to_mm = ch_common_samples_to_mm; dev_ptr->api_funcs.set_thresholds = ch_common_set_thresholds; dev_ptr->api_funcs.get_thresholds = ch_common_get_thresholds; /* Init max sample count */ dev_ptr->max_samples = CH201_GPRMT_MAX_SAMPLES; /* This firmware does not use oversampling */ dev_ptr->oversample = 0; /* Init device and group descriptor linkage */ // dev_ptr->group = grp_ptr; // set parent group pointer // grp_ptr->device[io_index] = dev_ptr; // add to parent group return 0; }
When I compile the code, it gives me error like that method is not defined yet before. But you can check at my header, I call that method from it's file (but the code is not defined at header, but I just make the code works on it is source file).
Below is the code when I compile it without defining it on header file.
..\..\..\main.c(95): error: #20: identifier "ch201_gprmt_init" is undefined chirp_error |= ch201_init(&sensor, &CH201_SENSOR_FW_INIT_FUNC);
********
So I was planning to define it on header library. But, when I define it on header library, it gives me more errors message than before.
So as you can check in the picture below, now I define it and looks like no errors on it.
But, when I compile, it gives me more errors (4 errors). It is said the ch201_device is not defined, but I define it at my main library code. Below is the error result.
..\..\..\..\..\..\components\libraries\ch201\ch201_gprmt.h(38): error: #20: identifier "ch201_device" is undefined uint8_t ch201_gprmt_init(ch201_device *dev_ptr, uint8_t i2c_addr, uint8_t dev_num, uint8_t i2c_bus_index);
So Is there any solution for this? Thank you for your appreciation.