package main import ( "context" "fmt" "log" "os" "os/signal" "syscall" "time" "gitea.unprism.ru/KRBL/sim-modem/api/modem" ) func main() { log.Println("CGSG forever!!!") ctx, cancel := signal.NotifyContext(context.Background(), syscall.SIGINT, syscall.SIGTERM) defer cancel() // Just for logs go func(ctx context.Context) { <-ctx.Done() log.Println("GOT INTERUPT SIGNAL") }(ctx) if err := mainE(ctx); err != nil { log.Println("MAIN finished with error:", err.Error()) } log.Println("END") } var m modem.Modem var logger *log.Logger func InetInit() error { // Connect to internet if err := m.Ic().Connect(); err != nil { return fmt.Errorf("connect to internet: %w", err) } // Setup route table // Linux now always manage to add ppp0 interface to route table in time so it is better to add ф loop here setupRouteTableLoop: for { if err := m.Ic().SetDefaultRouteTable(); err != nil { logger.Println("set route table:", err.Error()) time.Sleep(2 * time.Second) } else { break setupRouteTableLoop } } return nil } func Cmd(cmd string) { resp, err := m.At().SendWithTimeout(cmd, 10*time.Second) //50*time.Millisecond) logger.Println(cmd, "===>", resp, err) } func mainE(ctx context.Context) error { logger = log.New(os.Stdout, "main : ", log.LstdFlags) m = modem.New(log.New(logger.Writer(), "modem : ", log.LstdFlags)) logger.Println("||||||||||||||||| INIT |||||||||||||||") // If power is down modem won't find suitable devices add will try to send powerOn signal and then try again initLoop: for { select { case <-ctx.Done(): // For interupt logger.Println("Break init loop") return nil default: if err := m.Init(); err != nil { logger.Println("Init ended with error:", err.Error()) // logger.Println("Turn on...") // if err := m.PowerOnCtx(ctx); err != nil { // logger.Println("Turn on error:", err.Error()) // } time.Sleep(time.Second) continue initLoop } break initLoop } } // Final check for sure if !m.IsConnected() { logger.Println("Modem is not connected") return nil } // Close() deinits everything recursively defer func() { logger.Println("||||||||||||||||| CLOSE |||||||||||||||") m.Close() }() // Internet connect // if err := InetInit(); err != nil { // return err // } logger.Println("||||||||||||||||| SMS |||||||||||||||||") // Select ME PMS // logger.Println("SEND SMS") // logger.Println(m.Sms().Send("+79218937173", "CGSG forever!!!")) // m.At().RawSend("\r\n\x1A\r\n") // Cmd("AT+CREG?") // Cmd("AT+CNMI?") Cmd("AT+CNETSCAN") // Cmd("AT+CSCA?") // Cmd("AT+CPOL?") // Cmd("AT+COPS?") // // Cmd("AT+COPS=?") // Cmd("AT+CPSI?") // resp, err = m.At().Send("AT+CNMI=2,2") for { select { case <-ctx.Done(): logger.Println("Break main loop") return nil default: // Cmd("AT+CPSI?") // Cmd("AT+CIPGSMLOC=1") // Cmd("AT+CSQ") // Cmd("AT+CTZU?") // Cmd("AT+CPIN?") // Cmd("AT+CCLK?") // logger.Println(m.Gps().GetStatus()) // m.Update() // st, _ := m.Gps().GetStatus() // logger.Printf("FOUND SATELITES: %d\n", st.FoundSatelitesCount) // data := m.GetData() // logger.Printf("GPS DATA: %f%s %f%s\n", data.Latitude, data.LatitudeIndicator, data.Longitude, data.LongitudeIndicator) // logger.Println(m.GetTime()) // logger.Println(m.Ic().Ping()) time.Sleep(time.Second) } // Cmd("AT+CSQ") // Cmd("AT+COPS?") // if err := m.CheckSignal(); err != nil { // logger.Println(err) // } else { // logger.Println("AAAAAAAAAAA THERE IS SIGNAL") // } // readLen, err := m.At().SerialPort().Read(buf) // if err != nil { // return err // } // if readLen > 0 { // logger.Println(string(buf[:readLen])) // } } // resp, err = m.At().Send("AT+CPMS?") // logger.Println("Prefered mem storage:", resp, err) // resp, err = m.At().Send("AT+CREG?") // logger.Println("Network registration:", resp, err) // resp, err = m.At().Send("AT+CPMS?") // logger.Println("Prefered mem storage:", resp, err) // resp, err = m.At().Send("AT+CPMS=?") // logger.Println("Possible mem storage:", resp, err) // resp, err = m.At().Send("AT+CNMI?") // logger.Println("New message indications:", resp, err) // resp, err = m.At().Send("AT+CMGL=\"REC UNREAD\"") // logger.Println("New messages:", resp, err) // resp, err = m.At().Send("AT+CNMI=2,1") // logger.Println("AT+CNMI=2,1:", resp, err) // resp, err = m.At().Send("AT+CNMI?") // logger.Println("New message indications:", resp, err) // logger.Println("Reading port...") // for { // readLen, err := m.At().SerialPort().Read(buf) // if err != nil { // return err // } // if readLen > 0 { // logger.Println(string(buf[:readLen])) // } // } // for { // resp, err = m.At().Send("AT+CSQ") // logger.Println("AT+CSQ:", resp, err) // time.Sleep(500 * time.Millisecond) // } // logger.Println("||||||||||||||||| Checking gps status |||||||||||||||||") // st, err := m.Gps().GetStatus() // if err != nil { // return err // } // logger.Printf("GPS Status:%+v\n", st) // logger.Println("Turn off", m.PowerOff()) return nil }