Feng Hong / Mbed OS Nucleo_rtos_basic

main.cpp

Committer:
hi1000
Date:
2019-04-13
Revision:
11:8702316d7fc8
Parent:
10:d1104e320de7
Child:
12:5cb359f981f3

File content as of revision 11:8702316d7fc8:

#include "mbed.h"
#include <HX711.h>
#include <eeprom.h>
#include "eeprom_cust.h"
//#include "digitLCD.h"
#include "SB1602E.h"

extern void analyzePayload();
#if 1
#ifdef STM32F207xx
HX711 hx711(PB_11, PB_10);// data, clk
#endif

#ifdef STM32F303xE
//HX711 hx711(D8, D9);// data, clk
HX711 hx711(PA_14, PA_15);
#endif
extern void scaleCalibration();
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
SB1602E lcd(D14, D15 );  //  SDA, SCL
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


EEPROM ep(SDA,SCL,EEPROM_ADDR,EEPROM::T24C256);
extern void eeprom_test(void);
int init_id = 0x537;  // first 8 bit is the address

uint8_t can_tx_data[8];
uint8_t can_rx_data[8];

void print_char(char c = '*')
{
    printf("%c\r\n", c);
    fflush(stdout);
}


Thread can_receivethread;
Thread can_handlethread;

CANMessage  msg;
MemoryPool<CANMessage, 16> can_mpool;
Queue<CANMessage, 16> can_queue;

InterruptIn button1(USER_BUTTON);
volatile bool button1_pressed = false; // Used in the main loop
volatile bool button1_enabled = true; // Used for debouncing
Timeout button1_timeout; // Used for debouncing

// Enables button when bouncing is over
void button1_enabled_cb(void)
{
    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
    }
}

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);
    }
}

int main()
{
    int loop = 0;
    int8_t ival;
    printf("\n\n*** RTOS basic example ***\r\n");
  
//    wait(1);
#ifdef LCD_1621
    lcd.clear();            // clears display
    lcd.allsegson();
   
 //   lcd.printf("ABCDEFGHI"); // Standard printf function, All ASCII characters will display
#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   

    
    can_receivethread.start(can_rxthread);  
    can_handlethread.start(analyzePayload);   
//    flashIAP.init();
//    printf("Flash start address: 0x%08x Flash Size: %d\r\n", flashIAP.get_flash_start(), flashIAP.get_flash_size());
//    can1.reset();
//    can2.reset();
    can1.frequency(100000);
//    can2.frequency(100000);
    //button1.mode(PullUp); // Activate pull-up

    button1.fall(callback(button1_onpressed_cb)); // Attach ISR to handle button press event
//    eeprom_test();

#if 1  
//    scaleCalibration();
    init_scale();
    scale_thread.start(scale_reading);
#endif
    int idx = 0; // Just for printf below
    can_tx_data[0] = 0;
    while(1) {
        if (button1_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; 
            button1_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));            
            led1 = !led1;
            can_tx_data[0]++;
        }
    }
  
#if 0
    while(1) {
 //       can1.write(CANMessage(1337, reinterpret_cast<char*>(&a), sizeof(a)));
#if  
        can1.write(CANMessage(1337, reinterpret_cast<char*>(&a), 1));
#endif        
        printf("loop a=%d\n", a);
        led1 = !led1;
        a++;
        wait(0.2);
    }
#endif    
}