System Management code
Dependencies: mbed CANBuffer Watchdog MODSERIAL mbed-rtos xbeeRelay IAP
Fork of SystemManagement by
Revision 19:3a817d2cef11, committed 2014-10-25
- Comitter:
- martydd3
- Date:
- Sat Oct 25 16:48:09 2014 +0000
- Parent:
- 18:915a235bc099
- Child:
- 20:3dfa7e9461a0
- Commit message:
- Testing from basics;
Changed in this revision
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/IOobjects.cpp Sat Oct 25 16:48:09 2014 +0000 @@ -0,0 +1,7 @@ +#include "IOobjects.h" + +// I/O objects +MODSERIAL pc(USBTX, USBRX, 4096, 256); // Software buffered serial, 4kB buffer +CANBuffer can(CAN2, MEDIUM, p0_6); // Software buffered CAN +Watchdog wdt(0.11); // Watchdog timer set to 110ms +DigitalOut debugLED(LED4); \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/IOobjects.h Sat Oct 25 16:48:09 2014 +0000 @@ -0,0 +1,14 @@ +#ifndef _IO_OBJECTS_H +#define _IO_OBJECTS_H + +#include "mbed.h" +#include "MODSERIAL.h" +#include "CANBuffer.h" +#include "Watchdog.h" + +extern CANBuffer can; +extern MODSERIAL pc; +extern Watchdog wdt; +extern DigitalOut debugLED; + +#endif \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/MODSERIAL.lib Sat Oct 25 16:48:09 2014 +0000 @@ -0,0 +1,1 @@ +http://mbed.org/users/AjK/code/MODSERIAL/#ae0408ebdd68
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/SerialDiagnostics/SerialDiagnostics.cpp Sat Oct 25 16:48:09 2014 +0000 @@ -0,0 +1,42 @@ +#include "SerialDiagnostics.h" + +// Macros for working with the string +// Add newlines, add it to the working buffer +#define ADD_LINE len+=sprintf(buff+len,"%s\r\n",line); +#define ADD_SPRINTF_LINE padCenter(line,max_charsPerLine-2,temp,' '); len+=sprintf(buff+len,"%s\r\n",line); + +// Print to a string buffer, pad to maxLen chars and center it with char pad, str must be null terminated! +void padCenter(char *buff, int LineLen, char *str, char pad) { + int len = strlen(str); + int padL = (LineLen-len)/2; // -1 to save room for the null terminator + for (int i=0; i<padL; i++) buff[i] = pad; // Fill in the left padding chars + strcpy(buff+padL, str); + for (int i = padL+len; i<LineLen; i++) buff[i] = pad; // Fill remaining with padding chars + buff[LineLen-1] = '\0'; // Add null terminator +} + +void SerialDiagnostics::thread_serialOut(void const* args){ + const int max_charsPerLine = 81; // Max chars per line + const int max_lines = 30; // Max lines that the layout prints out + pc.printf("\033[2J"); // Clear the screen to get rid of reset message + + char buff[max_charsPerLine*max_lines]; // Giant string to store the printout + char line[max_charsPerLine]; // String buffer to work with one line at a time + char temp[max_charsPerLine]; // String buffer to sprintf into + + while(1){ + + int len = 0; + len += sprintf(buff+len, "\033[0;0H"); // Home the cursor + padCenter(line, max_charsPerLine-2, "-", '-'); ADD_LINE // Generate a line full of 80 -'s + padCenter(line, max_charsPerLine-2, " Penn Electric Racing - REV0 System Management Module Serial Dashboard ", '-'); ADD_LINE + padCenter(line, max_charsPerLine-2, "-", '-'); ADD_LINE // Generate a line full of 80 -'s + + // Write it all at once to output tx buffer + for (int i = 0; i < strlen(buff); i++) { + pc.putc(buff[i]); + } + + Thread::wait(100); + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/SerialDiagnostics/SerialDiagnostics.h Sat Oct 25 16:48:09 2014 +0000 @@ -0,0 +1,13 @@ +#ifndef _SERIAL_DIAGNOSTICS_H +#define _SERIAL_DIAGNOSTICS_H + +#include "MODSERIAL.h" +#include "rtos.h" +#include "IOobjects.h" + +namespace SerialDiagnostics { + void thread_serialOut(void const *args); + +} + +#endif \ No newline at end of file
--- a/SysMngmt.cpp Sat Oct 25 15:54:19 2014 +0000 +++ b/SysMngmt.cpp Sat Oct 25 16:48:09 2014 +0000 @@ -4,333 +4,16 @@ Revised Oct 19, 2014: First team repository version */ -#include "XBee_Lib.h" -#include "CANBuffer.h" - #include "mbed.h" -#include "rtos.h" -#include "Watchdog.h" -#include "FanPump.h" -#include "DC_DC.h" -#include "PollSwitch.h" -#include "IMD.h" -#include "CoulombCounter.h" +DigitalOut myled(LED1); -CANBuffer rxBuffer(CAN1, MEDIUM); -Watchdog wdt; -XBee250x XbeeTx; -Serial pc1(USBTX,USBRX); - -char sys_src_id = 0x4; // source address of system management -char reset_id = 0x010; +int main(){ -int SYSMGMT_ERROR_ID = 0x400; - -extern "C" void mbed_reset(); - -void soft_reset(){ - //http://developer.mbed.org/forum/mbed/topic/890/ - mbed_reset(); -} - -void error_update(void const *arg){ - char data[1] = {0}; while(1){ - data[0] = 0; - if(wdt.checkFlag()) - { - data[0] |= 0x2; - } - CANMessage txErrorMessage(SYSMGMT_ERROR_ID, data, 1); - rxBuffer.txWrite(txErrorMessage); - Thread::wait(10); + myled = 1; + wait(0.2); + myled = 0; + wait(0.2); } } - -int main() { - CANMessage rx_msg; - - wdt.kick(10.0); - pc1.baud(115200); - -/* - FanPump fanPump(&rxBuffer); - DC dc_dc(&fanPump, &rxBuffer); - PollSwitch pollSwitch(&rxBuffer); - IMD imdMonitor(&rxBuffer); - CurrentMonitor curMonitor(&rxBuffer); - - fanPump.start_update(); - dc_dc.start_update(); - pollSwitch.start_update(); - imdMonitor.start_update(); - curMonitor.start_update(); - - Thread error_thread(error_update); - - while(1) - { - if(rxBuffer.rxRead(rx_msg)){ - if(rx_msg.id == reset_id) - soft_reset(); - - char src_addr = (rx_msg.id & 0x0700) >> 8; // get bits 10:8 - - if(src_addr == sys_src_id){ - char cont_id = (rx_msg.id & 0x00FF); // get bits 7:0 - - // only control fans of dc_dc converter is on - if(cont_id == RX_PUMP_ID && dc_dc.is_on()) - { - float temp_float; - - memcpy(&rx_msg.data[0], &temp_float, sizeof(float)); - fanPump.set_fan_pump(Pump1, temp_float); - - memcpy(&rx_msg.data[4], &temp_float, sizeof(float)); - fanPump.set_fan_pump(Pump2, temp_float); - } - - if(cont_id == RX_FAN_ID && dc_dc.is_on()) - { - float temp_float; - - memcpy(&rx_msg.data[0], &temp_float, sizeof(float)); - fanPump.set_fan_pump(Fan1, temp_float); - - memcpy(&rx_msg.data[4], &temp_float, sizeof(float)); - fanPump.set_fan_pump(Fan2, temp_float); - } - - if(cont_id == RX_DC_DC_ID){ - dc_dc.set(rx_msg.data[0]); - } - } // check for correct src_addr - } // check CANBuffer - - wdt.kick(); - } // main while loop - -*/ -} - -/* - - Below is Kiran's old code, keeping it commented as a reference. - -*/ - -/* - -Attach Ticker every 10msec to -Get IMD -Poll Switches -Temperature Read -Get Battery State -End Ticker Send message through CAN - -CAN interrupt Rx Interrupt -Recieve CAN message into a buffer. Return -Buffer values(as long as !empty) -> SD Card, Xbee -> remove element - -extern "C" void CAN_IRQHandler(void) -{ - CANMessage Rxmsg; - CAN_SysM.read(Rxmsg); - RecieveBuffer.add(Rxmsg); -} - - http://developer.mbed.org/users/AjK/notebook/getting-closer-to-the-hardware/ - - extern "C" means this is linked assuming it's C code - C++ linker appearently adds extra crap with the function arguments keeping functions of this kind from linking properly - - Interrupt handler, This is probably linked to the Timer 2 interrupt request somewhere by the libraries - -*/ - - -/* - Appears to read a whole bunch of DigitalOut pins in void PollSwitch(), store the value in uint16_t Rxpoll, - and write the result to the CAN bus - -void Poll() -{ - uint16_t Rxpoll; - uint16_t recv,temp,i=0; //Test - char Result[4]={0}; - Rxpoll=PollSwitch(); - - Result[0]=(char)(Rxpoll&0x00ff); - Result[1]=(char)((Rxpoll&0xff00)>>8); - CANMessage Txmsg(410,Result,sizeof(Result)); - CAN_SysM.write(Txmsg); - - //Test - recv=(((uint16_t)Txmsg.data[1]<<8) | (0x00ff&(uint16_t)Txmsg.data[0])); - printf("Recv:%d\n\r",recv); - - while(i <= 12) - { - temp=recv; - if(((temp & (1 << i))>>i)==1) - pc.printf("Switch OFF:%d\n\r",i); - ++i; - } -} - - -void Temp() -{ - float DC_DC_Temperature, Coolant1_Temperature, Coolant2_Temperature, ChargerFET_Temperature; - float Resistance; - float Vadc; - int i; - ftc send, recv; - recv.FLOAT=0.0; - send.FLOAT=0.0; - - Vadc=DC_DC.read()*VDD; - Resistance=((float)R10K*Vadc)/((float)VDD + Vadc); - DC_DC_Temperature=ReadTemp(TR_NXFT15XH103FA_Map, Resistance, TABLE_SIZE_NXFT15XH103FA); - send.FLOAT=DC_DC_Temperature; - CANMessage Txmsg_DC_DC(450,send.C_FLOAT,sizeof(send.C_FLOAT)); - CAN_SysM.write(Txmsg_DC_DC); - - for(i=0; i<4;i++) - recv.C_FLOAT[i]=Txmsg_DC_DC.data[i]; - pc.printf("DC_DC:%f\n\r",recv.FLOAT); - - Vadc=ChargerFET.read()*VDD; - Resistance=((float)R10K*Vadc)/((float)VDD + Vadc); - ChargerFET_Temperature=ReadTemp(TR_NXFT15XH103FA_Map, Resistance, TABLE_SIZE_NXFT15XH103FA); - send.FLOAT=ChargerFET_Temperature; - CANMessage Txmsg_ChargerFET(451,send.C_FLOAT,sizeof(send.C_FLOAT)); - CAN_SysM.write(Txmsg_ChargerFET); - - for(i=0; i<4;i++) - recv.C_FLOAT[i]=Txmsg_ChargerFET.data[i]; - pc.printf("ChargerFET:%f\n\r",recv.FLOAT); - - Vadc=Coolant1.read()*VDD; - Resistance=((float)R10K*Vadc)/((float)VDD + Vadc); - Coolant1_Temperature=ReadTemp(TR_NTCLP00E3103H_Map, Resistance, TABLE_SIZE_NTCLP00E3103H); - send.FLOAT=Coolant1_Temperature; - CANMessage Txmsg_Coolant1(452,send.C_FLOAT,sizeof(send.C_FLOAT)); - CAN_SysM.write(Txmsg_Coolant1); - //Control Fans - - for(i=0; i<4;i++) - recv.C_FLOAT[i]=Txmsg_Coolant1.data[i]; - pc.printf("Coolant1:%f\n\r",recv.FLOAT); - - Vadc=Coolant2.read()*VDD; - Resistance=((float)R10K*Vadc)/((float)VDD + Vadc); - Coolant2_Temperature=ReadTemp(TR_NTCLP00E3103H_Map, Resistance, TABLE_SIZE_NTCLP00E3103H); - send.FLOAT=Coolant2_Temperature; - CANMessage Txmsg_Coolant2(453,send.C_FLOAT,sizeof(send.C_FLOAT)); - CAN_SysM.write(Txmsg_Coolant2); - //Control Fans - - for(i=0; i<4;i++) - recv.C_FLOAT[i]=Txmsg_Coolant2.data[i]; - pc.printf("Coolant2:%f\n\r",recv.FLOAT); -} - -void IMD() -{ - IMD_Measurement_Output IMD_Signal; - char status[4]; - ftc send; - - IMD_Signal=Get_Measurement(); - send.FLOAT=IMD_Signal.Frequency; - CANMessage Txmsg_Frequency(421,send.C_FLOAT,sizeof(send.C_FLOAT)); - CAN_SysM.write(Txmsg_Frequency); - - send.FLOAT=IMD_Signal.Duty_Cycle; - CANMessage Txmsg_DutyCycle(422,send.C_FLOAT,sizeof(send.C_FLOAT)); - CAN_SysM.write(Txmsg_DutyCycle); - - status[0]=Result.Encoded_Status; - CANMessage Txmsg_Status(423,status,sizeof(status)); - CAN_SysM.write(Txmsg_Status); -} -*/ - -/* - Activates a whole crapload of functions and pins on the chip - -void Init() -{ - - Timers to call various functions at different intervals - These things behave weirdly when wait(ms) is involved. Probably have to rewrite - - - //ReadIMD.attach(&IMD,0.1); - //PollSDSwitch.attach(&Poll,0.1); - - //ReadTemperature.attach(&Temp,0.1); - //ReadBatteryState.attach(&Battery,0.1); - - - Initialize Timer2 for Battery State - - LPC_SC 0x400F C000 (System Control) - ->PCONP 0x400F C0C4 (Power Control for Peripherals Register) - |= (1<<22) 22 Bit (Timer 2 power/clock control bit) - - ->PCLKSEL1 Peripheral Clock Selection register 1 (controls rate of clock signal supplied to peripheral) - |= ((1<<12) | (1<<13)); 12:13 Bits (Peripheral Clock Selection for TIMER2) - - LPC_TIM2 0x4009 0000 (Timer 2) - ->TCR 0x4009 0004 (Timer Control Register) - |= (1<<0); 0 Bit (Counter Enable) - - ->MR0 0x4009 0018 (Match Register) - - ->MCR 0x4009 0014 (Match Control Register) What to do when Match Register matches the Timer Counter - |= (1<<0); 0 Bit (Interrupt on MR0, interrupt generated when MR0 matches the value in TC) - - - LPC_SC->PCONP |= (1<<22); //PoewerOn Timer/Counter2 - LPC_SC->PCLKSEL1 |= ((1<<12) | (1<<13)); //Prescale Timer2 CCLK/8 - LPC_TIM2->TCR |= (1<<0); //Enable Timer2 - LPC_TIM2->MR0 = 11999; // 1msec - LPC_TIM2->MCR |= (1<<0); - - Nested Vectored Interrupt Controller (NVIC) - - NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority) - sets priority of an interrupt - - IRQn_Type - Interrupt number definitions - Interrupt Request (IRQ) - - NVIC_EnableIRQ(IRQn_Type IRQn) - Enable external interrupt (in this case, the TIMER2_IRQHandler(void) function above gets called every time - Timer2 generates an interrupt signal) - - - NVIC_SetPriority(TIMER0_IRQn,200); //IMD Capture Interrupt - NVIC_SetPriority(TIMER1_IRQn,200); //IMD 1msec sampling Interrupt - NVIC_SetPriority(TIMER2_IRQn,1); //Battery 1msec sampling Interrupt - NVIC_SetPriority(TIMER3_IRQn,255); //mbed Timer/Ticker/Wait Interrupt - NVIC_SetPriority(CAN_IRQn,2); - - NVIC_EnableIRQ(TIMER2_IRQn); //Enable TIMER2 IRQ - - CAN_SysM.mode(CAN::GlobalTest); - - - //NVIC_EnableIRQ(CAN_IRQn); - //NVIC_EnableIRQ(CANActivity_IRQn); -} - - - Main Loop: Currently reads CANMessages from Can interface (Pins: rd = p30, td = p29) - Send CANMessage data through XBee radio transmitters -*/