diff --git a/schematic/ALL.cmp b/schematic/ALL.cmp index e23214f..48048bd 100644 --- a/schematic/ALL.cmp +++ b/schematic/ALL.cmp @@ -1,4 +1,4 @@ -Cmp-Mod V01 Created by CvPcb (2013-feb-26)-stable date = Вс 30 ноя 2014 15:38:41 +Cmp-Mod V01 Created by CvPcb (2013-feb-26)-stable date = Ср 04 фев 2015 15:00:52 BeginCmp TimeStamp = /53A910B8/50AF1E60; @@ -115,14 +115,14 @@ EndCmp BeginCmp TimeStamp = /53973803/53997111; Reference = C5; -ValeurCmp = 10u; +ValeurCmp = 100u; IdModule = CP_5x11mm; EndCmp BeginCmp TimeStamp = /53973803/53997130; Reference = C6; -ValeurCmp = 100u; +ValeurCmp = 470u; IdModule = CP_5x11mm; EndCmp @@ -217,6 +217,13 @@ ValeurCmp = 1u; IdModule = SM0805; EndCmp +BeginCmp +TimeStamp = /54D32A5B; +Reference = C20; +ValeurCmp = 2200u, 40V; +IdModule = CP_16x25mm; +EndCmp + BeginCmp TimeStamp = /53973803/53976CAB/53BE6988; Reference = CON1; diff --git a/schematic/ALL.net b/schematic/ALL.net index 993936d..990ad17 100644 --- a/schematic/ALL.net +++ b/schematic/ALL.net @@ -1,7 +1,7 @@ (export (version D) (design (source /home/eddy/Docs/SAO/ELECTRONICS/STM32/kicad/alltogether/ALL.sch) - (date "Вс 30 ноя 2014 15:38:48") + (date "Ср 04 фев 2015 15:06:52") (tool "eeschema (2013-feb-26)-stable")) (components (comp (ref XP2) @@ -219,13 +219,13 @@ (sheetpath (names "/STM32F103 module/") (tstamps /53973803/)) (tstamp 53996A85)) (comp (ref C5) - (value 10u) + (value 100u) (footprint C2) (libsource (lib device) (part C)) (sheetpath (names "/STM32F103 module/") (tstamps /53973803/)) (tstamp 53997111)) (comp (ref C6) - (value 100u) + (value 470u) (footprint C2) (libsource (lib device) (part C)) (sheetpath (names "/STM32F103 module/") (tstamps /53973803/)) @@ -1445,10 +1445,10 @@ (uri /usr/share/kicad/library/conn.lib)) (library (logical regul) (uri /usr/share/kicad/library/regul.lib)) - (library (logical STM32f103) - (uri /home/eddy/kicad/STM32f103.lib)) (library (logical my_elements) - (uri my_elements.lib))) + (uri my_elements.lib)) + (library (logical STM32f103) + (uri /home/eddy/kicad/STM32f103.lib))) (nets (net (code 1) (name "/Power MOSFET module 2/GND_OUT") (node (ref XP7) (pin 19)) diff --git a/schematic/ALL.sch b/schematic/ALL.sch index 2bb98cf..3881ccf 100644 --- a/schematic/ALL.sch +++ b/schematic/ALL.sch @@ -1,4 +1,4 @@ -EESchema Schematic File Version 2 date Ср 28 янв 2015 08:47:22 +EESchema Schematic File Version 2 date Ср 04 фев 2015 15:06:53 LIBS:power LIBS:device LIBS:transistors @@ -41,7 +41,7 @@ $Descr A3 16535 11693 encoding utf-8 Sheet 1 12 Title "IR-spectrometer Control System" -Date "28 jan 2015" +Date "4 feb 2015" Rev "" Comp "SAO RAS" Comment1 "" diff --git a/schematic/MCU_module.sch b/schematic/MCU_module.sch index 7e13759..90dc3cf 100644 --- a/schematic/MCU_module.sch +++ b/schematic/MCU_module.sch @@ -1,4 +1,4 @@ -EESchema Schematic File Version 2 date Ср 28 янв 2015 08:47:22 +EESchema Schematic File Version 2 date Ср 04 фев 2015 15:06:53 LIBS:power LIBS:device LIBS:transistors @@ -41,7 +41,7 @@ $Descr A3 16535 11693 encoding utf-8 Sheet 3 12 Title "MCU module on STM32F103" -Date "28 jan 2015" +Date "4 feb 2015" Rev "" Comp "SAO RAS" Comment1 "" @@ -296,7 +296,7 @@ L C C5 U 1 1 53997111 P 4400 1100 F 0 "C5" H 4400 1200 40 0000 L CNN -F 1 "10u" H 4406 1015 40 0000 L CNN +F 1 "100u" H 4406 1015 40 0000 L CNN F 2 "C2" H 4438 950 30 0001 C CNN F 3 "~" H 4400 1100 60 0000 C CNN 1 4400 1100 @@ -307,7 +307,7 @@ L C C6 U 1 1 53997130 P 5350 1100 F 0 "C6" H 5350 1200 40 0000 L CNN -F 1 "100u" H 5356 1015 40 0000 L CNN +F 1 "470u" H 5356 1015 40 0000 L CNN F 2 "C2" H 5388 950 30 0001 C CNN F 3 "~" H 5350 1100 60 0000 C CNN 1 5350 1100 diff --git a/schematic/ST3232.sch b/schematic/ST3232.sch index edbcd7c..51f5c48 100644 --- a/schematic/ST3232.sch +++ b/schematic/ST3232.sch @@ -1,4 +1,4 @@ -EESchema Schematic File Version 2 date Ср 28 янв 2015 08:47:22 +EESchema Schematic File Version 2 date Ср 04 фев 2015 15:06:53 LIBS:power LIBS:device LIBS:transistors @@ -41,7 +41,7 @@ $Descr A4 11693 8268 encoding utf-8 Sheet 5 12 Title "RS-232 level converter" -Date "28 jan 2015" +Date "4 feb 2015" Rev "" Comp "SAO RAS" Comment1 "" diff --git a/schematic/Shutter_MOSFET.sch b/schematic/Shutter_MOSFET.sch index 27c599c..a0103f7 100644 --- a/schematic/Shutter_MOSFET.sch +++ b/schematic/Shutter_MOSFET.sch @@ -1,4 +1,4 @@ -EESchema Schematic File Version 2 date Ср 28 янв 2015 08:47:22 +EESchema Schematic File Version 2 date Ср 04 фев 2015 15:06:53 LIBS:power LIBS:device LIBS:transistors @@ -41,7 +41,7 @@ $Descr A4 11693 8268 encoding utf-8 Sheet 12 12 Title "Power load module" -Date "28 jan 2015" +Date "4 feb 2015" Rev "" Comp "SAO RAS" Comment1 "" diff --git a/schematic/USB_inp.sch b/schematic/USB_inp.sch index af29db8..c2ff5d0 100644 --- a/schematic/USB_inp.sch +++ b/schematic/USB_inp.sch @@ -1,4 +1,4 @@ -EESchema Schematic File Version 2 date Ср 28 янв 2015 08:47:22 +EESchema Schematic File Version 2 date Ср 04 фев 2015 15:06:53 LIBS:power LIBS:device LIBS:transistors @@ -41,7 +41,7 @@ $Descr A4 11693 8268 encoding utf-8 Sheet 4 12 Title "USB input circuit" -Date "28 jan 2015" +Date "4 feb 2015" Rev "" Comp "SAO RAS" Comment1 "" diff --git a/schematic/motors.sch b/schematic/motors.sch index 70c9828..5004e3e 100644 --- a/schematic/motors.sch +++ b/schematic/motors.sch @@ -1,4 +1,4 @@ -EESchema Schematic File Version 2 date Ср 28 янв 2015 08:47:22 +EESchema Schematic File Version 2 date Ср 04 фев 2015 15:06:53 LIBS:power LIBS:device LIBS:transistors @@ -41,7 +41,7 @@ $Descr A4 11693 8268 encoding utf-8 Sheet 8 12 Title "Stepper motor module" -Date "28 jan 2015" +Date "4 feb 2015" Rev "" Comp "SAO RAS" Comment1 "" @@ -152,7 +152,7 @@ AR Path="/53A910B7/50CECA5D" Ref="C3.2" Part="1" AR Path="/5391724D/50CECA5D" Ref="C3.3" Part="1" AR Path="/53A910BA/50CECA5D" Ref="C3.4" Part="1" AR Path="/53A910B9/50CECA5D" Ref="C3.5" Part="1" -F 0 "C3.5" H 5550 3350 50 0000 L CNN +F 0 "C3.1" H 5550 3350 50 0000 L CNN F 1 "1n" H 5550 3150 50 0000 L CNN F 2 "SM0805" H 5500 3250 60 0001 C CNN F 3 "" H 5500 3250 60 0001 C CNN @@ -168,7 +168,7 @@ AR Path="/53A910B7/50CECA5C" Ref="R6.2" Part="1" AR Path="/5391724D/50CECA5C" Ref="R6.3" Part="1" AR Path="/53A910BA/50CECA5C" Ref="R6.4" Part="1" AR Path="/53A910B9/50CECA5C" Ref="R6.5" Part="1" -F 0 "R6.5" V 5580 3000 50 0000 C CNN +F 0 "R6.1" V 5580 3000 50 0000 C CNN F 1 "51k" V 5500 3000 50 0000 C CNN F 2 "SM0603" H 5500 3000 60 0001 C CNN F 3 "" H 5500 3000 60 0001 C CNN @@ -232,7 +232,7 @@ AR Path="/53A910B7/50CEC791" Ref="R5.2" Part="1" AR Path="/5391724D/50CEC791" Ref="R5.3" Part="1" AR Path="/53A910BA/50CEC791" Ref="R5.4" Part="1" AR Path="/53A910B9/50CEC791" Ref="R5.5" Part="1" -F 0 "R5.5" V 5580 2500 50 0000 C CNN +F 0 "R5.1" V 5580 2500 50 0000 C CNN F 1 "51k" V 5500 2500 50 0000 C CNN F 2 "SM0603" H 5500 2500 60 0001 C CNN F 3 "" H 5500 2500 60 0001 C CNN @@ -248,7 +248,7 @@ AR Path="/53A910B7/50CEC790" Ref="C2.2" Part="1" AR Path="/5391724D/50CEC790" Ref="C2.3" Part="1" AR Path="/53A910BA/50CEC790" Ref="C2.4" Part="1" AR Path="/53A910B9/50CEC790" Ref="C2.5" Part="1" -F 0 "C2.5" H 5550 2850 50 0000 L CNN +F 0 "C2.1" H 5550 2850 50 0000 L CNN F 1 "1n" H 5550 2650 50 0000 L CNN F 2 "SM0805" H 5500 2750 60 0001 C CNN F 3 "" H 5500 2750 60 0001 C CNN @@ -264,7 +264,7 @@ AR Path="/53A910B7/50CEB99A" Ref="R2.2" Part="1" AR Path="/5391724D/50CEB99A" Ref="R2.3" Part="1" AR Path="/53A910BA/50CEB99A" Ref="R2.4" Part="1" AR Path="/53A910B9/50CEB99A" Ref="R2.5" Part="1" -F 0 "R2.5" V 4280 2650 50 0000 C CNN +F 0 "R2.1" V 4280 2650 50 0000 C CNN F 1 "0.33" V 4200 2650 50 0000 C CNN F 2 "SM2010" H 4200 2650 60 0001 C CNN F 3 "" H 4200 2650 60 0001 C CNN @@ -280,7 +280,7 @@ AR Path="/53A910B7/50CEB97A" Ref="R1.2" Part="1" AR Path="/5391724D/50CEB97A" Ref="R1.3" Part="1" AR Path="/53A910BA/50CEB97A" Ref="R1.4" Part="1" AR Path="/53A910B9/50CEB97A" Ref="R1.5" Part="1" -F 0 "R1.5" V 4280 2450 50 0000 C CNN +F 0 "R1.1" V 4280 2450 50 0000 C CNN F 1 "0.33" V 4200 2450 50 0000 C CNN F 2 "SM2010" H 4200 2450 60 0001 C CNN F 3 "" H 4200 2450 60 0001 C CNN @@ -328,7 +328,7 @@ AR Path="/53A910B7/50AF1E60" Ref="C1.2" Part="1" AR Path="/5391724D/50AF1E60" Ref="C1.3" Part="1" AR Path="/53A910BA/50AF1E60" Ref="C1.4" Part="1" AR Path="/53A910B9/50AF1E60" Ref="C1.5" Part="1" -F 0 "C1.5" H 5100 5100 50 0000 L CNN +F 0 "C1.1" H 5100 5100 50 0000 L CNN F 1 "68n" H 5100 4900 50 0000 L CNN F 2 "SM0805" H 5050 5000 60 0001 C CNN F 3 "" H 5050 5000 60 0001 C CNN @@ -376,7 +376,7 @@ AR Path="/53A910B7/50AF1C25" Ref="R3.2" Part="1" AR Path="/5391724D/50AF1C25" Ref="R3.3" Part="1" AR Path="/53A910BA/50AF1C25" Ref="R3.4" Part="1" AR Path="/53A910B9/50AF1C25" Ref="R3.5" Part="1" -F 0 "R3.5" V 4480 5050 50 0000 C CNN +F 0 "R3.1" V 4480 5050 50 0000 C CNN F 1 "22k" V 4400 5050 50 0000 C CNN F 2 "SM0603" H 4400 5050 60 0001 C CNN F 3 "" H 4400 5050 60 0001 C CNN @@ -392,7 +392,7 @@ AR Path="/53A910B7/50AE2A4D" Ref="DD2.2" Part="1" AR Path="/5391724D/50AE2A4D" Ref="DD2.3" Part="1" AR Path="/53A910BA/50AE2A4D" Ref="DD2.4" Part="1" AR Path="/53A910B9/50AE2A4D" Ref="DD2.5" Part="1" -F 0 "DD2.5" H 3800 4600 50 0000 L BNN +F 0 "DD2.1" H 3800 4600 50 0000 L BNN F 1 "L6208N" H 4300 2850 50 0000 L BNN F 2 "DIP-24__300_ELL" H 4300 3900 50 0001 C CNN F 3 "" H 4300 3750 60 0001 C CNN @@ -436,7 +436,7 @@ AR Path="/53A910B7/534BB108" Ref="R4.2" Part="1" AR Path="/5391724D/534BB108" Ref="R4.3" Part="1" AR Path="/53A910BA/534BB108" Ref="R4.4" Part="1" AR Path="/53A910B9/534BB108" Ref="R4.5" Part="1" -F 0 "R4.5" V 4780 5050 40 0000 C CNN +F 0 "R4.1" V 4780 5050 40 0000 C CNN F 1 "1.8k" V 4707 5051 40 0000 C CNN F 2 "SM0603" V 4630 5050 30 0001 C CNN F 3 "~" H 4700 5050 30 0000 C CNN diff --git a/schematic/power_MOSFET.sch b/schematic/power_MOSFET.sch index 7e7bc69..30c2525 100644 --- a/schematic/power_MOSFET.sch +++ b/schematic/power_MOSFET.sch @@ -1,4 +1,4 @@ -EESchema Schematic File Version 2 date Ср 28 янв 2015 08:47:22 +EESchema Schematic File Version 2 date Ср 04 фев 2015 15:06:53 LIBS:power LIBS:device LIBS:transistors @@ -41,7 +41,7 @@ $Descr A4 11693 8268 encoding utf-8 Sheet 11 12 Title "Power load module" -Date "28 jan 2015" +Date "4 feb 2015" Rev "" Comp "SAO RAS" Comment1 "" diff --git a/with_opencm3/hardware_ini.h b/with_opencm3/hardware_ini.h index 263f007..e6c14db 100644 --- a/with_opencm3/hardware_ini.h +++ b/with_opencm3/hardware_ini.h @@ -118,11 +118,14 @@ void ADC_calibrate_and_start(); #define SHUTTER_ON_PIN (GPIO2) #define SHUTTER_POLARITY_PIN (GPIO0) #define SHUTTER_FB_PIN (GPIO1) -// voltage (*100) threshold to run shutter -#define SHUTTER_VOLTAGE_THRES (1000) -#define SHUTTER_UNDERVOLTAGE_THRES (500) -// delay in operations in us -#define SHUTTER_DELAY (10000) +// voltage (*100) threshold to run shutter - 20V +#define SHUTTER_VOLTAGE_THRES (2000) +// minimum voltage that should be on capasitor if power source is on +#define SHUTTER_UNDERVOLTAGE_THRES (700) +// delay in operations (open/close) in us (according to shutter's datasheet it's about 12ms) +#define SHUTTER_DELAY (12500) +// delay for error test +#define SHUTTER_OP_DELAY (200) // ADC_value[8] is U36, ADC_value[9] is U10 #define SHUTTER_SENSE_VALUE (ADC_value[8]) diff --git a/with_opencm3/main.c b/with_opencm3/main.c index 2ab8138..bdf43c5 100644 --- a/with_opencm3/main.c +++ b/with_opencm3/main.c @@ -200,6 +200,8 @@ int main(){ if(Timer - Old_timer > 999){ // one-second cycle Old_timer += 1000; + if(Shutter_State == SHUTTER_NOTREADY) + shutter_init(); //OW_fill_ID(0); //gpio_toggle(GPIOC, GPIO12); // toggle LED //gpio_toggle(GPIO_BANK_SPI2_MOSI, GPIO_SPI2_MOSI); diff --git a/with_opencm3/powerhw.c b/with_opencm3/powerhw.c index 76f1afc..1bc867e 100644 --- a/with_opencm3/powerhw.c +++ b/with_opencm3/powerhw.c @@ -22,6 +22,7 @@ #include "main.h" // state of shutter - global variable to omit interface functions shutter_state Shutter_State = SHUTTER_NOTREADY; +uint16_t Shutter_delay = SHUTTER_DELAY; // function to be runned from timer irq void (*shutter_timer_fn)() = NULL; @@ -33,13 +34,16 @@ void (*shutter_timer_fn)() = NULL; */ void shutter_wait(int us, void(*fn_ready)()){ if(!fn_ready) return; + //DBG("wait for previous .. "); while(shutter_timer_fn); // wait for ending of previous operation + //DBG("ok\n"); shutter_timer_fn = fn_ready; timer_set_period(SHUTTER_TIM, us); timer_enable_counter(SHUTTER_TIM); } // macro to open/close/set default state +// open shutter is 0:0 -> when MCU power is off, shutter "automatically" opens #define shutter_open() do{gpio_clear(SHUTTER_PORT, SHUTTER_ON_PIN | SHUTTER_POLARITY_PIN);}while(0) #define shutter_close() do{gpio_clear(SHUTTER_PORT, SHUTTER_ON_PIN); \ gpio_set(SHUTTER_PORT, SHUTTER_POLARITY_PIN);}while(0) @@ -48,16 +52,62 @@ void shutter_wait(int us, void(*fn_ready)()){ gpio_clear(SHUTTER_PORT, SHUTTER_POLARITY_PIN);}while(0) #define shutter_error() ((gpio_get(SHUTTER_PORT, SHUTTER_FB_PIN) == 0)) +/** + * Make tests for undervoltage & wire breakage + * this function calls in 2 stages: + * 1) check undervoltage & set hiZ + * 2) repeat checking undervoltage & check wire breakage + * if shutter was uninitialized we open it + */ +void shutter_test(){ + static shutter_state old_State = SHUTTER_NOTREADY; + // test for undervoltage + if(shutter_voltage() < SHUTTER_UNDERVOLTAGE_THRES){ + ERR("shutter undervoltage\n"); + Shutter_State = SHUTTER_NOTREADY; + shutter_off(); + return; + } + if(Shutter_State != SHUTTER_INITIALIZED){ // first call of this function + old_State = Shutter_State; + Shutter_State = SHUTTER_INITIALIZED; + // test for wire breakage + DBG("breakage test\n"); + shutter_hiZ(); // 1,1: breakage test + shutter_wait(SHUTTER_OP_DELAY, shutter_test); + }else{ // check breakage + if(shutter_error()){ // ERR==0 -> wire breakage + ERR("shutter wire breakage\n"); + Shutter_State = SHUTTER_NOTREADY; + }else{ + if(old_State == SHUTTER_NOTREADY){ + Shutter_State = SHUTTER_OPENING; + DBG("ready!\n"); + }else{ + Shutter_State = old_State; + DBG("no errors\n"); + } + } + shutter_off(); + } +} + + /** * after open/close pulse we should return bridge to default state + * 3 stages: + * 1) check for short-circuit & turn off power of the shutter + * 2) check for overtemperature or undervoltage + * 3) common test for undervoltage/breakage */ void shutter_ready(){ uint8_t test_err = 0; + //DBG("shtr ready\n"); switch (Shutter_State){ case SHUTTER_CLOSED: // repeated pulse to check errors case SHUTTER_OPENED: if(shutter_error()){ - ERR("shutter vertemperature or undervoltage\n"); + ERR("shutter overtemperature or undervoltage\n"); Shutter_State = SHUTTER_NOTREADY; } break; @@ -66,7 +116,6 @@ void shutter_ready(){ if(shutter_error()){ ERR("shutter short-circuit\n"); Shutter_State = SHUTTER_NOTREADY; - shutter_off(); }else{ test_err = 1; if(Shutter_State == SHUTTER_PROC_CLOSING) @@ -77,9 +126,17 @@ void shutter_ready(){ break; default: ERR("wrong shutter state\n"); + print_shutter_state(lastsendfun); } shutter_off(); - if(test_err) shutter_wait(SHUTTER_DELAY, shutter_ready); // test for overtemp or undervoltage + if(Shutter_State == SHUTTER_NOTREADY) return; + if(test_err){ + //DBG("now test for err\n"); + shutter_wait(SHUTTER_OP_DELAY, shutter_ready); // test for overtemp or undervoltage + }else{ + // wait a lot of time to prevent false detections + shutter_wait(SHUTTER_DELAY, shutter_test); + } } /** @@ -98,7 +155,8 @@ shutter_state shutter_init(){ // 72MHz div 72 = 1MHz timer_set_prescaler(SHUTTER_TIM, 71); timer_one_shot_mode(SHUTTER_TIM); // single pulse mode - timer_enable_preload(SHUTTER_TIM); // force changing period + timer_disable_preload(SHUTTER_TIM); // force changing period + timer_update_on_overflow(SHUTTER_TIM); // generate UEV only on overflow timer_enable_update_event(SHUTTER_TIM); timer_enable_irq(SHUTTER_TIM, TIM_DIER_UIE); // update IRQ enable //DBG("shutter timer ready\n"); @@ -109,20 +167,9 @@ shutter_state shutter_init(){ // feedback: floating input gpio_set_mode(SHUTTER_PORT, GPIO_MODE_INPUT, GPIO_CNF_INPUT_FLOAT, SHUTTER_FB_PIN); - // test for wire breakage - shutter_hiZ(); // 1,1: breakage test - Delay(1); // wait for 1ms - if(shutter_error()){ // ERR==0 -> wire breakage - if(shutter_voltage() < SHUTTER_UNDERVOLTAGE_THRES) - ERR("shutter undervoltage\n"); - else - ERR("shutter wire breakage\n"); - }else{ - // Shutter_State = SHUTTER_CLOSING; // now try to close shutter - Shutter_State = SHUTTER_READY; - } shutter_off(); - return Shutter_State; + shutter_wait(SHUTTER_OP_DELAY, shutter_test); + return SHUTTER_INITIALIZED; // we return this state in spite of the shutter isn't really initialized yet } /** @@ -131,14 +178,21 @@ shutter_state shutter_init(){ */ void process_shutter(){ if(Shutter_State == SHUTTER_NOTREADY) return; - if(shutter_error()){ - ERR("shutter some error\n"); + + if(Shutter_State != SHUTTER_OPENING && Shutter_State != SHUTTER_CLOSING) + return; + if(shutter_voltage() < SHUTTER_UNDERVOLTAGE_THRES){ + ERR("no shutter power source\n"); Shutter_State = SHUTTER_NOTREADY; shutter_off(); return; } - if(Shutter_State != SHUTTER_OPENING && Shutter_State != SHUTTER_CLOSING) + if(shutter_error()){ + ERR("some shutter error\n"); + Shutter_State = SHUTTER_NOTREADY; + shutter_off(); return; + } if(shutter_voltage() < SHUTTER_VOLTAGE_THRES) return; // capasitor isn't charged switch (Shutter_State){ case SHUTTER_OPENING: @@ -152,30 +206,32 @@ void process_shutter(){ default: return; } - shutter_wait(SHUTTER_DELAY, shutter_ready); + shutter_wait(Shutter_delay, shutter_ready); } void Shutter_tim_isr(){ + //DBG("shutter timer\n"); + void (*fn)() = shutter_timer_fn; if(timer_get_flag(SHUTTER_TIM, TIM_SR_UIF)){ // Clear compare interrupt flag timer_clear_flag(SHUTTER_TIM, TIM_SR_UIF); + shutter_timer_fn = NULL; // and run needed function - if(shutter_timer_fn){ - shutter_timer_fn(); - shutter_timer_fn = NULL; + if(fn){ + fn(); } } } -/* +/** * printout shutter state */ void print_shutter_state(sendfun s){ P("shutter ", s); -if(shutter_error()){ // ERR==0 -> wire breakage - P("(error) ", s); -} switch (Shutter_State){ + case SHUTTER_INITIALIZED: + P("testing", s); + break; case SHUTTER_READY: P("ready", s); break; @@ -196,26 +252,40 @@ if(shutter_error()){ // ERR==0 -> wire breakage P("in process", s); break; default: // not ready or error - P("not initialised or broken", s); + if(shutter_error()){ // ERR==0 -> wire breakage or something else + P("error", s); + }else + P("not initialised or broken", s); } newline(s); } - -/* - switch (Shutter_State){ +/** + * Try to open/close shutter depending on argument: + * state == SHUTTER_CLOSING - try to close + * state == SHUTTER_OPENING - try to open + */ +void shutter_try(shutter_state state){ + switch (Shutter_State){ // right states are only OPENED, CLOSED & READY case SHUTTER_OPENED: + if(state == SHUTTER_OPENING){ // try to open opened shutter? + P("alerady opened\n", lastsendfun); + return; + } break; case SHUTTER_CLOSED: + if(state == SHUTTER_CLOSING){ // try to close closed? + P("alerady closed\n", lastsendfun); + return; + } break; - case SHUTTER_OPENING: - break; - case SHUTTER_CLOSING: - break; - case SHUTTER_PROC_OPENING: - break; - case SHUTTER_PROC_CLOSING: + case SHUTTER_READY: + ; // All OK break; default: + print_shutter_state(lastsendfun); + return; } -*/ + Shutter_State = state; // all OK, now we can change current state of shutter +} + diff --git a/with_opencm3/powerhw.h b/with_opencm3/powerhw.h index 081763a..3c638e5 100644 --- a/with_opencm3/powerhw.h +++ b/with_opencm3/powerhw.h @@ -27,8 +27,9 @@ // Shutter finite-state machine states typedef enum{ - SHUTTER_NOTREADY = 0, // initialisation - not ready, or error in work - SHUTTER_READY, + SHUTTER_NOTREADY = 0, // not ready, or error in work + SHUTTER_INITIALIZED, // initialisation in process + SHUTTER_READY, // ready for operation SHUTTER_OPENED, // shutter is in opened state SHUTTER_CLOSED, // shutter is in closed state SHUTTER_OPENING, // user is waiting for opening @@ -38,9 +39,15 @@ typedef enum{ } shutter_state; extern shutter_state Shutter_State; +extern uint16_t Shutter_delay; shutter_state shutter_init(); void process_shutter(); void print_shutter_state(sendfun s); +void shutter_try(shutter_state state); + +#define try_to_close_shutter() shutter_try(SHUTTER_CLOSING) +#define try_to_open_shutter() shutter_try(SHUTTER_OPENING) + #endif // __POWERHW_H__ diff --git a/with_opencm3/user_proto.c b/with_opencm3/user_proto.c index 039be47..2a64c02 100644 --- a/with_opencm3/user_proto.c +++ b/with_opencm3/user_proto.c @@ -64,6 +64,13 @@ void print_ad_vals(sendfun s){ } } +void set_shtr_delay(int32_t v, sendfun s){ + uint16_t d = (uint16_t) v; + Shutter_delay = d; + P("Change delay to ", s); + print_int(d, s); +} + void parce_incoming_buf(char *buf, int len, sendfun s){ uint8_t command; int i = 0, j, m; @@ -185,14 +192,14 @@ void parce_incoming_buf(char *buf, int len, sendfun s){ print_shutter_state(s); break; case 'c': // close shutter - if(Shutter_State != SHUTTER_CLOSED) - Shutter_State = SHUTTER_CLOSING; - else P("alerady closed\n", s); + try_to_close_shutter(); break; case 'o': // open shutter - if(Shutter_State != SHUTTER_OPENED) - Shutter_State = SHUTTER_OPENING; - else P("alerady opened\n", s); + try_to_open_shutter(); + break; + case 'z': // temporary: change delay + I = set_shtr_delay; + READINT(); break; case '\n': // show newline as is break;