mirror of
https://github.com/eddyem/IR-controller.git
synced 2025-12-06 02:35:14 +03:00
275 lines
5.9 KiB
C
275 lines
5.9 KiB
C
/*
|
|
* main.c
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License as published by
|
|
* the Free Software Foundation; either version 2 of the License, or
|
|
* (at your option) any later version.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with this program; if not, write to the Free Software
|
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
|
|
* MA 02110-1301, USA.
|
|
*/
|
|
|
|
#include "includes.h"
|
|
|
|
uint8_t dev_amount = 0; // amount of 1-wire devices
|
|
uint8_t ID_buf[64]; // 1-wire devices ID buffer (8 bytes for every device)
|
|
|
|
int main(void){
|
|
//SystemInit(); // If won't work - comment this line
|
|
Set_System();
|
|
LED_OnBlink();
|
|
findDev();
|
|
printDev();
|
|
while(1){
|
|
if(dev_amount){
|
|
if(FLAGS & FLAG_READ_T){
|
|
getTemp(); FLAGS ^= FLAG_READ_T;
|
|
}
|
|
if(FLAGS & FLAG_GETDEV){
|
|
findDev(); FLAGS ^= FLAG_GETDEV;
|
|
}
|
|
if(FLAGS & FLAG_PRINTDEV){
|
|
printDev(); FLAGS ^= FLAG_PRINTDEV;
|
|
}
|
|
}
|
|
if(FLAGS & FLAG_PRINTHALL){
|
|
if(Hall_GPIOx->IDR & Hall_PIN)
|
|
MSG("clear", "HC");
|
|
else
|
|
MSG("magnet", "HM");
|
|
newline();
|
|
FLAGS ^= FLAG_PRINTHALL;
|
|
}
|
|
if(FLAGS & FLAG_SWTCH_OFF){
|
|
FLAGS ^= FLAG_SWTCH_OFF;
|
|
ADG_off();
|
|
}
|
|
if((FLAGS & FLAG_SWITCH_N) && Uval_ready){
|
|
FLAGS ^= FLAG_SWITCH_N;
|
|
if(User_value & 0xFFFFFFF0){
|
|
MSG("Err ChN", "err"); newline();
|
|
}else
|
|
switch_Nth();
|
|
}
|
|
if(FLAGS & FLAG_PRINTADC){
|
|
prntADC(); FLAGS ^= FLAG_PRINTADC;
|
|
}
|
|
if(FLAGS & FLAG_PRINTSPD){
|
|
prntSPD(); FLAGS ^= FLAG_PRINTSPD;
|
|
}
|
|
if((FLAGS & FLAG_MOTOR) && Uval_ready){ // move motor && steps amount is readed
|
|
FLAGS ^= FLAG_MOTOR;
|
|
if(User_value > 0x10000000){ // max value: steps*16 must be an uint32_t !!!
|
|
MSG("Err step cnt", "err");
|
|
newline();
|
|
}else
|
|
move_motor();
|
|
}
|
|
if((FLAGS & FLAG_M_PERIOD) && Uval_ready){
|
|
FLAGS ^= FLAG_M_PERIOD;
|
|
if(User_value > (uint32_t)0xFFFF){
|
|
MSG("Err m period", "err");
|
|
newline();
|
|
}else
|
|
set_motor_period();
|
|
}
|
|
if(FLAGS & FLAG_ZAKWIRE){ // clear flag only after getting value or error
|
|
if(ZW_status == ZW_OFF){
|
|
ZW_start_measurement();
|
|
}else if(ZW_status == ZW_ERR || ZW_status == ZW_DATARDY){
|
|
switch(ZW_status){
|
|
case ZW_ERR:
|
|
MSG("Err zacwire", "err");
|
|
newline();
|
|
break;
|
|
case ZW_DATARDY:
|
|
MSG("ZacWire: ", 0);
|
|
printInt((uint8_t*)&ZW_result, 2);
|
|
newline();
|
|
break;
|
|
}
|
|
ZW_status = ZW_OFF;
|
|
FLAGS ^= FLAG_ZAKWIRE;
|
|
}
|
|
}
|
|
Delay(100);
|
|
}
|
|
}
|
|
|
|
inline void getTemp(){
|
|
uint8_t buf[9], i;
|
|
void printTBuf(){
|
|
uint8_t j;
|
|
OW_Send(0, (uint8_t*)"\xbe\xff\xff\xff\xff\xff\xff\xff\xff\xff", 10, buf, 9, 1);
|
|
for(j = 0; j != 9; j++)
|
|
printInt(&buf[j], 1);
|
|
newline();
|
|
}
|
|
// send broadcast message to start measurement
|
|
if(!OW_SendOnly(1, (uint8_t*)"\xcc\x44", 2)) return;
|
|
Delay(1000);
|
|
// read values
|
|
if(dev_amount == 1){
|
|
if(OW_WriteCmd(OW_SKIP_ROM)) printTBuf();
|
|
}else{
|
|
for(i = 0; i < dev_amount; i++){
|
|
MSG("Device ", "ow");
|
|
USB_Send_Data(i + '0');
|
|
MSG(": ", 0);
|
|
if(OW_WriteCmd(OW_MATCH_ROM)){
|
|
OW_SendOnly(0, &ID_buf[i*8], 8);
|
|
printTBuf();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
void findDev(){
|
|
// find 1-wire devices
|
|
dev_amount = OW_Scan(ID_buf, dev_amount);
|
|
MSG("Found ", "owN");
|
|
USB_Send_Data(dev_amount + '0');
|
|
MSG(" devices", 0);
|
|
newline();
|
|
}
|
|
|
|
void printDev(){
|
|
uint8_t *ptr = ID_buf;
|
|
uint8_t i, j;
|
|
if(dev_amount == 0)
|
|
MSG("No devices found", "err");
|
|
// print IDs in binary
|
|
for(i = 0; i < dev_amount; i++){
|
|
MSG("device ", "ow"); USB_Send_Data(i + '0');
|
|
MSG(":\r\n", "");
|
|
for(j = 0; j != 8; j++){
|
|
printInt(ptr++, 1);
|
|
}
|
|
newline();
|
|
}
|
|
newline();
|
|
}
|
|
|
|
inline void prntADC(){
|
|
MSG("ADC value ", 0);
|
|
printInt((uint8_t*)&ADC_value, 2);
|
|
newline();
|
|
}
|
|
|
|
/**
|
|
* Activate Nth output of ADG506A
|
|
* N == User_value
|
|
*/
|
|
inline void switch_Nth(){
|
|
uint32_t addr = (User_value & 0x0f) | 0x10;
|
|
GPIOC->BRR = (uint32_t)0x1f; // first - clear all
|
|
Delay(2); // wait a little
|
|
GPIOC->BSRR = addr; // set new address
|
|
if(MoreMessages){
|
|
P("Switch to ");
|
|
addr &= 0x0f;
|
|
printInt((uint8_t*)&addr, 1);
|
|
newline();
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Turn off ADG506A
|
|
*/
|
|
inline void ADG_off(){
|
|
GPIOC->BRR = (uint32_t)0x1f;
|
|
if(MoreMessages){
|
|
P("Switch off"); newline();
|
|
}
|
|
}
|
|
|
|
/*
|
|
* Print USART line speed
|
|
*/
|
|
inline void prntSPD(){
|
|
MSG("Line speed: ", "chspd");
|
|
printInt((uint8_t*)&linecoding.bitrate, 4);
|
|
newline();
|
|
}
|
|
|
|
/*
|
|
* System setup
|
|
*/
|
|
inline void Set_System(void){
|
|
// SysTick setup: 1 ms / SYSTICK_PRESCALE
|
|
SysTick_Config(SystemCoreClock / SYSTICK_PRESCALE / 1000);
|
|
// RCC configuration
|
|
RCC_Config();
|
|
// Ports configuration
|
|
Ports_Config();
|
|
Set_USBClock();
|
|
USB_Interrupts_Config();
|
|
USB_Init();
|
|
OW_Init();
|
|
}
|
|
|
|
/*
|
|
* Send char array wrd thru USB
|
|
*/
|
|
void prnt(uint8_t *wrd){
|
|
if(!wrd) return;
|
|
while(*wrd) USB_Send_Data(*wrd++);
|
|
}
|
|
|
|
/**
|
|
* Prints newline in "more messages" mode
|
|
* else do nothing
|
|
*/
|
|
void newline(){
|
|
if(MoreMessages) P("\r\n");
|
|
}
|
|
|
|
/**
|
|
* Send to terminal an integer value
|
|
* if "more messages" mode == 1, value will be in hex,
|
|
* else value will be printed as BigEndian binary
|
|
* @param val - value itself
|
|
* @param len - bytelength of val
|
|
*/
|
|
void printInt(uint8_t *val, int8_t len){
|
|
if(MoreMessages){
|
|
P("0x");
|
|
void putc(uint8_t c){
|
|
if(c < 10)
|
|
USB_Send_Data(c + '0');
|
|
else
|
|
USB_Send_Data(c + 'a' - 10);
|
|
}
|
|
while(--len >= 0){
|
|
putc(val[len] >> 4);
|
|
putc(val[len] & 0x0f);
|
|
}
|
|
USB_Send_Data(' ');
|
|
}else{
|
|
int8_t i;
|
|
//while(--len >= 0)
|
|
for(i = 0; i < len; i++)
|
|
USB_Send_Data(val[i]);
|
|
}
|
|
}
|
|
|
|
volatile uint16_t delay_counter = 0;
|
|
|
|
// Delay in ms
|
|
void Delay(uint16_t time){
|
|
delay_counter = time;
|
|
while(delay_counter != 0);
|
|
}
|
|
void Delay_SysTickHandler(){
|
|
if(delay_counter > 0)
|
|
delay_counter--;
|
|
}
|