Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
main.cpp
- Committer:
- hi1000
- Date:
- 2019-09-24
- Revision:
- 19:0356e54240cc
- Parent:
- 18:e6ed582f7022
- Child:
- 20:ec9d4f6a16ac
File content as of revision 19:0356e54240cc:
#include "mbed.h" #include <HX711.h> #include <eeprom.h> #include "eeprom_cust.h" //#include "digitLCD.h" #include "SB1602E.h" #include "yoda2.h" #include "TextLCD.h" EventFlags button_event_flags; EEPROM ep(SDA,SCL,EEPROM_ADDR,EEPROM::T24C32); extern void eeprom_test(void); #ifdef YODA2 // I2C Communication I2C i2c_lcd(PB_9, PB_8); // SDA, SCL TextLCD_I2C_N lcd(&i2c_lcd, ST7032_SA, TextLCD::LCD16x2, NC, TextLCD::ST7032_3V3); #endif #if 1 int current_weight; //EEPROM ep(SDA,SCL,EEPROM_ADDR,EEPROM::T24C256); int device_address = DEVICE_DEFAULT_ADDRESS; // address 11 bits: last 8 bits is device_address int device_type; //address 11 bits: first 3 bits is device_type int init_id = 0x00300000; // first 11 bit is the address int init_filter_handle, broadcast_filter_handle; int broadcast_id = 0x1ffC0000; #endif #if 1 EventFlags LCD_update_flags; extern void main_menu(); extern void analyzePayload(); extern Device_Type_d device_type_v; extern data_field_d can_txdata_frame; extern CANMessage tx_message; #if 1 #ifdef STM32F207xx HX711 hx711(PB_11, PB_10);// data, clk #endif #ifdef STM32F303xE //HX711 hx711(D8, D9);// data, clk #ifdef OWN_SOLDER_BOARD HX711 hx711(PA_14, PA_15); #endif #ifdef YODA2 HX711 hx711(PA_1, PA_0); #endif #endif extern void scaleCalibration(bool release_led); extern void init_scale(); Thread scale_thread; extern void scale_reading(); #endif unsigned char rx_buffer[8], tx_buffer[8]; unsigned char rx_length, tx_length; //#define LCD_1602 #ifdef STM32F207xx SB1602E lcd( PB_9, PB_8 ); // SDA, SCL CAN can1(PD_0, PD_1); CAN can2(PB_5, PB_6); DigitalOut led1(LED1); DigitalOut led2(LED2); //FlashIAP flashIAP; //#define LCD_1621 //digitLCD lcd(PA_5,PA_4,PB_5); // WO, CS, DATA #endif #ifdef STM32F303xE #ifdef LCD_1602 SB1602E lcd(D14, D15 ); // SDA, SCL #endif CAN can1(PA_11, PA_12); // RD, TD DigitalOut led1(LED1); // only one LED PA_5 DigitalOut led2(LED2); // only one LED PA_5 #endif #if 0 DigitalOut output1(PC_3); DigitalOut output2(PC_2); DigitalOut output3(PB_7); DigitalIn input1(PC_6); DigitalIn input2(PC_8); #endif uint8_t can_tx_data[8]; uint8_t can_rx_data[8]; #endif void print_char(char c = '*') { printf("%c\r\n", c); fflush(stdout); } #if 1 Thread can_receivethread; Thread can_handlethread; Thread mainmenu_thread; bool can_register_success = false; CANMessage msg; MemoryPool<CANMessage, 16> can_mpool; Queue<CANMessage, 16> can_queue; #endif InterruptIn button0(USER_BUTTON); volatile bool button0_pressed = false; // Used in the main loop volatile bool button0_enabled = true; // Used for debouncing Timeout button0_timeout; // Used for debouncing InterruptIn button1(BUTTON1); volatile bool button1_pressed = false; // Used in the main loop volatile bool button1_enabled = true; // Used for debouncing Timeout button1_timeout; // Used for debouncing InterruptIn button2(BUTTON2); volatile bool button2_pressed = false; // Used in the main loop volatile bool button2_enabled = true; // Used for debouncing Timeout button2_timeout; // Used for debouncing InterruptIn button3(BUTTON3); volatile bool button3_pressed = false; // Used in the main loop volatile bool button3_enabled = true; // Used for debouncing Timeout button3_timeout; // Used for debouncing InterruptIn button4(BUTTON4); volatile bool button4_pressed = false; // Used in the main loop volatile bool button4_enabled = true; // Used for debouncing Timeout button4_timeout; // Used for debouncing // Enables button when bouncing is over //button0 void button0_enabled_cb(void) { int button_status; button_status = button0.read(); if (button_status == 0) { printf("button0 down\r\n"); scaleCalibration(true); button_status = button0.read(); if (button_status == 0) { printf("button0 hold\r\n"); } else { printf("button0 press hold and release\r\n"); } } else printf("button0 released\r\n"); button0_enabled = true; } // ISR handling button pressed event void button0_onpressed_cb(void) { if (button0_enabled) { // Disabled while the button is bouncing button0_enabled = false; button0_pressed = true; // To be read by the main loop button0_timeout.attach(callback(button0_enabled_cb), 0.3); // Debounce time 300 ms } } //button0-- //button1 void button1_enabled_cb(void) { int button_status; button_status = button1.read(); if (button_status == 0) { printf("button1 down\r\n"); button_event_flags.set(BUTTON1_HOLD_EVENT); } else { printf("button1 released\r\n"); button_event_flags.set(BUTTON1_PRESSED_EVENT); } button1_enabled = true; } // ISR handling button pressed event void button1_onpressed_cb(void) { if (button1_enabled) { // Disabled while the button is bouncing button1_enabled = false; button1_pressed = true; // To be read by the main loop button1_timeout.attach(callback(button1_enabled_cb), 0.3); // Debounce time 300 ms } } //button1-- //button2 void button2_enabled_cb(void) { int button_status; button_status = button2.read(); if (button_status == 0) { printf("button2 down\r\n"); button_event_flags.set(BUTTON2_HOLD_EVENT); } else { printf("button2 released\r\n"); button_event_flags.set(BUTTON2_PRESSED_EVENT); } button2_enabled = true; } // ISR handling button pressed event void button2_onpressed_cb(void) { if (button2_enabled) { // Disabled while the button is bouncing button2_enabled = false; button2_pressed = true; // To be read by the main loop button2_timeout.attach(callback(button2_enabled_cb), 0.3); // Debounce time 300 ms } } //button2-- //button3 void button3_enabled_cb(void) { int button_status; button_status = button3.read(); if (button_status == 0) { printf("button3 down\r\n"); button_event_flags.set(BUTTON3_HOLD_EVENT); } else { printf("button3 released\r\n"); button_event_flags.set(BUTTON3_PRESSED_EVENT); } button3_enabled = true; } // ISR handling button pressed event void button3_onpressed_cb(void) { if (button3_enabled) { // Disabled while the button is bouncing button3_enabled = false; button3_pressed = true; // To be read by the main loop button3_timeout.attach(callback(button3_enabled_cb), 0.3); // Debounce time 300 ms } } //button3-- //button4 void button4_enabled_cb(void) { int button_status; button_status = button4.read(); if (button_status == 0) { printf("button4 down\r\n"); button_event_flags.set(BUTTON4_HOLD_EVENT); } else { printf("button4 released\r\n"); button_event_flags.set(BUTTON4_PRESSED_EVENT); } button4_enabled = true; } // ISR handling button pressed event void button4_onpressed_cb(void) { if (button4_enabled) { // Disabled while the button is bouncing button4_enabled = false; button4_pressed = true; // To be read by the main loop button4_timeout.attach(callback(button4_enabled_cb), 0.3); // Debounce time 300 ms } } //button4-- #if 1 void can_sendData(int can_id, uint8_t *tx_data, int length) { CANMessage txmsg; txmsg.format = CANExtended; txmsg.id = can_id; txmsg.len = length; txmsg.data[0] = tx_data[0]; txmsg.data[1] = tx_data[1]; txmsg.data[2] = tx_data[2]; txmsg.data[3] = tx_data[3]; txmsg.data[4] = tx_data[4]; txmsg.data[5] = tx_data[5]; txmsg.data[6] = tx_data[6]; txmsg.data[7] = tx_data[7]; // printf("can_sendData can_id=0x%08x \r\n", can_id); can1.write(txmsg); } void can_rxthread() { int loop; while (true) { #if 1 if(can1.read(msg)) { print_char(); printf("got message id=%d 0x%08x\r\n", msg.id, msg.id); // b = *reinterpret_cast<int*>(msg.data); for (loop = 0; loop < msg.len; loop++) { can_rx_data[loop] = msg.data[loop]; } printf("got data: length:%d\r\n", msg.len); for (loop = 0; loop < msg.len; loop++) { printf("data[%d]=%d\r\n", loop, can_rx_data[loop]); } // if(msg.id == 1337) { //only queue the message belongs to you CANMessage *can_message = can_mpool.alloc(); memcpy((void *)can_message, (void *)&msg, sizeof(msg)); if (!can_queue.full()) can_queue.put(can_message); else { printf("message queue is full. \r\n"); } led2 = !led2; } } #endif // wait(0.2); } } #endif void i2c_scanner(PinName sda, PinName scl) { I2C i2c(sda, scl); int error, address; int nDevices; i2c.frequency(100000); printf("i2c_scanner sda=%d scl=%d \r\n", (int)sda, (int)scl); printf("Scanning...\r\n"); nDevices = 0; for(address = 0; address < 127; address++ ) { i2c.start(); // error = i2c.write(address << 1); //We shift it left because mbed takes in 8 bit addreses error = i2c.write(address << 1, "1", 1, false); i2c.stop(); if (error == 0) { printf("I2C device found at address 7bit:0x%X (8bit:0x%X)\r\n", address, (address<<1)); //Returns 8-bit addres nDevices++; } } if (nDevices == 0) printf("No I2C devices found\r\n"); else printf("\r\ndone\r\n"); } int main() { int loop = 0; int8_t ival; unsigned int can_id; printf("\n\n*** RTOS starts ***\r\n"); // wait(1); #if 1 ep.read((uint32_t)EEPROM_DEVICE_ADDRESS_ADDRESS,device_address); printf("EEPROM: read device address:%d 0x%08x\r\n", device_address, device_address); if ((device_address == 0) || (device_address == 0xFFFFFFFF)) device_address = DEVICE_DEFAULT_ADDRESS; device_type = (device_address & 0x00000700) >> 8; device_type_v = (Device_Type_d)device_type; #ifdef LCD_1621 lcd.clear(); // clears display lcd.allsegson(); // lcd.printf("ABCDEFGHI"); // Standard printf function, All ASCII characters will display #endif #ifdef YODA2 lcd.cls(); lcd.setContrast(31); lcd.setCursor(TextLCD::CurOff_BlkOff); lcd.setAddress(0,0); lcd.printf("Hello Yoda2!"); #endif #ifdef LCD_1602 // lcd.printf( 0, "Hello world!" ); // line# (0 or 1), string // lcd.printf( 1, "pi = %.6f", 3.14159265 ); // lcd.putcxy(0x55, 5, 1); // lcd.printf(5, 0, "UUU"); // lcd.printf(0, 0, "pressed!" ); #endif // input1.mode(PullUp); // input2.mode(PullUp); // can1.reset(); // can2.reset(); printf("device_address =0x%08x \r\n", (device_address<<18)); can1.frequency(100000); can1.filter((device_address<<18), 0x1FFC0000, CANExtended, init_filter_handle); // 0x1FFC0000 to filter the last 18bits 0-17 device_address = (device_address & 0x000000FF); //only support one filter // can1.filter(broadcast_id, 0x1FFC0000, CANExtended, broadcast_filter_handle); // the broadcast id // can2.frequency(100000); //button0.mode(PullUp); // Activate pull-up can_receivethread.start(can_rxthread); can_handlethread.start(analyzePayload); #endif button1.mode(PullUp); button2.mode(PullUp); button3.mode(PullUp); button4.mode(PullUp); button0.fall(callback(button0_onpressed_cb)); // Attach ISR to handle button press event button0.rise(callback(button0_onpressed_cb)); // Attach ISR to handle button press event button1.fall(callback(button1_onpressed_cb)); // Attach ISR to handle button press event button1.rise(callback(button1_onpressed_cb)); // Attach ISR to handle button press event button2.fall(callback(button2_onpressed_cb)); // Attach ISR to handle button press event button2.rise(callback(button2_onpressed_cb)); // Attach ISR to handle button press event button3.fall(callback(button3_onpressed_cb)); // Attach ISR to handle button press event button3.rise(callback(button3_onpressed_cb)); // Attach ISR to handle button press event button4.fall(callback(button4_onpressed_cb)); // Attach ISR to handle button press event button4.rise(callback(button4_onpressed_cb)); // Attach ISR to handle button press event // i2c_scanner(PB_9, PB_8); // eeprom_test(); #if 1 // scaleCalibration(true); switch (device_type_v) { case CupTrack: case JamTrack: case TeaTrack: break; case Tea: case Jam: init_scale(); scale_thread.start(scale_reading); break; case Shaker: break; default: break; } mainmenu_thread.start(main_menu); #endif while(1) { wait(2); #if 1 if (!can_register_success) { can_txdata_frame.cmd = COMMAND_REGISTER; can_txdata_frame.value1 = 0; can_txdata_frame.value2 = 0; can_txdata_frame.value3 = 0; memcpy(can_tx_data, (unsigned char *)&can_txdata_frame, sizeof(can_tx_data)); // printf("cmd=0x%08x value1=0x%08x size=%d %d\r\n", can_txdata_frame.cmd, can_txdata_frame.value1, sizeof(can_tx_data), sizeof(can_txdata_frame)); // printf("data 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x \r\n", can_tx_data[0], can_tx_data[1], can_tx_data[2], can_tx_data[3], can_tx_data[4], can_tx_data[5], can_tx_data[6], can_tx_data[7]); can_id = (RASPBERRY_PI_CAN_ADDRESS << 18) | (((device_type << 8) |device_address) << 7) | 0x80000000; // printf("device_address = 0x%08x can_id=0x%08x \r\n", device_address, can_id); can_sendData(can_id, can_tx_data, 8); } #endif } #if 0 int idx = 0; // Just for printf below can_tx_data[0] = 0; while(1) { if (button0_pressed) { // Set when button is pressed #if 0 printf("scale value %f. \r\n", hx711.getGram()); #endif can_tx_data[1] = can_tx_data[0]+1; can_tx_data[2] = can_tx_data[1]+1; can_tx_data[3] = can_tx_data[2]+1; can_tx_data[4] = can_tx_data[3]+1; can_tx_data[5] = can_tx_data[4]+1; can_tx_data[6] = can_tx_data[5]+1; can_tx_data[7] = can_tx_data[6]+1; button0_pressed = false; printf("Button pressed %d\r\n", idx++); printf("ID=%d data[0]=%d. \r\n", init_id + idx%10, can_tx_data[0]); #ifdef LCD_1602 lcd.printf(0, 0, "%d ", idx ); // line# (0 or 1), string #endif can1.write(CANMessage((init_id + idx%10), reinterpret_cast<char*>(can_tx_data), 8, CANData,CANExtended)); led1 = !led1; can_tx_data[0]++; } } #endif }